mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Revert "mm/cma: manage the memory of the CMA area by using the ZONE_MOVABLE"
This reverts the following commits that change CMA design in MM.3d2054ad8c("ARM: CMA: avoid double mapping to the CMA area if CONFIG_HIGHMEM=y")1d47a3ec09("mm/cma: remove ALLOC_CMA")bad8c6c0b1("mm/cma: manage the memory of the CMA area by using the ZONE_MOVABLE") Ville reported a following error on i386. Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) microcode: microcode updated early to revision 0x4, date = 2013-06-28 Initializing CPU#0 Initializing HighMem for node 0 (000377fe:00118000) Initializing Movable for node 0 (00000001:00118000) BUG: Bad page state in process swapper pfn:377fe page:f53effc0 count:0 mapcount:-127 mapping:00000000 index:0x0 flags: 0x80000000() raw: 80000000 00000000 00000000 ffffff80 00000000 00000100 00000200 00000001 page dumped because: nonzero mapcount Modules linked in: CPU: 0 PID: 0 Comm: swapper Not tainted 4.17.0-rc5-elk+ #145 Hardware name: Dell Inc. Latitude E5410/03VXMC, BIOS A15 07/11/2013 Call Trace: dump_stack+0x60/0x96 bad_page+0x9a/0x100 free_pages_check_bad+0x3f/0x60 free_pcppages_bulk+0x29d/0x5b0 free_unref_page_commit+0x84/0xb0 free_unref_page+0x3e/0x70 __free_pages+0x1d/0x20 free_highmem_page+0x19/0x40 add_highpages_with_active_regions+0xab/0xeb set_highmem_pages_init+0x66/0x73 mem_init+0x1b/0x1d7 start_kernel+0x17a/0x363 i386_start_kernel+0x95/0x99 startup_32_smp+0x164/0x168 The reason for this error is that the span of MOVABLE_ZONE is extended to whole node span for future CMA initialization, and, normal memory is wrongly freed here. I submitted the fix and it seems to work, but, another problem happened. It's so late time to fix the later problem so I decide to reverting the series. Reported-by: Ville Syrjälä <[email protected]> Acked-by: Laura Abbott <[email protected]> Acked-by: Michal Hocko <[email protected]> Cc: Andrew Morton <[email protected]> Signed-off-by: Joonsoo Kim <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
577e75e0c9
commit
d883c6cf3b
7 changed files with 49 additions and 145 deletions
83
mm/cma.c
83
mm/cma.c
|
|
@ -39,7 +39,6 @@
|
|||
#include <trace/events/cma.h>
|
||||
|
||||
#include "cma.h"
|
||||
#include "internal.h"
|
||||
|
||||
struct cma cma_areas[MAX_CMA_AREAS];
|
||||
unsigned cma_area_count;
|
||||
|
|
@ -110,25 +109,23 @@ static int __init cma_activate_area(struct cma *cma)
|
|||
if (!cma->bitmap)
|
||||
return -ENOMEM;
|
||||
|
||||
WARN_ON_ONCE(!pfn_valid(pfn));
|
||||
zone = page_zone(pfn_to_page(pfn));
|
||||
|
||||
do {
|
||||
unsigned j;
|
||||
|
||||
base_pfn = pfn;
|
||||
if (!pfn_valid(base_pfn))
|
||||
goto err;
|
||||
|
||||
zone = page_zone(pfn_to_page(base_pfn));
|
||||
for (j = pageblock_nr_pages; j; --j, pfn++) {
|
||||
if (!pfn_valid(pfn))
|
||||
goto err;
|
||||
|
||||
WARN_ON_ONCE(!pfn_valid(pfn));
|
||||
/*
|
||||
* In init_cma_reserved_pageblock(), present_pages
|
||||
* is adjusted with assumption that all pages in
|
||||
* the pageblock come from a single zone.
|
||||
* alloc_contig_range requires the pfn range
|
||||
* specified to be in the same zone. Make this
|
||||
* simple by forcing the entire CMA resv range
|
||||
* to be in the same zone.
|
||||
*/
|
||||
if (page_zone(pfn_to_page(pfn)) != zone)
|
||||
goto err;
|
||||
goto not_in_zone;
|
||||
}
|
||||
init_cma_reserved_pageblock(pfn_to_page(base_pfn));
|
||||
} while (--i);
|
||||
|
|
@ -142,7 +139,7 @@ static int __init cma_activate_area(struct cma *cma)
|
|||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
not_in_zone:
|
||||
pr_err("CMA area %s could not be activated\n", cma->name);
|
||||
kfree(cma->bitmap);
|
||||
cma->count = 0;
|
||||
|
|
@ -152,41 +149,6 @@ err:
|
|||
static int __init cma_init_reserved_areas(void)
|
||||
{
|
||||
int i;
|
||||
struct zone *zone;
|
||||
pg_data_t *pgdat;
|
||||
|
||||
if (!cma_area_count)
|
||||
return 0;
|
||||
|
||||
for_each_online_pgdat(pgdat) {
|
||||
unsigned long start_pfn = UINT_MAX, end_pfn = 0;
|
||||
|
||||
zone = &pgdat->node_zones[ZONE_MOVABLE];
|
||||
|
||||
/*
|
||||
* In this case, we cannot adjust the zone range
|
||||
* since it is now maximum node span and we don't
|
||||
* know original zone range.
|
||||
*/
|
||||
if (populated_zone(zone))
|
||||
continue;
|
||||
|
||||
for (i = 0; i < cma_area_count; i++) {
|
||||
if (pfn_to_nid(cma_areas[i].base_pfn) !=
|
||||
pgdat->node_id)
|
||||
continue;
|
||||
|
||||
start_pfn = min(start_pfn, cma_areas[i].base_pfn);
|
||||
end_pfn = max(end_pfn, cma_areas[i].base_pfn +
|
||||
cma_areas[i].count);
|
||||
}
|
||||
|
||||
if (!end_pfn)
|
||||
continue;
|
||||
|
||||
zone->zone_start_pfn = start_pfn;
|
||||
zone->spanned_pages = end_pfn - start_pfn;
|
||||
}
|
||||
|
||||
for (i = 0; i < cma_area_count; i++) {
|
||||
int ret = cma_activate_area(&cma_areas[i]);
|
||||
|
|
@ -195,32 +157,9 @@ static int __init cma_init_reserved_areas(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reserved pages for ZONE_MOVABLE are now activated and
|
||||
* this would change ZONE_MOVABLE's managed page counter and
|
||||
* the other zones' present counter. We need to re-calculate
|
||||
* various zone information that depends on this initialization.
|
||||
*/
|
||||
build_all_zonelists(NULL);
|
||||
for_each_populated_zone(zone) {
|
||||
if (zone_idx(zone) == ZONE_MOVABLE) {
|
||||
zone_pcp_reset(zone);
|
||||
setup_zone_pageset(zone);
|
||||
} else
|
||||
zone_pcp_update(zone);
|
||||
|
||||
set_zone_contiguous(zone);
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to re-init per zone wmark by calling
|
||||
* init_per_zone_wmark_min() but doesn't call here because it is
|
||||
* registered on core_initcall and it will be called later than us.
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
pure_initcall(cma_init_reserved_areas);
|
||||
core_initcall(cma_init_reserved_areas);
|
||||
|
||||
/**
|
||||
* cma_init_reserved_mem() - create custom contiguous area from reserved memory
|
||||
|
|
|
|||
Loading…
Reference in a new issue