mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-20 19:34:46 +00:00
mm/page_alloc: Call kernel_map_pages in unset_migrateype_isolate
Commit d1037ba0b8
(mm/page_alloc: restrict max order of
merging on isolated pageblock) changed the logic of unset_migratetype_isolate
to check the buddy allocator and explicitly call __free_pages to
merge. The page that is being freed in this path never had prep_new_page
called so set_page_refcounted is called explicitly but there is
no call to kernel_map_pages. With the default kernel_map_pages this
is mostly harmless but if kernel_map_pages does any manipulation
of the page tables (unmapping or setting pages to read only) this
may trigger a fault:
alloc_contig_range test_pages_isolated(ceb00, ced00) failed
Unable to handle kernel paging request at virtual address ffffffc0cec00000
pgd = ffffffc045fc4000
[ffffffc0cec00000] *pgd=0000000000000000
Internal error: Oops: 9600004f [#1] PREEMPT SMP
Modules linked in: exfatfs
CPU: 1 PID: 23237 Comm: TimedEventQueue Not tainted 3.10.49-gc72ad36-dirty #1
task: ffffffc03de52100 ti: ffffffc015388000 task.ti: ffffffc015388000
PC is at memset+0xc8/0x1c0
LR is at kernel_map_pages+0x1ec/0x244
Fix this by calling kernel_map_pages to ensure the page is set in the
page table properly
Change-Id: Ie0c7f38fce24683b6ddebf95874be662ef25021b
Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
This commit is contained in:
parent
855d6f80c7
commit
97f38b6a5d
|
@ -102,6 +102,7 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype)
|
|||
|
||||
if (!is_migrate_isolate_page(buddy)) {
|
||||
__isolate_free_page(page, order);
|
||||
kernel_map_pages(page, (1 << order), 1);
|
||||
set_page_refcounted(page);
|
||||
isolated_page = page;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue