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

appletalk: remove the BKL

This changes appletalk to use lock_sock instead of
lock_kernel for serialization. I tried to make sure
that we don't hold the socket lock during sleeping
functions, but I did not try to prove whether the
locks are necessary in the first place.

Compile-tested only.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: David S. Miller <davem@davemloft.net>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org

+16 -25
-1
drivers/net/appletalk/Kconfig
··· 3 3 # 4 4 config ATALK 5 5 tristate "Appletalk protocol support" 6 - depends on BKL # waiting to be removed from net/appletalk/ddp.c 7 6 select LLC 8 7 ---help--- 9 8 AppleTalk is the protocol that Apple computers can use to communicate
+16 -24
net/appletalk/ddp.c
··· 54 54 #include <linux/capability.h> 55 55 #include <linux/module.h> 56 56 #include <linux/if_arp.h> 57 - #include <linux/smp_lock.h> 58 57 #include <linux/termios.h> /* For TIOCOUTQ/INQ */ 59 58 #include <linux/compat.h> 60 59 #include <linux/slab.h> ··· 1051 1052 { 1052 1053 struct sock *sk = sock->sk; 1053 1054 1054 - lock_kernel(); 1055 + lock_sock(sk); 1055 1056 if (sk) { 1056 1057 sock_orphan(sk); 1057 1058 sock->sk = NULL; 1058 1059 atalk_destroy_socket(sk); 1059 1060 } 1060 - unlock_kernel(); 1061 + release_sock(sk); 1061 1062 return 0; 1062 1063 } 1063 1064 ··· 1142 1143 if (addr->sat_family != AF_APPLETALK) 1143 1144 return -EAFNOSUPPORT; 1144 1145 1145 - lock_kernel(); 1146 + lock_sock(sk); 1146 1147 if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) { 1147 1148 struct atalk_addr *ap = atalk_find_primary(); 1148 1149 ··· 1178 1179 sock_reset_flag(sk, SOCK_ZAPPED); 1179 1180 err = 0; 1180 1181 out: 1181 - unlock_kernel(); 1182 + release_sock(sk); 1182 1183 return err; 1183 1184 } 1184 1185 ··· 1214 1215 #endif 1215 1216 } 1216 1217 1217 - lock_kernel(); 1218 + lock_sock(sk); 1218 1219 err = -EBUSY; 1219 1220 if (sock_flag(sk, SOCK_ZAPPED)) 1220 1221 if (atalk_autobind(sk) < 0) ··· 1232 1233 sk->sk_state = TCP_ESTABLISHED; 1233 1234 err = 0; 1234 1235 out: 1235 - unlock_kernel(); 1236 + release_sock(sk); 1236 1237 return err; 1237 1238 } 1238 1239 ··· 1248 1249 struct atalk_sock *at = at_sk(sk); 1249 1250 int err; 1250 1251 1251 - lock_kernel(); 1252 + lock_sock(sk); 1252 1253 err = -ENOBUFS; 1253 1254 if (sock_flag(sk, SOCK_ZAPPED)) 1254 1255 if (atalk_autobind(sk) < 0) ··· 1276 1277 memcpy(uaddr, &sat, sizeof(sat)); 1277 1278 1278 1279 out: 1279 - unlock_kernel(); 1280 - return err; 1281 - } 1282 - 1283 - static unsigned int atalk_poll(struct file *file, struct socket *sock, 1284 - poll_table *wait) 1285 - { 1286 - int err; 1287 - lock_kernel(); 1288 - err = datagram_poll(file, sock, wait); 1289 - unlock_kernel(); 1280 + release_sock(sk); 1290 1281 return err; 1291 1282 } 1292 1283 ··· 1585 1596 if (len > DDP_MAXSZ) 1586 1597 return -EMSGSIZE; 1587 1598 1588 - lock_kernel(); 1599 + lock_sock(sk); 1589 1600 if (usat) { 1590 1601 err = -EBUSY; 1591 1602 if (sock_flag(sk, SOCK_ZAPPED)) ··· 1640 1651 sk, size, dev->name); 1641 1652 1642 1653 size += dev->hard_header_len; 1654 + release_sock(sk); 1643 1655 skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err); 1656 + lock_sock(sk); 1644 1657 if (!skb) 1645 1658 goto out; 1646 1659 ··· 1729 1738 SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len); 1730 1739 1731 1740 out: 1732 - unlock_kernel(); 1741 + release_sock(sk); 1733 1742 return err ? : len; 1734 1743 } 1735 1744 ··· 1744 1753 int err = 0; 1745 1754 struct sk_buff *skb; 1746 1755 1747 - lock_kernel(); 1748 1756 skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 1749 1757 flags & MSG_DONTWAIT, &err); 1758 + lock_sock(sk); 1759 + 1750 1760 if (!skb) 1751 1761 goto out; 1752 1762 ··· 1779 1787 skb_free_datagram(sk, skb); /* Free the datagram. */ 1780 1788 1781 1789 out: 1782 - unlock_kernel(); 1790 + release_sock(sk); 1783 1791 return err ? : copied; 1784 1792 } 1785 1793 ··· 1879 1887 .socketpair = sock_no_socketpair, 1880 1888 .accept = sock_no_accept, 1881 1889 .getname = atalk_getname, 1882 - .poll = atalk_poll, 1890 + .poll = datagram_poll, 1883 1891 .ioctl = atalk_ioctl, 1884 1892 #ifdef CONFIG_COMPAT 1885 1893 .compat_ioctl = atalk_compat_ioctl,