From owner-svn-src-user@FreeBSD.ORG  Mon May 18 19:56:06 2009
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
Delivered-To: svn-src-user@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id DB25B106566C;
	Mon, 18 May 2009 19:56:06 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id C9EB78FC12;
	Mon, 18 May 2009 19:56:06 +0000 (UTC)
	(envelope-from kmacy@FreeBSD.org)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n4IJu68Q073252;
	Mon, 18 May 2009 19:56:06 GMT (envelope-from kmacy@svn.freebsd.org)
Received: (from kmacy@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id n4IJu6N4073250;
	Mon, 18 May 2009 19:56:06 GMT (envelope-from kmacy@svn.freebsd.org)
Message-Id: <200905181956.n4IJu6N4073250@svn.freebsd.org>
From: Kip Macy <kmacy@FreeBSD.org>
Date: Mon, 18 May 2009 19:56:06 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
X-SVN-Group: user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r192335 - in user/kmacy/releng_7_2_fcs/sys: amd64/amd64
	i386/i386
X-BeenThere: svn-src-user@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 18 May 2009 19:56:07 -0000

Author: kmacy
Date: Mon May 18 19:56:06 2009
New Revision: 192335
URL: http://svn.freebsd.org/changeset/base/192335

Log:
  merge 188904
    - Resolve an issue where we may clear an idt while an interrupt on a
      different cpu is still assigned to that vector by never clearing idt
      entries.  This was only provided as a debugging feature and the bugs
      are caught by other means.
    - Drop the sched lock when rebinding to reassign an interrupt vector
      to a new cpu so that pending interrupts have a chance to be delivered
      before removing the old vector.
  
   Discussed with:       tegge, jhb

Modified:
  user/kmacy/releng_7_2_fcs/sys/amd64/amd64/local_apic.c
  user/kmacy/releng_7_2_fcs/sys/i386/i386/local_apic.c

Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/local_apic.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/amd64/amd64/local_apic.c	Mon May 18 19:54:34 2009	(r192334)
+++ user/kmacy/releng_7_2_fcs/sys/amd64/amd64/local_apic.c	Mon May 18 19:56:06 2009	(r192335)
@@ -887,7 +887,13 @@ apic_disable_vector(u_int apic_id, u_int
 	KASSERT(vector != IDT_SYSCALL, ("Attempt to overwrite syscall entry"));
 	KASSERT(ioint_handlers[vector / 32] != NULL,
 	    ("No ISR handler for vector %u", vector));
+#ifdef notyet
+	/*
+	 * We can not currently clear the idt entry because other cpus
+	 * may have a valid vector at this offset.
+	 */
 	setidt(vector, &IDTVEC(rsvd), SDT_SYSIGT, SEL_KPL, 0);
+#endif
 }
 
 /* Release an APIC vector when it's no longer in use. */
@@ -911,9 +917,11 @@ apic_free_vector(u_int apic_id, u_int ve
 	if (sched_is_bound(td))
 		panic("apic_free_vector: Thread already bound.\n");
 	sched_bind(td, apic_cpuid(apic_id));
+	thread_unlock(td);
 	mtx_lock_spin(&icu_lock);
 	lapics[apic_id].la_ioint_irqs[vector - APIC_IO_INTS] = 0;
 	mtx_unlock_spin(&icu_lock);
+	thread_lock(td);
 	sched_unbind(td);
 	thread_unlock(td);
 

Modified: user/kmacy/releng_7_2_fcs/sys/i386/i386/local_apic.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/i386/i386/local_apic.c	Mon May 18 19:54:34 2009	(r192334)
+++ user/kmacy/releng_7_2_fcs/sys/i386/i386/local_apic.c	Mon May 18 19:56:06 2009	(r192335)
@@ -890,8 +890,14 @@ apic_disable_vector(u_int apic_id, u_int
 	KASSERT(vector != IDT_SYSCALL, ("Attempt to overwrite syscall entry"));
 	KASSERT(ioint_handlers[vector / 32] != NULL,
 	    ("No ISR handler for vector %u", vector));
+#ifdef notyet
+	/*
+	 * We can not currently clear the idt entry because other cpus
+	 * may have a valid vector at this offset.
+	 */
 	setidt(vector, &IDTVEC(rsvd), SDT_SYS386TGT, SEL_KPL,
 	    GSEL(GCODE_SEL, SEL_KPL));
+#endif
 }
 
 /* Release an APIC vector when it's no longer in use. */
@@ -915,9 +921,11 @@ apic_free_vector(u_int apic_id, u_int ve
 	if (sched_is_bound(td))
 		panic("apic_free_vector: Thread already bound.\n");
 	sched_bind(td, apic_cpuid(apic_id));
+	thread_unlock(td);
 	mtx_lock_spin(&icu_lock);
 	lapics[apic_id].la_ioint_irqs[vector - APIC_IO_INTS] = 0;
 	mtx_unlock_spin(&icu_lock);
+	thread_lock(td);
 	sched_unbind(td);
 	thread_unlock(td);