Re: [PATCH] mm,page_alloc,cma: conditionally prefer cma pageblocks for movable allocations
From: Joonsoo Kim
Date: Wed Mar 11 2020 - 06:13:52 EST
2020ë 3ì 11ì (ì) ìí 5:51, Vlastimil Babka <vbabka@xxxxxxx>ëì ìì:
>
> On 3/6/20 9:01 PM, Rik van Riel wrote:
> > Posting this one for Roman so I can deal with any upstream feedback and
> > create a v2 if needed, while scratching my head over the next piece of
> > this puzzle :)
> >
> > ---8<---
> >
> > From: Roman Gushchin <guro@xxxxxx>
> >
> > Currently a cma area is barely used by the page allocator because
> > it's used only as a fallback from movable, however kswapd tries
> > hard to make sure that the fallback path isn't used.
>
> Few years ago Joonsoo wanted to fix these kinds of weird MIGRATE_CMA corner
> cases by using ZONE_MOVABLE instead [1]. Unfortunately it was reverted due to
> unresolved bugs. Perhaps the idea could be resurrected now?
>
> [1]
> https://lore.kernel.org/linux-mm/1512114786-5085-1-git-send-email-iamjoonsoo.kim@xxxxxxx/
Thanks for ccing, Vlastimil.
Recently, I'm working for resurrecting this idea.
I will send the preparation patches in this or next week.
Unresolved bugs of my patchset comes from the fact that ZONE_MOVABLE
which is used for
serving CMA memory in my patchset could have both lowmem(direct mapped) and
highmem(no direct mapped) pages on CONFIG_HIGHMEM enabled system.
For someone to use this memory, PageHighMem() should be called to
check if there is direct
mapping or not. Current PageHighMem() implementation is:
#define PageHighMem(__p) is_highmem_idx(page_zonenum(__p))
Since ZONE_MOVABLE has both typed pages, ZONE_MOVABLE should be considered
as highmem zone. In this case, PageHighMem() always returns TRUE for
all pages on
ZONE_MOVABLE and lowmem pages on ZONE_MOVABLE could make some troubles.
My plan to fix this problem is to change the PageHighMem() implementation.
#define PageHighMem(__p) (page_to_pfn(__p) >= max_low_pfn)
In fact, PageHighMem() is used to check whether direct mapping exists or not.
With this new implementation, regardless of the zone type of the page, we can
correctly check if the page is direct mapped or not. Changing the
name, PageHighMem(),
to !PageDirectMapped() is also planned but it will be done after
everything have settle down.
Unfortunately, before changing the implementation, I should check the
all call-sites
of PageHighMem() since there is some callers who use PageHighMem() to check
the zone type.
What my preparation patch will does is to correct this PageHighMem() usage.
After fixing it, I will try to merge the patchset [1].
Thanks.