xen/intr: rework xen_intr_alloc_isrc() call structure

The call structure around xen_intr_alloc_isrc() was rather awful.
Notably finding a structure for reuse is part of allocation, but this
was done outside xen_intr_alloc_isrc().  Move this into
xen_intr_alloc_isrc() so the function handles all allocation steps.

Reviewed by: royger
Differential Revision: https://reviews.freebsd.org/D30726
This commit is contained in:
Elliott Mitchell 2021-05-11 12:05:03 -07:00 committed by Roger Pau Monné
parent 149c581018
commit 09bd542d17

View File

@ -318,6 +318,10 @@ xen_intr_alloc_isrc(enum evtchn_type type)
int error;
KASSERT(mtx_owned(&xen_intr_isrc_lock), ("Evtchn alloc lock not held"));
isrc = xen_intr_find_unused_isrc(type);
if (isrc != NULL) {
return (isrc);
}
if (xen_intr_auto_vector_count >= NR_EVENT_CHANNELS) {
if (!warned) {
@ -424,13 +428,10 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
*port_handlep = NULL;
mtx_lock(&xen_intr_isrc_lock);
isrc = xen_intr_find_unused_isrc(type);
isrc = xen_intr_alloc_isrc(type);
if (isrc == NULL) {
isrc = xen_intr_alloc_isrc(type);
if (isrc == NULL) {
mtx_unlock(&xen_intr_isrc_lock);
return (ENOSPC);
}
mtx_unlock(&xen_intr_isrc_lock);
return (ENOSPC);
}
isrc->xi_port = local_port;
isrc->xi_close = false;