Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Sep 2025 07:55:25 GMT
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 186e433300fe - main - u2f(4): Use taskqueue to start USB transfers from kqueue context
Message-ID:  <202509250755.58P7tPrf060927@gitrepo.freebsd.org>

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

URL: https://cgit.FreeBSD.org/src/commit/?id=186e433300fed9093dd9716baa20e838eb3b51b6

commit 186e433300fed9093dd9716baa20e838eb3b51b6
Author:     Vladimir Kondratyev <wulf@FreeBSD.org>
AuthorDate: 2025-09-25 07:54:19 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2025-09-25 07:54:19 +0000

    u2f(4): Use taskqueue to start USB transfers from kqueue context
    
    to avoid recursion on u2f mutex and taking of hidbus sleepable lock.
    
    Tested by:      emaste
    PR:             289494
    MFC after:      2 days
---
 sys/dev/hid/u2f.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/sys/dev/hid/u2f.c b/sys/dev/hid/u2f.c
index ac2eba7a499d..39610845c5fb 100644
--- a/sys/dev/hid/u2f.c
+++ b/sys/dev/hid/u2f.c
@@ -47,6 +47,7 @@
 #include <sys/selinfo.h>
 #include <sys/sysctl.h>
 #include <sys/systm.h>
+#include <sys/taskqueue.h>
 #include <sys/uio.h>
 
 #include <dev/evdev/input.h>
@@ -78,6 +79,7 @@ struct u2f_softc {
 	struct cdev *dev;
 
 	struct mtx sc_mtx;		/* hidbus private mutex */
+	struct task sc_kqtask;		/* kqueue task */
 	void *sc_rdesc;
 	hid_size_t sc_rdesc_size;
 	hid_size_t sc_isize;
@@ -121,6 +123,7 @@ static device_probe_t	u2f_probe;
 static device_attach_t	u2f_attach;
 static device_detach_t	u2f_detach;
 
+static void		u2f_kqtask(void *context, int pending);
 static int		u2f_kqread(struct knote *, long);
 static void		u2f_kqdetach(struct knote *);
 static void		u2f_notify(struct u2f_softc *);
@@ -174,6 +177,7 @@ u2f_attach(device_t dev)
 
 	mtx_init(&sc->sc_mtx, "u2f lock", NULL, MTX_DEF);
 	knlist_init_mtx(&sc->sc_rsel.si_note, &sc->sc_mtx);
+	TASK_INIT(&sc->sc_kqtask, 0, u2f_kqtask, sc);
 
 	make_dev_args_init(&mda);
 	mda.mda_flags = MAKEDEV_WAITOK;
@@ -217,6 +221,7 @@ u2f_detach(device_t dev)
 		destroy_dev(sc->dev);
 	}
 
+	taskqueue_drain(taskqueue_thread, &sc->sc_kqtask);
 	hid_intr_stop(sc->sc_dev);
 
 	knlist_clear(&sc->sc_rsel.si_note, 0);
@@ -519,6 +524,14 @@ u2f_kqfilter(struct cdev *dev, struct knote *kn)
 	return (0);
 }
 
+static void
+u2f_kqtask(void *context, int pending)
+{
+	struct u2f_softc *sc = context;
+
+	hid_intr_start(sc->sc_dev);
+}
+
 static int
 u2f_kqread(struct knote *kn, long hint)
 {
@@ -533,7 +546,7 @@ u2f_kqread(struct knote *kn, long hint)
 	} else {
 		ret = sc->sc_state.data ? 1 : 0;
 		if (!sc->sc_state.data)
-			hid_intr_start(sc->sc_dev);
+			taskqueue_enqueue(taskqueue_thread, &sc->sc_kqtask);
 	}
 
 	return (ret);



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