linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).