From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f41.google.com (mail-dl1-f41.google.com [74.125.82.41]) (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 18F2C478E3D for ; Wed, 1 Jul 2026 11:47:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.41 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782906465; cv=none; b=X6jvJWtCBkvlDxYkES4jBph/evFEUdakZSPCsie9stOwtXHU+WFfZtP3lxliB94RjT5ErRf595dzY0WTaEJANWghMGxFrvCq9TICsQdlgsREV1avBwre3LCnt3bCPSKlkB6yWQG0CDnS5xrSshC98gOFyJma+JzLcoVWC5Ze8Ks= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782906465; c=relaxed/simple; bh=JAzsI46xUUb7MY3eGvanhcLRnqm8mrwI8JOlp9MJq1g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AbZliggkWjW8S7S66V46n3SETz8rFCuke8t488cUyNT0GDqNwt1yIMJh01h0tn+GyqSox84n7Cg3lAYM3lEg6se6sm3KybAVl/smLdX9rTAlyRXAhGDjl67aA5AtjgVACASr0f9+W70E98+dy8Lj/vUvlza0W4i3Ql1FOJ0zPao= 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=X/KqWBXG; arc=none smtp.client-ip=74.125.82.41 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="X/KqWBXG" Received: by mail-dl1-f41.google.com with SMTP id a92af1059eb24-13b2d7dc8d1so520432c88.1 for ; Wed, 01 Jul 2026 04:47:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782906463; x=1783511263; 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=g5mNQO60b8nT7uv9aRlYZCg/3s0UiXqqPoo14TkqY90=; b=X/KqWBXGibQjoMlDuRsY0+Z58ny8DUUp4Hj3SPCw32GK90embzlTiU6NyXqlCjgVyQ OA1Xcmxcnlhi1J5yNWoWEEkt/NWlZQdcMBsxo2yUS27Th47n1t/ilDYdBDxOsjIVYF8s 0UeoH3tyJa+Ed6JSSkErBoj617g5o7EWXffcvts2bqzGQl5OY9bVlohUZJKCcvy2OHiQ gRmNKxIz//H070vrK/ZyGOdDRw6iWDGcQqwKCJV/HeTmrIVXr7YLqoFfwtYrDeFJpRdJ Ssp2S5AGy28hBwQ8cd8w39T5PrU/BG8MZ24z4RVWLGTmek15Y0abDTJyWSimI6Me0vnl L2cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782906463; x=1783511263; 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=g5mNQO60b8nT7uv9aRlYZCg/3s0UiXqqPoo14TkqY90=; b=G+QaUrB7C5sDQvpVcySg9EweJBBwAJEZMaW/i5ZTPwiKIkXAqUdEnq4N0DuhmXZPGO u9VSkvT28pHE9e2IYLORSkaqwllFzdbwcU079d2rgLqQhE4tv/6x15XTM9MQWNPjohz3 dvJNgZIKfyVzRu6VwbEAoQoeePsOLO5kUhTjzSr/7p9N8QIUowjJ8RRfWmdzsF/mjNOS C//NmMMZjG+XoLlRUlfrpU9+I1dbk/m/G4rTaii3EcijL/Pem/toG/0JK7dWRpEmZc+A ejbFZ2YWK1zV6vg4P7aBycu6EMh8TGKJL7sM5s3oLkGABl46YAXMhAfj9/Z9Icbx3k/u Qk4w== X-Gm-Message-State: AOJu0YzipavpqaQ9j3l7bQFPeVOqQL/qUfgTG/JmXHKxPUEwYM8vW/db q9CvD/3g+zJel4wBvB8pPqHa08X5lY8tKpkK9N7/LHd9mkTaLEHNhR7OlDVtoOTm X-Gm-Gg: AfdE7cl6BF4vPJClpMnubrYspUfCcvUwtdt1ERg+mOYYaSNEtvCoT7/of13dlMAc6Z/ LJ7KNAdouA2awEJ7jjbfvc4J0q2QcCjH05r4G93+KJ2hrTF0vEtfFFuehjDJdnNHIkb9tvRPmeA XzBhyv08GUntdbWIIN8gX13Jxa3KhkiHG5TBtJYSu9LaK8A7c85JkAO3aCSSxb+BrWKfqF+4upy FgXmCJLaI47xO/gmn52H8kOD9tWxij4vFqREToGsfu9La90t9GcHf+znFNCuBFylb45bozook44 Sp/GXotykOFhFPXaQ9QLEMnbfXLNVy0htYVFPJzZwjM8V9GbdZDycxplpLfJ0YPYLYnP1Du5vH3 KR1JCzxA9E4UBQ1N2JZK1qhfq70hibzJwU7tWy29o7t2kCa3YLFgACsVtKOIicPbe/9wfY64C5K MK4A== X-Received: by 2002:a05:7300:d50b:b0:30c:1865:d9e0 with SMTP id 5a478bee46e88-30eff07d7fdmr1439014eec.16.1782906463047; Wed, 01 Jul 2026 04:47:43 -0700 (PDT) Received: from localhost.localdomain ([2607:f130:0:11a::31]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30ee327cea7sm22518169eec.31.2026.07.01.04.47.39 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 01 Jul 2026 04:47:42 -0700 (PDT) From: wang lian To: damon@lists.linux.dev, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, sj@kernel.org, gutierrez.asier@huawei-partners.com, daichaobing@sangfor.com.cn, lianux.wang@processmission.com, Wang Lian Subject: [PATCH v2 5/5] mm/damon/vaddr: implement DAMOS_SPLIT handler Date: Wed, 1 Jul 2026 19:47:16 +0800 Message-ID: <20260701114716.56503-6-lianux.mm@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260701114716.56503-1-lianux.mm@gmail.com> References: <20260701114716.56503-1-lianux.mm@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Wang Lian Implement the vaddr operations layer handler for DAMOS_SPLIT. For each folio in the target region that is larger than the scheme's target_order, split it via split_folio_to_order(). This supports both anonymous and file-backed (e.g. tmpfs/shmem) folios, covering KVM guest memory backed by THP tmpfs. Signed-off-by: Wang Lian Signed-off-by: Wang Lian --- mm/damon/vaddr.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c index 2a3757c13bf0..3f2061b29ed8 100644 --- a/mm/damon/vaddr.c +++ b/mm/damon/vaddr.c @@ -934,6 +934,71 @@ static unsigned long damos_va_collapse(struct damon_target *target, return applied; } +static unsigned long damos_va_split(struct damon_target *target, + struct damon_region *r, struct damos *s, + unsigned long *sz_filter_passed) +{ + unsigned long addr, end, chunk_sz; + unsigned int target_order = s->target_order; + unsigned long applied = 0; + struct mm_struct *mm; + struct vm_area_struct *vma; + struct folio *folio; + struct folio_walk fw; + + mm = damon_get_mm(target); + if (!mm) + return 0; + + chunk_sz = PAGE_SIZE << HPAGE_PMD_ORDER; + addr = ALIGN_DOWN(r->ar.start, chunk_sz); + end = ALIGN(r->ar.end, chunk_sz); + + while (addr < end) { + mmap_read_lock(mm); + vma = find_vma(mm, addr); + /* + * split_folio_to_order() supports both anon and shmem + * folios, so we accept any VMA that has a folio at @addr. + * This covers important use cases like tmpfs THP-backed + * KVM guest memory where cold and hot pages are bundled + * together in a single PMD THP. + */ + if (!vma || addr < vma->vm_start) + goto unlock; + + folio = folio_walk_start(&fw, vma, addr, 0); + if (!folio) + goto unlock; + + if (folio_order(folio) > target_order) { + if (!folio_trylock(folio)) { + folio_walk_end(&fw, vma); + goto unlock; + } + folio_get(folio); + folio_walk_end(&fw, vma); + + if (!split_folio_to_order(folio, target_order)) + applied += chunk_sz; + + folio_unlock(folio); + folio_put(folio); + } else { + folio_walk_end(&fw, vma); + } + +unlock: + *sz_filter_passed += chunk_sz; + addr += chunk_sz; + mmap_read_unlock(mm); + cond_resched(); + } + + mmput(mm); + return applied; +} + static unsigned long damon_va_apply_scheme(struct damon_ctx *ctx, struct damon_target *t, struct damon_region *r, struct damos *scheme, unsigned long *sz_filter_passed) @@ -967,6 +1032,9 @@ static unsigned long damon_va_apply_scheme(struct damon_ctx *ctx, return damos_va_migrate(t, r, scheme, sz_filter_passed); case DAMOS_STAT: return damos_va_stat(t, r, scheme, sz_filter_passed); + case DAMOS_SPLIT: + return damos_va_split(t, r, scheme, + sz_filter_passed); default: /* * DAMOS actions that are not yet supported by 'vaddr'. -- 2.50.1 (Apple Git-155)