Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: ps2mult - use guard notation when acquiring spinlock

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>

+7 -18
+7 -18
drivers/input/serio/ps2mult.c
··· 76 76 struct ps2mult *psm = serio_get_drvdata(mx_port); 77 77 struct ps2mult_port *port = serio->port_data; 78 78 bool need_escape; 79 - unsigned long flags; 80 79 81 - spin_lock_irqsave(&psm->lock, flags); 80 + guard(spinlock_irqsave)(&psm->lock); 82 81 83 82 if (psm->out_port != port) 84 83 ps2mult_select_port(psm, port); ··· 92 93 93 94 serio_write(mx_port, data); 94 95 95 - spin_unlock_irqrestore(&psm->lock, flags); 96 - 97 96 return 0; 98 97 } 99 98 ··· 99 102 { 100 103 struct ps2mult *psm = serio_get_drvdata(serio->parent); 101 104 struct ps2mult_port *port = serio->port_data; 102 - unsigned long flags; 103 105 104 - spin_lock_irqsave(&psm->lock, flags); 106 + guard(spinlock_irqsave)(&psm->lock); 107 + 105 108 port->registered = true; 106 - spin_unlock_irqrestore(&psm->lock, flags); 107 109 108 110 return 0; 109 111 } ··· 111 115 { 112 116 struct ps2mult *psm = serio_get_drvdata(serio->parent); 113 117 struct ps2mult_port *port = serio->port_data; 114 - unsigned long flags; 115 118 116 - spin_lock_irqsave(&psm->lock, flags); 119 + guard(spinlock_irqsave)(&psm->lock); 120 + 117 121 port->registered = false; 118 - spin_unlock_irqrestore(&psm->lock, flags); 119 122 } 120 123 121 124 static int ps2mult_create_port(struct ps2mult *psm, int i) ··· 143 148 144 149 static void ps2mult_reset(struct ps2mult *psm) 145 150 { 146 - unsigned long flags; 147 - 148 - spin_lock_irqsave(&psm->lock, flags); 151 + guard(spinlock_irqsave)(&psm->lock); 149 152 150 153 serio_write(psm->mx_serio, PS2MULT_SESSION_END); 151 154 serio_write(psm->mx_serio, PS2MULT_SESSION_START); 152 155 153 156 ps2mult_select_port(psm, &psm->ports[PS2MULT_KBD_PORT]); 154 - 155 - spin_unlock_irqrestore(&psm->lock, flags); 156 157 } 157 158 158 159 static int ps2mult_connect(struct serio *serio, struct serio_driver *drv) ··· 225 234 { 226 235 struct ps2mult *psm = serio_get_drvdata(serio); 227 236 struct ps2mult_port *in_port; 228 - unsigned long flags; 229 237 230 238 dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, dfl); 231 239 232 - spin_lock_irqsave(&psm->lock, flags); 240 + guard(spinlock_irqsave)(&psm->lock); 233 241 234 242 if (psm->escape) { 235 243 psm->escape = false; ··· 275 285 } 276 286 277 287 out: 278 - spin_unlock_irqrestore(&psm->lock, flags); 279 288 return IRQ_HANDLED; 280 289 } 281 290