Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149583597
D7429.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D7429.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D7429: Add Reference Count to Xen Event Channel
Attached
Detach File
Event Timeline
Log In to Comment