[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <36300717-48b2-79ec-a97b-386e36bbd2a6@nvidia.com>
Date: Mon, 28 Feb 2022 13:14:54 -0800
From: John Hubbard <jhubbard@...dia.com>
To: David Hildenbrand <david@...hat.com>, Jens Axboe <axboe@...nel.dk>,
Jan Kara <jack@...e.cz>, Christoph Hellwig <hch@...radead.org>,
Dave Chinner <dchinner@...hat.com>,
"Darrick J . Wong" <djwong@...nel.org>,
Theodore Ts'o <tytso@....edu>,
Alexander Viro <viro@...iv.linux.org.uk>,
Miklos Szeredi <miklos@...redi.hu>,
Andrew Morton <akpm@...ux-foundation.org>,
Chaitanya Kulkarni <kch@...dia.com>
Cc: linux-block@...r.kernel.org, linux-fsdevel@...r.kernel.org,
linux-xfs@...r.kernel.org, linux-mm@...ck.org,
LKML <linux-kernel@...r.kernel.org>
Subject: Re: [RFC PATCH 1/7] mm/gup: introduce pin_user_page()
On 2/28/22 05:27, David Hildenbrand wrote:
...
>> diff --git a/mm/gup.c b/mm/gup.c
>> index 5c3f6ede17eb..44446241c3a9 100644
>> --- a/mm/gup.c
>> +++ b/mm/gup.c
>> @@ -3034,6 +3034,40 @@ long pin_user_pages(unsigned long start, unsigned long nr_pages,
>> }
>> EXPORT_SYMBOL(pin_user_pages);
>>
>> +/**
>> + * pin_user_page() - apply a FOLL_PIN reference to a page ()
>> + *
>> + * @page: the page to be pinned.
>> + *
>> + * Similar to get_user_pages(), in that the page's refcount is elevated using
>> + * FOLL_PIN rules.
>> + *
>> + * IMPORTANT: That means that the caller must release the page via
>> + * unpin_user_page().
>> + *
>> + */
>> +void pin_user_page(struct page *page)
>> +{
>> + struct folio *folio = page_folio(page);
>> +
>> + WARN_ON_ONCE(folio_ref_count(folio) <= 0);
>> +
>> + /*
>> + * Similar to try_grab_page(): be sure to *also*
>> + * increment the normal page refcount field at least once,
>> + * so that the page really is pinned.
>> + */
>> + if (folio_test_large(folio)) {
>> + folio_ref_add(folio, 1);
>> + atomic_add(1, folio_pincount_ptr(folio));
>> + } else {
>> + folio_ref_add(folio, GUP_PIN_COUNTING_BIAS);
>> + }
>> +
>> + node_stat_mod_folio(folio, NR_FOLL_PIN_ACQUIRED, 1);
>> +}
>> +EXPORT_SYMBOL(pin_user_page);
>> +
>> /*
>> * pin_user_pages_unlocked() is the FOLL_PIN variant of
>> * get_user_pages_unlocked(). Behavior is the same, except that this one sets
>
> I assume that function will only get called on a page that has been
> obtained by a previous pin_user_pages_fast(), correct?
>
Well, no. This is meant to be used in place of get_page(), for code that
knows that the pages will be released via unpin_user_page(). So there is
no special prerequisite there.
thanks,
--
John Hubbard
NVIDIA
Powered by blists - more mailing lists