* [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core
@ 2004-12-02 10:10 Mikael Pettersson
2004-12-02 18:59 ` Greg KH
0 siblings, 1 reply; 4+ messages in thread
From: Mikael Pettersson @ 2004-12-02 10:10 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel
Andrew,
This patch set changes perfctr to publish its global
information via a textual sysfs interface instead of
passing binary structs via sys_perfctr_info(). We can
now remove sys_perfctr_info().
Perfctr sysfs update part 1/4:
- Publish global information via text files in sysfs.
- Remove sys_perfctr_info() from arch-neutral code.
Signed-off-by: Mikael Pettersson <mikpe@csd.uu.se>
drivers/perfctr/init.c | 117 ++++++++++++++++++++++++++++++----------------
drivers/perfctr/version.h | 2
include/linux/perfctr.h | 3 -
kernel/sys_ni.c | 1
4 files changed, 79 insertions(+), 44 deletions(-)
diff -rupN linux-2.6.10-rc2-mm4/drivers/perfctr/init.c linux-2.6.10-rc2-mm4.perfctr-core-update/drivers/perfctr/init.c
--- linux-2.6.10-rc2-mm4/drivers/perfctr/init.c 2004-11-30 23:53:02.000000000 +0100
+++ linux-2.6.10-rc2-mm4.perfctr-core-update/drivers/perfctr/init.c 2004-12-02 02:43:52.000000000 +0100
@@ -8,6 +8,7 @@
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/perfctr.h>
#include <asm/uaccess.h>
@@ -21,51 +22,84 @@ struct perfctr_info perfctr_info = {
.driver_version = VERSION,
};
-char *perfctr_cpu_name __initdata;
+static struct class perfctr_class = {
+ .name = "perfctr",
+};
-static int cpus_copy_to_user(struct perfctr_cpu_mask __user *argp, const cpumask_t *cpus)
+static ssize_t
+perfctr_show_driver_version(struct class *class, char *buf)
{
- const unsigned int k_nrwords = PERFCTR_CPUMASK_NRLONGS*(sizeof(long)/sizeof(int));
- unsigned int u_nrwords;
- unsigned int ui, ki, j;
-
- if (get_user(u_nrwords, &argp->nrwords))
- return -EFAULT;
- if (put_user(k_nrwords, &argp->nrwords))
- return -EFAULT;
- if (u_nrwords < k_nrwords)
- return -EOVERFLOW;
- for(ui = 0, ki = 0; ki < PERFCTR_CPUMASK_NRLONGS; ++ki) {
- unsigned long mask = cpus_addr(*cpus)[ki];
- for(j = 0; j < sizeof(long)/sizeof(int); ++j) {
- if (put_user((unsigned int)mask, &argp->mask[ui]))
- return -EFAULT;
- ++ui;
- mask = (mask >> (8*sizeof(int)-1)) >> 1;
- }
- }
- return 0;
+ return sprintf(buf, "%s\n", perfctr_info.driver_version);
}
+static CLASS_ATTR(driver_version,0444,perfctr_show_driver_version,NULL);
-asmlinkage long sys_perfctr_info(struct perfctr_info __user *infop,
- struct perfctr_cpu_mask __user *cpusp,
- struct perfctr_cpu_mask __user *forbiddenp)
-{
- if (infop && copy_to_user(infop, &perfctr_info, sizeof perfctr_info))
- return -EFAULT;
- if (cpusp) {
- int err = cpus_copy_to_user(cpusp, &cpu_online_map);
- if (err)
- return err;
- }
- if (forbiddenp) {
- int err = cpus_copy_to_user(forbiddenp, &perfctr_cpus_forbidden_mask);
- if (err)
- return err;
- }
- return 0;
+static ssize_t
+perfctr_show_cpu_type(struct class *class, char *buf)
+{
+ return sprintf(buf, "%#x\n", perfctr_info.cpu_type);
+}
+static CLASS_ATTR(cpu_type,0444,perfctr_show_cpu_type,NULL);
+
+static ssize_t
+perfctr_show_cpu_features(struct class *class, char *buf)
+{
+ return sprintf(buf, "%#x\n", perfctr_info.cpu_features);
+}
+static CLASS_ATTR(cpu_features,0444,perfctr_show_cpu_features,NULL);
+
+static ssize_t
+perfctr_show_cpu_khz(struct class *class, char *buf)
+{
+ return sprintf(buf, "%u\n", perfctr_info.cpu_khz);
+}
+static CLASS_ATTR(cpu_khz,0444,perfctr_show_cpu_khz,NULL);
+
+static ssize_t
+perfctr_show_tsc_to_cpu_mult(struct class *class, char *buf)
+{
+ return sprintf(buf, "%u\n", perfctr_info.tsc_to_cpu_mult);
+}
+static CLASS_ATTR(tsc_to_cpu_mult,0444,perfctr_show_tsc_to_cpu_mult,NULL);
+
+static ssize_t
+perfctr_show_cpus_online(struct class *class, char *buf)
+{
+ int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, cpu_online_map);
+ buf[ret++] = '\n';
+ return ret;
+}
+static CLASS_ATTR(cpus_online,0444,perfctr_show_cpus_online,NULL);
+
+static ssize_t
+perfctr_show_cpus_forbidden(struct class *class, char *buf)
+{
+ int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, perfctr_cpus_forbidden_mask);
+ buf[ret++] = '\n';
+ return ret;
+}
+static CLASS_ATTR(cpus_forbidden,0444,perfctr_show_cpus_forbidden,NULL);
+
+static int __init perfctr_class_init(void)
+{
+ int ret;
+
+ ret = class_register(&perfctr_class);
+ if (ret)
+ return ret;
+ ret |= class_create_file(&perfctr_class, &class_attr_driver_version);
+ ret |= class_create_file(&perfctr_class, &class_attr_cpu_type);
+ ret |= class_create_file(&perfctr_class, &class_attr_cpu_features);
+ ret |= class_create_file(&perfctr_class, &class_attr_cpu_khz);
+ ret |= class_create_file(&perfctr_class, &class_attr_tsc_to_cpu_mult);
+ ret |= class_create_file(&perfctr_class, &class_attr_cpus_online);
+ ret |= class_create_file(&perfctr_class, &class_attr_cpus_forbidden);
+ if (ret)
+ class_unregister(&perfctr_class);
+ return ret;
}
+char *perfctr_cpu_name __initdata;
+
static int __init perfctr_init(void)
{
int err;
@@ -78,6 +112,11 @@ static int __init perfctr_init(void)
err = vperfctr_init();
if (err)
return err;
+ err = perfctr_class_init();
+ if (err) {
+ printk(KERN_ERR "perfctr: class initialisation failed\n");
+ return err;
+ }
printk(KERN_INFO "perfctr: driver %s, cpu type %s at %u kHz\n",
perfctr_info.driver_version,
perfctr_cpu_name,
diff -rupN linux-2.6.10-rc2-mm4/drivers/perfctr/version.h linux-2.6.10-rc2-mm4.perfctr-core-update/drivers/perfctr/version.h
--- linux-2.6.10-rc2-mm4/drivers/perfctr/version.h 2004-11-30 23:53:02.000000000 +0100
+++ linux-2.6.10-rc2-mm4.perfctr-core-update/drivers/perfctr/version.h 2004-12-02 02:43:52.000000000 +0100
@@ -1 +1 @@
-#define VERSION "2.7.8"
+#define VERSION "2.7.9"
diff -rupN linux-2.6.10-rc2-mm4/include/linux/perfctr.h linux-2.6.10-rc2-mm4.perfctr-core-update/include/linux/perfctr.h
--- linux-2.6.10-rc2-mm4/include/linux/perfctr.h 2004-11-30 23:53:04.000000000 +0100
+++ linux-2.6.10-rc2-mm4.perfctr-core-update/include/linux/perfctr.h 2004-12-02 02:43:52.000000000 +0100
@@ -71,9 +71,6 @@ struct vperfctr_control;
/*
* The perfctr system calls.
*/
-asmlinkage long sys_perfctr_info(struct perfctr_info __user*,
- struct perfctr_cpu_mask __user*,
- struct perfctr_cpu_mask __user*);
asmlinkage long sys_vperfctr_open(int tid, int creat);
asmlinkage long sys_vperfctr_control(int fd,
const struct vperfctr_control __user *argp,
diff -rupN linux-2.6.10-rc2-mm4/kernel/sys_ni.c linux-2.6.10-rc2-mm4.perfctr-core-update/kernel/sys_ni.c
--- linux-2.6.10-rc2-mm4/kernel/sys_ni.c 2004-11-30 23:53:04.000000000 +0100
+++ linux-2.6.10-rc2-mm4.perfctr-core-update/kernel/sys_ni.c 2004-12-02 02:43:52.000000000 +0100
@@ -83,7 +83,6 @@ cond_syscall(sys_pciconfig_read)
cond_syscall(sys_pciconfig_write)
cond_syscall(sys_pciconfig_iobase)
-cond_syscall(sys_perfctr_info)
cond_syscall(sys_vperfctr_open)
cond_syscall(sys_vperfctr_control)
cond_syscall(sys_vperfctr_unlink)
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core
2004-12-02 10:10 [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core Mikael Pettersson
@ 2004-12-02 18:59 ` Greg KH
2004-12-03 9:52 ` Mikael Pettersson
0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2004-12-02 18:59 UTC (permalink / raw)
To: Mikael Pettersson; +Cc: akpm, linux-kernel
On Thu, Dec 02, 2004 at 11:10:24AM +0100, Mikael Pettersson wrote:
> +static int __init perfctr_class_init(void)
> +{
> + int ret;
> +
> + ret = class_register(&perfctr_class);
> + if (ret)
> + return ret;
> + ret |= class_create_file(&perfctr_class, &class_attr_driver_version);
> + ret |= class_create_file(&perfctr_class, &class_attr_cpu_type);
> + ret |= class_create_file(&perfctr_class, &class_attr_cpu_features);
> + ret |= class_create_file(&perfctr_class, &class_attr_cpu_khz);
> + ret |= class_create_file(&perfctr_class, &class_attr_tsc_to_cpu_mult);
> + ret |= class_create_file(&perfctr_class, &class_attr_cpus_online);
> + ret |= class_create_file(&perfctr_class, &class_attr_cpus_forbidden);
> + if (ret)
> + class_unregister(&perfctr_class);
> + return ret;
It's easier to use sysfs_create_group() instead of registering all of
the individual files.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core
2004-12-02 18:59 ` Greg KH
@ 2004-12-03 9:52 ` Mikael Pettersson
2004-12-03 17:03 ` Greg KH
0 siblings, 1 reply; 4+ messages in thread
From: Mikael Pettersson @ 2004-12-03 9:52 UTC (permalink / raw)
To: Greg KH; +Cc: akpm, linux-kernel
Greg KH writes:
> On Thu, Dec 02, 2004 at 11:10:24AM +0100, Mikael Pettersson wrote:
> > +static int __init perfctr_class_init(void)
> > +{
> > + int ret;
> > +
> > + ret = class_register(&perfctr_class);
> > + if (ret)
> > + return ret;
> > + ret |= class_create_file(&perfctr_class, &class_attr_driver_version);
> > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_type);
> > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_features);
> > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_khz);
> > + ret |= class_create_file(&perfctr_class, &class_attr_tsc_to_cpu_mult);
> > + ret |= class_create_file(&perfctr_class, &class_attr_cpus_online);
> > + ret |= class_create_file(&perfctr_class, &class_attr_cpus_forbidden);
> > + if (ret)
> > + class_unregister(&perfctr_class);
> > + return ret;
>
> It's easier to use sysfs_create_group() instead of registering all of
> the individual files.
Thanks for the hint. While looking around I noticed I can simplify
it even further by having perfctr_class.class_attrs point to an array
of attributes at class_register() time.
Perfctr sysfs update:
- Simplify perfctr sysfs code.
Signed-off-by: Mikael Pettersson <mikpe@csd.uu.se>
drivers/perfctr/init.c | 58 ++++++++++++++++++-------------------------------
1 files changed, 22 insertions(+), 36 deletions(-)
diff -rupN linux-2.6.10-rc2-mm4/drivers/perfctr/init.c linux-2.6.10-rc2-mm4.perfctr-core-update2/drivers/perfctr/init.c
--- linux-2.6.10-rc2-mm4/drivers/perfctr/init.c 2004-12-03 01:52:19.000000000 +0100
+++ linux-2.6.10-rc2-mm4.perfctr-core-update2/drivers/perfctr/init.c 2004-12-03 01:51:37.000000000 +0100
@@ -22,81 +22,67 @@ struct perfctr_info perfctr_info = {
.driver_version = VERSION,
};
-static struct class perfctr_class = {
- .name = "perfctr",
-};
-
static ssize_t
-perfctr_show_driver_version(struct class *class, char *buf)
+driver_version_show(struct class *class, char *buf)
{
return sprintf(buf, "%s\n", perfctr_info.driver_version);
}
-static CLASS_ATTR(driver_version,0444,perfctr_show_driver_version,NULL);
static ssize_t
-perfctr_show_cpu_type(struct class *class, char *buf)
+cpu_type_show(struct class *class, char *buf)
{
return sprintf(buf, "%#x\n", perfctr_info.cpu_type);
}
-static CLASS_ATTR(cpu_type,0444,perfctr_show_cpu_type,NULL);
static ssize_t
-perfctr_show_cpu_features(struct class *class, char *buf)
+cpu_features_show(struct class *class, char *buf)
{
return sprintf(buf, "%#x\n", perfctr_info.cpu_features);
}
-static CLASS_ATTR(cpu_features,0444,perfctr_show_cpu_features,NULL);
static ssize_t
-perfctr_show_cpu_khz(struct class *class, char *buf)
+cpu_khz_show(struct class *class, char *buf)
{
return sprintf(buf, "%u\n", perfctr_info.cpu_khz);
}
-static CLASS_ATTR(cpu_khz,0444,perfctr_show_cpu_khz,NULL);
static ssize_t
-perfctr_show_tsc_to_cpu_mult(struct class *class, char *buf)
+tsc_to_cpu_mult_show(struct class *class, char *buf)
{
return sprintf(buf, "%u\n", perfctr_info.tsc_to_cpu_mult);
}
-static CLASS_ATTR(tsc_to_cpu_mult,0444,perfctr_show_tsc_to_cpu_mult,NULL);
static ssize_t
-perfctr_show_cpus_online(struct class *class, char *buf)
+cpus_online_show(struct class *class, char *buf)
{
int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, cpu_online_map);
buf[ret++] = '\n';
return ret;
}
-static CLASS_ATTR(cpus_online,0444,perfctr_show_cpus_online,NULL);
static ssize_t
-perfctr_show_cpus_forbidden(struct class *class, char *buf)
+cpus_forbidden_show(struct class *class, char *buf)
{
int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, perfctr_cpus_forbidden_mask);
buf[ret++] = '\n';
return ret;
}
-static CLASS_ATTR(cpus_forbidden,0444,perfctr_show_cpus_forbidden,NULL);
-static int __init perfctr_class_init(void)
-{
- int ret;
+static struct class_attribute perfctr_class_attrs[] = {
+ __ATTR_RO(driver_version),
+ __ATTR_RO(cpu_type),
+ __ATTR_RO(cpu_features),
+ __ATTR_RO(cpu_khz),
+ __ATTR_RO(tsc_to_cpu_mult),
+ __ATTR_RO(cpus_online),
+ __ATTR_RO(cpus_forbidden),
+ __ATTR_NULL
+};
- ret = class_register(&perfctr_class);
- if (ret)
- return ret;
- ret |= class_create_file(&perfctr_class, &class_attr_driver_version);
- ret |= class_create_file(&perfctr_class, &class_attr_cpu_type);
- ret |= class_create_file(&perfctr_class, &class_attr_cpu_features);
- ret |= class_create_file(&perfctr_class, &class_attr_cpu_khz);
- ret |= class_create_file(&perfctr_class, &class_attr_tsc_to_cpu_mult);
- ret |= class_create_file(&perfctr_class, &class_attr_cpus_online);
- ret |= class_create_file(&perfctr_class, &class_attr_cpus_forbidden);
- if (ret)
- class_unregister(&perfctr_class);
- return ret;
-}
+static struct class perfctr_class = {
+ .name = "perfctr",
+ .class_attrs = perfctr_class_attrs,
+};
char *perfctr_cpu_name __initdata;
@@ -112,7 +98,7 @@ static int __init perfctr_init(void)
err = vperfctr_init();
if (err)
return err;
- err = perfctr_class_init();
+ err = class_register(&perfctr_class);
if (err) {
printk(KERN_ERR "perfctr: class initialisation failed\n");
return err;
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core
2004-12-03 9:52 ` Mikael Pettersson
@ 2004-12-03 17:03 ` Greg KH
0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2004-12-03 17:03 UTC (permalink / raw)
To: Mikael Pettersson; +Cc: akpm, linux-kernel
On Fri, Dec 03, 2004 at 10:52:15AM +0100, Mikael Pettersson wrote:
> Greg KH writes:
> > On Thu, Dec 02, 2004 at 11:10:24AM +0100, Mikael Pettersson wrote:
> > > +static int __init perfctr_class_init(void)
> > > +{
> > > + int ret;
> > > +
> > > + ret = class_register(&perfctr_class);
> > > + if (ret)
> > > + return ret;
> > > + ret |= class_create_file(&perfctr_class, &class_attr_driver_version);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_type);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_features);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_cpu_khz);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_tsc_to_cpu_mult);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_cpus_online);
> > > + ret |= class_create_file(&perfctr_class, &class_attr_cpus_forbidden);
> > > + if (ret)
> > > + class_unregister(&perfctr_class);
> > > + return ret;
> >
> > It's easier to use sysfs_create_group() instead of registering all of
> > the individual files.
>
> Thanks for the hint. While looking around I noticed I can simplify
> it even further by having perfctr_class.class_attrs point to an array
> of attributes at class_register() time.
Nice, I forgot about that :)
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-12-03 17:32 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-02 10:10 [PATCH][2.6.10-rc2-mm4] perfctr sysfs update 1/4: core Mikael Pettersson
2004-12-02 18:59 ` Greg KH
2004-12-03 9:52 ` Mikael Pettersson
2004-12-03 17:03 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).