diff mbox

[uclibc-ng-devel,2/3] arc: clone: Fix CLONE_THREAD detection

Message ID 1469783840-10472-3-git-send-email-abrodkin@synopsys.com
State Accepted
Headers show

Commit Message

Alexey Brodkin July 29, 2016, 9:17 a.m. UTC
For thread group case (CLONE_THREAD), the cached PID of new process/thread
need not be reset. The old logic to decide that was flawed as it would be
true only for exact combination of CLONE_THREAD + _VM, but would fail for
CLONE_THREAD + _VM + _xyz.

More detailed tear-down of current and new code below.

Current implementation is:
--------------------->8--------------------
                               ; r12 contains clone flags
  mov_s   r2, CLONE_THREAD_N_VM; r2 contains bit mask
  and_s   r2, r2, r12          ; r2 contains bit mask AND clone flags
                               ;   but r12 still contains the same flags
  brne    r2, r12, .Lgo_thread ; here we compare modified mask with
                               ;   flags as they were and skip pthread TID/PID
                               ;   setup if r2 != r12 which happens all
                               ;   the time except clone flags were
                               ;   exactly CLONE_THREAD | CLONE_VM
--------------------->8--------------------

New implementation is:
--------------------->8--------------------
                               ; r12 contains clone flags
  mov_s   r2, CLONE_THREAD_N_VM; r2 contains bit mask
  and_s   r12, r12, r2         ; r12 contains clone flags AND bit mask
                               ;   i.e. we did mask all flags except
                               ;   CLONE_THREAD and CLONE_VM
  breq    r2, r12, .Lgo_thread ; here we compare masked flags with
                               ;   target mask and if they match we skip
                               ;   pthread TID/PID setup
--------------------->8--------------------

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Acked-by: Vineet Gupta <vgupta@synopsys.com>
---
 libc/sysdeps/linux/arc/clone.S | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/libc/sysdeps/linux/arc/clone.S b/libc/sysdeps/linux/arc/clone.S
index dbb3fa7..fc8dfcf 100644
--- a/libc/sysdeps/linux/arc/clone.S
+++ b/libc/sysdeps/linux/arc/clone.S
@@ -69,8 +69,8 @@  ENTRY(clone)
 .Lnext_clone_quirk:
 #ifdef RESET_PID
 	mov_s	r2, CLONE_THREAD_N_VM
-	and_s	r2, r2, r12
-	brne	r2, r12, .Lgo_thread
+	and_s	r12, r12, r2
+	breq	r2, r12, .Lgo_thread
 
 	mov	r8, __NR_getpid
 	ARC_TRAP_INSN		; r0 has PID