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

mxser: use guard()s

Having all the new guards, use them in the mxser code. This improves
readability, makes error handling easier, and marks locked portions of
code explicit.

Signed-off-by: "Jiri Slaby (SUSE)" <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20250814072456.182853-8-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Jiri Slaby (SUSE) and committed by
Greg Kroah-Hartman
793b4501 81600e92

+74 -123
+74 -123
drivers/tty/mxser.c
··· 442 442 443 443 static void mxser_start_tx(struct mxser_port *info) 444 444 { 445 - unsigned long flags; 446 - 447 - spin_lock_irqsave(&info->slock, flags); 445 + guard(spinlock_irqsave)(&info->slock); 448 446 __mxser_start_tx(info); 449 - spin_unlock_irqrestore(&info->slock, flags); 450 447 } 451 448 452 449 static void __mxser_stop_tx(struct mxser_port *info) ··· 462 465 static void mxser_dtr_rts(struct tty_port *port, bool active) 463 466 { 464 467 struct mxser_port *mp = container_of(port, struct mxser_port, port); 465 - unsigned long flags; 466 468 u8 mcr; 467 469 468 - spin_lock_irqsave(&mp->slock, flags); 470 + guard(spinlock_irqsave)(&mp->slock); 469 471 mcr = inb(mp->ioaddr + UART_MCR); 470 472 if (active) 471 473 mcr |= UART_MCR_DTR | UART_MCR_RTS; 472 474 else 473 475 mcr &= ~(UART_MCR_DTR | UART_MCR_RTS); 474 476 outb(mcr, mp->ioaddr + UART_MCR); 475 - spin_unlock_irqrestore(&mp->slock, flags); 476 477 } 477 478 478 479 static int mxser_set_baud(struct tty_struct *tty, speed_t newspd) ··· 823 828 static void mxser_shutdown_port(struct tty_port *port) 824 829 { 825 830 struct mxser_port *info = container_of(port, struct mxser_port, port); 826 - unsigned long flags; 827 831 828 - spin_lock_irqsave(&info->slock, flags); 832 + scoped_guard(spinlock_irqsave, &info->slock) { 833 + mxser_stop_rx(info); 829 834 830 - mxser_stop_rx(info); 835 + /* 836 + * clear delta_msr_wait queue to avoid mem leaks: we may free the irq 837 + * here so the queue might never be waken up 838 + */ 839 + wake_up_interruptible(&info->port.delta_msr_wait); 831 840 832 - /* 833 - * clear delta_msr_wait queue to avoid mem leaks: we may free the irq 834 - * here so the queue might never be waken up 835 - */ 836 - wake_up_interruptible(&info->port.delta_msr_wait); 841 + info->IER = 0; 842 + outb(0x00, info->ioaddr + UART_IER); 837 843 838 - info->IER = 0; 839 - outb(0x00, info->ioaddr + UART_IER); 844 + /* clear Rx/Tx FIFO's */ 845 + mxser_disable_and_clear_FIFO(info); 840 846 841 - /* clear Rx/Tx FIFO's */ 842 - mxser_disable_and_clear_FIFO(info); 847 + /* read data port to reset things */ 848 + (void)inb(info->ioaddr + UART_RX); 843 849 844 - /* read data port to reset things */ 845 - (void) inb(info->ioaddr + UART_RX); 846 - 847 - 848 - if (info->board->must_hwid) 849 - mxser_must_no_sw_flow_control(info->ioaddr); 850 - 851 - spin_unlock_irqrestore(&info->slock, flags); 850 + if (info->board->must_hwid) 851 + mxser_must_no_sw_flow_control(info->ioaddr); 852 + } 852 853 853 854 /* make sure ISR is not running while we free the buffer */ 854 855 synchronize_irq(info->board->irq); ··· 871 880 static void mxser_flush_buffer(struct tty_struct *tty) 872 881 { 873 882 struct mxser_port *info = tty->driver_data; 874 - unsigned long flags; 875 883 876 - spin_lock_irqsave(&info->slock, flags); 877 - kfifo_reset(&info->port.xmit_fifo); 884 + scoped_guard(spinlock_irqsave, &info->slock) { 885 + kfifo_reset(&info->port.xmit_fifo); 878 886 879 - outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 880 - info->ioaddr + UART_FCR); 881 - 882 - spin_unlock_irqrestore(&info->slock, flags); 887 + outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, 888 + info->ioaddr + UART_FCR); 889 + } 883 890 884 891 tty_wakeup(tty); 885 892 } ··· 890 901 static ssize_t mxser_write(struct tty_struct *tty, const u8 *buf, size_t count) 891 902 { 892 903 struct mxser_port *info = tty->driver_data; 893 - unsigned long flags; 894 904 size_t written; 895 905 bool is_empty; 896 906 897 - spin_lock_irqsave(&info->slock, flags); 898 - written = kfifo_in(&info->port.xmit_fifo, buf, count); 899 - is_empty = kfifo_is_empty(&info->port.xmit_fifo); 900 - spin_unlock_irqrestore(&info->slock, flags); 907 + scoped_guard(spinlock_irqsave, &info->slock) { 908 + written = kfifo_in(&info->port.xmit_fifo, buf, count); 909 + is_empty = kfifo_is_empty(&info->port.xmit_fifo); 910 + } 901 911 902 912 if (!is_empty && !tty->flow.stopped) 903 913 if (!tty->hw_stopped || mxser_16550A_or_MUST(info)) ··· 908 920 static int mxser_put_char(struct tty_struct *tty, u8 ch) 909 921 { 910 922 struct mxser_port *info = tty->driver_data; 911 - unsigned long flags; 912 - int ret; 913 923 914 - spin_lock_irqsave(&info->slock, flags); 915 - ret = kfifo_put(&info->port.xmit_fifo, ch); 916 - spin_unlock_irqrestore(&info->slock, flags); 917 - 918 - return ret; 924 + guard(spinlock_irqsave)(&info->slock); 925 + return kfifo_put(&info->port.xmit_fifo, ch); 919 926 } 920 927 921 928 ··· 951 968 struct tty_port *port = &info->port; 952 969 unsigned int closing_wait, close_delay; 953 970 954 - mutex_lock(&port->mutex); 971 + guard(mutex)(&port->mutex); 955 972 956 973 close_delay = jiffies_to_msecs(info->port.close_delay) / 10; 957 974 closing_wait = info->port.closing_wait; ··· 967 984 ss->close_delay = close_delay; 968 985 ss->closing_wait = closing_wait; 969 986 ss->custom_divisor = MXSER_CUSTOM_DIVISOR; 970 - mutex_unlock(&port->mutex); 987 + 971 988 return 0; 972 989 } 973 990 ··· 977 994 struct mxser_port *info = tty->driver_data; 978 995 struct tty_port *port = &info->port; 979 996 speed_t baud; 980 - unsigned long sl_flags; 981 997 unsigned int old_speed, close_delay, closing_wait; 982 - int retval = 0; 983 998 984 999 if (tty_io_error(tty)) 985 1000 return -EIO; 986 1001 987 - mutex_lock(&port->mutex); 1002 + guard(mutex)(&port->mutex); 988 1003 989 - if (ss->irq != info->board->irq || 990 - ss->port != info->ioaddr) { 991 - mutex_unlock(&port->mutex); 1004 + if (ss->irq != info->board->irq || ss->port != info->ioaddr) 992 1005 return -EINVAL; 993 - } 994 1006 995 1007 old_speed = port->flags & ASYNC_SPD_MASK; 996 1008 ··· 998 1020 if ((ss->baud_base != MXSER_BAUD_BASE) || 999 1021 (close_delay != port->close_delay) || 1000 1022 (closing_wait != port->closing_wait) || 1001 - ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { 1002 - mutex_unlock(&port->mutex); 1023 + ((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) 1003 1024 return -EPERM; 1004 - } 1025 + 1005 1026 port->flags = (port->flags & ~ASYNC_USR_MASK) | 1006 1027 (ss->flags & ASYNC_USR_MASK); 1007 1028 } else { ··· 1016 1039 (ss->baud_base != MXSER_BAUD_BASE || 1017 1040 ss->custom_divisor != 1018 1041 MXSER_CUSTOM_DIVISOR)) { 1019 - if (ss->custom_divisor == 0) { 1020 - mutex_unlock(&port->mutex); 1042 + if (ss->custom_divisor == 0) 1021 1043 return -EINVAL; 1022 - } 1044 + 1023 1045 baud = ss->baud_base / ss->custom_divisor; 1024 1046 tty_encode_baud_rate(tty, baud, baud); 1025 1047 } ··· 1030 1054 1031 1055 if (tty_port_initialized(port)) { 1032 1056 if (old_speed != (port->flags & ASYNC_SPD_MASK)) { 1033 - spin_lock_irqsave(&info->slock, sl_flags); 1057 + guard(spinlock_irqsave)(&info->slock); 1034 1058 mxser_change_speed(tty, NULL); 1035 - spin_unlock_irqrestore(&info->slock, sl_flags); 1036 1059 } 1037 - } else { 1038 - retval = mxser_activate(port, tty); 1039 - if (retval == 0) 1040 - tty_port_set_initialized(port, true); 1060 + 1061 + return 0; 1041 1062 } 1042 - mutex_unlock(&port->mutex); 1063 + 1064 + int retval = mxser_activate(port, tty); 1065 + if (retval == 0) 1066 + tty_port_set_initialized(port, true); 1067 + 1043 1068 return retval; 1044 1069 } 1045 1070 ··· 1057 1080 static int mxser_get_lsr_info(struct mxser_port *info, 1058 1081 unsigned int __user *value) 1059 1082 { 1060 - unsigned char status; 1061 1083 unsigned int result; 1062 - unsigned long flags; 1084 + u8 status; 1063 1085 1064 - spin_lock_irqsave(&info->slock, flags); 1065 - status = inb(info->ioaddr + UART_LSR); 1066 - spin_unlock_irqrestore(&info->slock, flags); 1086 + scoped_guard(spinlock_irqsave, &info->slock) 1087 + status = inb(info->ioaddr + UART_LSR); 1067 1088 result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0); 1068 1089 return put_user(result, value); 1069 1090 } ··· 1070 1095 { 1071 1096 struct mxser_port *info = tty->driver_data; 1072 1097 unsigned char control; 1073 - unsigned long flags; 1074 1098 u8 msr; 1075 1099 1076 1100 if (tty_io_error(tty)) 1077 1101 return -EIO; 1078 1102 1079 - spin_lock_irqsave(&info->slock, flags); 1080 - control = info->MCR; 1081 - msr = mxser_check_modem_status(tty, info); 1082 - spin_unlock_irqrestore(&info->slock, flags); 1103 + scoped_guard(spinlock_irqsave, &info->slock) { 1104 + control = info->MCR; 1105 + msr = mxser_check_modem_status(tty, info); 1106 + } 1083 1107 1084 1108 return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | 1085 1109 ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | ··· 1092 1118 unsigned int set, unsigned int clear) 1093 1119 { 1094 1120 struct mxser_port *info = tty->driver_data; 1095 - unsigned long flags; 1096 1121 1097 1122 if (tty_io_error(tty)) 1098 1123 return -EIO; 1099 1124 1100 - spin_lock_irqsave(&info->slock, flags); 1125 + guard(spinlock_irqsave)(&info->slock); 1101 1126 1102 1127 if (set & TIOCM_RTS) 1103 1128 info->MCR |= UART_MCR_RTS; ··· 1109 1136 info->MCR &= ~UART_MCR_DTR; 1110 1137 1111 1138 outb(info->MCR, info->ioaddr + UART_MCR); 1112 - spin_unlock_irqrestore(&info->slock, flags); 1139 + 1113 1140 return 0; 1114 1141 } 1115 1142 ··· 1117 1144 struct async_icount *cprev) 1118 1145 { 1119 1146 struct async_icount cnow; 1120 - unsigned long flags; 1121 1147 int ret; 1122 1148 1123 - spin_lock_irqsave(&info->slock, flags); 1124 - cnow = info->icount; /* atomic copy */ 1125 - spin_unlock_irqrestore(&info->slock, flags); 1149 + /* atomic copy */ 1150 + scoped_guard(spinlock_irqsave, &info->slock) 1151 + cnow = info->icount; 1126 1152 1127 1153 ret = ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) || 1128 1154 ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) || ··· 1151 1179 if (opmode & ~OP_MODE_MASK) 1152 1180 return -EINVAL; 1153 1181 1154 - spin_lock_irq(&port->slock); 1182 + guard(spinlock_irq)(&port->slock); 1155 1183 val = inb(port->opmode_ioaddr); 1156 1184 val &= ~(OP_MODE_MASK << shiftbit); 1157 1185 val |= (opmode << shiftbit); 1158 1186 outb(val, port->opmode_ioaddr); 1159 - spin_unlock_irq(&port->slock); 1160 1187 1161 1188 return 0; 1162 1189 } 1163 1190 1164 - spin_lock_irq(&port->slock); 1165 - opmode = inb(port->opmode_ioaddr) >> shiftbit; 1166 - spin_unlock_irq(&port->slock); 1191 + scoped_guard(spinlock_irq, &port->slock) 1192 + opmode = inb(port->opmode_ioaddr) >> shiftbit; 1167 1193 1168 1194 return put_user(opmode & OP_MODE_MASK, u_opmode); 1169 1195 } ··· 1171 1201 { 1172 1202 struct mxser_port *info = tty->driver_data; 1173 1203 struct async_icount cnow; 1174 - unsigned long flags; 1175 1204 void __user *argp = (void __user *)arg; 1176 1205 1177 1206 if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) ··· 1190 1221 * Caller should use TIOCGICOUNT to see which one it was 1191 1222 */ 1192 1223 case TIOCMIWAIT: 1193 - spin_lock_irqsave(&info->slock, flags); 1194 - cnow = info->icount; /* note the counters on entry */ 1195 - spin_unlock_irqrestore(&info->slock, flags); 1224 + /* note the counters on entry */ 1225 + scoped_guard(spinlock_irqsave, &info->slock) 1226 + cnow = info->icount; 1196 1227 1197 1228 return wait_event_interruptible(info->port.delta_msr_wait, 1198 1229 mxser_cflags_changed(info, arg, &cnow)); ··· 1215 1246 { 1216 1247 struct mxser_port *info = tty->driver_data; 1217 1248 struct async_icount cnow; 1218 - unsigned long flags; 1219 1249 1220 - spin_lock_irqsave(&info->slock, flags); 1221 - cnow = info->icount; 1222 - spin_unlock_irqrestore(&info->slock, flags); 1250 + scoped_guard(spinlock_irqsave, &info->slock) 1251 + cnow = info->icount; 1223 1252 1224 1253 icount->frame = cnow.frame; 1225 1254 icount->brk = cnow.brk; ··· 1295 1328 static void mxser_stop(struct tty_struct *tty) 1296 1329 { 1297 1330 struct mxser_port *info = tty->driver_data; 1298 - unsigned long flags; 1299 1331 1300 - spin_lock_irqsave(&info->slock, flags); 1332 + guard(spinlock_irqsave)(&info->slock); 1301 1333 if (info->IER & UART_IER_THRI) 1302 1334 __mxser_stop_tx(info); 1303 - spin_unlock_irqrestore(&info->slock, flags); 1304 1335 } 1305 1336 1306 1337 static void mxser_start(struct tty_struct *tty) 1307 1338 { 1308 1339 struct mxser_port *info = tty->driver_data; 1309 - unsigned long flags; 1310 1340 1311 - spin_lock_irqsave(&info->slock, flags); 1341 + guard(spinlock_irqsave)(&info->slock); 1312 1342 if (!kfifo_is_empty(&info->port.xmit_fifo)) 1313 1343 __mxser_start_tx(info); 1314 - spin_unlock_irqrestore(&info->slock, flags); 1315 1344 } 1316 1345 1317 1346 static void mxser_set_termios(struct tty_struct *tty, 1318 1347 const struct ktermios *old_termios) 1319 1348 { 1320 1349 struct mxser_port *info = tty->driver_data; 1321 - unsigned long flags; 1322 1350 1323 - spin_lock_irqsave(&info->slock, flags); 1324 - mxser_change_speed(tty, old_termios); 1325 - spin_unlock_irqrestore(&info->slock, flags); 1351 + scoped_guard(spinlock_irqsave, &info->slock) 1352 + mxser_change_speed(tty, old_termios); 1326 1353 1327 1354 if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) { 1328 1355 tty->hw_stopped = false; ··· 1328 1367 tty->flow.stopped = 0; 1329 1368 1330 1369 if (info->board->must_hwid) { 1331 - spin_lock_irqsave(&info->slock, flags); 1370 + guard(spinlock_irqsave)(&info->slock); 1332 1371 mxser_must_set_rx_sw_flow_control(info->ioaddr, false); 1333 - spin_unlock_irqrestore(&info->slock, flags); 1334 1372 } 1335 1373 1336 1374 mxser_start(tty); ··· 1338 1378 1339 1379 static bool mxser_tx_empty(struct mxser_port *info) 1340 1380 { 1341 - unsigned long flags; 1342 - u8 lsr; 1343 - 1344 - spin_lock_irqsave(&info->slock, flags); 1345 - lsr = inb(info->ioaddr + UART_LSR); 1346 - spin_unlock_irqrestore(&info->slock, flags); 1347 - 1348 - return !(lsr & UART_LSR_TEMT); 1381 + guard(spinlock_irqsave)(&info->slock); 1382 + return !(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT); 1349 1383 } 1350 1384 1351 1385 /* ··· 1413 1459 static int mxser_rs_break(struct tty_struct *tty, int break_state) 1414 1460 { 1415 1461 struct mxser_port *info = tty->driver_data; 1416 - unsigned long flags; 1417 1462 u8 lcr; 1418 1463 1419 - spin_lock_irqsave(&info->slock, flags); 1464 + guard(spinlock_irqsave)(&info->slock); 1420 1465 lcr = inb(info->ioaddr + UART_LCR); 1421 1466 if (break_state == -1) 1422 1467 lcr |= UART_LCR_SBC; 1423 1468 else 1424 1469 lcr &= ~UART_LCR_SBC; 1425 1470 outb(lcr, info->ioaddr + UART_LCR); 1426 - spin_unlock_irqrestore(&info->slock, flags); 1427 1471 1428 1472 return 0; 1429 1473 } ··· 1624 1672 port = &brd->ports[i]; 1625 1673 1626 1674 int_cnt = 0; 1627 - spin_lock(&port->slock); 1675 + guard(spinlock)(&port->slock); 1628 1676 do { 1629 1677 if (mxser_port_isr(port)) 1630 1678 break; 1631 1679 } while (int_cnt++ < MXSER_ISR_PASS_LIMIT); 1632 - spin_unlock(&port->slock); 1633 1680 } 1634 1681 } 1635 1682