Skip to contentSkip to conversation

2.6.14-rc3: wider use of for_each_cpu_mask() in arch/ia64

PATCH In review [email protected] 3 participants 4 messages Oct 8, 2005 – Oct 10, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 2.6.14-rc3: wider use of for_each_cpu_mask() in arch/ia64

In arch/ia64 change the explicit use of for-loops and NR_CPUS into the general for_each_cpu_mask() construct. This widens the scope of potential future optimizations of for_each_cpu_mask().

Index: linux/arch/ia64/mm/tlb.c
=================================--- linux.orig/arch/ia64/mm/tlb.c 2005-08-28 16:41:01.000000000 -0700
+++ linux/arch/ia64/mm/tlb.c 2005-10-07 14:30:11.000000000 -0700
@@ -77,9 +77,10 @@
/* can't call flush_tlb_all() here because of race condition with O(1) scheduler [EF] */ {
int cpu = get_cpu(); /* prevent preemption/migration */
- for (i = 0; i < NR_CPUS; ++i)
- if (cpu_online(i) && (i != cpu))
+ for_each_cpu_mask(i, cpu_online_map) {
+ if (i != cpu)
per_cpu(ia64_need_tlb_flush, i) = 1;
+ }
put_cpu();
}
local_flush_tlb_all();
Index: linux/arch/ia64/kernel/module.c
=================================--- linux.orig/arch/ia64/kernel/module.c 2005-08-28 16:41:01.000000000 -0700
+++ linux/arch/ia64/kernel/module.c 2005-10-07 14:34:09.000000000 -0700
@@ -948,7 +948,8 @@
{
unsigned int i;
for (i = 0; i < NR_CPUS; i++)
- if (cpu_possible(i))
- memcpy(pcpudst + __per_cpu_offset[i], src, size);
+ for_each_cpu_mask(i, cpu_possible_map) {
+ memcpy(pcpudst + __per_cpu_offset[i], src, size);
+ }
}
#endif /* CONFIG_SMP */
Index: linux/arch/ia64/kernel/smpboot.c
=================================--- linux.orig/arch/ia64/kernel/smpboot.c 2005-08-28 16:41:01.000000000 -0700
+++ linux/arch/ia64/kernel/smpboot.c 2005-10-07 14:36:51.000000000 -0700
@@ -695,8 +695,9 @@
*/

for (cpu = 0; cpu < NR_CPUS; cpu++)
- if (cpu_online(cpu))
- bogosum += cpu_data(cpu)->loops_per_jiffy;
+ for_each_cpu_mask(cpu, cpu_online_map) {
+ bogosum += cpu_data(cpu)->loops_per_jiffy;
+ }

printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
(int)num_online_cpus(), bogosum/(500000/HZ), (bogosum/(5000/HZ))%100);
Index: linux/arch/ia64/kernel/irq.c
=================================--- linux.orig/arch/ia64/kernel/irq.c 2005-10-06 15:03:20.000000000 -0700
+++ linux/arch/ia64/kernel/irq.c 2005-10-07 14:40:01.000000000 -0700
@@ -57,9 +57,9 @@

if (i = 0) {
seq_printf(p, " ");
- for (j=0; j<NR_CPUS; j++)
- if (cpu_online(j))
- seq_printf(p, "CPU%d ",j);
+ for_each_cpu_mask(j, cpu_online_map) {
+ seq_printf(p, "CPU%d ",j);
+ }
seq_putc(p, '\n');
}

@@ -72,9 +72,9 @@
#ifndef CONFIG_SMP
seq_printf(p, "%10u ", kstat_irqs(i));
#else
- for (j = 0; j < NR_CPUS; j++)
- if (cpu_online(j))
- seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+ for_each_cpu_mask(j, cpu_online_map) {
+ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+ }
#endif
seq_printf(p, " %14s", irq_desc[i].handler->typename); seq_printf(p, " %s", action->name);
Index: linux/arch/ia64/kernel/smp.c
=================================--- linux.orig/arch/ia64/kernel/smp.c 2005-10-06 15:03:27.000000000 -0700
+++ linux/arch/ia64/kernel/smp.c 2005-10-07 14:44:22.000000000 -0700
@@ -200,8 +200,8 @@
{
unsigned int i;

- for (i = 0; i < NR_CPUS; i++) {
- if (cpu_online(i) && i != smp_processor_id())
+ for_each_cpu_mask(i, cpu_online_map) {
+ if (i != smp_processor_id())
send_IPI_single(i, op);
}
}
@@ -214,9 +214,9 @@
{
int i;

- for (i = 0; i < NR_CPUS; i++)
- if (cpu_online(i))
- send_IPI_single(i, op);
+ for_each_cpu_mask(i, cpu_online_map) {
+ send_IPI_single(i, op);
+ }
}

/*
Index: linux/arch/ia64/kernel/mca.c
=================================--- linux.orig/arch/ia64/kernel/mca.c 2005-10-06 15:03:27.000000000 -0700
+++ linux/arch/ia64/kernel/mca.c 2005-10-07 14:47:45.000000000 -0700
@@ -546,9 +546,7 @@
KDBA_MCA_TRACE();

/* Clear the Rendez checkin flag for all cpus */
- for(cpu = 0; cpu < NR_CPUS; cpu++) {
- if (!cpu_online(cpu))
- continue;
+ for_each_cpu_mask(cpu, cpu_online_map) {
if (ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE)
ia64_mca_wakeup(cpu);
}

#1 lore raw

[email protected] wrote on Saturday, October 08, 2005 10:44 AM

Quoted 1 line

--- linux.orig/arch/ia64/kernel/module.c 2005-08-28

16:41:01.000000000 -0700

Quoted 1 line

+++ linux/arch/ia64/kernel/module.c 2005-10-07 14:34:09.000000000

-0700

Review line 952

Quoted 6 lines
(quoted diff) +0 -2
@@ -948,7 +948,8 @@
 {
 	unsigned int i;
 	for (i = 0; i < NR_CPUS; i++)
-		if (cpu_possible(i))
-			memcpy(pcpudst + __per_cpu_offset[i], src,

size);

Review line 955

Quoted 5 lines
(quoted diff) +3 -0
+	for_each_cpu_mask(i, cpu_possible_map) {
+		memcpy(pcpudst + __per_cpu_offset[i], src, size);
+	}
 }
 #endif /* CONFIG_SMP */

Looks like you forgot to delete the for (i=0 ...) clause.

Quoted 1 line

--- linux.orig/arch/ia64/kernel/smpboot.c 2005-08-28

16:41:01.000000000 -0700

Quoted 1 line

+++ linux/arch/ia64/kernel/smpboot.c 2005-10-07 14:36:51.000000000

-0700

Review line 700

Quoted 9 lines
(quoted diff) +3 -2
@@ -695,8 +695,9 @@
 	 */
 
 	for (cpu = 0; cpu < NR_CPUS; cpu++)
-		if (cpu_online(cpu))
-			bogosum += cpu_data(cpu)->loops_per_jiffy;
+	for_each_cpu_mask(cpu, cpu_online_map) {
+		bogosum += cpu_data(cpu)->loops_per_jiffy;
+	}

Same here.

#2 lore raw
In reply to [email protected]
Quoted 10 lines · On Sat, Oct 08, 2005 at 10:43:31AM -0700, [email protected] wrote:

In arch/ia64 change the explicit use of for-loops and NR_CPUS into the general for_each_cpu_mask() construct. This widens the scope of potential future optimizations of for_each_cpu_mask().

Index: linux/arch/ia64/mm/tlb.c
=================================> --- linux.orig/arch/ia64/mm/tlb.c 2005-08-28 16:41:01.000000000 -0700
+++ linux/arch/ia64/mm/tlb.c 2005-10-07 14:30:11.000000000 -0700

Review line 80

Quoted 6 lines
(quoted diff) +1 -2
@@ -77,9 +77,10 @@
 	/* can't call flush_tlb_all() here because of race condition with O(1) scheduler [EF] */
 	{
 		int cpu = get_cpu(); /* prevent preemption/migration */
-		for (i = 0; i < NR_CPUS; ++i)
-			if (cpu_online(i) && (i != cpu))
+		for_each_cpu_mask(i, cpu_online_map) {

What about for_each_online_cpu? Reads a little more cleanly. Accomplishes the same thing.

Robin

#3 lore raw

PATCH 1/1 2.6.14-rc3: wider use of for_each_cpu_mask() in arch/ia64

In reply to [email protected]

Retry with fixes:

In arch/ia64 change the explicit use of for-loops and NR_CPUS into the general for_each_cpu() or for_each_online_cpu() constructs, as appropriate. This widens the scope of potential future optimizations of the general constructs, as well as takes advantage of the existing optimizations of first_cpu() and next_cpu().

Index: linux/arch/ia64/mm/tlb.c
=================================--- linux.orig/arch/ia64/mm/tlb.c 2005-10-10 08:27:31.000000000 -0700
+++ linux/arch/ia64/mm/tlb.c 2005-10-10 08:32:03.000000000 -0700
@@ -77,9 +77,10 @@
/* can't call flush_tlb_all() here because of race condition with O(1) scheduler [EF] */ {
int cpu = get_cpu(); /* prevent preemption/migration */
- for (i = 0; i < NR_CPUS; ++i)
- if (cpu_online(i) && (i != cpu))
+ for_each_online_cpu(i) {
+ if (i != cpu)
per_cpu(ia64_need_tlb_flush, i) = 1;
+ }
put_cpu();
}
local_flush_tlb_all();
Index: linux/arch/ia64/kernel/module.c
=================================--- linux.orig/arch/ia64/kernel/module.c 2005-10-10 08:27:31.000000000 -0700
+++ linux/arch/ia64/kernel/module.c 2005-10-10 08:32:47.000000000 -0700
@@ -947,8 +947,8 @@
percpu_modcopy (void *pcpudst, const void *src, unsigned long size)
{
unsigned int i;
- for (i = 0; i < NR_CPUS; i++)
- if (cpu_possible(i))
- memcpy(pcpudst + __per_cpu_offset[i], src, size);
+ for_each_cpu(i) {
+ memcpy(pcpudst + __per_cpu_offset[i], src, size);
+ }
}
#endif /* CONFIG_SMP */
Index: linux/arch/ia64/kernel/smpboot.c
=================================--- linux.orig/arch/ia64/kernel/smpboot.c 2005-10-10 08:27:31.000000000 -0700
+++ linux/arch/ia64/kernel/smpboot.c 2005-10-10 08:33:18.000000000 -0700
@@ -694,9 +694,9 @@
* Allow the user to impress friends.
*/

- for (cpu = 0; cpu < NR_CPUS; cpu++)
- if (cpu_online(cpu))
- bogosum += cpu_data(cpu)->loops_per_jiffy;
+ for_each_online_cpu(cpu) {
+ bogosum += cpu_data(cpu)->loops_per_jiffy;
+ }

printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
(int)num_online_cpus(), bogosum/(500000/HZ), (bogosum/(5000/HZ))%100);
Index: linux/arch/ia64/kernel/irq.c
=================================--- linux.orig/arch/ia64/kernel/irq.c 2005-10-10 08:27:31.000000000 -0700
+++ linux/arch/ia64/kernel/irq.c 2005-10-10 08:34:09.000000000 -0700
@@ -57,9 +57,9 @@

if (i = 0) {
seq_printf(p, " ");
- for (j=0; j<NR_CPUS; j++)
- if (cpu_online(j))
- seq_printf(p, "CPU%d ",j);
+ for_each_online_cpu(j) {
+ seq_printf(p, "CPU%d ",j);
+ }
seq_putc(p, '\n');
}

@@ -72,9 +72,9 @@
#ifndef CONFIG_SMP
seq_printf(p, "%10u ", kstat_irqs(i));
#else
- for (j = 0; j < NR_CPUS; j++)
- if (cpu_online(j))
- seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+ for_each_online_cpu(j) {
+ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+ }
#endif
seq_printf(p, " %14s", irq_desc[i].handler->typename); seq_printf(p, " %s", action->name);
Index: linux/arch/ia64/kernel/smp.c
=================================--- linux.orig/arch/ia64/kernel/smp.c 2005-10-10 08:27:31.000000000 -0700
+++ linux/arch/ia64/kernel/smp.c 2005-10-10 08:34:50.000000000 -0700
@@ -200,8 +200,8 @@
{
unsigned int i;

- for (i = 0; i < NR_CPUS; i++) {
- if (cpu_online(i) && i != smp_processor_id())
+ for_each_online_cpu(i) {
+ if (i != smp_processor_id())
send_IPI_single(i, op);
}
}
@@ -214,9 +214,9 @@
{
int i;

- for (i = 0; i < NR_CPUS; i++)
- if (cpu_online(i))
- send_IPI_single(i, op);
+ for_each_online_cpu(i) {
+ send_IPI_single(i, op);
+ }
}

/*