From nobody Tue Feb 10 05:25:59 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC1C9330670 for ; Sun, 11 Jan 2026 12:19:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768133993; cv=none; b=d5w3/Mi9TdWjAaKgQW5CKrsvprz39RPAF6loNN3L9m9DLMdaLQX/Ua7qhZNpe1WmPlovU2I/SF1qHHHUzHYsmHPt1FZ1Q4pEw2iZl/lyfj6UffN/Bnq9T2S7ncf9F4lMC8d6dowP7T/E58LJivobxWdT3AoIzQJteZvKkUhWwf0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768133993; c=relaxed/simple; bh=BwOmIVHUpQGCoutNoM03UUVYggDibsP0l5ejwo0bs+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jFd0Bfb+Z2AN80qDuPzcLA1jAwnYRh3GPbdRc8IvRNkoUjs1mplTHyMfomQc/U8MVwHPMQ62a/4AoI5jz7ApU2eon/kJJ6trcFVG2ZMu4Dk4OjT/tLT/iE0zALGMDYIYiEUHS3D6mOfDe3z1IHHUq+CPOxZjWUxytlY43E4vW2g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YxlvtFfD; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YxlvtFfD" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2a0fe77d141so42051565ad.1 for ; Sun, 11 Jan 2026 04:19:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768133991; x=1768738791; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zzjqHFHsTu/NzGPB+PE+U2CGfVjIazwd87Qrshcmnl0=; b=YxlvtFfDjXDnfFVjseBKrzhUSbc/BGFyWnkNwC0a41/hPHdg8hJKROfC9LbAlWITq8 1XdD9mA8Sqi/piUCtGXYyKWhYNIB8/WRV+d8hoP/7iN9isFkfXQdwfjrt0EDSJre8uUh Wo7p0/7Dp91hjiIOKwxkoLbqyfCLUUgKfMcTKoloPJArjZxsqbJa+LY/IJt2HsepJDnx Aq2DHNzNDal5DCSn0wGpdaSkPuAjJUYXVdpSJn/nlPDpNCJ3XLB9CherQe7itSRCbgP4 kLItmcJDvjCMzaykAjg3yvnlvN9rundEFV5O+331vZoLfYrVCDt8mR3E9nyYllTZ6JvQ R3iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768133991; x=1768738791; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zzjqHFHsTu/NzGPB+PE+U2CGfVjIazwd87Qrshcmnl0=; b=egCZywv+HTXicW0Lnkr0eFOLve80HxkzWGtCrDHb+Q1Nq5EaWk+57By0/ZYCih+K8Y Zf1O3pZWFEsjXtgWs3cXxfhe64pPZsCX0J24WVziW5LngXoPLhw4V1qfZ4QYVZLPW/qU WBUn3i3cZTdSyTj3tuFdE/0Tr6hcJYFNfHp0+bZkl78I9AXXXBOhwYJU/dkJVk0L/GtF wRo/5OwKMfSLxX4ljO4u201G/sbTx3k39LXHyrVyCKJAzPegb9qhbiXMISHB2mQjsns6 H3/2gYUTs7LCIectZDZaUsDbzEuVTykL86Iby8sGHx44AhswNs5Aui7ZHwonXlIJZUx4 wzZg== X-Forwarded-Encrypted: i=1; AJvYcCUjVFPYvOy38q0PTomnQ1p0R9GhJjxnstzg+gqP4qE/nqGwtL9WL9xtPqcFWhsefaYNIp7XnDHIYJZcoK4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9nYax40nx3Kz5xb399Q4YNlDAjLH22SZKacMNLvqjL3hJZ3EC C59Usn5i8gLop/KW9oKlrY37Lo3eh+8EHyAAdWb9qxHhWiZW9SbksKys X-Gm-Gg: AY/fxX6wE4l8C/fmnnnRNLk/YJEY1i+sOyA3kT/0xBj/CY2qTCy/tNCRNUoDylHQgMH jW2J1WTpFz22j7LDk829GBmlr/MCVSvFLuj/nCNUktkLBHrF3RcRVuEflytU5ZmbybUi/W4q2nZ Go4z/qY0ygcTSKyRuQCQxI6Qrq9m+ViH8vsoLJxuq+UO99XHY4ADw13bdECTMyQRO0hMjIVQ0+a TD1ZhEchkjnNf//3t8e2PNbRBXEnAHL/CQ8MvdlEPOOb4t0vz2NKVogvDrPBDMChtCXfSRuUGrx l3Riw4wBwvFvG0doSNx6XmVOlXyuGuWloVJrLHRs5v5IshwBUzF1uJjJMKkSFjXfmO5ZuU1g3wx ZzyrzTFyUcdNCBr75dP1ub103FPvy2kVXfflRJQFS9HbkBfdT6qJDYYrhoniS/il2fvUGIGnMmH eh1R1qhrxx9cB2tjbbLpY6GHiGz12+qA== X-Google-Smtp-Source: AGHT+IEoqWK3ugDB7/VD7wzPQM66g18mZY1tdzLq1qScr45zyMjWbfKXpi/m32xd7/USrBdm6hou+g== X-Received: by 2002:a17:902:c402:b0:2a0:97d2:a265 with SMTP id d9443c01a7336-2a3ee452277mr138508085ad.14.1768133991082; Sun, 11 Jan 2026 04:19:51 -0800 (PST) Received: from localhost.localdomain ([221.227.246.159]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-34f6b07029fsm4877954a91.2.2026.01.11.04.19.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Jan 2026 04:19:50 -0800 (PST) From: Vernon Yang X-Google-Original-From: Vernon Yang To: akpm@linux-foundation.org, david@kernel.org Cc: lorenzo.stoakes@oracle.com, ziy@nvidia.com, dev.jain@arm.com, baohua@kernel.org, lance.yang@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Vernon Yang Subject: [PATCH mm-new v4 3/6] mm: khugepaged: just skip when the memory has been collapsed Date: Sun, 11 Jan 2026 20:19:06 +0800 Message-ID: <20260111121909.8410-4-yanglincheng@kylinos.cn> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260111121909.8410-1-yanglincheng@kylinos.cn> References: <20260111121909.8410-1-yanglincheng@kylinos.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The following data is traced by bpftrace on a desktop system. After the system has been left idle for 10 minutes upon booting, a lot of SCAN_PMD_MAPPED or SCAN_NO_PTE_TABLE are observed during a full scan by khugepaged. @scan_pmd_status[1]: 1 ## SCAN_SUCCEED @scan_pmd_status[6]: 2 ## SCAN_EXCEED_SHARED_PTE @scan_pmd_status[3]: 142 ## SCAN_PMD_MAPPED @scan_pmd_status[2]: 178 ## SCAN_NO_PTE_TABLE total progress size: 674 MB Total time : 419 seconds ## include khugepaged_scan_sleep_millisecs The khugepaged_scan list save all task that support collapse into hugepage, as long as the task is not destroyed, khugepaged will not remove it from the khugepaged_scan list. This exist a phenomenon where task has already collapsed all memory regions into hugepage, but khugepaged continues to scan it, which wastes CPU time and invalid, and due to khugepaged_scan_sleep_millisecs (default 10s) causes a long wait for scanning a large number of invalid task, so scanning really valid task is later. After applying this patch, when the memory is either SCAN_PMD_MAPPED or SCAN_NO_PTE_TABLE, just skip it, as follow: @scan_pmd_status[6]: 2 @scan_pmd_status[3]: 147 @scan_pmd_status[2]: 173 total progress size: 45 MB Total time : 20 seconds Signed-off-by: Vernon Yang --- mm/khugepaged.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 5c6015ac7b5e..6df2857d94c6 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -68,7 +68,10 @@ enum scan_result { static struct task_struct *khugepaged_thread __read_mostly; static DEFINE_MUTEX(khugepaged_mutex); =20 -/* default scan 8*HPAGE_PMD_NR ptes (or vmas) every 10 second */ +/* + * default scan 8*HPAGE_PMD_NR ptes, pmd_mapped, no_pte_table or vmas + * every 10 second. + */ static unsigned int khugepaged_pages_to_scan __read_mostly; static unsigned int khugepaged_pages_collapsed; static unsigned int khugepaged_full_scans; @@ -1267,7 +1270,7 @@ static enum scan_result hpage_collapse_scan_pmd(struc= t mm_struct *mm, result =3D find_pmd_or_thp_or_none(mm, start_addr, &pmd); if (result !=3D SCAN_SUCCEED) { if (cur_progress) - *cur_progress =3D HPAGE_PMD_NR; + *cur_progress =3D 1; goto out; } =20 @@ -1276,7 +1279,7 @@ static enum scan_result hpage_collapse_scan_pmd(struc= t mm_struct *mm, pte =3D pte_offset_map_lock(mm, pmd, start_addr, &ptl); if (!pte) { if (cur_progress) - *cur_progress =3D HPAGE_PMD_NR; + *cur_progress =3D 1; result =3D SCAN_NO_PTE_TABLE; goto out; } @@ -2347,9 +2350,6 @@ static enum scan_result hpage_collapse_scan_file(stru= ct mm_struct *mm, unsigned continue; } =20 - if (cur_progress) - *cur_progress +=3D folio_nr_pages(folio); - if (folio_order(folio) =3D=3D HPAGE_PMD_ORDER && folio->index =3D=3D start) { /* Maybe PMD-mapped */ @@ -2361,9 +2361,14 @@ static enum scan_result hpage_collapse_scan_file(str= uct mm_struct *mm, unsigned * returning. */ folio_put(folio); + if (cur_progress) + *cur_progress +=3D 1; break; } =20 + if (cur_progress) + *cur_progress +=3D folio_nr_pages(folio); + node =3D folio_nid(folio); if (hpage_collapse_scan_abort(node, cc)) { result =3D SCAN_SCAN_ABORT; --=20 2.51.0