From owner-p4-projects@FreeBSD.ORG Tue Oct 26 16:06:29 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C69DD1065679; Tue, 26 Oct 2010 16:06:29 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 89395106566B for ; Tue, 26 Oct 2010 16:06:29 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 75ED08FC17 for ; Tue, 26 Oct 2010 16:06:29 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id o9QG6TLY052101 for ; Tue, 26 Oct 2010 16:06:29 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id o9QG6TIW052098 for perforce@freebsd.org; Tue, 26 Oct 2010 16:06:29 GMT (envelope-from jhb@freebsd.org) Date: Tue, 26 Oct 2010 16:06:29 GMT Message-Id: <201010261606.o9QG6TIW052098@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 185119 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Oct 2010 16:06:30 -0000 http://p4web.freebsd.org/@@185119?ac=10 Change 185119 by jhb@jhb_jhbbsd on 2010/10/26 16:05:30 Disable interrupts before bumping td_md.md_spinlock_count to 1 to fix races with single stepping through spinlock_enter clobbering td.md_saved_*. Affected files ... .. //depot/projects/smpng/sys/amd64/amd64/machdep.c#97 edit .. //depot/projects/smpng/sys/arm/arm/machdep.c#32 edit .. //depot/projects/smpng/sys/i386/i386/machdep.c#162 edit .. //depot/projects/smpng/sys/ia64/ia64/machdep.c#126 edit .. //depot/projects/smpng/sys/mips/mips/machdep.c#17 edit .. //depot/projects/smpng/sys/pc98/pc98/machdep.c#43 edit .. //depot/projects/smpng/sys/powerpc/aim/machdep.c#22 edit .. //depot/projects/smpng/sys/powerpc/booke/machdep.c#19 edit .. //depot/projects/smpng/sys/sparc64/sparc64/machdep.c#105 edit .. //depot/projects/smpng/sys/sun4v/sun4v/machdep.c#16 edit Differences ... ==== //depot/projects/smpng/sys/amd64/amd64/machdep.c#97 (text+ko) ==== @@ -1761,11 +1761,15 @@ spinlock_enter(void) { struct thread *td; + register_t flags; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_flags = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + flags = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_flags = flags; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/arm/arm/machdep.c#32 (text+ko) ==== @@ -493,11 +493,15 @@ spinlock_enter(void) { struct thread *td; + register_t cspr; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_cspr = disable_interrupts(I32_bit | F32_bit); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + cspr = disable_interrupts(I32_bit | F32_bit); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_cspr = cspr; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/i386/i386/machdep.c#162 (text+ko) ==== @@ -2996,11 +2996,15 @@ spinlock_enter(void) { struct thread *td; + register_t flags; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_flags = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + flags = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_flags = flags; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/ia64/ia64/machdep.c#126 (text+ko) ==== @@ -513,11 +513,15 @@ spinlock_enter(void) { struct thread *td; + int intr; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_intr = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + intr = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_intr = intr; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/mips/mips/machdep.c#17 (text+ko) ==== @@ -450,11 +450,15 @@ spinlock_enter(void) { struct thread *td; + register_t intr; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_intr = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + intr = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_intr = intr; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/pc98/pc98/machdep.c#43 (text+ko) ==== @@ -2328,11 +2328,15 @@ spinlock_enter(void) { struct thread *td; + register_t flags; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_flags = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + flags = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_flags = flags; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/powerpc/aim/machdep.c#22 (text+ko) ==== @@ -751,11 +751,15 @@ spinlock_enter(void) { struct thread *td; + register_t msr; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_msr = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + msr = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_msr = msr; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/powerpc/booke/machdep.c#19 (text+ko) ==== @@ -516,11 +516,15 @@ spinlock_enter(void) { struct thread *td; + register_t msr; td = curthread; - if (td->td_md.md_spinlock_count == 0) - td->td_md.md_saved_msr = intr_disable(); - td->td_md.md_spinlock_count++; + if (td->td_md.md_spinlock_count == 0) { + msr = intr_disable(); + td->td_md.md_spinlock_count == 1; + td->td_md.md_saved_msr = msr; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/sparc64/sparc64/machdep.c#105 (text+ko) ==== @@ -224,9 +224,10 @@ if (td->td_md.md_spinlock_count == 0) { pil = rdpr(pil); wrpr(pil, 0, PIL_TICK); + td->td_md.md_spinlock_count == 1; td->td_md.md_saved_pil = pil; - } - td->td_md.md_spinlock_count++; + } else + td->td_md.md_spinlock_count++; critical_enter(); } ==== //depot/projects/smpng/sys/sun4v/sun4v/machdep.c#16 (text+ko) ==== @@ -269,9 +269,10 @@ td = curthread; if (td->td_md.md_spinlock_count == 0) { pil = intr_disable(); + td->td_md.md_spinlock_count == 1; td->td_md.md_saved_pil = pil; - } - td->td_md.md_spinlock_count++; + } else + td->td_md.md_spinlock_count++; critical_enter(); } @@ -285,9 +286,8 @@ critical_exit(); pil = td->td_md.md_saved_pil; td->td_md.md_spinlock_count--; - if (td->td_md.md_spinlock_count == 0) { + if (td->td_md.md_spinlock_count == 0) intr_restore(pil); - } } unsigned