On Mon, Jun 19, 2023 at 03:37:30PM -0400, Peter Xu wrote: > Here what I can do is still guard this try_grab_folio() and fail the GUP if > for any reason it failed. Perhaps then it means I'll also keep that one > untouched in hugetlb_follow_page_mask() too. But I suppose keeping the > WARN_ON_ONCE() seems still proper. Here's the outcome that I plan to post in the new version, taking care of try_grab_folio() failures even if it happens, meanwhile remove the compound_head() redundancy on the page. __get_user_pages(): ... ===8<=== /* * This must be a large folio (and doesn't need to * be the whole folio; it can be part of it), do * the refcount work for all the subpages too. * * NOTE: here the page may not be the head page * e.g. when start addr is not thp-size aligned. * try_grab_folio() should have taken care of tail * pages. */ if (page_increm > 1) { struct folio *folio; /* * Since we already hold refcount on the * large folio, this should never fail. */ folio = try_grab_folio(page, page_increm - 1, foll_flags); if (WARN_ON_ONCE(!folio)) { /* * Release the 1st page ref if the * folio is problematic, fail hard. */ gup_put_folio(page_folio(page), 1, foll_flags); ret = -EFAULT; goto out; } } ===8<=== Thanks, -- Peter Xu