[to-be-updated] mm-compaction-fix-the-total_isolated-in-strict-mode.patch removed from -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The quilt patch titled
     Subject: mm/compaction: fix the total_isolated in strict mode
has been removed from the -mm tree.  Its filename was
     mm-compaction-fix-the-total_isolated-in-strict-mode.patch

This patch was dropped because an updated version will be issued

------------------------------------------------------
From: Qiang Liu <liuq131@xxxxxxxxxxxxxxx>
Subject: mm/compaction: fix the total_isolated in strict mode
Date: Sat, 2 Nov 2024 20:16:21 +0000

If the last cycle reads bogus compound_order() and blockpfn > end_pfn
occurs, it is possible that total_isolated will be less than nr_scanned. 
In this case, strict mode should return 0, but the "if (strict &&
blockpfn < end_pfn)" statement cannot recognize this situation.

We assume that the block we are currently processing is distributed as
follows:
0   1   2                                                            511
--------------------------------------------------
|   |   |                                                             |
--------------------------------------------------
Index 0 and 1 are both pages with an order of 0.
Index 2 has a bogus order (let's assume the order is 9).
When the for loop reaches index 2, it will enter the following code:

/*
 * For compound pages such as THP and hugetlbfs, we can save
 * potentially a lot of iterations if we skip them at once.
 * The check is racy, but we can consider only valid values
 * and the only danger is skipping too much.
 */
if (PageCompound(page)) {
    const unsigned int order = compound_order(page);
    if (blockpfn + (1UL << order) <= end_pfn) {
        blockpfn += (1UL << order) - 1;
        page += (1UL << order) - 1;
        nr_scanned += (1UL << order) - 1;
    }
    goto isolate_fail;

}

After exiting the for loop:
blockpfn =basepfn+ 2+2^9 = basepfn+514;
endpfn  = basepfn +512;
total_isolated = 2;
nr_scanned = 514;

/*
 * Be careful to not go outside of the pageblock.
 */
if (unlikely(blockpfn > end_pfn))
        blockpfn = end_pfn;
So this can happen

/*
 * If strict isolation is requested by CMA then check that all the
 * pages requested were isolated. If there were any failures, 0 is
 * returned and CMA will fail.
 */
if (strict && blockpfn < end_pfn)
        total_isolated = 0;

If processed according to the old code, it will not enter the if statement
to reset total_isolated, but the correct handling is to reset
total_isolated to 0.

Link: https://lkml.kernel.org/r/20241102201621.95291-1-liuq131@xxxxxxxxxxxxxxx
Signed-off-by: Qiang Liu <liuq131@xxxxxxxxxxxxxxx>
Cc: Laura Abbott <labbott@xxxxxxxxxx>
Cc: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 mm/compaction.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/mm/compaction.c~mm-compaction-fix-the-total_isolated-in-strict-mode
+++ a/mm/compaction.c
@@ -700,7 +700,7 @@ isolate_fail:
 	 * pages requested were isolated. If there were any failures, 0 is
 	 * returned and CMA will fail.
 	 */
-	if (strict && blockpfn < end_pfn)
+	if (strict && (blockpfn < end_pfn || total_isolated != nr_scanned))
 		total_isolated = 0;
 
 	cc->total_free_scanned += nr_scanned;
_

Patches currently in -mm which might be from liuq131@xxxxxxxxxxxxxxx are






[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux