From: William Lee Irwin III 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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/i386/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/ia64/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/mips/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/ppc/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/um/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/arch/x86_64/kernel/irq.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/drivers/base/node.c 2003-11-19 01:33:14.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-19 01:33:14.000000000 -0800 +++ 25-akpm/include/linux/cpumask.h 2003-11-19 01:33:14.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 */ _