mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
mm: subtract CMA isolated pages when allocate TVP [1/1]
PD#SWPL-2933 Problem: When allocate CMA pages in buildroot enverioment, system will hung in congestion_wait: Call trace: [<ffffff8009086a78>] __switch_to+0xa0/0xc8 [<ffffff8009de3eb8>] __schedule+0x268/0x7d8 [<ffffff8009de4464>] schedule+0x3c/0xa0 [<ffffff8009de7c9c>] schedule_timeout+0x1b4/0x448 [<ffffff8009de3be8>] io_schedule_timeout+0x98/0x100 [<ffffff80091e3fb8>] congestion_wait+0x90/0x190 [<ffffff80091ebcf4>] isolate_migratepages_block+0x7ec/0x890 [<ffffff80091ec794>] isolate_migratepages_range+0x8c/0x100 [<ffffff8009a8f34c>] aml_alloc_contig_migrate_range+0x104/0x158 [<ffffff8009a8f518>] cma_boost_work_func+0x178/0x270 [<ffffff80090cc228>] kthread+0xf8/0x110 [<ffffff80090836c0>] ret_from_fork+0x10/0x50 Solution: subtract isolated CMA pages when allocation large CMA for TVP. Verify: local Change-Id: I96153cf104abb009a8965c2230a5242e495dd031 Signed-off-by: Tao Zeng <tao.zeng@amlogic.com>
This commit is contained in:
@@ -637,7 +637,11 @@ isolate_freepages_range(struct compact_control *cc,
|
||||
/* Similar to reclaim, but different enough that they don't share logic */
|
||||
static bool too_many_isolated(struct zone *zone)
|
||||
{
|
||||
#ifdef CONFIG_AMLOGIC_CMA
|
||||
signed long active, inactive, isolated;
|
||||
#else
|
||||
unsigned long active, inactive, isolated;
|
||||
#endif
|
||||
|
||||
inactive = node_page_state(zone->zone_pgdat, NR_INACTIVE_FILE) +
|
||||
node_page_state(zone->zone_pgdat, NR_INACTIVE_ANON);
|
||||
@@ -646,6 +650,13 @@ static bool too_many_isolated(struct zone *zone)
|
||||
isolated = node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE) +
|
||||
node_page_state(zone->zone_pgdat, NR_ISOLATED_ANON);
|
||||
|
||||
#ifdef CONFIG_AMLOGIC_CMA
|
||||
isolated -= global_page_state(NR_CMA_ISOLATED);
|
||||
WARN_ONCE(isolated > (inactive + active) / 2,
|
||||
"isolated:%ld, cma:%ld, inactive:%ld, active:%ld\n",
|
||||
isolated, global_page_state(NR_CMA_ISOLATED),
|
||||
inactive, active);
|
||||
#endif /* CONFIG_AMLOGIC_CMA */
|
||||
return isolated > (inactive + active) / 2;
|
||||
}
|
||||
#ifdef CONFIG_AMLOGIC_CMA
|
||||
|
||||
Reference in New Issue
Block a user