]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Input: psmouse - remove dedicated kpsmoused workqueue
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 12 Mar 2026 05:50:57 +0000 (22:50 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 12 Mar 2026 18:16:30 +0000 (11:16 -0700)
The only user of psmouse_queue_work() and therefore kpsmoused workqueue
is psmouse-base itself, when it tries to schedule the resync work. Since
resyncing is not going to race with itself we no longer need the
dedicated ordered workqueue.

Remove it and switch to using regular (non-delayed) work structure
scheduled on the default workqueue.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/psmouse-base.c
drivers/input/mouse/psmouse.h

index 3f34825c869105ef0b354cadb577b0fa8b7d5893..6ab5f1d96eaeaac58f4ff6144725a7da94b073bc 100644 (file)
@@ -113,8 +113,6 @@ ATTRIBUTE_GROUPS(psmouse_dev);
  */
 static DEFINE_MUTEX(psmouse_mutex);
 
-static struct workqueue_struct *kpsmoused_wq;
-
 struct psmouse *psmouse_from_serio(struct serio *serio)
 {
        struct ps2dev *ps2dev = serio_get_drvdata(serio);
@@ -240,12 +238,6 @@ psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse)
        return PSMOUSE_FULL_PACKET;
 }
 
-void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
-               unsigned long delay)
-{
-       queue_delayed_work(kpsmoused_wq, work, delay);
-}
-
 /*
  * __psmouse_set_state() sets new psmouse state and resets all flags.
  */
@@ -379,7 +371,7 @@ static void psmouse_receive_byte(struct ps2dev *ps2dev, u8 data)
                             psmouse->name, psmouse->phys, psmouse->pktcnt);
                psmouse->badbyte = psmouse->packet[0];
                __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
-               psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
+               schedule_work(&psmouse->resync_work);
                return;
        }
 
@@ -415,7 +407,7 @@ static void psmouse_receive_byte(struct ps2dev *ps2dev, u8 data)
            time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) {
                psmouse->badbyte = psmouse->packet[0];
                __psmouse_set_state(psmouse, PSMOUSE_RESYNCING);
-               psmouse_queue_work(psmouse, &psmouse->resync_work, 0);
+               schedule_work(&psmouse->resync_work);
                return;
        }
 
@@ -1313,7 +1305,7 @@ int psmouse_deactivate(struct psmouse *psmouse)
 static void psmouse_resync(struct work_struct *work)
 {
        struct psmouse *parent = NULL, *psmouse =
-               container_of(work, struct psmouse, resync_work.work);
+               container_of(work, struct psmouse, resync_work);
        struct serio *serio = psmouse->ps2dev.serio;
        psmouse_ret_t rc = PSMOUSE_GOOD_DATA;
        bool failed = false, enabled = false;
@@ -1466,7 +1458,7 @@ static void psmouse_disconnect(struct serio *serio)
 
        /* make sure we don't have a resync in progress */
        mutex_unlock(&psmouse_mutex);
-       disable_delayed_work_sync(&psmouse->resync_work);
+       disable_work_sync(&psmouse->resync_work);
        mutex_lock(&psmouse_mutex);
 
        if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
@@ -1580,7 +1572,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
 
        ps2_init(&psmouse->ps2dev, serio,
                 psmouse_pre_receive_byte, psmouse_receive_byte);
-       INIT_DELAYED_WORK(&psmouse->resync_work, psmouse_resync);
+       INIT_WORK(&psmouse->resync_work, psmouse_resync);
        psmouse->dev = input_dev;
        scnprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys);
 
@@ -2022,21 +2014,12 @@ static int __init psmouse_init(void)
        if (err)
                return err;
 
-       kpsmoused_wq = alloc_ordered_workqueue("kpsmoused", 0);
-       if (!kpsmoused_wq) {
-               pr_err("failed to create kpsmoused workqueue\n");
-               err = -ENOMEM;
-               goto err_smbus_exit;
-       }
-
        err = serio_register_driver(&psmouse_drv);
        if (err)
-               goto err_destroy_wq;
+               goto err_smbus_exit;
 
        return 0;
 
-err_destroy_wq:
-       destroy_workqueue(kpsmoused_wq);
 err_smbus_exit:
        psmouse_smbus_module_exit();
        return err;
@@ -2045,7 +2028,6 @@ err_smbus_exit:
 static void __exit psmouse_exit(void)
 {
        serio_unregister_driver(&psmouse_drv);
-       destroy_workqueue(kpsmoused_wq);
        psmouse_smbus_module_exit();
 }
 
index 783201301e5cc63b5b1c09ca2b5a3331b3cd98d0..90ed8cd15d857b23da2b151554e46b0b1e1e71c1 100644 (file)
@@ -90,7 +90,7 @@ struct psmouse {
        void *private;
        struct input_dev *dev;
        struct ps2dev ps2dev;
-       struct delayed_work resync_work;
+       struct work_struct resync_work;
        const char *vendor;
        const char *name;
        const struct psmouse_protocol *protocol;
@@ -132,8 +132,6 @@ struct psmouse {
 
 struct psmouse *psmouse_from_serio(struct serio *serio);
 
-void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
-               unsigned long delay);
 int psmouse_reset(struct psmouse *psmouse);
 void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state);
 void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);