linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: "zhaoyang.huang" <zhaoyang.huang@unisoc.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Alistair Popple <apopple@nvidia.com>,
	John Hubbard <jhubbard@nvidia.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Zhaoyang Huang <huangzhaoyang@gmail.com>,
	steve.kang@unisoc.com
Subject: Re: [PATCH] mm: gup: fix infinite loop within __get_longterm_locked
Date: Mon, 20 Jan 2025 21:14:10 +0100	[thread overview]
Message-ID: <4326b3f1-f99d-4be8-97fd-286c75358635@redhat.com> (raw)
In-Reply-To: <20250120092604.3590285-1-zhaoyang.huang@unisoc.com>

On 20.01.25 10:26, zhaoyang.huang wrote:
> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> 
> Infinite loop within __get_longterm_locked detected in an unique usage
> of pin_user_pages where the VA's pages are all unpinnable(vm_ops->fault
> function allocate pages via cma_alloc for hardware purpose and leave them
> out of LRU) Fixing this by have 'collected' reflect the actual number> of pages in movable_folio_list.

Maybe something like:

"
We can run into an infinite loop in __get_longterm_locked() when 
collect_longterm_unpinnable_folios() finds only folios that are isolated 
from the LRU or were never added to the LRU. This can happen when all 
folios to be pinned are never added to the LRU, for example when 
vm_ops->fault allocated pages using cma_alloc() and never added them to 
the LRU.

We incorrectly update the "collected" variable even if nothing was 
collected. Fix it by incrementing "collected" only when we isolated a 
folio and added it to the list of folios to migrate.
"

I assume, long-term these things will not actually be folios, but pages, 
and we'll have to skip them in different code -- or assume they can be 
longterm pinned even on CMA because they are allocated by the CMA-owning 
driver.

> 
> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> ---
>   mm/gup.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/gup.c b/mm/gup.c
> index 3b75e631f369..2231ce7221f9 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -2341,8 +2341,6 @@ static unsigned long collect_longterm_unpinnable_folios(
>   		if (folio_is_longterm_pinnable(folio))
>   			continue;
>   
> -		collected++;
> -
>   		if (folio_is_device_coherent(folio))
>   			continue;
>   
> @@ -2359,6 +2357,8 @@ static unsigned long collect_longterm_unpinnable_folios(
>   		if (!folio_isolate_lru(folio))
>   			continue;
>   
> +		collected++;
> +
>   		list_add_tail(&folio->lru, movable_folio_list);
>   		node_stat_mod_folio(folio,
>   				    NR_ISOLATED_ANON + folio_is_file_lru(folio),

What if folio_isolate_hugetlb() succeeded? The return value can tell us 
if it actually succeeded.

-- 
Cheers,

David / dhildenb



  parent reply	other threads:[~2025-01-20 20:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-20  9:26 zhaoyang.huang
2025-01-20 19:34 ` John Hubbard
2025-01-21  1:28   ` Zhaoyang Huang
2025-01-20 20:14 ` David Hildenbrand [this message]
2025-01-21  1:31   ` Zhaoyang Huang
2025-01-21  7:49     ` David Hildenbrand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4326b3f1-f99d-4be8-97fd-286c75358635@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=huangzhaoyang@gmail.com \
    --cc=jhubbard@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=steve.kang@unisoc.com \
    --cc=zhaoyang.huang@unisoc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox