Messages in this thread |  | | Subject | Re: [PATCH v11 01/25] mm/gup: factor out duplicate code from four routines | From | John Hubbard <> | Date | Wed, 18 Dec 2019 14:15:53 -0800 |
| |
On 12/18/19 7:52 AM, Kirill A. Shutemov wrote: > On Mon, Dec 16, 2019 at 02:25:13PM -0800, John Hubbard wrote: >> +static void put_compound_head(struct page *page, int refs) >> +{ >> + /* Do a get_page() first, in case refs == page->_refcount */ >> + get_page(page); >> + page_ref_sub(page, refs); >> + put_page(page); >> +} > > It's not terribly efficient. Maybe something like: > > VM_BUG_ON_PAGE(page_ref_count(page) < ref, page); > if (refs > 2) > page_ref_sub(page, refs - 1); > put_page(page); > > ?
OK, but how about this instead? I don't see the need for a "2", as that is a magic number that requires explanation. Whereas "1" is not a magic number--here it means: either there are "many" (>1) refs, or not.
And the routine won't be called with refs less than about 32 (2MB huge page, 64KB base page == 32 subpages) anyway.
VM_BUG_ON_PAGE(page_ref_count(page) < refs, page); /* * Calling put_page() for each ref is unnecessarily slow. Only the last * ref needs a put_page(). */ if (refs > 1) page_ref_sub(page, refs - 1); put_page(page);
thanks, -- John Hubbard NVIDIA
|  |