• Linus Torvalds's avatar
    Make workqueue bit operations work on "atomic_long_t" · a08727ba
    Linus Torvalds authored
    On architectures where the atomicity of the bit operations is handled by
    external means (ie a separate spinlock to protect concurrent accesses),
    just doing a direct assignment on the workqueue data field (as done by
    commit 4594bf15) can cause the
    assignment to be lost due to lack of serialization with the bitops on
    the same word.
    
    So we need to serialize the assignment with the locks on those
    architectures (notably older ARM chips, PA-RISC and sparc32).
    
    So rather than using an "unsigned long", let's use "atomic_long_t",
    which already has a safe assignment operation (atomic_long_set()) on
    such architectures.
    
    This requires that the atomic operations use the same atomicity locks as
    the bit operations do, but that is largely the case anyway.  Sparc32
    will probably need fixing.
    
    Architectures (including modern ARM with LL/SC) that implement sane
    atomic operations for SMP won't see any of this matter.
    
    Cc: Russell King <rmk+lkml@arm.linux.org.uk>
    Cc: David Howells <dhowells@redhat.com>
    Cc: David Miller <davem@davemloft.com>
    Cc: Matthew Wilcox <matthew@wil.cx>
    Cc: Linux Arch Maintainers <linux-arch@vger.kernel.org>
    Cc: Andrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    a08727ba
workqueue.c 20.8 KB