Users who want to find out which CPUs are part of which resctrl domain need to jump through some hoops in /sys to find the lists of CPUs. This is extra complicated when Sub-NUMA cluster is enabled on a system since there is no simple indication that this feature is active, or how many numa nodes are present per L3 cache. Add files in each resource info directory to provide this information in each of "list" and "bitmap" form. E.g. $ cat /sys/fs/resctrl/info/domain_cpu_list 0: 0-35,72-107 1: 36-71,108-143 $ cat /sys/fs/resctrl/info/domain_cpu_map 0: 0000,00000fff,ffffff00,0000000f,ffffffff 1: ffff,fffff000,000000ff,fffffff0,00000000 Suggested-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx> --- Documentation/arch/x86/resctrl.rst | 19 +++++++++ arch/x86/kernel/cpu/resctrl/rdtgroup.c | 57 ++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/Documentation/arch/x86/resctrl.rst b/Documentation/arch/x86/resctrl.rst index 15f1cff6ee76..8c42ad3369fd 100644 --- a/Documentation/arch/x86/resctrl.rst +++ b/Documentation/arch/x86/resctrl.rst @@ -261,6 +261,25 @@ with the following files: bytes) at which a previously used LLC_occupancy counter can be considered for re-use. +Subdirectories of all resource types contain these files: + +"domain_cpu_list" + Provides a list of CPU numbers associated with each + domain for this resource. + Example:: + + # cat /sys/fs/resctrl/info/L3/domain_cpu_list + 0: 0-35,72-107 + 1: 36-71,108-143 + +"domain_cpu_map" + Same as above but the CPUs are listed in bitmap format. + Example:: + + # cat /sys/fs/resctrl/info/L3/domain_cpu_map + 0: 0000,00000fff,ffffff00,0000000f,ffffffff + 1: ffff,fffff000,000000ff,fffffff0,00000000 + Finally, in the top level of the "info" directory there is a file named "last_cmd_status". This is reset with every "command" issued via the file system (making new directories or writing to any of the diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c index 40e6bb8a8fc8..54673def7e9f 100644 --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c @@ -957,6 +957,20 @@ static int rdt_num_closids_show(struct kernfs_open_file *of, return 0; } +static int rdt_ctrl_cpus_show(struct kernfs_open_file *of, + struct seq_file *seq, void *v) +{ + struct resctrl_schema *s = of->kn->parent->priv; + struct rdt_resource *r = s->res; + struct rdt_ctrl_domain *d; + + list_for_each_entry(d, &r->ctrl_domains, hdr.list) + seq_printf(seq, is_cpu_list(of) ? "%d: %*pbl\n" : "%d: %*pb\n", + d->hdr.id, cpumask_pr_args(&d->hdr.cpu_mask)); + + return 0; +} + static int rdt_default_ctrl_show(struct kernfs_open_file *of, struct seq_file *seq, void *v) { @@ -1103,6 +1117,19 @@ static int rdt_num_rmids_show(struct kernfs_open_file *of, return 0; } +static int rdt_mon_cpus_show(struct kernfs_open_file *of, + struct seq_file *seq, void *v) +{ + struct rdt_resource *r = of->kn->parent->priv; + struct rdt_mon_domain *d; + + list_for_each_entry(d, &r->mon_domains, hdr.list) + seq_printf(seq, is_cpu_list(of) ? "%d: %*pbl\n" : "%d: %*pb\n", + d->hdr.id, cpumask_pr_args(&d->hdr.cpu_mask)); + + return 0; +} + static int rdt_mon_features_show(struct kernfs_open_file *of, struct seq_file *seq, void *v) { @@ -1810,6 +1837,21 @@ static struct rftype res_common_files[] = { .seq_show = rdt_num_closids_show, .fflags = RFTYPE_CTRL_INFO, }, + { + .name = "domain_cpu_list", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_ctrl_cpus_show, + .flags = RFTYPE_FLAGS_CPUS_LIST, + .fflags = RFTYPE_CTRL_INFO, + }, + { + .name = "domain_cpu_map", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_ctrl_cpus_show, + .fflags = RFTYPE_CTRL_INFO, + }, { .name = "mon_features", .mode = 0444, @@ -1824,6 +1866,21 @@ static struct rftype res_common_files[] = { .seq_show = rdt_num_rmids_show, .fflags = RFTYPE_MON_INFO, }, + { + .name = "domain_cpu_list", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_mon_cpus_show, + .flags = RFTYPE_FLAGS_CPUS_LIST, + .fflags = RFTYPE_MON_INFO, + }, + { + .name = "domain_cpu_map", + .mode = 0444, + .kf_ops = &rdtgroup_kf_single_ops, + .seq_show = rdt_mon_cpus_show, + .fflags = RFTYPE_MON_INFO, + }, { .name = "cbm_mask", .mode = 0444, -- 2.44.0