Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Apr 2023 14:00:47 GMT
From:      =?utf-8?Q?Roger=20Pau=20Monn=C3=A9?= <royger@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 054073c2831c - main - xen/intr: xen_intr_bind_isrc() always set handle
Message-ID:  <202304141400.33EE0lTl083564@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by royger:

URL: https://cgit.FreeBSD.org/src/commit/?id=054073c2831cf70c3f2937b915663e1e2c75a25d

commit 054073c2831cf70c3f2937b915663e1e2c75a25d
Author:     Elliott Mitchell <ehem+freebsd@m5p.com>
AuthorDate: 2022-05-14 21:41:51 +0000
Commit:     Roger Pau Monné <royger@FreeBSD.org>
CommitDate: 2023-04-14 13:58:45 +0000

    xen/intr: xen_intr_bind_isrc() always set handle
    
    Previously the upper layer handle was being set before the last
    potential error condition.  The reasoning appears to have been it was
    assumed invalid in case of an error being returned.  Now ensure it is
    invalid until just before a successful return.
    
    Fixes: 76acc41fb7c7 ("Implement vector callback for PVHVM and unify event channel implementations")
    Fixes: 6d54cab1fe7d ("xen: allow to register event channels without handlers")
    Reviewed by: royger
---
 sys/x86/xen/xen_intr.c | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index 4b9b4675b5a0..167870b892f1 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -410,7 +410,7 @@ static int
 xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
     enum evtchn_type type, const char *intr_owner, driver_filter_t filter,
     driver_intr_t handler, void *arg, enum intr_type flags,
-    xen_intr_handle_t *port_handlep)
+    xen_intr_handle_t *const port_handlep)
 {
 	struct xenisrc *isrc;
 	int error;
@@ -420,6 +420,7 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
 		printf("%s: %s: Bad event handle\n", intr_owner, __func__);
 		return (EINVAL);
 	}
+	*port_handlep = NULL;
 
 	mtx_lock(&xen_intr_isrc_lock);
 	isrc = xen_intr_find_unused_isrc(type);
@@ -436,9 +437,6 @@ 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 */
-	*port_handlep = xen_intr_handle_from_isrc(isrc);
-
 #ifdef SMP
 	if (type == EVTCHN_TYPE_PORT) {
 		/*
@@ -450,23 +448,23 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
 	}
 #endif
 
-	if (filter == NULL && handler == NULL) {
-		/*
-		 * No filter/handler provided, leave the event channel
-		 * masked and without a valid handler, the caller is
-		 * in charge of setting that up.
-		 */
-		*isrcp = isrc;
-		return (0);
+	/*
+	 * If a filter or handler function is provided, add it to the event.
+	 * Otherwise the event channel is left masked and without a handler,
+	 * the caller is in charge of setting that up.
+	 */
+	if (filter != NULL || handler != NULL) {
+		error = xen_intr_add_handler(intr_owner, filter, handler, arg,
+		    flags, xen_intr_handle_from_isrc(isrc));
+		if (error != 0) {
+			xen_intr_release_isrc(isrc);
+			return (error);
+		}
 	}
 
-	error = xen_intr_add_handler(intr_owner, filter, handler, arg, flags,
-	    *port_handlep);
-	if (error != 0) {
-		xen_intr_release_isrc(isrc);
-		return (error);
-	}
 	*isrcp = isrc;
+	/* Assign the opaque handler */
+	*port_handlep = xen_intr_handle_from_isrc(isrc);
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202304141400.33EE0lTl083564>