• Hirokazu Takata's avatar
    [PATCH] m32r: Fix sys_tas() syscall · 91f4ab05
    Hirokazu Takata authored
    This patch fixes a deadlock problem of the m32r SMP kernel.
    
    In the m32r kernel, sys_tas() system call is provided as a test-and-set
    function for userspace, for backward compatibility.
    
    In some multi-threading application program, deadlocks were rarely caused
    at sys_tas() funcion.  Such a deadlock was caused due to a collision of
    __pthread_lock() and __pthread_unlock() operations.
    
    The "tas" syscall is repeatedly called by pthread_mutex_lock() to get a
    lock, while a lock variable's value is not 0.  On the other hand,
    pthead_mutex_unlock() sets the lock variable to 0 for unlocking.
    
    In the previous implementation of sys_tas() routine, there was a
    possibility that a unlock operation was ignored in the following case:
    
    - Assume a lock variable (*addr) was equal to 1 before sys_tas() execution.
    - __pthread_unlock() operation is executed by the other processor
      and the lock variable (*addr) is set to 0, between a read operation
      ("oldval = *addr;") and the following write operation ("*addr = 1;")
      during a execution of sys_tas().
    
    In this case, the following write operation ("*addr = 1;") overwrites the
    __pthread_unlock() result, and sys_tas() fails to get a lock in the next
    turn and after that.
    
    According to the attatched patch, sys_tas() returns 0 value in the next
    turn and deadlocks never happen.
    Signed-off-by: default avatarHitoshi Yamamoto <Yamamoto.Hitoshi@ap.MitsubishiElectric.co.jp>
    Signed-off-by: default avatarHirokazu Takata <takata@linux-m32r.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    91f4ab05
sys_m32r.c 4.68 KB