From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from tomts10-srv.bellnexxia.net (tomts10.bellnexxia.net [209.226.175.54]) by ozlabs.org (Postfix) with ESMTP id 0B208DDE48 for ; Fri, 9 Mar 2007 13:45:27 +1100 (EST) Received: from krystal.dyndns.org ([67.68.240.144]) by tomts10-srv.bellnexxia.net (InterMail vM.5.01.06.13 201-253-122-130-113-20050324) with ESMTP id <20070309024525.FFQY1723.tomts10-srv.bellnexxia.net@krystal.dyndns.org> for ; Thu, 8 Mar 2007 21:45:25 -0500 Date: Thu, 8 Mar 2007 21:45:25 -0500 From: Mathieu Desnoyers To: akpm@linux-foundation.org, mbligh@google.com, linux-kernel@vger.kernel.org, linuxppc-dev@ozlabs.org, paulus@samba.org Subject: [PATCH] Fix atomicity of TIF update in flush_thread() for powerpc Message-ID: <20070309024525.GB9462@Krystal> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Fix atomicity of TIF update in flush_thread() for powerpc Race : parent process executing : sys_ptrace() (lock_kernel()) (ptrace_get_task_struct(pid)) arch_ptrace() ptrace_detach() ptrace_disable(child); clear_singlestep(child); clear_tsk_thread_flag(child, TIF_SINGLESTEP); (which clears the TIF_SINGLESTEP flag atomically from a different process) (put_task_struct(child)) (unlock_kernel()) And at the same time, in the child process : sys_execve() do_execve() search_binary_handler() load_elf_binary() flush_old_exec() flush_thread() doing a non-atomic thread flag update Applies on 2.6.20. Signed-off-by: Mathieu Desnoyers --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c @@ -476,8 +476,13 @@ void flush_thread(void) #ifdef CONFIG_PPC64 struct thread_info *t = current_thread_info(); - if (t->flags & _TIF_ABI_PENDING) - t->flags ^= (_TIF_ABI_PENDING | _TIF_32BIT); + if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) { + clear_tsk_thread_flag(tsk, TIF_ABI_PENDING); + if (test_tsk_thread_flag(tsk, TIF_32BIT)) + clear_tsk_thread_flag(tsk, TIF_32BIT); + else + set_tsk_thread_flag(tsk, TIF_32BIT); + } #endif discard_lazy_cpu_state(); -- Mathieu Desnoyers Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68