Hi, Matthew,
On 7/16/2024 8:12 AM, Matthew Wilcox wrote:
I was going to send this patch:
+++ b/mm/madvise.c
@@ -1136,9 +1136,10 @@ static int madvise_inject_error(int behavior,
/*
* When soft offlining hugepages, after migrating the page
* we dissolve it, therefore in the second loop "page" will
- * no longer be a compound page.
+ * no longer be part of a large folio.
*/
- size = page_size(compound_head(page));
+ size = folio_size(page_folio(page));
+ start = start & ~(size - 1);
if (behavior == MADV_SOFT_OFFLINE) {
pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n",
because right now if you start in the middle of (e.g.) an order-4 folio
followed by an order-0 folio, you'll skip the order-0 folio immediately
following it.
But then I realised that we can come to this path in the middle of
a large file-backed folio that's mapped misaligned and has a COW page
in the middle, and the whole thing is just misguided. So I gave up.
Anyone want to take a crack at fixing & testing this?
Thanks for the report.
My understanding is, we should run folio_test_large() upfront, and treat
both ends as special case
unless they're folio_size aligned, and iterate in folio_size for the
middle. I think this should work for
hugetlb and large folio in general, but I need to confirm this with tests.
Any thoughts?
BTW, unpoison does look right, I can address them together.
thanks,
-jane