lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 29 Mar 2017 17:09:48 +0200 From: Jiri Olsa <jolsa@...nel.org> To: Fenghua Yu <fenghua.yu@...el.com> Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl>, Mike Galbraith <efault@....de>, Shaohua Li <shli@...com>, lkml <linux-kernel@...r.kernel.org>, Ingo Molnar <mingo@...nel.org>, Peter Zijlstra <peterz@...radead.org>, Thomas Gleixner <tglx@...utronix.de> Subject: [PATCH] x86/intel_rdt: Add cpus_list rdtgroup file While playing with the resctrl interface I found it much easier to deal with cpumask list rather than just regular cpumask. Adding cpus_list file to provide cpumask list interface to define group's cpus. # cd /sys/fs/resctrl/ # echo 1-10 > krava/cpus_list # cat krava/cpus_list 1-10 # cat krava/cpus 0007fe # cat cpus fffff9 # cat cpus_list 0,3-23 Cc: Fenghua Yu <fenghua.yu@...el.com> Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl> Cc: Mike Galbraith <efault@....de> Cc: Shaohua Li <shli@...com> Signed-off-by: Jiri Olsa <jolsa@...nel.org> --- arch/x86/include/asm/intel_rdt.h | 16 +++++++++--- arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 42 +++++++++++++++++++++++--------- arch/x86/kernel/cpu/intel_rdt_schemata.c | 6 +++-- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/intel_rdt.h b/arch/x86/include/asm/intel_rdt.h index 0d64397cee58..0e74e58e1f23 100644 --- a/arch/x86/include/asm/intel_rdt.h +++ b/arch/x86/include/asm/intel_rdt.h @@ -37,6 +37,9 @@ struct rdtgroup { /* rdtgroup.flags */ #define RDT_DELETED 1 +/* rftype.flags */ +#define RFTYPE_FLAGS_CPUS_LIST 1 + /* List of all resource groups */ extern struct list_head rdt_all_groups; @@ -54,16 +57,19 @@ struct rftype { char *name; umode_t mode; struct kernfs_ops *kf_ops; + unsigned long flags; int (*seq_show)(struct kernfs_open_file *of, - struct seq_file *sf, void *v); + struct seq_file *sf, void *v, + unsigned long flags); /* * write() is the generic write callback which maps directly to * kernfs write operation and overrides all other operations. * Maximum write size is determined by ->max_write_len. */ ssize_t (*write)(struct kernfs_open_file *of, - char *buf, size_t nbytes, loff_t off); + char *buf, size_t nbytes, loff_t off, + unsigned long flags); }; /** @@ -179,9 +185,11 @@ void rdt_cbm_update(void *arg); struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn); void rdtgroup_kn_unlock(struct kernfs_node *kn); ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, - char *buf, size_t nbytes, loff_t off); + char *buf, size_t nbytes, loff_t off, + unsigned long flags); int rdtgroup_schemata_show(struct kernfs_open_file *of, - struct seq_file *s, void *v); + struct seq_file *s, void *v, + unsigned long flags); /* * intel_rdt_sched_in() - Writes the task's CLOSid to IA32_PQR_MSR diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c index 9ac2a5cdd9c2..3a1dfb421dc5 100644 --- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c @@ -153,7 +153,7 @@ static int rdtgroup_seqfile_show(struct seq_file *m, void *arg) struct rftype *rft = of->kn->priv; if (rft->seq_show) - return rft->seq_show(of, m, arg); + return rft->seq_show(of, m, arg, rft->flags); return 0; } @@ -163,7 +163,7 @@ static ssize_t rdtgroup_file_write(struct kernfs_open_file *of, char *buf, struct rftype *rft = of->kn->priv; if (rft->write) - return rft->write(of, buf, nbytes, off); + return rft->write(of, buf, nbytes, off, rft->flags); return -EINVAL; } @@ -175,15 +175,17 @@ static struct kernfs_ops rdtgroup_kf_single_ops = { }; static int rdtgroup_cpus_show(struct kernfs_open_file *of, - struct seq_file *s, void *v) + struct seq_file *s, void *v, + unsigned long flags) { + const char *fmt = flags & RFTYPE_FLAGS_CPUS_LIST ? "%*pbl\n" : "%*pb\n"; struct rdtgroup *rdtgrp; int ret = 0; rdtgrp = rdtgroup_kn_lock_live(of->kn); if (rdtgrp) - seq_printf(s, "%*pb\n", cpumask_pr_args(&rdtgrp->cpu_mask)); + seq_printf(s, fmt, cpumask_pr_args(&rdtgrp->cpu_mask)); else ret = -ENOENT; rdtgroup_kn_unlock(of->kn); @@ -230,7 +232,8 @@ rdt_update_closid(const struct cpumask *cpu_mask, int *closid) } static ssize_t rdtgroup_cpus_write(struct kernfs_open_file *of, - char *buf, size_t nbytes, loff_t off) + char *buf, size_t nbytes, loff_t off, + unsigned long flags) { cpumask_var_t tmpmask, newmask; struct rdtgroup *rdtgrp, *r; @@ -252,7 +255,11 @@ static ssize_t rdtgroup_cpus_write(struct kernfs_open_file *of, goto unlock; } - ret = cpumask_parse(buf, newmask); + if (flags & RFTYPE_FLAGS_CPUS_LIST) + ret = cpulist_parse(buf, newmask); + else + ret = cpumask_parse(buf, newmask); + if (ret) goto unlock; @@ -415,7 +422,8 @@ static int rdtgroup_move_task(pid_t pid, struct rdtgroup *rdtgrp, } static ssize_t rdtgroup_tasks_write(struct kernfs_open_file *of, - char *buf, size_t nbytes, loff_t off) + char *buf, size_t nbytes, loff_t off, + unsigned long flags __maybe_unused) { struct rdtgroup *rdtgrp; int ret = 0; @@ -448,7 +456,8 @@ static void show_rdt_tasks(struct rdtgroup *r, struct seq_file *s) } static int rdtgroup_tasks_show(struct kernfs_open_file *of, - struct seq_file *s, void *v) + struct seq_file *s, void *v, + unsigned long flags) { struct rdtgroup *rdtgrp; int ret = 0; @@ -473,6 +482,14 @@ static struct rftype rdtgroup_base_files[] = { .seq_show = rdtgroup_cpus_show, }, { + .name = "cpus_list", + .mode = 0644, + .kf_ops = &rdtgroup_kf_single_ops, + .write = rdtgroup_cpus_write, + .seq_show = rdtgroup_cpus_show, + .flags = RFTYPE_FLAGS_CPUS_LIST, + }, + { .name = "tasks", .mode = 0644, .kf_ops = &rdtgroup_kf_single_ops, @@ -489,7 +506,8 @@ static struct rftype rdtgroup_base_files[] = { }; static int rdt_num_closids_show(struct kernfs_open_file *of, - struct seq_file *seq, void *v) + struct seq_file *seq, void *v, + unsigned long flags __maybe_unused) { struct rdt_resource *r = of->kn->parent->priv; @@ -499,7 +517,8 @@ static int rdt_num_closids_show(struct kernfs_open_file *of, } static int rdt_cbm_mask_show(struct kernfs_open_file *of, - struct seq_file *seq, void *v) + struct seq_file *seq, void *v, + unsigned long flags __maybe_unused) { struct rdt_resource *r = of->kn->parent->priv; @@ -509,7 +528,8 @@ static int rdt_cbm_mask_show(struct kernfs_open_file *of, } static int rdt_min_cbm_bits_show(struct kernfs_open_file *of, - struct seq_file *seq, void *v) + struct seq_file *seq, void *v, + unsigned long flags __maybe_unused) { struct rdt_resource *r = of->kn->parent->priv; diff --git a/arch/x86/kernel/cpu/intel_rdt_schemata.c b/arch/x86/kernel/cpu/intel_rdt_schemata.c index f369cb8db0d5..3780ebebf36c 100644 --- a/arch/x86/kernel/cpu/intel_rdt_schemata.c +++ b/arch/x86/kernel/cpu/intel_rdt_schemata.c @@ -132,7 +132,8 @@ static int update_domains(struct rdt_resource *r, int closid) } ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of, - char *buf, size_t nbytes, loff_t off) + char *buf, size_t nbytes, loff_t off, + unsigned long flags) { struct rdtgroup *rdtgrp; struct rdt_resource *r; @@ -224,7 +225,8 @@ static void show_doms(struct seq_file *s, struct rdt_resource *r, int closid) } int rdtgroup_schemata_show(struct kernfs_open_file *of, - struct seq_file *s, void *v) + struct seq_file *s, void *v, + unsigned long flags __maybe_unused) { struct rdtgroup *rdtgrp; struct rdt_resource *r; -- 2.9.3
Powered by blists - more mailing lists