• Shan Hai's avatar
    powerpc/vdso: Remove redundant locking in update_vsyscall_tz() · ce73ec6d
    Shan Hai authored
    The locking in update_vsyscall_tz() is not only unnecessary because the vdso
    code copies the data unproteced in __kernel_gettimeofday() but also
    introduces a hard to reproduce race condition between update_vsyscall()
    and update_vsyscall_tz(), which causes user space process to loop
    forever in vdso code.
    
    The following patch removes the locking from update_vsyscall_tz().
    
    Locking is not only unnecessary because the vdso code copies the data
    unprotected in __kernel_gettimeofday() but also erroneous because updating
    the tb_update_count is not atomic and introduces a hard to reproduce race
    condition between update_vsyscall() and update_vsyscall_tz(), which further
    causes user space process to loop forever in vdso code.
    
    The below scenario describes the race condition,
    x==0	Boot CPU			other CPU
    	proc_P: x==0
    	    timer interrupt
    		update_vsyscall
    x==1		    x++;sync		settimeofday
    					    update_vsyscall_tz
    x==2						x++;sync
    x==3		    sync;x++
    						sync;x++
    	proc_P: x==3 (loops until x becomes even)
    
    Because the ++ operator would be implemented as three instructions and not
    atomic on powerpc.
    
    A similar change was made for x86 in commit 6c260d58
    ("x86: vdso: Remove bogus locking in update_vsyscall_tz")
    Signed-off-by: default avatarShan Hai <shan.hai@windriver.com>
    CC: <stable@vger.kernel.org>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    ce73ec6d
time.c 26.3 KB