On 16/10/13 16:10, Ralf Baechle wrote: > On Tue, Oct 15, 2013 at 03:13:02PM +0100, Markos Chandras wrote: > >> Add support for including VPE and TC ids in /proc/cpuinfo output as >> appropriate when MT/SMTC is enabled. > > The pile of #ifdefs cracked my glasses ... > > And there are more CPUs or configuration that want to provide special > per-CPU information in /proc/cpuinfo. So I think there needs to be a > hook mechanism, such as a notifier. > > This is a first cut only; I need to think about what sort of looking > the notifier needs to have. But I'd appreciate testing on MT hardware! > > Thanks, > > Ralf > > Signed-off-by: Ralf Baechle <ralf@xxxxxxxxxxxxxx> Hi Ralf, Both of these patches seem to be applied, Markos' in v3.14-rc1, and your one in mips-for-linux-next: $ cat /proc/cpuinfo ... processor : 3 ... core : 1 VPE : 1 VCED exceptions : not available VCEI exceptions : not available VPE : 1 Maybe a revert of Markos' patch could be squashed in to your patch? Cheers James > > arch/mips/include/asm/cpu-info.h | 21 +++++++++++++++++++++ > arch/mips/kernel/proc.c | 23 +++++++++++++++++++++++ > arch/mips/kernel/smp-mt.c | 22 ++++++++++++++++++++++ > arch/mips/kernel/smtc-proc.c | 23 +++++++++++++++++++++++ > 4 files changed, 89 insertions(+) > > diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h > index 21c8e29..95c1c42 100644 > --- a/arch/mips/include/asm/cpu-info.h > +++ b/arch/mips/include/asm/cpu-info.h > @@ -92,4 +92,25 @@ extern void cpu_report(void); > extern const char *__cpu_name[]; > #define cpu_name_string() __cpu_name[smp_processor_id()] > > +struct seq_file; > +struct notifier_block; > + > +extern int register_proc_cpuinfo_notifier(struct notifier_block *nb); > +extern int proc_cpuinfo_notifier_call_chain(unsigned long val, void *v); > + > +#define proc_cpuinfo_notifier(fn, pri) \ > +({ \ > + static struct notifier_block fn##_nb = { \ > + .notifier_call = fn, \ > + .priority = pri \ > + }; \ > + \ > + register_proc_cpuinfo_notifier(&fn##_nb); \ > +}) > + > +struct proc_cpuinfo_notifier_args { > + struct seq_file *m; > + unsigned long n; > +}; > + > #endif /* __ASM_CPU_INFO_H */ > diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c > index 8c58d8a..5ca804d 100644 > --- a/arch/mips/kernel/proc.c > +++ b/arch/mips/kernel/proc.c > @@ -17,8 +17,24 @@ > > unsigned int vced_count, vcei_count; > > +/* > + * * No lock; only written during early bootup by CPU 0. > + * */ > +static RAW_NOTIFIER_HEAD(proc_cpuinfo_chain); > + > +int __ref register_proc_cpuinfo_notifier(struct notifier_block *nb) > +{ > + return raw_notifier_chain_register(&proc_cpuinfo_chain, nb); > +} > + > +int proc_cpuinfo_notifier_call_chain(unsigned long val, void *v) > +{ > + return raw_notifier_call_chain(&proc_cpuinfo_chain, val, v); > +} > + > static int show_cpuinfo(struct seq_file *m, void *v) > { > + struct proc_cpuinfo_notifier_args proc_cpuinfo_notifier_args; > unsigned long n = (unsigned long) v - 1; > unsigned int version = cpu_data[n].processor_id; > unsigned int fp_vers = cpu_data[n].fpu_id; > @@ -112,6 +128,13 @@ static int show_cpuinfo(struct seq_file *m, void *v) > cpu_has_vce ? "%u" : "not available"); > seq_printf(m, fmt, 'D', vced_count); > seq_printf(m, fmt, 'I', vcei_count); > + > + proc_cpuinfo_notifier_args.m = m; > + proc_cpuinfo_notifier_args.n = n; > + > + raw_notifier_call_chain(&proc_cpuinfo_chain, 0, > + &proc_cpuinfo_notifier_args); > + > seq_printf(m, "\n"); > > return 0; > diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c > index 57a3f7a..9a43e78 100644 > --- a/arch/mips/kernel/smp-mt.c > +++ b/arch/mips/kernel/smp-mt.c > @@ -285,3 +285,25 @@ struct plat_smp_ops vsmp_smp_ops = { > .smp_setup = vsmp_smp_setup, > .prepare_cpus = vsmp_prepare_cpus, > }; > + > +static int proc_cpuinfo_chain_call(struct notifier_block *nfb, > + unsigned long action_unused, void *data) > +{ > + struct proc_cpuinfo_notifier_args *pcn = data; > + struct seq_file *m = pcn->m; > + unsigned long n = pcn->n; > + > + if (!cpu_has_mipsmt) > + return NOTIFY_OK; > + > + seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id); > + > + return NOTIFY_OK; > +} > + > +static int __init proc_cpuinfo_notifier_init(void) > +{ > + return proc_cpuinfo_notifier(proc_cpuinfo_chain_call, 0); > +} > + > +subsys_initcall(proc_cpuinfo_notifier_init); > diff --git a/arch/mips/kernel/smtc-proc.c b/arch/mips/kernel/smtc-proc.c > index c10aa84..38635a9 100644 > --- a/arch/mips/kernel/smtc-proc.c > +++ b/arch/mips/kernel/smtc-proc.c > @@ -77,3 +77,26 @@ void init_smtc_stats(void) > > proc_create("smtc", 0444, NULL, &smtc_proc_fops); > } > + > +static int proc_cpuinfo_chain_call(struct notifier_block *nfb, > + unsigned long action_unused, void *data) > +{ > + struct proc_cpuinfo_notifier_args *pcn = data; > + struct seq_file *m = pcn->m; > + unsigned long n = pcn->n; > + > + if (!cpu_has_mipsmt) > + return NOTIFY_OK; > + > + seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id); > + seq_printf(m, "TC\t\t\t: %d\n", cpu_data[n].tc_id); > + > + return NOTIFY_OK; > +} > + > +static int __init proc_cpuinfo_notifier_init(void) > +{ > + return proc_cpuinfo_notifier(proc_cpuinfo_chain_call, 0); > +} > + > +subsys_initcall(proc_cpuinfo_notifier_init); >
Attachment:
signature.asc
Description: OpenPGP digital signature