[PATCH] s390: atomic primitives
Hugh Dickins <hugh@veritas.com> Fix the broken atomic_cmpxchg primitive. Add atomic_sub_and_test, atomic64_sub_return, atomic64_sub_and_test, atomic64_cmpxchg, atomic64_add_unless and atomic64_inc_not_zero. Replace old style atomic_compare_and_swap by atomic_cmpxchg. Shorten the whole header by defining most primitives with the two inline functions atomic_add_return and atomic_sub_return. In addition this patch contains the s390 related fixes of Hugh's "mm: fill arch atomic64 gaps" patch. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
8d93c700a4
commit
973bd99375
@@ -85,7 +85,7 @@ kexec_halt_all_cpus(void *kernel_image)
|
||||
pfault_fini();
|
||||
#endif
|
||||
|
||||
if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid))
|
||||
if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) != -1)
|
||||
signal_processor(smp_processor_id(), sigp_stop);
|
||||
|
||||
/* Wait for all other cpus to enter stopped state */
|
||||
|
@@ -263,7 +263,7 @@ static void do_machine_restart(void * __unused)
|
||||
int cpu;
|
||||
static atomic_t cpuid = ATOMIC_INIT(-1);
|
||||
|
||||
if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid))
|
||||
if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) != -1)
|
||||
signal_processor(smp_processor_id(), sigp_stop);
|
||||
|
||||
/* Wait for all other cpus to enter stopped state */
|
||||
@@ -313,7 +313,7 @@ static void do_machine_halt(void * __unused)
|
||||
{
|
||||
static atomic_t cpuid = ATOMIC_INIT(-1);
|
||||
|
||||
if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid) == 0) {
|
||||
if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) == -1) {
|
||||
smp_send_stop();
|
||||
if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)
|
||||
cpcmd(vmhalt_cmd, NULL, 0, NULL);
|
||||
@@ -332,7 +332,7 @@ static void do_machine_power_off(void * __unused)
|
||||
{
|
||||
static atomic_t cpuid = ATOMIC_INIT(-1);
|
||||
|
||||
if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid) == 0) {
|
||||
if (atomic_cmpxchg(&cpuid, -1, smp_processor_id()) == -1) {
|
||||
smp_send_stop();
|
||||
if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0)
|
||||
cpcmd(vmpoff_cmd, NULL, 0, NULL);
|
||||
|
Reference in New Issue
Block a user