Page MenuHomeFreeBSD

D7429.diff
No OneTemporary

D7429.diff

Index: sys/x86/xen/xen_intr.c
===================================================================
--- sys/x86/xen/xen_intr.c
+++ sys/x86/xen/xen_intr.c
@@ -45,6 +45,7 @@
#include <sys/interrupt.h>
#include <sys/pcpu.h>
#include <sys/smp.h>
+#include <sys/refcount.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -128,6 +129,7 @@
u_int xi_activehi:1;
u_int xi_edgetrigger:1;
u_int xi_masked:1;
+ volatile u_int xi_refcount;
};
static void xen_intr_suspend(struct pic *);
@@ -343,10 +345,8 @@
{
mtx_lock(&xen_intr_isrc_lock);
- if (isrc->xi_intsrc.is_handlers != 0) {
- mtx_unlock(&xen_intr_isrc_lock);
- return (EBUSY);
- }
+ KASSERT(isrc->xi_intsrc.is_handlers == 0,
+ ("Release called, but xenisrc still in use"));
evtchn_mask_port(isrc->xi_port);
evtchn_clear_port(isrc->xi_port);
@@ -417,6 +417,7 @@
}
isrc->xi_port = local_port;
xen_intr_port_to_isrc[local_port] = isrc;
+ refcount_init(&isrc->xi_refcount, 1);
mtx_unlock(&xen_intr_isrc_lock);
/* Assign the opaque handler (the event channel port) */
@@ -1508,6 +1509,13 @@
if (isrc == NULL)
return;
+ mtx_lock(&xen_intr_isrc_lock);
+ if (refcount_release(&isrc->xi_refcount) == 0) {
+ mtx_unlock(&xen_intr_isrc_lock);
+ return;
+ }
+ mtx_unlock(&xen_intr_isrc_lock);
+
if (isrc->xi_cookie != NULL)
intr_remove_handler(isrc->xi_cookie);
xen_intr_release_isrc(isrc);
@@ -1563,6 +1571,31 @@
return (error);
}
+int
+xen_intr_get_evtchn_from_port(evtchn_port_t port, xen_intr_handle_t *handlep)
+{
+
+ if (!is_valid_evtchn(port) || port >= NR_EVENT_CHANNELS)
+ return (EINVAL);
+
+ if (handlep == NULL) {
+ return (EINVAL);
+ }
+
+ mtx_lock(&xen_intr_isrc_lock);
+ if (xen_intr_port_to_isrc[port] == NULL) {
+ mtx_unlock(&xen_intr_isrc_lock);
+ return (EINVAL);
+ }
+ refcount_acquire(&xen_intr_port_to_isrc[port]->xi_refcount);
+ mtx_unlock(&xen_intr_isrc_lock);
+
+ /* Assign the opaque handler (the event channel port) */
+ *handlep = &xen_intr_port_to_isrc[port]->xi_vector;
+
+ return (0);
+}
+
#ifdef DDB
static const char *
xen_intr_print_type(enum evtchn_type type)
Index: sys/xen/xen_intr.h
===================================================================
--- sys/xen/xen_intr.h
+++ sys/xen/xen_intr.h
@@ -263,4 +263,16 @@
driver_intr_t handler, void *arg, enum intr_type flags,
xen_intr_handle_t handle);
+/**
+ * Get a reference to an event channel port
+ *
+ * \param port Event channel port to which we get a reference.
+ * \param handlep Pointer to an opaque handle used to manage this
+ * registration.
+ *
+ * \returns 0 on success, otherwise an errno.
+ */
+int xen_intr_get_evtchn_from_port(evtchn_port_t port,
+ xen_intr_handle_t *handlep);
+
#endif /* _XEN_INTR_H_ */

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 26, 10:02 AM (5 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30377986
Default Alt Text
D7429.diff (2 KB)

Event Timeline