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
This commit is contained in:
Elliott Mitchell 2021-04-06 10:30:49 +02:00 committed by Roger Pau Monné
parent d3705b5a7f
commit 5ca00e0c98

View File

@ -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);
}