Re: [PATCH v16 15/22] mm/compaction: do page isolation first in compaction

From: Alex Shi
Date: Sat Jul 18 2020 - 23:59:57 EST




å 2020/7/18 äå12:09, Alexander Duyck åé:
>>> I wonder if it wouldn't make sense to combine these two atomic ops
>>> with tests and the put_page into a single inline function? Then it
>>> could be possible to just do one check and if succeeds you do the
>>> block of code below, otherwise you just fall-through into the -EBUSY
>>> case.
>>>
>> Uh, since get_page changes page->_refcount, TestClearPageLRU changes page->flags,
>> So I don't know how to combine them, could you make it more clear with code?
> Actually it is pretty straight forward. Something like this:
> static inline bool get_page_unless_zero_or_nonlru(struct page *page)
> {
> if (get_page_unless_zero(page)) {
> if (TestClearPageLRU(page))
> return true;
> put_page(page);
> }
> return false;
> }
>
> You can then add comments as necessary. The general idea is you are
> having to do this in two different spots anyway so why not combine the
> logic? Although it does assume you can change the ordering of the
> other test above.


It doesn't look different with original code, does it?

Thanks
Alex