]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/resctrl: Always initialise rid field in rdt_resources_all[]
authorJames Morse <james.morse@arm.com>
Thu, 15 May 2025 16:58:53 +0000 (16:58 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 16 May 2025 12:35:22 +0000 (14:35 +0200)
x86 has an array, rdt_resources_all[], of all possible resources.
The for-each-resource walkers depend on the rid field of all
resources being initialised.

If the array ever grows due to another architecture adding a resource
type that is not defined on x86, the for-each-resources walkers will
loop forever.

Initialise all the rid values in resctrl_arch_late_init() before
any for-each-resource walker can be called.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Reviewed-by: Fenghua Yu <fenghuay@nvidia.com>
Tested-by: Fenghua Yu <fenghuay@nvidia.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Tony Luck <tony.luck@intel.com>
Link: https://lore.kernel.org/20250515165855.31452-24-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/core.c

index 58d7c6accdf2e85596cd62c28c8dd47d6a9ac560..224bed28f341293287034f703239dfaf3c523761 100644 (file)
@@ -60,7 +60,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
        [RDT_RESOURCE_L3] =
        {
                .r_resctrl = {
-                       .rid                    = RDT_RESOURCE_L3,
                        .name                   = "L3",
                        .ctrl_scope             = RESCTRL_L3_CACHE,
                        .mon_scope              = RESCTRL_L3_CACHE,
@@ -74,7 +73,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
        [RDT_RESOURCE_L2] =
        {
                .r_resctrl = {
-                       .rid                    = RDT_RESOURCE_L2,
                        .name                   = "L2",
                        .ctrl_scope             = RESCTRL_L2_CACHE,
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_L2),
@@ -86,7 +84,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
        [RDT_RESOURCE_MBA] =
        {
                .r_resctrl = {
-                       .rid                    = RDT_RESOURCE_MBA,
                        .name                   = "MB",
                        .ctrl_scope             = RESCTRL_L3_CACHE,
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_MBA),
@@ -96,7 +93,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
        [RDT_RESOURCE_SMBA] =
        {
                .r_resctrl = {
-                       .rid                    = RDT_RESOURCE_SMBA,
                        .name                   = "SMBA",
                        .ctrl_scope             = RESCTRL_L3_CACHE,
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_SMBA),
@@ -996,7 +992,11 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c)
 static int __init resctrl_arch_late_init(void)
 {
        struct rdt_resource *r;
-       int state, ret;
+       int state, ret, i;
+
+       /* for_each_rdt_resource() requires all rid to be initialised. */
+       for (i = 0; i < RDT_NUM_RESOURCES; i++)
+               rdt_resources_all[i].r_resctrl.rid = i;
 
        /*
         * Initialize functions(or definitions) that are different