diff options
author | Milton Miller <miltonm@bga.com> | 2008-10-09 21:56:44 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2008-10-13 01:24:19 -0400 |
commit | 199f45c45e8d4f58a5f568464be933534460eb82 (patch) | |
tree | 488e5c5e4530313aff840fc5a2074a26f6233172 /arch/powerpc/platforms | |
parent | 2172fe8704a1df7cbb988ae1ec4edbfef3e28860 (diff) |
powerpc/xics: Reduce and comment xics IPI use of memory barriers
A single full sync (mb()) is requrired to order the mmio to the qirr reg
with the set or clear of the message word. However, test_and_clear_bit
has the effect of smp_mb() and we are not doing any other io from here,
so we don't need a mb per bit processed.
Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 62b0400577de..e1904774a70f 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -498,26 +498,23 @@ static irqreturn_t xics_ipi_dispatch(int cpu) | |||
498 | { | 498 | { |
499 | WARN_ON(cpu_is_offline(cpu)); | 499 | WARN_ON(cpu_is_offline(cpu)); |
500 | 500 | ||
501 | mb(); /* order mmio clearing qirr */ | ||
501 | while (xics_ipi_message[cpu].value) { | 502 | while (xics_ipi_message[cpu].value) { |
502 | if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION, | 503 | if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION, |
503 | &xics_ipi_message[cpu].value)) { | 504 | &xics_ipi_message[cpu].value)) { |
504 | mb(); | ||
505 | smp_message_recv(PPC_MSG_CALL_FUNCTION); | 505 | smp_message_recv(PPC_MSG_CALL_FUNCTION); |
506 | } | 506 | } |
507 | if (test_and_clear_bit(PPC_MSG_RESCHEDULE, | 507 | if (test_and_clear_bit(PPC_MSG_RESCHEDULE, |
508 | &xics_ipi_message[cpu].value)) { | 508 | &xics_ipi_message[cpu].value)) { |
509 | mb(); | ||
510 | smp_message_recv(PPC_MSG_RESCHEDULE); | 509 | smp_message_recv(PPC_MSG_RESCHEDULE); |
511 | } | 510 | } |
512 | if (test_and_clear_bit(PPC_MSG_CALL_FUNC_SINGLE, | 511 | if (test_and_clear_bit(PPC_MSG_CALL_FUNC_SINGLE, |
513 | &xics_ipi_message[cpu].value)) { | 512 | &xics_ipi_message[cpu].value)) { |
514 | mb(); | ||
515 | smp_message_recv(PPC_MSG_CALL_FUNC_SINGLE); | 513 | smp_message_recv(PPC_MSG_CALL_FUNC_SINGLE); |
516 | } | 514 | } |
517 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) | 515 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) |
518 | if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, | 516 | if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, |
519 | &xics_ipi_message[cpu].value)) { | 517 | &xics_ipi_message[cpu].value)) { |
520 | mb(); | ||
521 | smp_message_recv(PPC_MSG_DEBUGGER_BREAK); | 518 | smp_message_recv(PPC_MSG_DEBUGGER_BREAK); |
522 | } | 519 | } |
523 | #endif | 520 | #endif |