From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (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 DEB4D2D63E5 for ; Thu, 18 Jun 2026 09:48:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781776134; cv=none; b=lwOLWyuRRYMZ/HIZQxMtOaJv4W3HSTMnr56tydsVb7e/sjeGIan9h/uJPKN2WbSa41zsUaRfPXm20Aa+i0n4ZPcTvk5kHe/QcN+wlTqPnv0FnbGfMTvfoGss296rlByfL7DRfFzO1WG0kEMR/ejZ+yyF4aJEu2a6gerB8ZAVENI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781776134; c=relaxed/simple; bh=TEDYDkC6TSMbNqHtIbpHE47e2nZcENVxaaawFCZf2FE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DU2WnFKYVnwVo14LmjzAmFArPguFxfA1xCj6x1dbsiwxcD5LasGpm5y4Y35HI5q7ZfxKG/5CKv0GZDvW+G2t5MhPBmYKE7yxXxSnFgONRdbcMgToDOsqPVmRAow3ic2HaPjIfn4XR/LGzsjBDq3dB5oZSuF8zknU/SRVuDqbBqM= 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=GqwWAZxF; arc=none smtp.client-ip=74.125.82.46 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="GqwWAZxF" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-13988680a69so1886042c88.0 for ; Thu, 18 Jun 2026 02:48:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781776131; x=1782380931; 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=Wr6KFUBUKLmL1HFmRhmGjgD46HcpDVoxGUkNMPoznh4=; b=GqwWAZxFS6Eg/+Jjhj6bMGLCkx5NLtquTI0hmCiUaa7/QJxDSu7TriSomMJ/4JEppa 7OMwQhDRzJkOWo/GEp/4qkcNMheOJmaLDxJPcRS+aXnXhHo/XS5Yjw1yz3qSrj3EvRDX vpMxcVOtnAfHTKsq2c1JMJ01eYMDtAM279a7kD47xYyO8hwN8jqYEkR301j9d9Jb/bZ6 EF7nAEKlE7Pwg2g5sUqt2MEtsn9+PnjeW8C42JwmW2G6e3k9kVj+FFxsQrQvFkCoM6qa QCO5+Bd/C369Y71ay4tW+30IsjJQTt9jzKcVpV3/KBZPPIOLkOvHcnUCy1eoDChGXLdV dXbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781776131; x=1782380931; 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=Wr6KFUBUKLmL1HFmRhmGjgD46HcpDVoxGUkNMPoznh4=; b=np10k/gxxTXDiuz8Kfs0dXWVmdz9ViFHQQi3Cmg+7WNvFdrvecZgJPBfskPJjICVt5 OvjQSGznNaV/4VmKOMilzVCZRjXcKOThEwZsOK8gUTKV8CW8cOAmN96pEV+EOkD91d/x XvzQWn4d3rwbZLaIJ6cYXc5jFu/4RUyoN2qmnzUMILaH0qSAmtthMwKmwfkunGjwWXi2 3OcOa6bwhG+uyK4IzNAEdBtK0jhDNYUnRnR/8q7UoLxyrxJ3HZdwqZf6OBBPQCPR/u+0 bvmCc0Hf/lxS52nxxCSQI6l7qCBZBJsUDykdp0fCBocaTjb7nRYBKBYbuCi44XYG50rz mXYw== X-Forwarded-Encrypted: i=1; AFNElJ8hzN+1KTUKIPCCiy9Sw/7ZqVoMXFhyNn+o9paPTMekN8qiyt0LWHd92PGBd+BEtom0uacbMV0Vz3+6FA0=@vger.kernel.org X-Gm-Message-State: AOJu0YxmwB0sPjCnpCLxui59kQ8g8rdYHAkX9ELHUd+82FEvr4TJoF9O c+Pzv/EO17f8Ek+AwLMAe2TfLUf9OEsLEc7jj++ixhXgQc5N/b2Q9Vip X-Gm-Gg: Acq92OEsGR2wspqB+B47Sb/c7fEjdIWJMzXpDM6rcN68H1dyDAnTcELqZEA2g/DDunX t8iAmrOpXTF6c5rN4+6D9SoHJW3w40DgRBz+MVjqRsjsg88+o7SKi5+WSKB1Wzi7dka/430IvYe fjg9KIFyUH8UqLR8aPJH+gLMxUErtWJZA2jevgJ0t4kN/9dzjEBYHhTXQ/Du7/Kwe6UHyIKUHzk JIcBl63OBAJ4+bP8lg6cP1klrby1xgtcUnQsTbJxVp9KcbTCPdajsWJ6HSrTgNnUWcvbj+vgPxJ O2sJy4j6RROSl+HqdjKOpXFZFBC0caEtJfcXMDrHgcOO+vmNTAXu4I1G0D+iKMN02ltOd9x++f1 8FEFBT3TKTsI4WRB0H0OLWPN/Hesd5M4Hush/qdhkVMmS/YeoGIUnc9/9PuRTd3WjyYFvZseyQm 0izzUWqGF7JeeMU4NLPrmWwtnZ X-Received: by 2002:a05:7022:238f:b0:138:14dd:16c6 with SMTP id a92af1059eb24-13997c9a7abmr1977944c88.34.1781776130639; Thu, 18 Jun 2026 02:48:50 -0700 (PDT) Received: from localhost.localdomain ([104.28.158.224]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-1384b91a4c7sm18069971c88.8.2026.06.18.02.48.47 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 18 Jun 2026 02:48:50 -0700 (PDT) From: Wang Lian To: sj@kernel.org, akpm@linux-foundation.org Cc: npache@redhat.com, gutierrez.asier@huawei-partners.com, daichaobing@sangfor.com.cn, linux-mm@kvack.org, linux-kernel@vger.kernel.org, lianux.mm@gmail.com, kunwu.chan@gmail.com Subject: [RFC PATCH 1/6] mm/damon: add target_order field for DAMOS_COLLAPSE Date: Thu, 18 Jun 2026 17:48:33 +0800 Message-ID: <20260618094838.32805-2-lianux.mm@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260618094838.32805-1-lianux.mm@gmail.com> References: <20260618094838.32805-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 DAMOS_COLLAPSE currently collapses into PMD-size THP only. Add a target_order field to express per-order mTHP collapse intent. Zero means system default (PMD order, same as current behavior). Valid values are 0 and 2..HPAGE_PMD_ORDER. Wire up the sysfs interface: a per-scheme rw file "target_order". Validate at store time that the value is in range, and warn at scheme creation time if DAMOS_COLLAPSE is used with an unsupported non-PMD order, resetting to 0. The actual mTHP application via the khugepaged wrapper will be added in subsequent patches. Co-developed-by: Kunwu Chan Signed-off-by: Kunwu Chan Signed-off-by: Wang Lian --- include/linux/damon.h | 5 +++++ mm/damon/sysfs-schemes.c | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 6f7edb3590ef..5a0587556573 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -572,6 +572,11 @@ struct damos_migrate_dests { struct damos { struct damos_access_pattern pattern; enum damos_action action; + /* + * @target_order: target order for mTHP actions (DAMOS_COLLAPSE). + * 0 means system default (PMD order). Valid: 0, 2..HPAGE_PMD_ORDER. + */ + unsigned int target_order; unsigned long apply_interval_us; /* private: internal use only */ /* diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 329cfd0bbe9f..735970717048 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -6,7 +6,9 @@ */ #include +#include #include +#include #include "sysfs-common.h" @@ -2257,6 +2259,7 @@ struct damon_sysfs_scheme { struct damon_sysfs_stats *stats; struct damon_sysfs_scheme_regions *tried_regions; int target_nid; + unsigned int target_order; struct damos_sysfs_dests *dests; }; @@ -2642,6 +2645,34 @@ static ssize_t target_nid_store(struct kobject *kobj, return err ? err : count; } +static ssize_t target_order_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_scheme *scheme = container_of(kobj, + struct damon_sysfs_scheme, kobj); + + return sysfs_emit(buf, "%u\n", scheme->target_order); +} + +static ssize_t target_order_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_scheme *scheme = container_of(kobj, + struct damon_sysfs_scheme, kobj); + unsigned int val; + int err; + + err = kstrtouint(buf, 0, &val); + if (err) + return err; + + if (val != 0 && (val < 2 || val > HPAGE_PMD_ORDER)) + return -EINVAL; + + scheme->target_order = val; + return count; +} + static void damon_sysfs_scheme_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_scheme, kobj)); @@ -2656,10 +2687,14 @@ static struct kobj_attribute damon_sysfs_scheme_apply_interval_us_attr = static struct kobj_attribute damon_sysfs_scheme_target_nid_attr = __ATTR_RW_MODE(target_nid, 0600); +static struct kobj_attribute damon_sysfs_scheme_target_order_attr = + __ATTR_RW_MODE(target_order, 0600); + static struct attribute *damon_sysfs_scheme_attrs[] = { &damon_sysfs_scheme_action_attr.attr, &damon_sysfs_scheme_apply_interval_us_attr.attr, &damon_sysfs_scheme_target_nid_attr.attr, + &damon_sysfs_scheme_target_order_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_scheme); @@ -3005,6 +3040,16 @@ static struct damos *damon_sysfs_mk_scheme( if (!scheme) return NULL; + if (sysfs_scheme->action == DAMOS_COLLAPSE && + sysfs_scheme->target_order != 0 && + sysfs_scheme->target_order != HPAGE_PMD_ORDER) { + pr_warn("DAMON collapse: target_order %u not supported, only PMD order (%u) is available. Use 0 or %u.\n", + sysfs_scheme->target_order, + HPAGE_PMD_ORDER, HPAGE_PMD_ORDER); + sysfs_scheme->target_order = 0; + } + scheme->target_order = sysfs_scheme->target_order; + err = damos_sysfs_add_quota_score(sysfs_quotas->goals, &scheme->quota); if (err) { damon_destroy_scheme(scheme); -- 2.50.1 (Apple Git-155)