public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: James Morse <james.morse@arm.com>
To: x86@kernel.org, linux-kernel@vger.kernel.org
Cc: Reinette Chatre <reinette.chatre@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	H Peter Anvin <hpa@zytor.com>, Babu Moger <Babu.Moger@amd.com>,
	James Morse <james.morse@arm.com>,
	shameerali.kolothum.thodi@huawei.com,
	D Scott Phillips OS <scott@os.amperecomputing.com>,
	carl@os.amperecomputing.com, lcherian@marvell.com,
	bobo.shaobowang@huawei.com, tan.shaopeng@fujitsu.com,
	baolin.wang@linux.alibaba.com,
	Jamie Iles <quic_jiles@quicinc.com>,
	Xin Hao <xhao@linux.alibaba.com>,
	peternewman@google.com, dfustini@baylibre.com,
	amitsinght@marvell.com, David Hildenbrand <david@redhat.com>,
	Rex Nie <rex.nie@jaguarmicro.com>,
	Dave Martin <dave.martin@arm.com>, Koba Ko <kobak@nvidia.com>,
	Shanker Donthineni <sdonthineni@nvidia.com>,
	fenghuay@nvidia.com, Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>,
	Babu Moger <babu.moger@amd.com>
Subject: [PATCH v9 01/27] x86/resctrl: Remove the limit on the number of CLOSID
Date: Fri, 25 Apr 2025 17:37:43 +0000	[thread overview]
Message-ID: <20250425173809.5529-2-james.morse@arm.com> (raw)
In-Reply-To: <20250425173809.5529-1-james.morse@arm.com>

From: Amit Singh Tomar <amitsinght@marvell.com>

Resctrl allocates and finds free CLOSID values using the bits of a u32.
This restricts the number of control groups that can be created by
user-space.

MPAM has an architectural limit of 2^16 CLOSID values, Intel x86 could
be extended beyond 32 values. There is at least one MPAM platform which
supports more than 32 CLOSID values.

Replace the fixed size bitmap with calls to the bitmap API to allocate
an array of a sufficient size.

ffs() returns '1' for bit 0, hence the existing code subtracts 1 from
the index to get the CLOSID value. find_first_bit() returns the bit
number which does not need adjusting.

Signed-off-by: Amit Singh Tomar <amitsinght@marvell.com>
[ morse: fixed the off-by-one in the allocator and the wrong
 not-found value. Removed the limit. Rephrase the commit message. ]
Signed-off-by: James Morse <james.morse@arm.com>
Tested-by: Peter Newman <peternewman@google.com>
Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Amit Singh Tomar <amitsinght@marvell.com> # arm64
Tested-by: Shanker Donthineni <sdonthineni@nvidia.com> # arm64
Tested-by: Babu Moger <babu.moger@amd.com>
Reviewed-by: Fenghua Yu <fenghuay@nvidia.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
---
Changes since v8:
 * Added check for closid_init() on monitor only platforms.

Changes since v7:
 * Moved closid_exit() earlier in rdt_kill_sb() to match what
   rdt_get_tree() does.

Changes since v6:
 * Set variable to NULL after kfree()ing it.
 * Call closid_exit() from rdt_kill_sb() to prevent a memory leak.

Changes since v5:
 * This patch got pulled into this series.
---
 arch/x86/kernel/cpu/resctrl/rdtgroup.c | 51 ++++++++++++++++++--------
 1 file changed, 35 insertions(+), 16 deletions(-)

diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index cc4a54145c83..53213cae30ec 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -130,8 +130,8 @@ static bool resctrl_is_mbm_event(int e)
 }
 
 /*
- * Trivial allocator for CLOSIDs. Since h/w only supports a small number,
- * we can keep a bitmap of free CLOSIDs in a single integer.
+ * Trivial allocator for CLOSIDs. Use BITMAP APIs to manipulate a bitmap
+ * of free CLOSIDs.
  *
  * Using a global CLOSID across all resources has some advantages and
  * some drawbacks:
@@ -144,7 +144,7 @@ static bool resctrl_is_mbm_event(int e)
  * - Our choices on how to configure each resource become progressively more
  *   limited as the number of resources grows.
  */
-static unsigned long closid_free_map;
+static unsigned long *closid_free_map;
 static int closid_free_map_len;
 
 int closids_supported(void)
@@ -152,20 +152,35 @@ int closids_supported(void)
 	return closid_free_map_len;
 }
 
-static void closid_init(void)
+static int closid_init(void)
 {
 	struct resctrl_schema *s;
-	u32 rdt_min_closid = 32;
+	u32 rdt_min_closid = ~0;
+
+	/* Monitor only platforms still call closid_init() */
+	if (list_empty(&resctrl_schema_all))
+		return 0;
 
 	/* Compute rdt_min_closid across all resources */
 	list_for_each_entry(s, &resctrl_schema_all, list)
 		rdt_min_closid = min(rdt_min_closid, s->num_closid);
 
-	closid_free_map = BIT_MASK(rdt_min_closid) - 1;
+	closid_free_map = bitmap_alloc(rdt_min_closid, GFP_KERNEL);
+	if (!closid_free_map)
+		return -ENOMEM;
+	bitmap_fill(closid_free_map, rdt_min_closid);
 
 	/* RESCTRL_RESERVED_CLOSID is always reserved for the default group */
-	__clear_bit(RESCTRL_RESERVED_CLOSID, &closid_free_map);
+	__clear_bit(RESCTRL_RESERVED_CLOSID, closid_free_map);
 	closid_free_map_len = rdt_min_closid;
+
+	return 0;
+}
+
+static void closid_exit(void)
+{
+	bitmap_free(closid_free_map);
+	closid_free_map = NULL;
 }
 
 static int closid_alloc(void)
@@ -182,12 +197,11 @@ static int closid_alloc(void)
 			return cleanest_closid;
 		closid = cleanest_closid;
 	} else {
-		closid = ffs(closid_free_map);
-		if (closid == 0)
+		closid = find_first_bit(closid_free_map, closid_free_map_len);
+		if (closid == closid_free_map_len)
 			return -ENOSPC;
-		closid--;
 	}
-	__clear_bit(closid, &closid_free_map);
+	__clear_bit(closid, closid_free_map);
 
 	return closid;
 }
@@ -196,7 +210,7 @@ void closid_free(int closid)
 {
 	lockdep_assert_held(&rdtgroup_mutex);
 
-	__set_bit(closid, &closid_free_map);
+	__set_bit(closid, closid_free_map);
 }
 
 /**
@@ -210,7 +224,7 @@ bool closid_allocated(unsigned int closid)
 {
 	lockdep_assert_held(&rdtgroup_mutex);
 
-	return !test_bit(closid, &closid_free_map);
+	return !test_bit(closid, closid_free_map);
 }
 
 /**
@@ -2765,20 +2779,22 @@ static int rdt_get_tree(struct fs_context *fc)
 		goto out_ctx;
 	}
 
-	closid_init();
+	ret = closid_init();
+	if (ret)
+		goto out_schemata_free;
 
 	if (resctrl_arch_mon_capable())
 		flags |= RFTYPE_MON;
 
 	ret = rdtgroup_add_files(rdtgroup_default.kn, flags);
 	if (ret)
-		goto out_schemata_free;
+		goto out_closid_exit;
 
 	kernfs_activate(rdtgroup_default.kn);
 
 	ret = rdtgroup_create_info_dir(rdtgroup_default.kn);
 	if (ret < 0)
-		goto out_schemata_free;
+		goto out_closid_exit;
 
 	if (resctrl_arch_mon_capable()) {
 		ret = mongroup_create_dir(rdtgroup_default.kn,
@@ -2829,6 +2845,8 @@ static int rdt_get_tree(struct fs_context *fc)
 		kernfs_remove(kn_mongrp);
 out_info:
 	kernfs_remove(kn_info);
+out_closid_exit:
+	closid_exit();
 out_schemata_free:
 	schemata_list_destroy();
 out_ctx:
@@ -3076,6 +3094,7 @@ static void rdt_kill_sb(struct super_block *sb)
 	rmdir_all_sub();
 	rdt_pseudo_lock_release();
 	rdtgroup_default.mode = RDT_MODE_SHAREABLE;
+	closid_exit();
 	schemata_list_destroy();
 	rdtgroup_destroy_root();
 	if (resctrl_arch_alloc_capable())
-- 
2.39.5


  reply	other threads:[~2025-04-25 17:38 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-25 17:37 [PATCH v9 00/27] x86/resctrl: Move the resctrl filesystem code to /fs/resctrl James Morse
2025-04-25 17:37 ` James Morse [this message]
2025-04-25 17:37 ` [PATCH v9 02/27] x86/resctrl: Rename resctrl_sched_in() to begin with "resctrl_arch_" James Morse
2025-04-25 17:37 ` [PATCH v9 03/27] x86/resctrl: Check all domains are offline in resctrl_exit() James Morse
2025-05-01 17:02   ` Reinette Chatre
2025-04-25 17:37 ` [PATCH v9 04/27] x86/resctrl: resctrl_exit() teardown resctrl but leave the mount point James Morse
2025-05-01 17:03   ` Reinette Chatre
2025-05-07 16:48     ` James Morse
2025-05-07 17:23       ` Reinette Chatre
2025-04-25 17:37 ` [PATCH v9 05/27] x86/resctrl: Drop __init/__exit on assorted symbols James Morse
2025-04-25 17:37 ` [PATCH v9 06/27] x86/resctrl: Move is_mba_sc() out of core.c James Morse
2025-04-25 17:37 ` [PATCH v9 07/27] x86/resctrl: Add end-marker to the resctrl_event_id enum James Morse
2025-05-01 17:03   ` Reinette Chatre
2025-04-25 17:37 ` [PATCH v9 08/27] x86/resctrl: Expand the width of domid by replacing mon_data_bits James Morse
2025-05-01 17:04   ` Reinette Chatre
2025-05-07 16:48     ` James Morse
2025-04-25 17:37 ` [PATCH v9 09/27] x86/resctrl: Split trace.h James Morse
2025-04-25 17:37 ` [PATCH v9 10/27] x86/resctrl: Add 'resctrl' to the title of the resctrl documentation James Morse
2025-05-01 17:07   ` Reinette Chatre
2025-05-01 21:17   ` Fenghua Yu
2025-04-25 17:37 ` [PATCH v9 11/27] fs/resctrl: Add boiler plate for external resctrl code James Morse
2025-04-25 17:37 ` [PATCH v9 12/27] x86/resctrl: Move the filesystem bits to headers visible to fs/resctrl James Morse
2025-04-25 17:37 ` [PATCH v9 13/27] x86/resctrl: Move enum resctrl_event_id to resctrl.h James Morse
2025-05-01 17:19   ` Reinette Chatre
2025-05-07 16:48     ` James Morse
2025-04-25 17:37 ` [PATCH v9 14/27] x86/resctrl: Fix types in resctrl_arch_mon_ctx_alloc() and free stubs James Morse
2025-05-01 17:27   ` Reinette Chatre
2025-05-07 16:48     ` James Morse
2025-04-25 17:37 ` [PATCH v9 15/27] x86/resctrl: Move pseudo lock prototypes to include/linux/resctrl.h James Morse
2025-05-01 17:29   ` Reinette Chatre
2025-04-25 17:37 ` [PATCH v9 16/27] x86/resctrl: Squelch whitespace anomalies in resctrl core code James Morse
2025-04-25 17:37 ` [PATCH v9 17/27] x86/resctrl: Prefer alloc(sizeof(*foo)) idiom in rdt_init_fs_context() James Morse
2025-04-25 17:38 ` [PATCH v9 18/27] x86/resctrl: Relax some asm #includes James Morse
2025-04-25 17:38 ` [PATCH v9 19/27] x86/resctrl: Always initialise rid field in rdt_resources_all[] James Morse
2025-05-01 17:31   ` Reinette Chatre
2025-04-25 17:38 ` [PATCH v9 20/27] x86/resctrl: Remove a newline to avoid confusing the code move script James Morse
2025-04-25 17:38 ` [PATCH v9 21/27] x86/resctrl: Add python script to move resctrl code to /fs/resctrl James Morse
2025-04-25 17:38 ` [PATCH v9 22/27] x86,fs/resctrl: Move the resctrl filesystem code to live in /fs/resctrl James Morse
2025-04-25 17:38 ` [PATCH v9 23/27] x86,fs/resctrl: Remove duplicated trace header files James Morse
2025-05-01 17:34   ` Reinette Chatre
2025-04-25 17:38 ` [PATCH v9 24/27] fs/resctrl: Remove unnecessary includes James Morse
2025-05-01 17:34   ` Reinette Chatre
2025-05-01 22:27   ` Fenghua Yu
2025-04-25 17:38 ` [PATCH v9 25/27] fs/resctrl: Change internal.h's header guard macros James Morse
2025-05-01 17:35   ` Reinette Chatre
2025-05-01 22:25   ` Fenghua Yu
2025-04-25 17:38 ` [PATCH v9 26/27] x86,fs/resctrl: Move resctrl.rst to live under Documentation/filesystems James Morse
2025-04-25 17:38 ` [PATCH v9 27/27] MAINTAINERS: Add reviewers for fs/resctrl James Morse
2025-04-29 14:25   ` Dave Martin
2025-05-01 17:41   ` Reinette Chatre
2025-05-01 17:51 ` [PATCH v9 00/27] x86/resctrl: Move the resctrl filesystem code to /fs/resctrl Reinette Chatre
2025-05-07 16:49   ` James Morse
2025-05-07 17:25     ` Reinette Chatre
2025-05-02 16:04 ` Moger, Babu
2025-05-02 16:30   ` Reinette Chatre
2025-05-02 16:45     ` Moger, Babu
2025-05-07 16:49       ` James Morse
2025-05-07 20:27         ` Moger, Babu
2025-05-07 20:36           ` Reinette Chatre
2025-05-07 12:00 ` Shaopeng Tan (Fujitsu)
2025-05-07 16:51   ` James Morse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250425173809.5529-2-james.morse@arm.com \
    --to=james.morse@arm.com \
    --cc=Babu.Moger@amd.com \
    --cc=amitsinght@marvell.com \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=bobo.shaobowang@huawei.com \
    --cc=bp@alien8.de \
    --cc=carl@os.amperecomputing.com \
    --cc=dave.martin@arm.com \
    --cc=david@redhat.com \
    --cc=dfustini@baylibre.com \
    --cc=fenghuay@nvidia.com \
    --cc=hpa@zytor.com \
    --cc=kobak@nvidia.com \
    --cc=lcherian@marvell.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peternewman@google.com \
    --cc=quic_jiles@quicinc.com \
    --cc=reinette.chatre@intel.com \
    --cc=rex.nie@jaguarmicro.com \
    --cc=scott@os.amperecomputing.com \
    --cc=sdonthineni@nvidia.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=tan.shaopeng@fujitsu.com \
    --cc=tan.shaopeng@jp.fujitsu.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    --cc=xhao@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox