> + 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