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

Configure Feed

Select the types of activity you want to include in your feed.

Input: hyperv-keyboard - 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-12-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+18 -20
+18 -20
drivers/input/serio/hyperv-keyboard.c
··· 102 102 { 103 103 struct hv_kbd_dev *kbd_dev = hv_get_drvdata(hv_dev); 104 104 struct synth_kbd_keystroke *ks_msg; 105 - unsigned long flags; 106 105 u32 msg_type = __le32_to_cpu(msg->header.type); 107 106 u32 info; 108 107 u16 scan_code; ··· 146 147 /* 147 148 * Inject the information through the serio interrupt. 148 149 */ 149 - spin_lock_irqsave(&kbd_dev->lock, flags); 150 - if (kbd_dev->started) { 151 - if (info & IS_E0) 152 - serio_interrupt(kbd_dev->hv_serio, 153 - XTKBD_EMUL0, 0); 154 - if (info & IS_E1) 155 - serio_interrupt(kbd_dev->hv_serio, 156 - XTKBD_EMUL1, 0); 157 - scan_code = __le16_to_cpu(ks_msg->make_code); 158 - if (info & IS_BREAK) 159 - scan_code |= XTKBD_RELEASE; 150 + scoped_guard(spinlock_irqsave, &kbd_dev->lock) { 151 + if (kbd_dev->started) { 152 + if (info & IS_E0) 153 + serio_interrupt(kbd_dev->hv_serio, 154 + XTKBD_EMUL0, 0); 155 + if (info & IS_E1) 156 + serio_interrupt(kbd_dev->hv_serio, 157 + XTKBD_EMUL1, 0); 158 + scan_code = __le16_to_cpu(ks_msg->make_code); 159 + if (info & IS_BREAK) 160 + scan_code |= XTKBD_RELEASE; 160 161 161 - serio_interrupt(kbd_dev->hv_serio, scan_code, 0); 162 + serio_interrupt(kbd_dev->hv_serio, 163 + scan_code, 0); 164 + } 162 165 } 163 - spin_unlock_irqrestore(&kbd_dev->lock, flags); 164 166 165 167 /* 166 168 * Only trigger a wakeup on key down, otherwise ··· 292 292 static int hv_kbd_start(struct serio *serio) 293 293 { 294 294 struct hv_kbd_dev *kbd_dev = serio->port_data; 295 - unsigned long flags; 296 295 297 - spin_lock_irqsave(&kbd_dev->lock, flags); 296 + guard(spinlock_irqsave)(&kbd_dev->lock); 297 + 298 298 kbd_dev->started = true; 299 - spin_unlock_irqrestore(&kbd_dev->lock, flags); 300 299 301 300 return 0; 302 301 } ··· 303 304 static void hv_kbd_stop(struct serio *serio) 304 305 { 305 306 struct hv_kbd_dev *kbd_dev = serio->port_data; 306 - unsigned long flags; 307 307 308 - spin_lock_irqsave(&kbd_dev->lock, flags); 308 + guard(spinlock_irqsave)(&kbd_dev->lock); 309 + 309 310 kbd_dev->started = false; 310 - spin_unlock_irqrestore(&kbd_dev->lock, flags); 311 311 } 312 312 313 313 static int hv_kbd_probe(struct hv_device *hv_dev,