Input: ps2mult - use guard notation when acquiring spinlock
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 5 Sep 2024 04:17:20 +0000 (21:17 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 4 Oct 2024 07:58:16 +0000 (00:58 -0700)
Using guard notation makes the code more compact and error handling
more robust by ensuring that locks are released in all code paths
when control leaves critical section.

Link: https://lore.kernel.org/r/20240905041732.2034348-16-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/serio/ps2mult.c

index 937ecde..b96cee5 100644 (file)
@@ -76,9 +76,8 @@ static int ps2mult_serio_write(struct serio *serio, unsigned char data)
        struct ps2mult *psm = serio_get_drvdata(mx_port);
        struct ps2mult_port *port = serio->port_data;
        bool need_escape;
-       unsigned long flags;
 
-       spin_lock_irqsave(&psm->lock, flags);
+       guard(spinlock_irqsave)(&psm->lock);
 
        if (psm->out_port != port)
                ps2mult_select_port(psm, port);
@@ -93,8 +92,6 @@ static int ps2mult_serio_write(struct serio *serio, unsigned char data)
 
        serio_write(mx_port, data);
 
-       spin_unlock_irqrestore(&psm->lock, flags);
-
        return 0;
 }
 
@@ -102,11 +99,10 @@ static int ps2mult_serio_start(struct serio *serio)
 {
        struct ps2mult *psm = serio_get_drvdata(serio->parent);
        struct ps2mult_port *port = serio->port_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&psm->lock, flags);
+       guard(spinlock_irqsave)(&psm->lock);
+
        port->registered = true;
-       spin_unlock_irqrestore(&psm->lock, flags);
 
        return 0;
 }
@@ -115,11 +111,10 @@ static void ps2mult_serio_stop(struct serio *serio)
 {
        struct ps2mult *psm = serio_get_drvdata(serio->parent);
        struct ps2mult_port *port = serio->port_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&psm->lock, flags);
+       guard(spinlock_irqsave)(&psm->lock);
+
        port->registered = false;
-       spin_unlock_irqrestore(&psm->lock, flags);
 }
 
 static int ps2mult_create_port(struct ps2mult *psm, int i)
@@ -148,16 +143,12 @@ static int ps2mult_create_port(struct ps2mult *psm, int i)
 
 static void ps2mult_reset(struct ps2mult *psm)
 {
-       unsigned long flags;
-
-       spin_lock_irqsave(&psm->lock, flags);
+       guard(spinlock_irqsave)(&psm->lock);
 
        serio_write(psm->mx_serio, PS2MULT_SESSION_END);
        serio_write(psm->mx_serio, PS2MULT_SESSION_START);
 
        ps2mult_select_port(psm, &psm->ports[PS2MULT_KBD_PORT]);
-
-       spin_unlock_irqrestore(&psm->lock, flags);
 }
 
 static int ps2mult_connect(struct serio *serio, struct serio_driver *drv)
@@ -234,11 +225,10 @@ static irqreturn_t ps2mult_interrupt(struct serio *serio,
 {
        struct ps2mult *psm = serio_get_drvdata(serio);
        struct ps2mult_port *in_port;
-       unsigned long flags;
 
        dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, dfl);
 
-       spin_lock_irqsave(&psm->lock, flags);
+       guard(spinlock_irqsave)(&psm->lock);
 
        if (psm->escape) {
                psm->escape = false;
@@ -285,7 +275,6 @@ static irqreturn_t ps2mult_interrupt(struct serio *serio,
        }
 
  out:
-       spin_unlock_irqrestore(&psm->lock, flags);
        return IRQ_HANDLED;
 }