linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* format_cpumask()
@ 2003-11-17  3:35 William Lee Irwin III
  2003-11-19  9:32 ` format_cpumask() Paul Jackson
  0 siblings, 1 reply; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-17  3:35 UTC (permalink / raw)
  To: linux-kernel; +Cc: anton, ak

I botched printing out cpumasks, and about a dozen times over.

This implements a generic format_cpumask() function and calls
it in various places. This time, without scrambling the bits.


-- wli


===== include/linux/cpumask.h 1.1 vs edited =====
--- 1.1/include/linux/cpumask.h	Mon Aug 18 19:46:23 2003
+++ edited/include/linux/cpumask.h	Sun Nov 16 19:28:33 2003
@@ -68,4 +68,23 @@
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
 
+static inline int format_cpumask(char *buf, cpumask_t cpus)
+{
+	int k, len = 0;
+
+	for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; ++k) {
+		int m;
+		cpumask_t tmp;
+
+		cpus_shift_right(tmp, cpus, BITS_PER_LONG*k);
+		if (BITS_PER_LONG == 32)
+			m = sprintf(buf, "%08lx", cpus_coerce(tmp));
+		else /* BITS_PER_LONG == 64 */
+			m = sprintf(buf, "%16lx", cpus_coerce(tmp));
+		len += m;
+		buf += m;
+	}
+	return len;
+}
+
 #endif /* __LINUX_CPUMASK_H */
===== arch/i386/kernel/irq.c 1.45 vs edited =====
--- 1.45/arch/i386/kernel/irq.c	Wed Oct 22 20:26:34 2003
+++ edited/arch/i386/kernel/irq.c	Sun Nov 16 19:19:13 2003
@@ -949,19 +949,13 @@
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data];
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1000,10 +994,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/ia64/kernel/irq.c 1.31 vs edited =====
--- 1.31/arch/ia64/kernel/irq.c	Tue Nov  4 11:31:16 2003
+++ edited/arch/ia64/kernel/irq.c	Sun Nov 16 19:07:19 2003
@@ -974,19 +974,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1034,17 +1028,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t *mask = (cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-		len += j;
-		page += j;
-		cpus_shift_right(*mask, *mask, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/mips/kernel/irq.c 1.14 vs edited =====
--- 1.14/arch/mips/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/mips/kernel/irq.c	Sun Nov 16 19:07:59 2003
@@ -872,17 +872,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -918,19 +914,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t *mask = (cpumask_t *)data, tmp;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc/kernel/irq.c 1.33 vs edited =====
--- 1.33/arch/ppc/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/ppc/kernel/irq.c	Sun Nov 16 19:08:36 2003
@@ -574,19 +574,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp = irq_affinity[(long)data];
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -665,17 +659,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t mask = *(cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-		len += j;
-		page += j;
-		cpus_shift_right(mask, mask, 16);
-	}
+	len = format_cpumask(page, mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc64/kernel/irq.c 1.36 vs edited =====
--- 1.36/arch/ppc64/kernel/irq.c	Wed Oct 15 18:43:36 2003
+++ edited/arch/ppc64/kernel/irq.c	Sun Nov 16 19:11:59 2003
@@ -657,18 +657,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -744,10 +739,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *) data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/um/kernel/irq.c 1.11 vs edited =====
--- 1.11/arch/um/kernel/irq.c	Tue Oct  7 19:53:41 2003
+++ edited/arch/um/kernel/irq.c	Sun Nov 16 19:09:06 2003
@@ -577,9 +577,15 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
+	int len;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
+	len += sprinf(page, "\n");
+	return len;
 }
 
 static unsigned int parse_hex_value (const char *buffer,
@@ -652,18 +658,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len = 0;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/x86_64/kernel/irq.c 1.18 vs edited =====
--- 1.18/arch/x86_64/kernel/irq.c	Tue Oct  7 19:53:42 2003
+++ edited/arch/x86_64/kernel/irq.c	Sun Nov 16 19:12:18 2003
@@ -850,18 +850,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -897,19 +892,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	tmp = *mask;
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== drivers/base/node.c 1.15 vs edited =====
--- 1.15/drivers/base/node.c	Mon Aug 18 19:46:23 2003
+++ edited/drivers/base/node.c	Sun Nov 16 19:20:29 2003
@@ -19,15 +19,11 @@
 {
 	struct node *node_dev = to_node(dev);
 	cpumask_t tmp = node_dev->cpumap;
-	int k, len = 0;
+	int len = 0;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		buf += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-        len += sprintf(buf, "\n");
+	len = format_cpumask(buf, node_dev->cpumap);
+	buf += len;
+	len += sprintf(buf, "\n");
 	return len;
 }
 static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-17  3:35 format_cpumask() William Lee Irwin III
@ 2003-11-19  9:32 ` Paul Jackson
  2003-11-19 10:38   ` format_cpumask() William Lee Irwin III
  0 siblings, 1 reply; 11+ messages in thread
From: Paul Jackson @ 2003-11-19  9:32 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: linux-kernel, anton, ak

William wrote:
> +static inline int format_cpumask(char *buf, cpumask_t cpus)

Wouldn't it be a good idea to pass in the length of the remaining
available buffer space and use snprintf, to avoid overruns?

We're going to end up with some pretty big cpumasks on some systems --
running over a buffer would be nasty.  It would mostly happen during
bring up of new bigger systems; but still worth avoiding.

A second thought - more controversial - long sequences of digits can get
pretty difficult to read.  How about breaking them with a separator
character, say every 32 or 64 bits.

I'd suggest a comma ','.

This has the secondary win that one _could_ then avoid zero-filling,
since if each segment is always one words-worth, it's no longer
ambiguous when leading zeros are suppressed.  However suppressing zero
filling might be harder on scripting ... depending on the language.  For
languages (C and awk?) that lack infinite precision integer arithmetic
but have good field separators, the zero filling probably doesn't help
much.  For languages (Python?) with good infinite precision arithmetic,
the field separator is not helpful.  For languages with good string
handling, field separators (sh with IFS=,) and fair to poor
arithmetic, the zero fill might impede string manipulation more than
arithmetic.

The main advantage, in my view, of not zero-filling, is that it is one
more way to shorten the long strings from monster systems.

The following code provides the "," separated, no-zero fill, flavor of
this.  This comes from some work I am doing to provide an abstract data
type for nodemask_t, that should also work for cpumasks, with a nice
little bit of code reduction (but still nice inline assembly code in
most cases).

The following "__mask_snprintf_len()" code would be called from a macro,
such as:

#define mask_snprintf(buf, buflen, cpumask) \
	__mask_snprintf_len(buf, buflen, cpumask_addr(cpumask), NR_CPUS/8)

where cpumask_addr(map) was one of:

	&(map)
    or
	(map).mask


int __mask_snprintf_len(char *buf, unsigned int buflen,
        unsigned int *maskp, unsigned int maskbytes)
{
        int i;
        int len = 0;
        unsigned int maskints = maskbytes/sizeof(unsigned int);
        char *sep;
        if (buflen < 2)
                return;
        if (maskints == 0) {
                strcpy(buf,"0");
                return 1;
        }
        buf[0] = 0;
        sep = "";
        for (i = maskints-1; i >= 0; i--) {
                int n = strlen(buf);
                len += snprintf(buf+n, buflen-n, "%s%x", sep, maskp[i]);
                sep = ",";
        }
        return len;
}


-- 
                          I won't rest till it's the best ...
                          Programmer, Linux Scalability
                          Paul Jackson <pj@sgi.com> 1.650.933.1373


-- 
                          I won't rest till it's the best ...
                          Programmer, Linux Scalability
                          Paul Jackson <pj@sgi.com> 1.650.933.1373

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-19  9:32 ` format_cpumask() Paul Jackson
@ 2003-11-19 10:38   ` William Lee Irwin III
  0 siblings, 0 replies; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-19 10:38 UTC (permalink / raw)
  To: Paul Jackson; +Cc: linux-kernel, anton, ak

On Wed, Nov 19, 2003 at 01:32:38AM -0800, Paul Jackson wrote:
> Wouldn't it be a good idea to pass in the length of the remaining
> available buffer space and use snprintf, to avoid overruns?
> We're going to end up with some pretty big cpumasks on some systems --
> running over a buffer would be nasty.  It would mostly happen during
> bring up of new bigger systems; but still worth avoiding.
> A second thought - more controversial - long sequences of digits can get
> pretty difficult to read.  How about breaking them with a separator
> character, say every 32 or 64 bits.

I'm happy just to get the numbers into _some_ format that makes sense.
This could very well be an improvement over the large hexadecimal
number. I say run with it.


-- wli

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-18  0:34     ` format_cpumask() Keith Owens
@ 2003-11-18  0:56       ` William Lee Irwin III
  0 siblings, 0 replies; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-18  0:56 UTC (permalink / raw)
  To: Keith Owens; +Cc: Joe Korty, Luck, Tony, linux-kernel

On Mon, 17 Nov 2003 16:26:47 -0800, William Lee Irwin III <wli@holomorphy.com> wrote:
>>+		m = sprintf(buf, "%0*lx", 2*sizeof(long), cpus_coerce(tmp));

On Tue, Nov 18, 2003 at 11:34:11AM +1100, Keith Owens wrote:
> Sorry, that has to be 
> +		m = sprintf(buf, "%0*lx", (int)(2*sizeof(long)), cpus_coerce(tmp));
> otherwise gcc complains on 64 bit systems.  The '*' flag requires an
> int parameter, sizeof returns long.

Would be nice if I could get at those often enough to catch these myself.
So round 4 (or whatever):


-- wli


===== include/linux/cpumask.h 1.1 vs edited =====
--- 1.1/include/linux/cpumask.h	Mon Aug 18 19:46:23 2003
+++ edited/include/linux/cpumask.h	Mon Nov 17 16:55:23 2003
@@ -68,4 +68,20 @@
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
 
+static inline int format_cpumask(char *buf, cpumask_t cpus)
+{
+	int k, len = 0;
+
+	for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; --k) {
+		int m;
+		cpumask_t tmp;
+
+		cpus_shift_right(tmp, cpus, BITS_PER_LONG*k);
+		m = sprintf(buf, "%0*lx", (int)(2*sizeof(long)), cpus_coerce(tmp));
+		len += m;
+		buf += m;
+	}
+	return len;
+}
+
 #endif /* __LINUX_CPUMASK_H */
===== drivers/base/node.c 1.15 vs edited =====
--- 1.15/drivers/base/node.c	Mon Aug 18 19:46:23 2003
+++ edited/drivers/base/node.c	Sun Nov 16 19:20:29 2003
@@ -19,15 +19,11 @@
 {
 	struct node *node_dev = to_node(dev);
 	cpumask_t tmp = node_dev->cpumap;
-	int k, len = 0;
+	int len = 0;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		buf += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-        len += sprintf(buf, "\n");
+	len = format_cpumask(buf, node_dev->cpumap);
+	buf += len;
+	len += sprintf(buf, "\n");
 	return len;
 }
 static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
===== arch/i386/kernel/irq.c 1.45 vs edited =====
--- 1.45/arch/i386/kernel/irq.c	Wed Oct 22 20:26:34 2003
+++ edited/arch/i386/kernel/irq.c	Mon Nov 17 15:51:39 2003
@@ -949,19 +949,13 @@
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1000,10 +994,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/ia64/kernel/irq.c 1.31 vs edited =====
--- 1.31/arch/ia64/kernel/irq.c	Tue Nov  4 11:31:16 2003
+++ edited/arch/ia64/kernel/irq.c	Sun Nov 16 19:07:19 2003
@@ -974,19 +974,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1034,17 +1028,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t *mask = (cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-		len += j;
-		page += j;
-		cpus_shift_right(*mask, *mask, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/mips/kernel/irq.c 1.14 vs edited =====
--- 1.14/arch/mips/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/mips/kernel/irq.c	Sun Nov 16 19:07:59 2003
@@ -872,17 +872,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -918,19 +914,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t *mask = (cpumask_t *)data, tmp;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc/kernel/irq.c 1.33 vs edited =====
--- 1.33/arch/ppc/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/ppc/kernel/irq.c	Sun Nov 16 19:08:36 2003
@@ -574,19 +574,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp = irq_affinity[(long)data];
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -665,17 +659,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t mask = *(cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-		len += j;
-		page += j;
-		cpus_shift_right(mask, mask, 16);
-	}
+	len = format_cpumask(page, mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc64/kernel/irq.c 1.36 vs edited =====
--- 1.36/arch/ppc64/kernel/irq.c	Wed Oct 15 18:43:36 2003
+++ edited/arch/ppc64/kernel/irq.c	Sun Nov 16 19:11:59 2003
@@ -657,18 +657,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -744,10 +739,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *) data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/um/kernel/irq.c 1.11 vs edited =====
--- 1.11/arch/um/kernel/irq.c	Tue Oct  7 19:53:41 2003
+++ edited/arch/um/kernel/irq.c	Sun Nov 16 19:09:06 2003
@@ -577,9 +577,15 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
+	int len;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
+	len += sprinf(page, "\n");
+	return len;
 }
 
 static unsigned int parse_hex_value (const char *buffer,
@@ -652,18 +658,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len = 0;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/x86_64/kernel/irq.c 1.18 vs edited =====
--- 1.18/arch/x86_64/kernel/irq.c	Tue Oct  7 19:53:42 2003
+++ edited/arch/x86_64/kernel/irq.c	Sun Nov 16 19:12:18 2003
@@ -850,18 +850,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -897,19 +892,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	tmp = *mask;
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-18  0:26   ` format_cpumask() William Lee Irwin III
@ 2003-11-18  0:34     ` Keith Owens
  2003-11-18  0:56       ` format_cpumask() William Lee Irwin III
  0 siblings, 1 reply; 11+ messages in thread
From: Keith Owens @ 2003-11-18  0:34 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: Joe Korty, Luck, Tony, linux-kernel

On Mon, 17 Nov 2003 16:26:47 -0800, 
William Lee Irwin III <wli@holomorphy.com> wrote:
>+		m = sprintf(buf, "%0*lx", 2*sizeof(long), cpus_coerce(tmp));

Sorry, that has to be 

+		m = sprintf(buf, "%0*lx", (int)(2*sizeof(long)), cpus_coerce(tmp));

otherwise gcc complains on 64 bit systems.  The '*' flag requires an
int parameter, sizeof returns long.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
       [not found] ` <20031118002213.GA6272@tsunami.ccur.com>
@ 2003-11-18  0:26   ` William Lee Irwin III
  2003-11-18  0:34     ` format_cpumask() Keith Owens
  0 siblings, 1 reply; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-18  0:26 UTC (permalink / raw)
  To: Joe Korty; +Cc: Luck, Tony, linux-kernel

On Mon, Nov 17, 2003 at 07:22:13PM -0500, Joe Korty wrote:
> How about this? (eye-checked only).
> static int format_cpumask(char *buf, cpumask_t cpus)
> {
> 	int i, d, len = 0;
> 	cpumask_t tmp;
> 
> 	for(i = (NR_CPUS - 1) & ~3; i >= 0; i -= 4) {
> 		cpus_shift_right(tmp, cpus, i);
> 		d = (int)cpus_coerce(tmp) & 0xf;
> 		buf[len++] = "0123456789abcdef"[d];
> 	}
> 	return len;
> }

I think Keith Owens had a much better suggestion: using '*' in the
format string.


===== include/linux/cpumask.h 1.1 vs edited =====
--- 1.1/include/linux/cpumask.h	Mon Aug 18 19:46:23 2003
+++ edited/include/linux/cpumask.h	Mon Nov 17 16:25:18 2003
@@ -68,4 +68,20 @@
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
 
+static inline int format_cpumask(char *buf, cpumask_t cpus)
+{
+	int k, len = 0;
+
+	for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; --k) {
+		int m;
+		cpumask_t tmp;
+
+		cpus_shift_right(tmp, cpus, BITS_PER_LONG*k);
+		m = sprintf(buf, "%0*lx", 2*sizeof(long), cpus_coerce(tmp));
+		len += m;
+		buf += m;
+	}
+	return len;
+}
+
 #endif /* __LINUX_CPUMASK_H */

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-17 23:56 format_cpumask() Luck, Tony
  2003-11-18  0:00 ` format_cpumask() William Lee Irwin III
@ 2003-11-18  0:03 ` William Lee Irwin III
       [not found] ` <20031118002213.GA6272@tsunami.ccur.com>
  2 siblings, 0 replies; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-18  0:03 UTC (permalink / raw)
  To: Luck, Tony; +Cc: linux-kernel, akpm

At some point in the past, I wrote:
>> I was trying to make it a NR_CPUS -bit integer with the 
>> highest nybbles
>> printed first. What's your favorite alternative?

On Mon, Nov 17, 2003 at 03:56:34PM -0800, Luck, Tony wrote:
> The prettiest output format I can think of would be
> to pretend that we had enough bits for NR_CPUS.  I.e.
> on a 128 cpu system, cpu0 looks like:
>  00000000000000000000000000000001
> and cpu 127 is:
>  80000000000000000000000000000000
> This is probably the messiest to implement :-(
> -Tony

Okay, how far off from what you want am I on this?

akpm, this also includes two things you mentioned in another reply.


-- wli


===== include/linux/cpumask.h 1.1 vs edited =====
--- 1.1/include/linux/cpumask.h	Mon Aug 18 19:46:23 2003
+++ edited/include/linux/cpumask.h	Mon Nov 17 16:01:20 2003
@@ -68,4 +68,23 @@
 		cpu < NR_CPUS;						\
 		cpu = next_online_cpu(cpu,map))
 
+static inline int format_cpumask(char *buf, cpumask_t cpus)
+{
+	int k, len = 0;
+
+	for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; --k) {
+		int m;
+		cpumask_t tmp;
+
+		cpus_shift_right(tmp, cpus, BITS_PER_LONG*k);
+		if (BITS_PER_LONG == 32)
+			m = sprintf(buf, "%08lx", cpus_coerce(tmp));
+		else /* BITS_PER_LONG == 64 */
+			m = sprintf(buf, "%016lx", cpus_coerce(tmp));
+		len += m;
+		buf += m;
+	}
+	return len;
+}
+
 #endif /* __LINUX_CPUMASK_H */
===== arch/i386/kernel/irq.c 1.45 vs edited =====
--- 1.45/arch/i386/kernel/irq.c	Wed Oct 22 20:26:34 2003
+++ edited/arch/i386/kernel/irq.c	Mon Nov 17 15:51:39 2003
@@ -949,19 +949,13 @@
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1000,10 +994,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/ia64/kernel/irq.c 1.31 vs edited =====
--- 1.31/arch/ia64/kernel/irq.c	Tue Nov  4 11:31:16 2003
+++ edited/arch/ia64/kernel/irq.c	Sun Nov 16 19:07:19 2003
@@ -974,19 +974,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	len = 0;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -1034,17 +1028,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t *mask = (cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-		len += j;
-		page += j;
-		cpus_shift_right(*mask, *mask, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/mips/kernel/irq.c 1.14 vs edited =====
--- 1.14/arch/mips/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/mips/kernel/irq.c	Sun Nov 16 19:07:59 2003
@@ -872,17 +872,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -918,19 +914,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int len, k;
-	cpumask_t *mask = (cpumask_t *)data, tmp;
+	int len;
+	cpumask_t *mask = (cpumask_t *)data;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc/kernel/irq.c 1.33 vs edited =====
--- 1.33/arch/ppc/kernel/irq.c	Tue Oct  7 19:53:39 2003
+++ edited/arch/ppc/kernel/irq.c	Sun Nov 16 19:08:36 2003
@@ -574,19 +574,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp = irq_affinity[(long)data];
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -665,17 +659,13 @@
 			int count, int *eof, void *data)
 {
 	cpumask_t mask = *(cpumask_t *)data;
-	int k, len = 0;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-		len += j;
-		page += j;
-		cpus_shift_right(mask, mask, 16);
-	}
+	len = format_cpumask(page, mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/ppc64/kernel/irq.c 1.36 vs edited =====
--- 1.36/arch/ppc64/kernel/irq.c	Wed Oct 15 18:43:36 2003
+++ edited/arch/ppc64/kernel/irq.c	Sun Nov 16 19:11:59 2003
@@ -657,18 +657,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -744,10 +739,16 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	unsigned long *mask = (unsigned long *) data;
+	int len;
+	cpumask_t *mask = (cpumask_t *) data;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", *mask);
+
+	len = format_cpumask(page, *mask);
+	page += len;
+	len += sprintf (page, "\n");
+	return len;
 }
 
 static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
===== arch/um/kernel/irq.c 1.11 vs edited =====
--- 1.11/arch/um/kernel/irq.c	Tue Oct  7 19:53:41 2003
+++ edited/arch/um/kernel/irq.c	Sun Nov 16 19:09:06 2003
@@ -577,9 +577,15 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
+	int len;
+
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
+
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
+	len += sprinf(page, "\n");
+	return len;
 }
 
 static unsigned int parse_hex_value (const char *buffer,
@@ -652,18 +658,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len = 0;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
-	tmp = *mask;
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== arch/x86_64/kernel/irq.c 1.18 vs edited =====
--- 1.18/arch/x86_64/kernel/irq.c	Tue Oct  7 19:53:42 2003
+++ edited/arch/x86_64/kernel/irq.c	Sun Nov 16 19:12:18 2003
@@ -850,18 +850,13 @@
 static int irq_affinity_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int k, len;
-	cpumask_t tmp = irq_affinity[(long)data];
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, irq_affinity[(long)data]);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
@@ -897,19 +892,14 @@
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	cpumask_t tmp, *mask = (cpumask_t *) data;
-	int k, len;
+	cpumask_t *mask = (cpumask_t *)data;
+	int len;
 
 	if (count < HEX_DIGITS+1)
 		return -EINVAL;
 
-	tmp = *mask;
-	for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		page += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
+	len = format_cpumask(page, *mask);
+	page += len;
 	len += sprintf(page, "\n");
 	return len;
 }
===== drivers/base/node.c 1.15 vs edited =====
--- 1.15/drivers/base/node.c	Mon Aug 18 19:46:23 2003
+++ edited/drivers/base/node.c	Sun Nov 16 19:20:29 2003
@@ -19,15 +19,11 @@
 {
 	struct node *node_dev = to_node(dev);
 	cpumask_t tmp = node_dev->cpumap;
-	int k, len = 0;
+	int len = 0;
 
-	for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-		int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-		len += j;
-		buf += j;
-		cpus_shift_right(tmp, tmp, 16);
-	}
-        len += sprintf(buf, "\n");
+	len = format_cpumask(buf, node_dev->cpumap);
+	buf += len;
+	len += sprintf(buf, "\n");
 	return len;
 }
 static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-17 23:56 format_cpumask() Luck, Tony
@ 2003-11-18  0:00 ` William Lee Irwin III
  2003-11-18  0:03 ` format_cpumask() William Lee Irwin III
       [not found] ` <20031118002213.GA6272@tsunami.ccur.com>
  2 siblings, 0 replies; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-18  0:00 UTC (permalink / raw)
  To: Luck, Tony; +Cc: linux-kernel

At some point in the past, I wrote:
>> I was trying to make it a NR_CPUS -bit integer with the 
>> highest nybbles
>> printed first. What's your favorite alternative?

On Mon, Nov 17, 2003 at 03:56:34PM -0800, Luck, Tony wrote:
> The prettiest output format I can think of would be
> to pretend that we had enough bits for NR_CPUS.  I.e.
> on a 128 cpu system, cpu0 looks like:
>  00000000000000000000000000000001
> and cpu 127 is:
>  80000000000000000000000000000000
> This is probably the messiest to implement :-(
> -Tony

This is actually what I was trying to do. It's why I started the
loop of printing out the hexadecimal unsigned long components with
for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; --k);

except I posted ++k. Amended patch coming very shortly.


-- wli

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: format_cpumask()
@ 2003-11-17 23:56 Luck, Tony
  2003-11-18  0:00 ` format_cpumask() William Lee Irwin III
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Luck, Tony @ 2003-11-17 23:56 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: linux-kernel

> I was trying to make it a NR_CPUS -bit integer with the 
> highest nybbles
> printed first. What's your favorite alternative?

The prettiest output format I can think of would be
to pretend that we had enough bits for NR_CPUS.  I.e.
on a 128 cpu system, cpu0 looks like:

 00000000000000000000000000000001

and cpu 127 is:

 80000000000000000000000000000000

This is probably the messiest to implement :-(

-Tony

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: format_cpumask()
  2003-11-17 18:49 format_cpumask() Luck, Tony
@ 2003-11-17 23:35 ` William Lee Irwin III
  0 siblings, 0 replies; 11+ messages in thread
From: William Lee Irwin III @ 2003-11-17 23:35 UTC (permalink / raw)
  To: Luck, Tony; +Cc: linux-kernel

On Mon, Nov 17, 2003 at 10:49:31AM -0800, Luck, Tony wrote:
> That makes it had to write portable shell scripts (etc.) that can
> parse these values on both 32-bit and 64-bit systems?  A bitmask with
> just cpu0 set looks like:
> 	0000000100000000
> on a 32-bit machine.  And like:
> 	0000000000000001
> on a 64-bit machine.  Heaven help the architectures (ia64, sparc, ppc)
> that support both 32-bit and 64-bit applications!

Okay, so we need to:

(a) zero-pad the 64-bit case
(b) pick a format the users actually like

I was trying to make it a NR_CPUS -bit integer with the highest nybbles
printed first. What's your favorite alternative?


-- wli

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re:  format_cpumask()
@ 2003-11-17 18:49 Luck, Tony
  2003-11-17 23:35 ` format_cpumask() William Lee Irwin III
  0 siblings, 1 reply; 11+ messages in thread
From: Luck, Tony @ 2003-11-17 18:49 UTC (permalink / raw)
  To: linux-kernel; +Cc: wli

> +	for (k = sizeof(cpumask_t)/sizeof(long) - 1; k >= 0; ++k) {
> +		int m;
> +		cpumask_t tmp;
> +
> +		cpus_shift_right(tmp, cpus, BITS_PER_LONG*k);
> +		if (BITS_PER_LONG == 32)
> +			m = sprintf(buf, "%08lx", cpus_coerce(tmp));
> +		else /* BITS_PER_LONG == 64 */
> +			m = sprintf(buf, "%16lx", cpus_coerce(tmp));
> +		len += m;
> +		buf += m;
> +	}

That makes it had to write portable shell scripts (etc.) that can
parse these values on both 32-bit and 64-bit systems?  A bitmask with
just cpu0 set looks like:

	0000000100000000

on a 32-bit machine.  And like:

	0000000000000001

on a 64-bit machine.  Heaven help the architectures (ia64, sparc, ppc)
that support both 32-bit and 64-bit applications!

-Tony Luck  


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2003-11-19 10:38 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-17  3:35 format_cpumask() William Lee Irwin III
2003-11-19  9:32 ` format_cpumask() Paul Jackson
2003-11-19 10:38   ` format_cpumask() William Lee Irwin III
2003-11-17 18:49 format_cpumask() Luck, Tony
2003-11-17 23:35 ` format_cpumask() William Lee Irwin III
2003-11-17 23:56 format_cpumask() Luck, Tony
2003-11-18  0:00 ` format_cpumask() William Lee Irwin III
2003-11-18  0:03 ` format_cpumask() William Lee Irwin III
     [not found] ` <20031118002213.GA6272@tsunami.ccur.com>
2003-11-18  0:26   ` format_cpumask() William Lee Irwin III
2003-11-18  0:34     ` format_cpumask() Keith Owens
2003-11-18  0:56       ` format_cpumask() William Lee Irwin III

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).