From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A775EC77B7C for ; Wed, 2 Jul 2025 20:14:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4A9F06B00A8; Wed, 2 Jul 2025 16:14:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4820D8D0002; Wed, 2 Jul 2025 16:14:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 398548D0001; Wed, 2 Jul 2025 16:14:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 2A6776B00A8 for ; Wed, 2 Jul 2025 16:14:21 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id AEF52140485 for ; Wed, 2 Jul 2025 20:14:20 +0000 (UTC) X-FDA: 83620426680.07.35B7E57 Received: from mail-yb1-f179.google.com (mail-yb1-f179.google.com [209.85.219.179]) by imf03.hostedemail.com (Postfix) with ESMTP id D20D02000E for ; Wed, 2 Jul 2025 20:14:18 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Cq0LXjyx; spf=pass (imf03.hostedemail.com: domain of bijan311@gmail.com designates 209.85.219.179 as permitted sender) smtp.mailfrom=bijan311@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751487258; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Ka2lHJKibszvD814XqK78W02tftJp26/CMGv/fNrDPI=; b=aBVP0HE73RuRSXD/huUDf7g4pZs40o96jmRT7xYa11cQZLnMxh5g3IKblG9Y5yJaXWXdbK 7szIlwvVhwpWOJa/UbIQ8uNQEiaE7fdKiUczYLT8j0dQfGoArPk1sXthjIjwmYGOLIQlsn deBXxfyhHQIgIvI8P17+DvMNsprGv7w= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Cq0LXjyx; spf=pass (imf03.hostedemail.com: domain of bijan311@gmail.com designates 209.85.219.179 as permitted sender) smtp.mailfrom=bijan311@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751487258; a=rsa-sha256; cv=none; b=Pvo2YwzAhxESeB74rvYGjShi82QoH22ZpJjDDEFiLX2z+Kb82sNY7gjVpFaSfzbfMOqHzx fPnjb7OS2g3azmK5LAkfyVYGGRsbUelq/kmflV0uvfrJ3KYtaGcHtKh+lhezD8u/nw9VPK S/Rpz8qvqXx4vE+lV0fQWqFJPKRmweQ= Received: by mail-yb1-f179.google.com with SMTP id 3f1490d57ef6-e81f8679957so4006014276.2 for ; Wed, 02 Jul 2025 13:14:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751487258; x=1752092058; darn=kvack.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=Ka2lHJKibszvD814XqK78W02tftJp26/CMGv/fNrDPI=; b=Cq0LXjyxKUNlTmSJqkv8llO8kAFw4zbfnCVofr7gfuXnXa9FPJhKNLk3FmwTmEPd2X LuuTFoJMaM7s02SlGKj0kU/ciP3gNo91lo5mYy4+fWck0bxYbJwXYsu2pVx3VMB1zSsY +9Hu+5eehte1Q3CEoglHe6/2p4ItN90iQh3w2z7HQeh6Lxks/H3TbFHnyn9hHrR63SS8 WAXhE7Hr8Rk71NkHSda80JwwVg1hCRzzimoOW7EHNe8Sw9JeLtVHGwgS2Y2irueVzucC T3fOCBBJlqIiNgoymSJCBCz+gJiq5YR2Q3pluW80CWhAtpBC9dpVYEk5hMct6JP+66Vh Yz+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751487258; x=1752092058; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ka2lHJKibszvD814XqK78W02tftJp26/CMGv/fNrDPI=; b=RDKZvXpZl4eDxdlpIUYvZehk3B94ZNXlZu6x15ertsb6v4L+kTyyR7CqNTTGLOpA+Y Nv0izVCfwKZbkHWIgaUBKNdX3pj/kLyom7LVtpznwC6TM/rtSr7zKO4IH9nXCEGaA1rR TY/vt+teErQ7Hvf2549enMoyWNDrff+ei46VofzhzuPJy7FOwRATfb5lKUiUZ7ndDGL3 6Rzw5dEBf7hmiQi/mOr65O/WGQsOjnkfoUm2eLyWIFT/elKXF6i/EwCGo/opSmp6N9T+ aysQ2/07Z7ORSU1bl9roqNgANM2/iiTVs3KuM8hBGIXVzBEwy9bOcudu0Cbmakgcncr8 ts0A== X-Forwarded-Encrypted: i=1; AJvYcCVQoFpfzb95NgZwzODRbdu2M3gLLjF38gouPcbHEZOHSIiWR5RcamORFm7AdpcRmNTOb7muVuhtgQ==@kvack.org X-Gm-Message-State: AOJu0YxdaiRCrshc3LzXBOvAtzTDlFZbUUrafP2ZhbgWizy0vLJlNTpr ab0tKbd4FyHd2x4Tr7L8H2VtgvR0hr06fM7DditIfGOA8Fdg8ngrFnFH X-Gm-Gg: ASbGncv1Z2AI9Ngyx/HMC6qqrX0sMN+cl6GVpbV/2fMOViXrnPwH6hjxU70Pbbmg1d8 Duyai7HUXgvM5TaBgOKigAKeHt1irjz4DOx7xU5vfXGOF2AI7xC+avnp2HG+JkMM8jfm3/lkoRr WzccgZpLvlJycBXM4cFit4jf9oBGhPVR3rFOFu9qNzWFRnYsf7lBgtuHRfj/i+UobST53tXzeaW C5Hfu+kn6K5Jhri+Lsx58A+nL65EjkKyf+J4Iq+/t09NIKqvGxRQ1kaJjCVFhmx5SBsvTtoFS7I hC/vqF26WvxGn73tVcAUYHWUr5GzpYs65OWXoWE63RmMmolzjt2+QaYtciwjFkXIKEMyWTwLMAx C2tnrvCzaZHprNXGBOA== X-Google-Smtp-Source: AGHT+IE3dlhWUQcRHaBMecK1cT77BYAqbxJi6TZDV3Mx4tnnVo3pxRt5aw3J+eVaop43IyeQiBIT1A== X-Received: by 2002:a05:690c:6513:b0:70f:8884:a5fc with SMTP id 00721157ae682-7164d27d031mr57275137b3.4.1751487257720; Wed, 02 Jul 2025 13:14:17 -0700 (PDT) Received: from bijan-laptop.attlocal.net ([2600:1700:680e:c000:873e:8f35:7cd8:3fe3]) by smtp.gmail.com with ESMTPSA id 00721157ae682-71515cb4347sm26124157b3.83.2025.07.02.13.14.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Jul 2025 13:14:17 -0700 (PDT) From: Bijan Tabatabai To: damon@lists.linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: sj@kernel.org, akpm@linux-foundation.org, corbet@lwn.net, joshua.hahnjy@gmail.com, bijantabatab@micron.com, venkataravis@micron.com, emirakhur@micron.com, ajayjoshi@micron.com, vtavarespetr@micron.com Subject: [RFC PATCH v3 03/13] mm/damon/sysfs-schemes: implement DAMOS action destinations directory Date: Wed, 2 Jul 2025 15:13:26 -0500 Message-ID: <20250702201337.5780-4-bijan311@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250702201337.5780-1-bijan311@gmail.com> References: <20250702201337.5780-1-bijan311@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: D20D02000E X-Stat-Signature: hqqagckbibr58hyaswnna53wma5kpiek X-Rspam-User: X-HE-Tag: 1751487258-65678 X-HE-Meta: U2FsdGVkX1/8Gy1xY3VdB5dZsit1n3svHTsQXI1LHCNfaCBkwZ78AelAyeNEH1nj3UtlLj3/HKZW/MiAm7Ru/RKGKcP++IJmpi8ccoNxK6qmrZ6yMrTZPEIw/Fo75TJP8C0t8wLCL6dj00jnJpJ37rzi25G0oKKOoa2TwokXKTBRLP3e44co90ZQ7r4Ra8K9E4uB5GZQ5xlOu/E2LNSaP7CuPt2X7S5m/dAnJlRkGkP+HaFUWSQSIQGlZAD0iJlRuLscL8P0JCk2zVgzYxqoiAKD4McNK+zMaiSec1gYulCyHjnV9aAlZ/acisP2739CABxqJp7dywGJpzJFdxudJg6T7yDUvbBkzlXZbRehgPw+IQ5lQGYf+5h8e8VkiYLk7TEzIi5TFqPBi7j9r8hyXcp/P0/f5zb3dquV7mbeoRrK7UvEPBiqIHLzP4kCX+Rawj0b1I2AflSagqbh1H5YAcXUcLxG3fhox4S5CjgGexn408CIyi3bwSNUf8K5XHAHgmzwIP15DEN7R0tfPXkz0HoB11HO/JX8J5LRWPdQBX3hYnl0TOR3h/QQn6p046RAV1GDzJZcnNpfL4xfgNdphbFAUKY/UIP9M8aAox8b/4iYQeQ+Xe0Zu5Krq4CmjKeYg9fwMksN9aBumjNq3IRhq7mLKxfBOpbo6DhbE7Q76Uc7hCV1DZdCbyRBuZZq4jxA3IjeltHsAlTDoIWFiLQKruOjtlxqr7uRy8elzxUxgA9EbQQmKT7pId1fIHO8N6HOrFYffXv5Y8LZY80Y9zMFWoZjNcMKK1N4LYmpCaH84UMNUwansB67kE0zAeL9bloqKZCkKXIHb5cXozxw1BvAYUjJNW6nRR8/94xT1gMSF202jocHRjpunDtNuQmMaeAAIL2QJBPoFRUPn7UUkqim1kwPxQzKvoPva7BCOKQHVuQMqRz8HawCxQZDFlAkaJ2dCD+3YynDv+SSOZD8mkl 1Qs5ui00 er8A95KzPWQqGORarrM641S5Nbp9ww2sF4KCgdPL9HOIDKRiwL+LPOvJGVSpOf+mcgBSJy225vz+oHFdMpAu2lKsh2Yte/ZkyQnpN4n4/4775VHh+wRdQUYw6ugVQDcroAaR36aD1CYPzLqSZ7oac3yKECr97GLcjus4fVt+rpkEcrV+H365HUuFLoXTMExmDNVZ6G4Dw0Z/3VIxjFJQDfkXPMKg5EUM9YY65aPbR3KjleSMIaJMkZWFS0bGp6PpB1KWNU4UJmksB3o1m/d1SldstRIfdSWZ7Vu1L0NbIEFbxHR05hKF3bsHhw52hxDP0n/mJt/5GdFun8iOkqwNIXAQOY78wQ8PzMr49dZNvkOimkdDtShUjjyQ1qXbLz6mWGe6AkGmKdFZGzZ+YYgikBZyeaiMkpHB6A8/owUfZGbPsJ4DINkTHCiYqDhJT5pIlTQ8iog4t48xhlJEPwPv8aXXLSQcawkPEPjnr9vur1TEj100Guk1utcC7Um/3OnR9SsT2I5sbPFXZG4xWIVEOjfe/7g== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: SeongJae Park DAMOS_MIGRATE_{HOT,COLD} can have multiple action destinations and their weights. Implement sysfs directory named 'dests' under each scheme directory to let DAMON sysfs ABI users utilize the feature. The interface is similar to other multiple parameters directory like kdamonds or filters. The directory contains only nr_dests file initially. Writing a number of desired destinations to nr_dests creates directories of the number. Each of the created directories has two files named id and weight. Users can then write the destination's identifier (node id in case of DAMOS_MIGRATE_*) and weight to the files. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 225 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 224 insertions(+), 1 deletion(-) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 601360e9b521..b9434cdaacdc 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -1655,6 +1655,204 @@ static const struct kobj_type damon_sysfs_access_pattern_ktype = { .default_groups = damon_sysfs_access_pattern_groups, }; +/* + * dest (action destination) directory + */ + +struct damos_sysfs_dest { + struct kobject kobj; + unsigned int id; + unsigned int weight; +}; + +static struct damos_sysfs_dest *damos_sysfs_dest_alloc(void) +{ + return kzalloc(sizeof(struct damos_sysfs_dest), GFP_KERNEL); +} + +static ssize_t id_show( + struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + struct damos_sysfs_dest *dest = container_of(kobj, + struct damos_sysfs_dest, kobj); + + return sysfs_emit(buf, "%u\n", dest->id); +} + +static ssize_t id_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damos_sysfs_dest *dest = container_of(kobj, + struct damos_sysfs_dest, kobj); + int err = kstrtouint(buf, 0, &dest->id); + + return err ? err : count; +} + +static ssize_t weight_show( + struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + struct damos_sysfs_dest *dest = container_of(kobj, + struct damos_sysfs_dest, kobj); + + return sysfs_emit(buf, "%u\n", dest->weight); +} + +static ssize_t weight_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damos_sysfs_dest *dest = container_of(kobj, + struct damos_sysfs_dest, kobj); + int err = kstrtouint(buf, 0, &dest->weight); + + return err ? err : count; +} + +static void damos_sysfs_dest_release(struct kobject *kobj) +{ + struct damos_sysfs_dest *dest = container_of(kobj, + struct damos_sysfs_dest, kobj); + kfree(dest); +} + +static struct kobj_attribute damos_sysfs_dest_id_attr = + __ATTR_RW_MODE(id, 0600); + +static struct kobj_attribute damos_sysfs_dest_weight_attr = + __ATTR_RW_MODE(weight, 0600); + +static struct attribute *damos_sysfs_dest_attrs[] = { + &damos_sysfs_dest_id_attr.attr, + &damos_sysfs_dest_weight_attr.attr, + NULL, +}; +ATTRIBUTE_GROUPS(damos_sysfs_dest); + +static const struct kobj_type damos_sysfs_dest_ktype = { + .release = damos_sysfs_dest_release, + .sysfs_ops = &kobj_sysfs_ops, + .default_groups = damos_sysfs_dest_groups, +}; + +/* + * dests (action destinations) directory + */ + +struct damos_sysfs_dests { + struct kobject kobj; + struct damos_sysfs_dest **dests_arr; + int nr; +}; + +static struct damos_sysfs_dests * +damos_sysfs_dests_alloc(void) +{ + return kzalloc(sizeof(struct damos_sysfs_dests), GFP_KERNEL); +} + +static void damos_sysfs_dests_rm_dirs( + struct damos_sysfs_dests *dests) +{ + struct damos_sysfs_dest **dests_arr = dests->dests_arr; + int i; + + for (i = 0; i < dests->nr; i++) + kobject_put(&dests_arr[i]->kobj); + dests->nr = 0; + kfree(dests_arr); + dests->dests_arr = NULL; +} + +static int damos_sysfs_dests_add_dirs( + struct damos_sysfs_dests *dests, int nr_dests) +{ + struct damos_sysfs_dest **dests_arr, *dest; + int err, i; + + damos_sysfs_dests_rm_dirs(dests); + if (!nr_dests) + return 0; + + dests_arr = kmalloc_array(nr_dests, sizeof(*dests_arr), + GFP_KERNEL | __GFP_NOWARN); + if (!dests_arr) + return -ENOMEM; + dests->dests_arr = dests_arr; + + for (i = 0; i < nr_dests; i++) { + dest = damos_sysfs_dest_alloc(); + if (!dest) { + damos_sysfs_dests_rm_dirs(dests); + return -ENOMEM; + } + + err = kobject_init_and_add(&dest->kobj, + &damos_sysfs_dest_ktype, + &dests->kobj, "%d", i); + if (err) { + kobject_put(&dest->kobj); + damos_sysfs_dests_rm_dirs(dests); + return err; + } + + dests_arr[i] = dest; + dests->nr++; + } + return 0; +} + +static ssize_t nr_dests_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damos_sysfs_dests *dests = container_of(kobj, + struct damos_sysfs_dests, kobj); + + return sysfs_emit(buf, "%d\n", dests->nr); +} + +static ssize_t nr_dests_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damos_sysfs_dests *dests; + int nr, err = kstrtoint(buf, 0, &nr); + + if (err) + return err; + if (nr < 0) + return -EINVAL; + + dests = container_of(kobj, struct damos_sysfs_dests, kobj); + + if (!mutex_trylock(&damon_sysfs_lock)) + return -EBUSY; + err = damos_sysfs_dests_add_dirs(dests, nr); + mutex_unlock(&damon_sysfs_lock); + if (err) + return err; + + return count; +} + +static void damos_sysfs_dests_release(struct kobject *kobj) +{ + kfree(container_of(kobj, struct damos_sysfs_dests, kobj)); +} + +static struct kobj_attribute damos_sysfs_dests_nr_attr = + __ATTR_RW_MODE(nr_dests, 0600); + +static struct attribute *damos_sysfs_dests_attrs[] = { + &damos_sysfs_dests_nr_attr.attr, + NULL, +}; +ATTRIBUTE_GROUPS(damos_sysfs_dests); + +static const struct kobj_type damos_sysfs_dests_ktype = { + .release = damos_sysfs_dests_release, + .sysfs_ops = &kobj_sysfs_ops, + .default_groups = damos_sysfs_dests_groups, +}; + /* * scheme directory */ @@ -1672,6 +1870,7 @@ struct damon_sysfs_scheme { struct damon_sysfs_stats *stats; struct damon_sysfs_scheme_regions *tried_regions; int target_nid; + struct damos_sysfs_dests *dests; }; struct damos_sysfs_action_name { @@ -1762,6 +1961,22 @@ static int damon_sysfs_scheme_set_access_pattern( return err; } +static int damos_sysfs_set_dests(struct damon_sysfs_scheme *scheme) +{ + struct damos_sysfs_dests *dests = damos_sysfs_dests_alloc(); + int err; + + if (!dests) + return -ENOMEM; + err = kobject_init_and_add(&dests->kobj, &damos_sysfs_dests_ktype, + &scheme->kobj, "dests"); + if (err) + kobject_put(&dests->kobj); + else + scheme->dests = dests; + return err; +} + static int damon_sysfs_scheme_set_quotas(struct damon_sysfs_scheme *scheme) { struct damon_sysfs_quotas *quotas = damon_sysfs_quotas_alloc(); @@ -1894,9 +2109,12 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme) err = damon_sysfs_scheme_set_access_pattern(scheme); if (err) return err; - err = damon_sysfs_scheme_set_quotas(scheme); + err = damos_sysfs_set_dests(scheme); if (err) goto put_access_pattern_out; + err = damon_sysfs_scheme_set_quotas(scheme); + if (err) + goto put_dests_out; err = damon_sysfs_scheme_set_watermarks(scheme); if (err) goto put_quotas_access_pattern_out; @@ -1927,6 +2145,9 @@ static int damon_sysfs_scheme_add_dirs(struct damon_sysfs_scheme *scheme) put_quotas_access_pattern_out: kobject_put(&scheme->quotas->kobj); scheme->quotas = NULL; +put_dests_out: + kobject_put(&scheme->dests->kobj); + scheme->dests = NULL; put_access_pattern_out: kobject_put(&scheme->access_pattern->kobj); scheme->access_pattern = NULL; @@ -1937,6 +2158,8 @@ static void damon_sysfs_scheme_rm_dirs(struct damon_sysfs_scheme *scheme) { damon_sysfs_access_pattern_rm_dirs(scheme->access_pattern); kobject_put(&scheme->access_pattern->kobj); + kobject_put(&scheme->dests->kobj); + damos_sysfs_dests_rm_dirs(scheme->dests); damon_sysfs_quotas_rm_dirs(scheme->quotas); kobject_put(&scheme->quotas->kobj); kobject_put(&scheme->watermarks->kobj); -- 2.43.5