* [PATCH] xhci: dbgtty: convert rx push tasklet to BH workqueue
@ 2026-10-08 12:06 Kun Luo
0 siblings, 0 replies; only message in thread
From: Kun Luo @ 2026-10-08 12:06 UTC (permalink / raw)
To: Mathias Nyman
Cc: Greg Kroah-Hartman, linux-usb, linux-kernel, Lu Baolu, Kun Luo
The kernel is converting remaining tasklet users to BH workqueues so
softirq handling can go through the workqueue path. The dbc TTY rx
push path is a straightforward bottom-half: schedule from IRQ /
unthrottle, run the same work, kill on port teardown.
Replace the tasklet with system_bh_wq. Behavior stays in softirq
context, so existing locking is unchanged.
Compile-tested only.
Signed-off-by: Kun Luo <luokun485@gmail.com>
---
drivers/usb/host/xhci-dbgcap.h | 2 +-
drivers/usb/host/xhci-dbgtty.c | 17 +++++++++--------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/usb/host/xhci-dbgcap.h b/drivers/usb/host/xhci-dbgcap.h
index 5b18efb2c1ea..78e9b5e674a3 100644
--- a/drivers/usb/host/xhci-dbgcap.h
+++ b/drivers/usb/host/xhci-dbgcap.h
@@ -127,7 +127,7 @@ struct dbc_port {
struct list_head read_pool;
struct list_head read_queue;
unsigned int n_read;
- struct tasklet_struct push;
+ struct work_struct push;
struct list_head write_pool;
unsigned int tx_boundary;
diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c
index 3d51e8d82659..c18215751d92 100644
--- a/drivers/usb/host/xhci-dbgtty.c
+++ b/drivers/usb/host/xhci-dbgtty.c
@@ -11,6 +11,7 @@
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/idr.h>
+#include <linux/workqueue.h>
#include "xhci.h"
#include "xhci-dbgcap.h"
@@ -189,9 +190,9 @@ dbc_read_complete(struct xhci_dbc *dbc, struct dbc_request *req)
}
}
- /* defer moving data from req to tty buffer to a tasklet */
+ /* defer moving data from req to tty buffer to BH workqueue */
list_add_tail(&req->list_pool, &port->read_queue);
- tasklet_schedule(&port->push);
+ queue_work(system_bh_wq, &port->push);
out:
spin_unlock_irqrestore(&port->port_lock, flags);
}
@@ -384,7 +385,7 @@ static void dbc_tty_unthrottle(struct tty_struct *tty)
unsigned long flags;
spin_lock_irqsave(&port->port_lock, flags);
- tasklet_schedule(&port->push);
+ queue_work(system_bh_wq, &port->push);
spin_unlock_irqrestore(&port->port_lock, flags);
}
@@ -400,13 +401,13 @@ static const struct tty_operations dbc_tty_ops = {
.unthrottle = dbc_tty_unthrottle,
};
-static void dbc_rx_push(struct tasklet_struct *t)
+static void dbc_rx_push(struct work_struct *work)
{
struct dbc_request *req;
struct tty_struct *tty;
unsigned long flags;
bool disconnect = false;
- struct dbc_port *port = from_tasklet(port, t, push);
+ struct dbc_port *port = from_work(port, work, push);
struct list_head *queue = &port->read_queue;
int untransferred;
@@ -438,7 +439,7 @@ static void dbc_rx_push(struct tasklet_struct *t)
}
if (!list_empty(queue))
- tasklet_schedule(&port->push);
+ queue_work(system_bh_wq, &port->push);
if (!disconnect)
dbc_start_rx(port);
@@ -467,7 +468,7 @@ xhci_dbc_tty_init_port(struct xhci_dbc *dbc, struct dbc_port *port)
{
tty_port_init(&port->port);
spin_lock_init(&port->port_lock);
- tasklet_setup(&port->push, dbc_rx_push);
+ INIT_WORK(&port->push, dbc_rx_push);
INIT_LIST_HEAD(&port->read_pool);
INIT_LIST_HEAD(&port->read_queue);
INIT_LIST_HEAD(&port->write_pool);
@@ -479,7 +480,7 @@ xhci_dbc_tty_init_port(struct xhci_dbc *dbc, struct dbc_port *port)
static void
xhci_dbc_tty_exit_port(struct dbc_port *port)
{
- tasklet_kill(&port->push);
+ cancel_work_sync(&port->push);
tty_port_destroy(&port->port);
}
--
2.54.0
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-10-08 12:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-08 12:06 [PATCH] xhci: dbgtty: convert rx push tasklet to BH workqueue Kun Luo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®