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.