diff options
author | Dave Airlie <airlied@redhat.com> | 2020-03-31 15:15:47 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2020-03-31 15:15:47 +1000 |
commit | 5fc0df93fccd4dc8412bfc488ba4ba8268aa12dc (patch) | |
tree | 6091ced63dbba747619762470ebba2298676ea0d /mm/sparse.c | |
parent | 700d6ab987f3b5e28b13b5993e5a9a975c5604e2 (diff) | |
parent | 7111951b8d4973bda27ff663f2cf18b663d15b48 (diff) |
Merge v5.6 into drm-next
msm needed rc6, so I just went and merged release
(msm has been in drm-next outside of this tree)
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'mm/sparse.c')
-rw-r--r-- | mm/sparse.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/mm/sparse.c b/mm/sparse.c index 596b2a45b100..65599e8bd636 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -734,6 +734,7 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, struct mem_section *ms = __pfn_to_section(pfn); bool section_is_early = early_section(ms); struct page *memmap = NULL; + bool empty; unsigned long *subsection_map = ms->usage ? &ms->usage->subsection_map[0] : NULL; @@ -764,7 +765,8 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, * For 2/ and 3/ the SPARSEMEM_VMEMMAP={y,n} cases are unified */ bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); - if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) { + empty = bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION); + if (empty) { unsigned long section_nr = pfn_to_section_nr(pfn); /* @@ -779,13 +781,21 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, ms->usage = NULL; } memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); - ms->section_mem_map = (unsigned long)NULL; + /* + * Mark the section invalid so that valid_section() + * return false. This prevents code from dereferencing + * ms->usage array. + */ + ms->section_mem_map &= ~SECTION_HAS_MEM_MAP; } if (section_is_early && memmap) free_map_bootmem(memmap); else depopulate_section_memmap(pfn, nr_pages, altmap); + + if (empty) + ms->section_mem_map = (unsigned long)NULL; } static struct page * __meminit section_activate(int nid, unsigned long pfn, |