> +     switch (type) {
> +     case MF_MSG_KERNEL:
> +     case MF_MSG_UNKNOWN:
> +             return true;
> +     case MF_MSG_KERNEL_HIGH_ORDER:
> +             /*
> +              * Rule out a concurrent buddy allocation: give the
> +              * allocator a moment to finish prep_new_page() and
> +              * re-check. A genuine high-order kernel tail page stays
> +              * unowned; an in-flight allocation will have bumped the
> +              * refcount, attached a mapping, or placed the page on
> +              * an LRU by now.
> +              */
> +             p = pfn_to_online_page(pfn);
> +             if (!p)
> +                     return true;
> +             /*
> +              * Yield so a concurrent allocator on another CPU can
> +              * finish prep_new_page() and have its writes become
> +              * visible before we resample the page state.
> +              */
> +             cpu_relax();
> +             return page_count(p) == 0 &&
> +                    !PageLRU(p) &&
> +                    !page_mapped(p) &&
> +                    !page_folio(p)->mapping &&
> +                    !is_free_buddy_page(p);

I don't get what you are doing here. The right way to check for a tail page is
not by checking the refcount.

Further, you are not holding a folio reference? If so, calling
page_mapped/folio_mapped is shaky. On concurrent folio split you can trigger a
VM_WARN_ON_FOLIO().


Maybe folio_snapshot() is what you are looking for, if you are in fact not
holding a reference?

-- 
Cheers,

David

Reply via email to