Module Name:    src
Committed By:   msaitoh
Date:           Tue Apr 14 14:59:11 UTC 2015

Modified Files:
        src/sys/arch/xen/include [netbsd-6]: evtchn.h
        src/sys/arch/xen/xen [netbsd-6]: evtchn.c pci_intr_machdep.c

Log Message:
Pull up following revision(s) (requested by bouyer in ticket #1278):
        sys/arch/xen/include/evtchn.h: revision 1.23
        sys/arch/xen/xen/evtchn.c: revision 1.71
        sys/arch/xen/xen/pci_intr_machdep.c: revision 1.17
Properly implemement pci_intr_disestablish(9), so that interrupt
handlers stop being called when the device has been detached.
Should fix PR port-xen/47720 (which turns out to not be related to raidframe).
While there fix possible races in event_remove_handler() and pirq_establish().


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.20.8.1 src/sys/arch/xen/include/evtchn.h
cvs rdiff -u -r1.62.2.1 -r1.62.2.2 src/sys/arch/xen/xen/evtchn.c
cvs rdiff -u -r1.15 -r1.15.8.1 src/sys/arch/xen/xen/pci_intr_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/include/evtchn.h
diff -u src/sys/arch/xen/include/evtchn.h:1.20 src/sys/arch/xen/include/evtchn.h:1.20.8.1
--- src/sys/arch/xen/include/evtchn.h:1.20	Tue Sep 20 00:12:23 2011
+++ src/sys/arch/xen/include/evtchn.h	Tue Apr 14 14:59:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: evtchn.h,v 1.20 2011/09/20 00:12:23 jym Exp $	*/
+/*	$NetBSD: evtchn.h,v 1.20.8.1 2015/04/14 14:59:11 msaitoh Exp $	*/
 
 /*
  *
@@ -67,5 +67,6 @@ struct pintrhand {
 
 struct pintrhand *pirq_establish(int, int, int (*)(void *), void *, int,
      const char *);
+void pirq_disestablish(struct pintrhand *);
 
 #endif /*  _XEN_EVENTS_H_ */

Index: src/sys/arch/xen/xen/evtchn.c
diff -u src/sys/arch/xen/xen/evtchn.c:1.62.2.1 src/sys/arch/xen/xen/evtchn.c:1.62.2.2
--- src/sys/arch/xen/xen/evtchn.c:1.62.2.1	Tue Dec 17 22:39:17 2013
+++ src/sys/arch/xen/xen/evtchn.c	Tue Apr 14 14:59:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: evtchn.c,v 1.62.2.1 2013/12/17 22:39:17 riz Exp $	*/
+/*	$NetBSD: evtchn.c,v 1.62.2.2 2015/04/14 14:59:11 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -54,7 +54,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.62.2.1 2013/12/17 22:39:17 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.62.2.2 2015/04/14 14:59:11 msaitoh Exp $");
 
 #include "opt_xen.h"
 #include "isa.h"
@@ -554,16 +554,16 @@ pirq_establish(int pirq, int evtch, int 
 		return NULL;
 	}
 
-	if (event_set_handler(evtch, pirq_interrupt, ih, level, evname) != 0) {
-		kmem_free(ih, sizeof(struct pintrhand));
-		return NULL;
-	}
-
 	ih->pirq = pirq;
 	ih->evtch = evtch;
 	ih->func = func;
 	ih->arg = arg;
 
+	if (event_set_handler(evtch, pirq_interrupt, ih, level, evname) != 0) {
+		kmem_free(ih, sizeof(struct pintrhand));
+		return NULL;
+	}
+
 	physdev_op.cmd = PHYSDEVOP_IRQ_STATUS_QUERY;
 	physdev_op.u.irq_status_query.irq = pirq;
 	if (HYPERVISOR_physdev_op(&physdev_op) < 0)
@@ -579,6 +579,17 @@ pirq_establish(int pirq, int evtch, int 
 	return ih;
 }
 
+void
+pirq_disestablish(struct pintrhand *ih)
+{
+	int error = event_remove_handler(ih->evtch, pirq_interrupt, ih);
+	if (error) {
+		printf("pirq_disestablish(%p): %d\n", ih, error);
+		return;
+	}
+	kmem_free(ih, sizeof(struct pintrhand));
+}
+
 int
 pirq_interrupt(void *arg)
 {
@@ -776,7 +787,6 @@ event_remove_handler(int evtch, int (*fu
 	}
 	ci = ih->ih_cpu;
 	*ihp = ih->ih_evt_next;
-	mutex_spin_exit(&evtlock[evtch]);
 
 	ipls = ci->ci_isources[ih->ih_level];
 	for (ihp = &ipls->ipl_handlers, ih = ipls->ipl_handlers;
@@ -788,6 +798,7 @@ event_remove_handler(int evtch, int (*fu
 	if (ih == NULL)
 		panic("event_remove_handler");
 	*ihp = ih->ih_ipl_next;
+	mutex_spin_exit(&evtlock[evtch]);
 	kmem_free(ih, sizeof (struct intrhand));
 	if (evts->ev_handlers == NULL) {
 		xen_atomic_clear_bit(&ci->ci_evtmask[0], evtch);

Index: src/sys/arch/xen/xen/pci_intr_machdep.c
diff -u src/sys/arch/xen/xen/pci_intr_machdep.c:1.15 src/sys/arch/xen/xen/pci_intr_machdep.c:1.15.8.1
--- src/sys/arch/xen/xen/pci_intr_machdep.c:1.15	Fri Jul  1 18:36:45 2011
+++ src/sys/arch/xen/xen/pci_intr_machdep.c	Tue Apr 14 14:59:11 2015
@@ -1,4 +1,4 @@
-/*      $NetBSD: pci_intr_machdep.c,v 1.15 2011/07/01 18:36:45 dyoung Exp $      */
+/*      $NetBSD: pci_intr_machdep.c,v 1.15.8.1 2015/04/14 14:59:11 msaitoh Exp $      */
 
 /*
  * Copyright (c) 2005 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.15 2011/07/01 18:36:45 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_intr_machdep.c,v 1.15.8.1 2015/04/14 14:59:11 msaitoh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -221,4 +221,5 @@ pci_intr_establish(pci_chipset_tag_t pci
 void
 pci_intr_disestablish(pci_chipset_tag_t pcitag, void *cookie)
 {
+	pirq_disestablish(cookie);
 }

Reply via email to