From nobody Tue Feb 10 14:49:45 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.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 C4A642D7DF6 for ; Sun, 4 Jan 2026 05:41:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767505317; cv=none; b=AYXgMSs9h05sMPOOXTQBamc9q3hQOjH/fytf2mngMLbM4svp0hl5pKNqAnzd4dT7ss5zHFdEh5EeIwjTF6WoWNpxrlNr/RakymWVtd+BIQzQUOXLir7CIm243Os8XPhExehxKFrYcPXKsC8kuQn2b+tty/peXB8s+YpRRnmpxrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767505317; c=relaxed/simple; bh=9yOpQtH2zcc67JQBBuQEcbumnyamBcAx/g5ECxUw7J0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ACYgfpNU3aGA6riPt1OdyQz5z9JJW/aDrY1COzKFlmBl1wo22Swzhw9X0mmYARn6tky4/02x+nxDugRzJTFPMseP8L1VxYG7xS9m3GYDxy49z9CP+UINN9a4g44wocWefIf2fGmaigq9GR0K86+wYsttFWPCOdSo4Ib+EtBSq4g= 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=B8EQ0A1m; arc=none smtp.client-ip=209.85.210.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="B8EQ0A1m" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-8035e31d834so10701031b3a.2 for ; Sat, 03 Jan 2026 21:41:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767505315; x=1768110115; 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=QUwkpMJcxEqSkkbLVyH1UfcFj9WYjjkK0bK86vvl/Zk=; b=B8EQ0A1mK3QkIR5vFL+H9z4skEKLnroOxkfYada6JU5JQDUghs/DLc9m68H54hyaiT qLQbAbCCcJdHACT+CGpOb3hdY17VQHHdj6hRUSKLWdD7RvStHRxXtjWtdkwk7pEHCYIl fcmdPrB3nj+WzBSWbLWJuhx0wHppmaLaIXH2ppGwt4apc06MFi5tOrcZUo2+va0GLFZu 4bQ3L9xC9Dq15PlX5SpUo0vT42YhHRId7jLFFawxIQcvxLtPLyiAsF1tDQZKZ3oUjZ2b Z+zKN1EuSa68vftpD77lPJGTAPCHrPp+VlCKNe6/+qvR1L+5pdywDaOWKCd9p5/MQN7N XumQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767505315; x=1768110115; 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=QUwkpMJcxEqSkkbLVyH1UfcFj9WYjjkK0bK86vvl/Zk=; b=lG5oVlbwKKET+3aNSM9hXKScz54VauYd8mbpRb43zBwyXsPh3VE9punY1WwzXYVqxe 49aLfhRA+JUh9wMfyplcpFSuJeVlx7YuBP3TJADQcI+rABS1sBVbLExjtkjTKQCtjGkc eSUxuopWM7+FzEAHoze7+L0WTJr8iA6WY4BZ1eWRJOWnSwguostH+NyeDzbo5yZ1e8ZO /hP+Wi7skZuj1yBO9SkPg1JUEzaHAvJ6md8nXBtGBjQqMsOKW+La0FKuqqU5wUahWV2B 1afpSVLykT4D1Zkm1ogLnn1+q/bRvtYnDykE++Rff0kct5W3RENG4P27gQSTMEBoyVuq M7WQ== X-Forwarded-Encrypted: i=1; AJvYcCX4iuwPLEGzJK5kRM8JRrPreAJ3mFEuZ9IFIrqGv/VmIKHYtX8fgeDnM+Dn7y1UaBG3pxOJXR02WIeAA0Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwlTVa4GrF54nMN3S/I1XN4nYjne/k1A6SludVAJMZfrXiOFXIG JiO9eDLxw3JGVNJzaOqWwn3A+UsjeH0/BhbWfJ79Sy0fD5aMRWB8g1+P X-Gm-Gg: AY/fxX5V8JLukM8d3VlEyntfTs/fjoh/b3/N43ZARJTp3xd45mrctRpuCKf6aWxxONv ZRPPIUrl1cLEtVDg83xH6YSZYVbLc+o5+QLvyKLHt1abaNkx3y8nu0U6F1Z1rav/r1O7DPy9C6h 8MHvjOrfMQftPT7JFJiLSRyFK2KOhBZ9ehoAc/SS3RcQ2GeHqv0u6btchE42MQL1mRNVBm+PEiG 2KT+WZ5s0Fjmhy0bLMHFrll3Rqqj7iIktObq0ilFLoWwa6doWFzOywYSskJT9VKA4816wapba0o 9bsYRRLQGFJ7Ks46Al+Puw6mkRtN+FtuXn/UMFxGjxnmr/UlUicG2gHuXSnhGmWxURhar962Jp8 xLfNEWEY9VwPCaCN+acsmJ4yrHdJu8X4I2BJShOYGpSxLups2aCi1kEmTSQam8ca3m/+yRA5MEL Bz18JePrULdKsuKQVx4rWjnry51NL6 X-Google-Smtp-Source: AGHT+IGwHwdxXTQyKxKpW2n1/+t3fWr60BwAf/OcttAH9+pfbFW7cQq89AcUb3EhW+mxdXl3KrSRHA== X-Received: by 2002:a05:6a00:3385:b0:7e8:43f5:bd1a with SMTP id d2e1a72fcca58-7ff6735e923mr38179784b3a.47.1767505315075; Sat, 03 Jan 2026 21:41:55 -0800 (PST) Received: from localhost.localdomain ([121.232.80.251]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7ff7b31c479sm44378305b3a.24.2026.01.03.21.41.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Jan 2026 21:41:54 -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, richard.weiyang@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Vernon Yang Subject: [PATCH v3 3/6] mm: khugepaged: just skip when the memory has been collapsed Date: Sun, 4 Jan 2026 13:41:09 +0800 Message-ID: <20260104054112.4541-4-yanglincheng@kylinos.cn> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260104054112.4541-1-yanglincheng@kylinos.cn> References: <20260104054112.4541-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 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 4b124e854e2e..30786c706c4a 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -66,7 +66,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; @@ -1264,7 +1267,7 @@ static int hpage_collapse_scan_pmd(struct mm_struct *= mm, =20 result =3D find_pmd_or_thp_or_none(mm, start_addr, &pmd); if (result !=3D SCAN_SUCCEED) { - _progress =3D HPAGE_PMD_NR; + _progress =3D 1; goto out; } =20 @@ -1272,7 +1275,7 @@ static int hpage_collapse_scan_pmd(struct mm_struct *= mm, nodes_clear(cc->alloc_nmask); pte =3D pte_offset_map_lock(mm, pmd, start_addr, &ptl); if (!pte) { - _progress =3D HPAGE_PMD_NR; + _progress =3D 1; result =3D SCAN_NO_PTE_TABLE; goto out; } @@ -2336,8 +2339,6 @@ static int hpage_collapse_scan_file(struct mm_struct = *mm, unsigned long addr, continue; } =20 - _progress +=3D folio_nr_pages(folio); - if (folio_order(folio) =3D=3D HPAGE_PMD_ORDER && folio->index =3D=3D start) { /* Maybe PMD-mapped */ @@ -2349,9 +2350,12 @@ static int hpage_collapse_scan_file(struct mm_struct= *mm, unsigned long addr, * returning. */ folio_put(folio); + _progress++; break; } =20 + _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