]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/resctrl: Label the resources with their configuration type
authorJames Morse <james.morse@arm.com>
Wed, 28 Jul 2021 17:06:18 +0000 (17:06 +0000)
committerBorislav Petkov <bp@suse.de>
Wed, 11 Aug 2021 11:13:18 +0000 (13:13 +0200)
The names of resources are used for the schema name presented to
user-space. The name used is rooted in a structure provided by the
architecture code because the names are different when CDP is enabled.
x86 implements this by swapping between two sets of resource structures
based on their alloc_enabled flag. The type of configuration in-use is
encoded in the name (and cbm_idx_offset).

Once the CDP behaviour is moved into the parts of resctrl that will
move to /fs/, there will be two struct resctrl_schema for one struct
rdt_resource. The schema describes the type of configuration being
applied to the resource. The name of the schema should be generated
by resctrl, base on the type of configuration. To do this struct
resctrl_schema needs to store the type of configuration in use for a
schema.

Create an enum resctrl_conf_type describing the options, and add it to
struct resctrl_schema. The underlying resources are still separate, as
cbm_idx_offset is still in use.

Temporarily label all the entries in rdt_resources_all[] and copy that
value to struct resctrl_schema. Copying the value ensures there is no
mismatch while the filesystem parts of resctrl are modified to use the
schema. Once the resources are merged, the filesystem code can assign
this value based on the schema being created.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Jamie Iles <jamie@nuviainc.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lkml.kernel.org/r/20210728170637.25610-6-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/internal.h
arch/x86/kernel/cpu/resctrl/rdtgroup.c
include/linux/resctrl.h

index 10fbbc3cf40ab68b09d38899f08bc7c2ca97ace0..c5b5c72278376efc0e44aa7ee9b606e09eec9f69 100644 (file)
@@ -62,6 +62,7 @@ mba_wrmsr_amd(struct rdt_domain *d, struct msr_param *m,
 struct rdt_hw_resource rdt_resources_all[] = {
        [RDT_RESOURCE_L3] =
        {
+               .conf_type                      = CDP_NONE,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L3,
                        .name                   = "L3",
@@ -81,6 +82,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_L3DATA] =
        {
+               .conf_type                      = CDP_DATA,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L3DATA,
                        .name                   = "L3DATA",
@@ -100,6 +102,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_L3CODE] =
        {
+               .conf_type                      = CDP_CODE,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L3CODE,
                        .name                   = "L3CODE",
@@ -119,6 +122,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_L2] =
        {
+               .conf_type                      = CDP_NONE,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L2,
                        .name                   = "L2",
@@ -138,6 +142,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_L2DATA] =
        {
+               .conf_type                      = CDP_DATA,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L2DATA,
                        .name                   = "L2DATA",
@@ -157,6 +162,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_L2CODE] =
        {
+               .conf_type                      = CDP_CODE,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_L2CODE,
                        .name                   = "L2CODE",
@@ -176,6 +182,7 @@ struct rdt_hw_resource rdt_resources_all[] = {
        },
        [RDT_RESOURCE_MBA] =
        {
+               .conf_type                      = CDP_NONE,
                .r_resctrl = {
                        .rid                    = RDT_RESOURCE_MBA,
                        .name                   = "MB",
index 2cc4b37bc1283a5ca46a6d7f0bdea132dd837b22..5e4a0a8d743c9f270dee4e5c86e7ea25de80138f 100644 (file)
@@ -369,6 +369,7 @@ struct rdt_parse_data {
 
 /**
  * struct rdt_hw_resource - arch private attributes of a resctrl resource
+ * @conf_type:         The type that should be used when configuring. temporary
  * @r_resctrl:         Attributes of the resource used directly by resctrl.
  * @num_closid:                Maximum number of closid this hardware can support.
  * @msr_base:          Base MSR address for CBMs
@@ -381,6 +382,7 @@ struct rdt_parse_data {
  * msr_update and msr_base.
  */
 struct rdt_hw_resource {
+       enum resctrl_conf_type  conf_type;
        struct rdt_resource     r_resctrl;
        int                     num_closid;
        unsigned int            msr_base;
index 1fc40dbce85dbeb2983104e0a8e3637c23340d4e..d7fd0712e76cfd23ce0190190deb27fe73625da6 100644 (file)
@@ -2135,6 +2135,7 @@ static int schemata_list_create(void)
                        return -ENOMEM;
 
                s->res = r;
+               s->conf_type = resctrl_to_arch_res(r)->conf_type;
 
                INIT_LIST_HEAD(&s->list);
                list_add(&s->list, &resctrl_schema_all);
index 5a21d483da6a9755e738918fbde443b96fbb6d70..095ed48168d7cb562af47e26cde95ec5b84117ec 100644 (file)
@@ -15,6 +15,18 @@ int proc_resctrl_show(struct seq_file *m,
 
 #endif
 
+/**
+ * enum resctrl_conf_type - The type of configuration.
+ * @CDP_NONE:  No prioritisation, both code and data are controlled or monitored.
+ * @CDP_CODE:  Configuration applies to instruction fetches.
+ * @CDP_DATA:  Configuration applies to reads and writes.
+ */
+enum resctrl_conf_type {
+       CDP_NONE,
+       CDP_CODE,
+       CDP_DATA,
+};
+
 /**
  * struct rdt_domain - group of CPUs sharing a resctrl resource
  * @list:              all instances of this resource
@@ -157,11 +169,13 @@ struct rdt_resource {
  * struct resctrl_schema - configuration abilities of a resource presented to
  *                        user-space
  * @list:      Member of resctrl_schema_all.
+ * @conf_type: Whether this schema is specific to code/data.
  * @res:       The resource structure exported by the architecture to describe
  *             the hardware that is configured by this schema.
  */
 struct resctrl_schema {
        struct list_head                list;
+       enum resctrl_conf_type          conf_type;
        struct rdt_resource             *res;
 };
 #endif /* _RESCTRL_H */