[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.23.453.2009011137280.503484@chino.kir.corp.google.com>
Date: Tue, 1 Sep 2020 11:37:41 -0700 (PDT)
From: David Rientjes <rientjes@...gle.com>
To: Pavel Tatashin <pasha.tatashin@...een.com>
cc: linux-kernel@...r.kernel.org, akpm@...ux-foundation.org,
mhocko@...e.com, linux-mm@...ck.org
Subject: Re: [PATCH] mm/memory_hotplug: drain per-cpu pages again during
memory offline
On Tue, 1 Sep 2020, Pavel Tatashin wrote:
> There is a race during page offline that can lead to infinite loop:
> a page never ends up on a buddy list and __offline_pages() keeps
> retrying infinitely or until a termination signal is received.
>
> Thread#1 - a new process:
>
> load_elf_binary
> begin_new_exec
> exec_mmap
> mmput
> exit_mmap
> tlb_finish_mmu
> tlb_flush_mmu
> release_pages
> free_unref_page_list
> free_unref_page_prepare
> set_pcppage_migratetype(page, migratetype);
> // Set page->index migration type below MIGRATE_PCPTYPES
>
> Thread#2 - hot-removes memory
> __offline_pages
> start_isolate_page_range
> set_migratetype_isolate
> set_pageblock_migratetype(page, MIGRATE_ISOLATE);
> Set migration type to MIGRATE_ISOLATE-> set
> drain_all_pages(zone);
> // drain per-cpu page lists to buddy allocator.
>
> Thread#1 - continue
> free_unref_page_commit
> migratetype = get_pcppage_migratetype(page);
> // get old migration type
> list_add(&page->lru, &pcp->lists[migratetype]);
> // add new page to already drained pcp list
>
> Thread#2
> Never drains pcp again, and therefore gets stuck in the loop.
>
> The fix is to try to drain per-cpu lists again after
> check_pages_isolated_cb() fails.
>
> Signed-off-by: Pavel Tatashin <pasha.tatashin@...een.com>
> Cc: stable@...r.kernel.org
Acked-by: David Rientjes <rientjes@...gle.com>
Powered by blists - more mailing lists