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

tty: moxa: use guard()s

Use guards in the moxa code. This improves readability, makes error
handling easier, and marks locked portions of code explicit. All that
while being sure the lock is unlocked.

Signed-off-by: Jiri Slaby (SUSE) <jirislaby@kernel.org>
Link: https://patch.msgid.link/20251119100140.830761-6-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Jiri Slaby (SUSE) and committed by
Greg Kroah-Hartman
1c7736dc 8c03bfcf

+71 -94
+71 -94
drivers/tty/moxa.c
··· 487 487 488 488 static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg) 489 489 { 490 - unsigned long flags; 491 - spin_lock_irqsave(&moxafunc_lock, flags); 490 + guard(spinlock_irqsave)(&moxafunc_lock); 492 491 writew(arg, ofsAddr + FuncArg); 493 492 writew(cmd, ofsAddr + FuncCode); 494 493 moxa_wait_finish(ofsAddr); 495 - spin_unlock_irqrestore(&moxafunc_lock, flags); 496 494 } 497 495 498 496 static int moxafuncret(void __iomem *ofsAddr, u16 cmd, u16 arg) 499 497 { 500 - unsigned long flags; 501 - u16 ret; 502 - spin_lock_irqsave(&moxafunc_lock, flags); 498 + guard(spinlock_irqsave)(&moxafunc_lock); 503 499 writew(arg, ofsAddr + FuncArg); 504 500 writew(cmd, ofsAddr + FuncCode); 505 501 moxa_wait_finish(ofsAddr); 506 - ret = readw(ofsAddr + FuncArg); 507 - spin_unlock_irqrestore(&moxafunc_lock, flags); 508 - return ret; 502 + 503 + return readw(ofsAddr + FuncArg); 509 504 } 510 505 511 506 static void moxa_low_water_check(void __iomem *ofsAddr) ··· 997 1002 if (ret) 998 1003 goto err_free; 999 1004 1000 - spin_lock_bh(&moxa_lock); 1001 - brd->ready = 1; 1002 - if (!timer_pending(&moxaTimer)) 1003 - mod_timer(&moxaTimer, jiffies + HZ / 50); 1004 - spin_unlock_bh(&moxa_lock); 1005 + scoped_guard(spinlock_bh, &moxa_lock) { 1006 + brd->ready = 1; 1007 + if (!timer_pending(&moxaTimer)) 1008 + mod_timer(&moxaTimer, jiffies + HZ / 50); 1009 + } 1005 1010 1006 1011 first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; 1007 1012 for (i = 0; i < brd->numPorts; i++) ··· 1021 1026 { 1022 1027 unsigned int a, opened, first_idx; 1023 1028 1024 - mutex_lock(&moxa_openlock); 1025 - spin_lock_bh(&moxa_lock); 1026 - brd->ready = 0; 1027 - spin_unlock_bh(&moxa_lock); 1029 + scoped_guard(mutex, &moxa_openlock) { 1030 + scoped_guard(spinlock_bh, &moxa_lock) 1031 + brd->ready = 0; 1028 1032 1029 - /* pci hot-un-plug support */ 1030 - for (a = 0; a < brd->numPorts; a++) 1031 - if (tty_port_initialized(&brd->ports[a].port)) 1032 - tty_port_tty_hangup(&brd->ports[a].port, false); 1033 - 1034 - for (a = 0; a < MAX_PORTS_PER_BOARD; a++) 1035 - tty_port_destroy(&brd->ports[a].port); 1036 - 1037 - while (1) { 1038 - opened = 0; 1033 + /* pci hot-un-plug support */ 1039 1034 for (a = 0; a < brd->numPorts; a++) 1040 1035 if (tty_port_initialized(&brd->ports[a].port)) 1041 - opened++; 1042 - mutex_unlock(&moxa_openlock); 1043 - if (!opened) 1044 - break; 1045 - msleep(50); 1046 - mutex_lock(&moxa_openlock); 1036 + tty_port_tty_hangup(&brd->ports[a].port, false); 1037 + 1038 + for (a = 0; a < MAX_PORTS_PER_BOARD; a++) 1039 + tty_port_destroy(&brd->ports[a].port); 1040 + 1041 + while (1) { 1042 + opened = 0; 1043 + for (a = 0; a < brd->numPorts; a++) 1044 + if (tty_port_initialized(&brd->ports[a].port)) 1045 + opened++; 1046 + if (!opened) 1047 + break; 1048 + mutex_unlock(&moxa_openlock); 1049 + msleep(50); 1050 + mutex_lock(&moxa_openlock); 1051 + } 1047 1052 } 1048 1053 1049 1054 first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD; ··· 1201 1206 static bool moxa_carrier_raised(struct tty_port *port) 1202 1207 { 1203 1208 struct moxa_port *ch = container_of(port, struct moxa_port, port); 1204 - int dcd; 1205 1209 1206 - spin_lock_irq(&port->lock); 1207 - dcd = ch->DCDState; 1208 - spin_unlock_irq(&port->lock); 1209 - return dcd; 1210 + guard(spinlock_irq)(&port->lock); 1211 + return ch->DCDState; 1210 1212 } 1211 1213 1212 1214 static void moxa_dtr_rts(struct tty_port *port, bool active) ··· 1217 1225 { 1218 1226 struct moxa_board_conf *brd; 1219 1227 struct moxa_port *ch; 1220 - int port; 1228 + int port = tty->index; 1221 1229 1222 - port = tty->index; 1223 - if (mutex_lock_interruptible(&moxa_openlock)) 1224 - return -ERESTARTSYS; 1225 - brd = &moxa_boards[port / MAX_PORTS_PER_BOARD]; 1226 - if (!brd->ready) { 1227 - mutex_unlock(&moxa_openlock); 1228 - return -ENODEV; 1229 - } 1230 + scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &moxa_openlock) { 1231 + brd = &moxa_boards[port / MAX_PORTS_PER_BOARD]; 1232 + if (!brd->ready) 1233 + return -ENODEV; 1230 1234 1231 - if (port % MAX_PORTS_PER_BOARD >= brd->numPorts) { 1232 - mutex_unlock(&moxa_openlock); 1233 - return -ENODEV; 1234 - } 1235 + if (port % MAX_PORTS_PER_BOARD >= brd->numPorts) 1236 + return -ENODEV; 1235 1237 1236 - ch = &brd->ports[port % MAX_PORTS_PER_BOARD]; 1237 - ch->port.count++; 1238 - tty->driver_data = ch; 1239 - tty_port_tty_set(&ch->port, tty); 1240 - mutex_lock(&ch->port.mutex); 1241 - if (!tty_port_initialized(&ch->port)) { 1242 - ch->statusflags = 0; 1243 - moxa_set_tty_param(tty, &tty->termios); 1244 - MoxaPortLineCtrl(ch, true, true); 1245 - MoxaPortEnable(ch); 1246 - MoxaSetFifo(ch, ch->type == PORT_16550A); 1247 - tty_port_set_initialized(&ch->port, true); 1238 + ch = &brd->ports[port % MAX_PORTS_PER_BOARD]; 1239 + ch->port.count++; 1240 + tty->driver_data = ch; 1241 + tty_port_tty_set(&ch->port, tty); 1242 + 1243 + guard(mutex)(&ch->port.mutex); 1244 + if (!tty_port_initialized(&ch->port)) { 1245 + ch->statusflags = 0; 1246 + moxa_set_tty_param(tty, &tty->termios); 1247 + MoxaPortLineCtrl(ch, true, true); 1248 + MoxaPortEnable(ch); 1249 + MoxaSetFifo(ch, ch->type == PORT_16550A); 1250 + tty_port_set_initialized(&ch->port, true); 1251 + } 1248 1252 } 1249 - mutex_unlock(&ch->port.mutex); 1250 - mutex_unlock(&moxa_openlock); 1251 1253 1252 1254 return tty_port_block_til_ready(&ch->port, tty, filp); 1253 1255 } ··· 1256 1270 static ssize_t moxa_write(struct tty_struct *tty, const u8 *buf, size_t count) 1257 1271 { 1258 1272 struct moxa_port *ch = tty->driver_data; 1259 - unsigned long flags; 1260 1273 int len; 1261 1274 1262 1275 if (ch == NULL) 1263 1276 return 0; 1264 1277 1265 - spin_lock_irqsave(&moxa_lock, flags); 1266 - len = MoxaPortWriteData(tty, buf, count); 1267 - spin_unlock_irqrestore(&moxa_lock, flags); 1278 + scoped_guard(spinlock_irqsave, &moxa_lock) 1279 + len = MoxaPortWriteData(tty, buf, count); 1268 1280 1269 1281 set_bit(LOWWAIT, &ch->statusflags); 1270 1282 return len; ··· 1333 1349 bool dtr_active, rts_active; 1334 1350 struct moxa_port *ch; 1335 1351 1336 - mutex_lock(&moxa_openlock); 1352 + guard(mutex)(&moxa_openlock); 1337 1353 ch = tty->driver_data; 1338 - if (!ch) { 1339 - mutex_unlock(&moxa_openlock); 1354 + if (!ch) 1340 1355 return -EINVAL; 1341 - } 1342 1356 1343 1357 MoxaPortGetLineOut(ch, &dtr_active, &rts_active); 1344 1358 if (set & TIOCM_RTS) ··· 1348 1366 if (clear & TIOCM_DTR) 1349 1367 dtr_active = false; 1350 1368 MoxaPortLineCtrl(ch, dtr_active, rts_active); 1351 - mutex_unlock(&moxa_openlock); 1369 + 1352 1370 return 0; 1353 1371 } 1354 1372 ··· 1397 1415 1398 1416 static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd) 1399 1417 { 1400 - unsigned long flags; 1401 1418 dcd = !!dcd; 1402 1419 1403 - spin_lock_irqsave(&p->port.lock, flags); 1404 - if (dcd != p->DCDState) { 1405 - p->DCDState = dcd; 1406 - spin_unlock_irqrestore(&p->port.lock, flags); 1407 - if (!dcd) 1408 - tty_port_tty_hangup(&p->port, true); 1420 + scoped_guard(spinlock_irqsave, &p->port.lock) { 1421 + if (dcd == p->DCDState) 1422 + return; 1423 + 1424 + p->DCDState = dcd; 1409 1425 } 1410 - else 1411 - spin_unlock_irqrestore(&p->port.lock, flags); 1426 + 1427 + if (!dcd) 1428 + tty_port_tty_hangup(&p->port, true); 1412 1429 } 1413 1430 1414 1431 static int moxa_poll_port(struct moxa_port *p, unsigned int handle, ··· 1475 1494 u16 __iomem *ip; 1476 1495 unsigned int card, port, served = 0; 1477 1496 1478 - spin_lock(&moxa_lock); 1497 + guard(spinlock)(&moxa_lock); 1479 1498 for (card = 0; card < MAX_BOARDS; card++) { 1480 1499 brd = &moxa_boards[card]; 1481 1500 if (!brd->ready) ··· 1506 1525 1507 1526 if (served) 1508 1527 mod_timer(&moxaTimer, jiffies + HZ / 50); 1509 - spin_unlock(&moxa_lock); 1510 1528 } 1511 1529 1512 1530 /******************************************************************************/ ··· 1841 1861 baud = MoxaPortSetBaud(port, baud); 1842 1862 1843 1863 if (termio->c_iflag & (IXON | IXOFF | IXANY)) { 1844 - spin_lock_irq(&moxafunc_lock); 1864 + guard(spinlock_irq)(&moxafunc_lock); 1845 1865 writeb(termio->c_cc[VSTART], ofsAddr + FuncArg); 1846 1866 writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1); 1847 1867 writeb(FC_SetXonXoff, ofsAddr + FuncCode); 1848 1868 moxa_wait_finish(ofsAddr); 1849 - spin_unlock_irq(&moxafunc_lock); 1850 - 1851 1869 } 1852 1870 return baud; 1853 1871 } ··· 2076 2098 2077 2099 if (!info) 2078 2100 return -ENODEV; 2079 - mutex_lock(&info->port.mutex); 2101 + guard(mutex)(&info->port.mutex); 2080 2102 ss->type = info->type; 2081 2103 ss->line = info->port.tty->index; 2082 2104 ss->flags = info->port.flags; 2083 2105 ss->baud_base = 921600; 2084 2106 ss->close_delay = jiffies_to_msecs(info->port.close_delay) / 10; 2085 - mutex_unlock(&info->port.mutex); 2107 + 2086 2108 return 0; 2087 2109 } 2088 2110 ··· 2098 2120 2099 2121 close_delay = msecs_to_jiffies(ss->close_delay * 10); 2100 2122 2101 - mutex_lock(&info->port.mutex); 2123 + guard(mutex)(&info->port.mutex); 2102 2124 if (!capable(CAP_SYS_ADMIN)) { 2103 2125 if (close_delay != info->port.close_delay || 2104 2126 ss->type != info->type || 2105 2127 ((ss->flags & ~ASYNC_USR_MASK) != 2106 2128 (info->port.flags & ~ASYNC_USR_MASK))) { 2107 - mutex_unlock(&info->port.mutex); 2108 2129 return -EPERM; 2109 2130 } 2110 2131 } else { ··· 2113 2136 2114 2137 info->type = ss->type; 2115 2138 } 2116 - mutex_unlock(&info->port.mutex); 2139 + 2117 2140 return 0; 2118 2141 } 2119 2142