[PATCH] ppc64: reverse prediction on spinlock busy loop code
Anton Blanchard
anton at samba.org
Sat Apr 30 01:25:00 EST 2005
Mispredicting the spinlock busy loop also means we slow down the rate at
which we do the loads which can be good for heavily contended locks.
Note: There are some gcc issues with our default build and branch
prediction, but a CONFIG_POWER4_ONLY build should emit them correctly.
Im working with Alan Modra on it now.
Anton
--
From: Jake Moilanen <moilanen at austin.ibm.com>
On our raw spinlocks, we currently have an attempt at the lock, and if
we do not get it we enter a spin loop. This spinloop will likely
continue for awhile, and we pridict likely.
Shouldn't we predict that we will get out of the loop so our next
instructions are already prefetched. Even when we miss because the lock
is still held, it won't matter since we are waiting anyways.
I did a couple quick benchmarks, but the results are inconclusive.
16-way 690 running specjbb with original code
# ./specjbb 3000 16 1 1 19 30 120
...
Valid run, Score is 59282
16-way 690 running specjbb with unlikely code
# ./specjbb 3000 16 1 1 19 30 120
...
Valid run, Score is 59541
I saw a smaller increase on a JS20 (~1.6%)
JS20 specjbb w/ original code
# ./specjbb 400 2 1 1 19 30 120
...
Valid run, Score is 20460
JS20 specjbb w/ unlikely code
# ./specjbb 400 2 1 1 19 30 120
...
Valid run, Score is 20803
Jake
Signed-off-by: Jake Moilanen <moilanen at austin.ibm.com>
Signed-off-by: Anton Blanchard <anton at samba.org>
Index: linux-2.6.12-rc2/include/asm-ppc64/spinlock.h
===================================================================
--- linux-2.6.12-rc2.orig/include/asm-ppc64/spinlock.h 2005-04-29 09:45:52.770813561 +1000
+++ linux-2.6.12-rc2/include/asm-ppc64/spinlock.h 2005-04-29 10:27:34.217207239 +1000
@@ -110,7 +110,7 @@
HMT_low();
if (SHARED_PROCESSOR)
__spin_yield(lock);
- } while (likely(lock->lock != 0));
+ } while (unlikely(lock->lock != 0));
HMT_medium();
}
}
@@ -128,7 +128,7 @@
HMT_low();
if (SHARED_PROCESSOR)
__spin_yield(lock);
- } while (likely(lock->lock != 0));
+ } while (unlikely(lock->lock != 0));
HMT_medium();
local_irq_restore(flags_dis);
}
@@ -194,7 +194,7 @@
HMT_low();
if (SHARED_PROCESSOR)
__rw_yield(rw);
- } while (likely(rw->lock < 0));
+ } while (unlikely(rw->lock < 0));
HMT_medium();
}
}
@@ -251,7 +251,7 @@
HMT_low();
if (SHARED_PROCESSOR)
__rw_yield(rw);
- } while (likely(rw->lock != 0));
+ } while (unlikely(rw->lock != 0));
HMT_medium();
}
}
More information about the Linuxppc64-dev
mailing list