diff mbox series

mm/gup: don't check page lru flag before draining it

Message ID 1717488551-18053-1-git-send-email-yangge1116@126.com (mailing list archive)
State New
Headers show
Series mm/gup: don't check page lru flag before draining it | expand

Commit Message

Ge Yang June 4, 2024, 8:09 a.m. UTC
From: yangge <yangge1116@126.com>

If a page is added in pagevec, its ref count increases one, remove
the page from pagevec decreases one. Page migration requires the
page is not referrened by others except page mapping. Before
migrating a page, we should try to drain the page from pagevec in
case the page is in it, however, folio_test_lru() is not sufficient
to tell whether the page is in pagevec or not, if the page is in
pagevec, the migration will fail.

Remove the condition and drain lru once to ensure the page is not
referrenced by pagevec.

Signed-off-by: yangge <yangge1116@126.com>
---
 mm/gup.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Baolin Wang June 4, 2024, 8:56 a.m. UTC | #1
On 2024/6/4 16:09, yangge1116@126.com wrote:
> From: yangge <yangge1116@126.com>
> 
> If a page is added in pagevec, its ref count increases one, remove
> the page from pagevec decreases one. Page migration requires the
> page is not referrened by others except page mapping. Before
> migrating a page, we should try to drain the page from pagevec in
> case the page is in it, however, folio_test_lru() is not sufficient
> to tell whether the page is in pagevec or not, if the page is in
> pagevec, the migration will fail.
> 
> Remove the condition and drain lru once to ensure the page is not
> referrenced by pagevec.

This looks sane to me and seems a simple way to fix.

> Signed-off-by: yangge <yangge1116@126.com>
> ---
>   mm/gup.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/mm/gup.c b/mm/gup.c
> index ca0f5ce..890dcbc 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -2411,7 +2411,7 @@ static unsigned long collect_longterm_unpinnable_pages(
>   			continue;
>   		}
>   
> -		if (!folio_test_lru(folio) && drain_allow) {
> +		if (drain_allow) {
>   			lru_add_drain_all();
>   			drain_allow = false;
>   		}

You should rebase your code on the latest mm-unstable branch, as 
collect_longterm_unpinnable_pages() in the upstream has been replaced 
with collect_longterm_unpinnable_folios().
Ge Yang June 4, 2024, 9:18 a.m. UTC | #2
在 2024/6/4 下午4:56, Baolin Wang 写道:
> 
> 
> On 2024/6/4 16:09, yangge1116@126.com wrote:
>> From: yangge <yangge1116@126.com>
>>
>> If a page is added in pagevec, its ref count increases one, remove
>> the page from pagevec decreases one. Page migration requires the
>> page is not referrened by others except page mapping. Before
>> migrating a page, we should try to drain the page from pagevec in
>> case the page is in it, however, folio_test_lru() is not sufficient
>> to tell whether the page is in pagevec or not, if the page is in
>> pagevec, the migration will fail.
>>
>> Remove the condition and drain lru once to ensure the page is not
>> referrenced by pagevec.
> 
> This looks sane to me and seems a simple way to fix.
> 
>> Signed-off-by: yangge <yangge1116@126.com>
>> ---
>>   mm/gup.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/mm/gup.c b/mm/gup.c
>> index ca0f5ce..890dcbc 100644
>> --- a/mm/gup.c
>> +++ b/mm/gup.c
>> @@ -2411,7 +2411,7 @@ static unsigned long 
>> collect_longterm_unpinnable_pages(
>>               continue;
>>           }
>> -        if (!folio_test_lru(folio) && drain_allow) {
>> +        if (drain_allow) {
>>               lru_add_drain_all();
>>               drain_allow = false;
>>           }
> 
> You should rebase your code on the latest mm-unstable branch, as 
> collect_longterm_unpinnable_pages() in the upstream has been replaced 
> with collect_longterm_unpinnable_folios().
Ok, thanks
diff mbox series

Patch

diff --git a/mm/gup.c b/mm/gup.c
index ca0f5ce..890dcbc 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2411,7 +2411,7 @@  static unsigned long collect_longterm_unpinnable_pages(
 			continue;
 		}
 
-		if (!folio_test_lru(folio) && drain_allow) {
+		if (drain_allow) {
 			lru_add_drain_all();
 			drain_allow = false;
 		}