From: William Lee Irwin III <wli@holomorphy.com>

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.



 arch/i386/kernel/irq.c   |   22 +++++++++++-----------
 arch/ia64/kernel/irq.c   |   22 ++++++----------------
 arch/mips/kernel/irq.c   |   25 ++++++++-----------------
 arch/ppc/kernel/irq.c    |   22 ++++++----------------
 arch/ppc64/kernel/irq.c  |   21 +++++++++++----------
 arch/um/kernel/irq.c     |   22 ++++++++++++----------
 arch/x86_64/kernel/irq.c |   24 +++++++-----------------
 drivers/base/node.c      |   12 ++++--------
 include/linux/cpumask.h  |   16 ++++++++++++++++
 9 files changed, 81 insertions(+), 105 deletions(-)

diff -puN arch/i386/kernel/irq.c~format_cpumask arch/i386/kernel/irq.c
--- 25/arch/i386/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/i386/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -967,19 +967,13 @@ cpumask_t irq_affinity[NR_IRQS] = { [0 .
 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;
 }
@@ -1018,10 +1012,16 @@ static int irq_affinity_write_proc(struc
 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,
diff -puN arch/ia64/kernel/irq.c~format_cpumask arch/ia64/kernel/irq.c
--- 25/arch/ia64/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/ia64/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -977,19 +977,13 @@ void set_irq_affinity_info (unsigned int
 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;
 }
@@ -1037,17 +1031,13 @@ static int prof_cpu_mask_read_proc (char
 			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;
 }
diff -puN arch/mips/kernel/irq.c~format_cpumask arch/mips/kernel/irq.c
--- 25/arch/mips/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/mips/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -872,17 +872,13 @@ static cpumask_t irq_affinity [NR_IRQS] 
 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 irq_affinity_write_proc (stru
 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;
 }
diff -puN arch/ppc64/kernel/irq.c~format_cpumask arch/ppc64/kernel/irq.c
--- 25/arch/ppc64/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -659,18 +659,13 @@ cpumask_t irq_affinity [NR_IRQS] = { [0 
 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;
 }
@@ -746,10 +741,16 @@ static int irq_affinity_write_proc (stru
 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,
diff -puN arch/ppc/kernel/irq.c~format_cpumask arch/ppc/kernel/irq.c
--- 25/arch/ppc/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/ppc/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -574,19 +574,13 @@ cpumask_t irq_affinity [NR_IRQS];
 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 @@ static int prof_cpu_mask_read_proc (char
 			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;
 }
diff -puN arch/um/kernel/irq.c~format_cpumask arch/um/kernel/irq.c
--- 25/arch/um/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/um/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -577,9 +577,15 @@ static cpumask_t irq_affinity [NR_IRQS] 
 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 irq_affinity_write_proc (stru
 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;
 }
diff -puN arch/x86_64/kernel/irq.c~format_cpumask arch/x86_64/kernel/irq.c
--- 25/arch/x86_64/kernel/irq.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/arch/x86_64/kernel/irq.c	2003-11-17 17:23:20.000000000 -0800
@@ -853,18 +853,13 @@ static cpumask_t irq_affinity [NR_IRQS] 
 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;
 }
@@ -900,19 +895,14 @@ static int irq_affinity_write_proc (stru
 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;
 }
diff -puN drivers/base/node.c~format_cpumask drivers/base/node.c
--- 25/drivers/base/node.c~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/drivers/base/node.c	2003-11-17 17:23:20.000000000 -0800
@@ -19,15 +19,11 @@ static ssize_t node_read_cpumap(struct s
 {
 	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);
diff -puN include/linux/cpumask.h~format_cpumask include/linux/cpumask.h
--- 25/include/linux/cpumask.h~format_cpumask	2003-11-17 17:23:20.000000000 -0800
+++ 25-akpm/include/linux/cpumask.h	2003-11-17 17:23:20.000000000 -0800
@@ -68,4 +68,20 @@ static inline int next_online_cpu(int cp
 		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 */

_