]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mm/MADV_COLLAPSE: set EAGAIN on unexpected page refcount
authorZach O'Keefe <zokeefe@google.com>
Wed, 25 Jan 2023 01:57:37 +0000 (17:57 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 17 Feb 2023 02:11:59 +0000 (18:11 -0800)
During collapse, in a few places we check to see if a given small page has
any unaccounted references.  If the refcount on the page doesn't match our
expectations, it must be there is an unknown user concurrently interested
in the page, and so it's not safe to move the contents elsewhere.
However, the unaccounted pins are likely an ephemeral state.

In this situation, MADV_COLLAPSE returns -EINVAL when it should return
-EAGAIN.  This could cause userspace to conclude that the syscall
failed, when it in fact could succeed by retrying.

Link: https://lkml.kernel.org/r/20230125015738.912924-1-zokeefe@google.com
Fixes: 7d8faaf15545 ("mm/madvise: introduce MADV_COLLAPSE sync hugepage collapse")
Signed-off-by: Zach O'Keefe <zokeefe@google.com>
Reported-by: Hugh Dickins <hughd@google.com>
Acked-by: Hugh Dickins <hughd@google.com>
Reviewed-by: Yang Shi <shy828301@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/khugepaged.c

index 90acfea40c13c9e13d48b0868bb308251bce4cf4..a26a28e3738c1075b5c0856b2989f3c3e92722b0 100644 (file)
@@ -2611,6 +2611,7 @@ static int madvise_collapse_errno(enum scan_result r)
        case SCAN_CGROUP_CHARGE_FAIL:
                return -EBUSY;
        /* Resource temporary unavailable - trying again might succeed */
+       case SCAN_PAGE_COUNT:
        case SCAN_PAGE_LOCK:
        case SCAN_PAGE_LRU:
        case SCAN_DEL_PAGE_LRU: