git: 5ca00e0c985f - main - xen/intr: use struct xenisrc * as xen_intr_handle_t

Roger Pau Monné royger at FreeBSD.org
Wed Jul 28 15:27:51 UTC 2021


The branch main has been updated by royger:

URL: https://cgit.FreeBSD.org/src/commit/?id=5ca00e0c985f85a241bbb263c66225a8e9c54ae2

commit 5ca00e0c985f85a241bbb263c66225a8e9c54ae2
Author:     Elliott Mitchell <ehem+freebsd at m5p.com>
AuthorDate: 2021-04-06 08:30:49 +0000
Commit:     Roger Pau Monné <royger at FreeBSD.org>
CommitDate: 2021-07-28 15:27:03 +0000

    xen/intr: use struct xenisrc * as xen_intr_handle_t
    
    Since xen_intr_handle_t is meant to be an opaque handle and the only
    use is retrieving the associated struct xenisrc *, directly use it as
    the opaque handler.
    
    Also add a wrapper function for converting the other direction.  If some
    other value becomes appropriate in the future, these two functions will
    be the only spots needing modification.
    
    Reviewed by: mhorne, royger
    Differential Revision: https://reviews.freebsd.org/D29500
---
 sys/x86/xen/xen_intr.c | 76 +++++++++++++++++++++++++++-----------------------
 1 file changed, 41 insertions(+), 35 deletions(-)

diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index c729ffddb345..ebbae25c2d9e 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -168,6 +168,38 @@ static u_int		 xen_intr_auto_vector_count;
 static struct xenisrc	*xen_intr_port_to_isrc[NR_EVENT_CHANNELS];
 
 /*------------------------- Private Functions --------------------------------*/
+
+/**
+ * Retrieve a handle for a Xen interrupt source.
+ *
+ * \param isrc  A valid Xen interrupt source structure.
+ *
+ * \returns  A handle suitable for use with xen_intr_isrc_from_handle()
+ *           to retrieve the original Xen interrupt source structure.
+ */
+
+static inline xen_intr_handle_t
+xen_intr_handle_from_isrc(struct xenisrc *isrc)
+{
+	return (isrc);
+}
+
+/**
+ * Lookup a Xen interrupt source object given an interrupt binding handle.
+ *
+ * \param handle  A handle initialized by a previous call to
+ *                xen_intr_bind_isrc().
+ *
+ * \returns  A pointer to the Xen interrupt source object associated
+ *           with the given interrupt handle.  NULL if no association
+ *           currently exists.
+ */
+static inline struct xenisrc *
+xen_intr_isrc_from_handle(xen_intr_handle_t handle)
+{
+	return ((struct xenisrc *)handle);
+}
+
 /**
  * Disable signal delivery for an event channel port on the
  * specified CPU.
@@ -393,8 +425,8 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
 	refcount_init(&isrc->xi_refcount, 1);
 	mtx_unlock(&xen_intr_isrc_lock);
 
-	/* Assign the opaque handler (the event channel port) */
-	*port_handlep = &isrc->xi_vector;
+	/* Assign the opaque handler */
+	*port_handlep = xen_intr_handle_from_isrc(isrc);
 
 #ifdef SMP
 	if (type == EVTCHN_TYPE_PORT) {
@@ -427,32 +459,6 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
 	return (0);
 }
 
-/**
- * Lookup a Xen interrupt source object given an interrupt binding handle.
- * 
- * \param handle  A handle initialized by a previous call to
- *                xen_intr_bind_isrc().
- *
- * \returns  A pointer to the Xen interrupt source object associated
- *           with the given interrupt handle.  NULL if no association
- *           currently exists.
- */
-static struct xenisrc *
-xen_intr_isrc(xen_intr_handle_t handle)
-{
-	int vector;
-
-	if (handle == NULL)
-		return (NULL);
-
-	vector = *(int *)handle;
-	KASSERT(vector >= first_evtchn_irq &&
-	    vector < (first_evtchn_irq + xen_intr_auto_vector_count),
-	    ("Xen interrupt vector is out of range"));
-
-	return ((struct xenisrc *)intr_lookup_source(vector));
-}
-
 /**
  * Determine the event channel ports at the given section of the
  * event port bitmap which have pending events for the given cpu.
@@ -1195,7 +1201,7 @@ xen_intr_describe(xen_intr_handle_t port_handle, const char *fmt, ...)
 	struct xenisrc *isrc;
 	va_list ap;
 
-	isrc = xen_intr_isrc(port_handle);
+	isrc = xen_intr_isrc_from_handle(port_handle);
 	if (isrc == NULL)
 		return (EINVAL);
 
@@ -1213,7 +1219,7 @@ xen_intr_unbind(xen_intr_handle_t *port_handlep)
 	KASSERT(port_handlep != NULL,
 	    ("NULL xen_intr_handle_t passed to xen_intr_unbind"));
 
-	isrc = xen_intr_isrc(*port_handlep);
+	isrc = xen_intr_isrc_from_handle(*port_handlep);
 	*port_handlep = NULL;
 	if (isrc == NULL)
 		return;
@@ -1235,7 +1241,7 @@ xen_intr_signal(xen_intr_handle_t handle)
 {
 	struct xenisrc *isrc;
 
-	isrc = xen_intr_isrc(handle);
+	isrc = xen_intr_isrc_from_handle(handle);
 	if (isrc != NULL) {
 		KASSERT(isrc->xi_type == EVTCHN_TYPE_PORT ||
 			isrc->xi_type == EVTCHN_TYPE_IPI,
@@ -1250,7 +1256,7 @@ xen_intr_port(xen_intr_handle_t handle)
 {
 	struct xenisrc *isrc;
 
-	isrc = xen_intr_isrc(handle);
+	isrc = xen_intr_isrc_from_handle(handle);
 	if (isrc == NULL)
 		return (0);
 
@@ -1265,7 +1271,7 @@ xen_intr_add_handler(const char *name, driver_filter_t filter,
 	struct xenisrc *isrc;
 	int error;
 
-	isrc = xen_intr_isrc(handle);
+	isrc = xen_intr_isrc_from_handle(handle);
 	if (isrc == NULL || isrc->xi_cookie != NULL)
 		return (EINVAL);
 
@@ -1299,8 +1305,8 @@ xen_intr_get_evtchn_from_port(evtchn_port_t port, xen_intr_handle_t *handlep)
 	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;
+	/* Assign the opaque handler */
+	*handlep = xen_intr_handle_from_isrc(xen_intr_port_to_isrc[port]);
 
 	return (0);
 }


More information about the dev-commits-src-main mailing list