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

l2tp: improve tunnel/session refcount helpers

l2tp_tunnel_inc_refcount and l2tp_session_inc_refcount wrap
refcount_inc. They add no value so just use the refcount APIs directly
and drop l2tp's helpers. l2tp already uses refcount_inc_not_zero
anyway.

Rename l2tp_tunnel_dec_refcount and l2tp_session_dec_refcount to
l2tp_tunnel_put and l2tp_session_put to better match their use pairing
various _get getters.

Signed-off-by: James Chapman <jchapman@katalix.com>
Signed-off-by: Tom Parkin <tparkin@katalix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

James Chapman and committed by
David S. Miller
abe7a1a7 1f4c3dce

+79 -93
+20 -32
net/l2tp/l2tp_core.c
··· 170 170 { 171 171 trace_free_session(session); 172 172 if (session->tunnel) 173 - l2tp_tunnel_dec_refcount(session->tunnel); 173 + l2tp_tunnel_put(session->tunnel); 174 174 kfree_rcu(session, rcu); 175 175 } 176 176 ··· 197 197 } 198 198 EXPORT_SYMBOL_GPL(l2tp_sk_to_tunnel); 199 199 200 - void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel) 201 - { 202 - refcount_inc(&tunnel->ref_count); 203 - } 204 - EXPORT_SYMBOL_GPL(l2tp_tunnel_inc_refcount); 205 - 206 - void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel) 200 + void l2tp_tunnel_put(struct l2tp_tunnel *tunnel) 207 201 { 208 202 if (refcount_dec_and_test(&tunnel->ref_count)) 209 203 l2tp_tunnel_free(tunnel); 210 204 } 211 - EXPORT_SYMBOL_GPL(l2tp_tunnel_dec_refcount); 205 + EXPORT_SYMBOL_GPL(l2tp_tunnel_put); 212 206 213 - void l2tp_session_inc_refcount(struct l2tp_session *session) 214 - { 215 - refcount_inc(&session->ref_count); 216 - } 217 - EXPORT_SYMBOL_GPL(l2tp_session_inc_refcount); 218 - 219 - void l2tp_session_dec_refcount(struct l2tp_session *session) 207 + void l2tp_session_put(struct l2tp_session *session) 220 208 { 221 209 if (refcount_dec_and_test(&session->ref_count)) 222 210 l2tp_session_free(session); 223 211 } 224 - EXPORT_SYMBOL_GPL(l2tp_session_dec_refcount); 212 + EXPORT_SYMBOL_GPL(l2tp_session_put); 225 213 226 214 /* Lookup a tunnel. A new reference is held on the returned tunnel. */ 227 215 struct l2tp_tunnel *l2tp_tunnel_get(const struct net *net, u32 tunnel_id) ··· 442 454 if (tunnel) { 443 455 list_for_each_entry_rcu(session, &tunnel->session_list, list) { 444 456 if (!strcmp(session->ifname, ifname)) { 445 - l2tp_session_inc_refcount(session); 457 + refcount_inc(&session->ref_count); 446 458 rcu_read_unlock_bh(); 447 459 448 460 return session; ··· 459 471 static void l2tp_session_coll_list_add(struct l2tp_session_coll_list *clist, 460 472 struct l2tp_session *session) 461 473 { 462 - l2tp_session_inc_refcount(session); 474 + refcount_inc(&session->ref_count); 463 475 WARN_ON_ONCE(session->coll_list); 464 476 session->coll_list = clist; 465 477 spin_lock(&clist->lock); ··· 545 557 spin_unlock(&clist->lock); 546 558 if (refcount_dec_and_test(&clist->ref_count)) 547 559 kfree(clist); 548 - l2tp_session_dec_refcount(session); 560 + l2tp_session_put(session); 549 561 } 550 562 } 551 563 ··· 594 606 goto out; 595 607 } 596 608 597 - l2tp_tunnel_inc_refcount(tunnel); 609 + refcount_inc(&tunnel->ref_count); 598 610 WRITE_ONCE(session->tunnel, tunnel); 599 611 list_add_rcu(&session->list, &tunnel->session_list); 600 612 ··· 1077 1089 1078 1090 if (!session || !session->recv_skb) { 1079 1091 if (session) 1080 - l2tp_session_dec_refcount(session); 1092 + l2tp_session_put(session); 1081 1093 1082 1094 /* Not found? Pass to userspace to deal with */ 1083 1095 goto pass; ··· 1091 1103 1092 1104 if (version == L2TP_HDR_VER_3 && 1093 1105 l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr)) { 1094 - l2tp_session_dec_refcount(session); 1106 + l2tp_session_put(session); 1095 1107 goto invalid; 1096 1108 } 1097 1109 1098 1110 l2tp_recv_common(session, skb, ptr, optr, hdrflags, length); 1099 - l2tp_session_dec_refcount(session); 1111 + l2tp_session_put(session); 1100 1112 1101 1113 return 0; 1102 1114 ··· 1396 1408 tunnel = l2tp_sk_to_tunnel(sk); 1397 1409 if (tunnel) { 1398 1410 l2tp_tunnel_delete(tunnel); 1399 - l2tp_tunnel_dec_refcount(tunnel); 1411 + l2tp_tunnel_put(tunnel); 1400 1412 } 1401 1413 } 1402 1414 ··· 1431 1443 1432 1444 l2tp_tunnel_remove(tunnel->l2tp_net, tunnel); 1433 1445 /* drop initial ref */ 1434 - l2tp_tunnel_dec_refcount(tunnel); 1446 + l2tp_tunnel_put(tunnel); 1435 1447 1436 1448 /* drop workqueue ref */ 1437 - l2tp_tunnel_dec_refcount(tunnel); 1449 + l2tp_tunnel_put(tunnel); 1438 1450 } 1439 1451 1440 1452 /* Create a socket for the tunnel, if one isn't set up by ··· 1622 1634 1623 1635 tunnel = l2tp_sk_to_tunnel(sk); 1624 1636 if (tunnel) { 1625 - l2tp_tunnel_dec_refcount(tunnel); 1637 + l2tp_tunnel_put(tunnel); 1626 1638 return -EBUSY; 1627 1639 } 1628 1640 ··· 1714 1726 { 1715 1727 if (!test_and_set_bit(0, &tunnel->dead)) { 1716 1728 trace_delete_tunnel(tunnel); 1717 - l2tp_tunnel_inc_refcount(tunnel); 1729 + refcount_inc(&tunnel->ref_count); 1718 1730 queue_work(l2tp_wq, &tunnel->del_work); 1719 1731 } 1720 1732 } ··· 1724 1736 { 1725 1737 if (!test_and_set_bit(0, &session->dead)) { 1726 1738 trace_delete_session(session); 1727 - l2tp_session_inc_refcount(session); 1739 + refcount_inc(&session->ref_count); 1728 1740 queue_work(l2tp_wq, &session->del_work); 1729 1741 } 1730 1742 } ··· 1742 1754 (*session->session_close)(session); 1743 1755 1744 1756 /* drop initial ref */ 1745 - l2tp_session_dec_refcount(session); 1757 + l2tp_session_put(session); 1746 1758 1747 1759 /* drop workqueue ref */ 1748 - l2tp_session_dec_refcount(session); 1760 + l2tp_session_put(session); 1749 1761 } 1750 1762 1751 1763 /* We come here whenever a session's send_seq, cookie_len or
+2 -4
net/l2tp/l2tp_core.h
··· 209 209 } 210 210 211 211 /* Tunnel and session refcounts */ 212 - void l2tp_tunnel_inc_refcount(struct l2tp_tunnel *tunnel); 213 - void l2tp_tunnel_dec_refcount(struct l2tp_tunnel *tunnel); 214 - void l2tp_session_inc_refcount(struct l2tp_session *session); 215 - void l2tp_session_dec_refcount(struct l2tp_session *session); 212 + void l2tp_tunnel_put(struct l2tp_tunnel *tunnel); 213 + void l2tp_session_put(struct l2tp_session *session); 216 214 217 215 /* Tunnel and session lookup. 218 216 * These functions take a reference on the instances they return, so
+4 -4
net/l2tp/l2tp_debugfs.c
··· 44 44 { 45 45 /* Drop reference taken during previous invocation */ 46 46 if (pd->tunnel) 47 - l2tp_tunnel_dec_refcount(pd->tunnel); 47 + l2tp_tunnel_put(pd->tunnel); 48 48 49 49 pd->tunnel = l2tp_tunnel_get_next(pd->net, &pd->tkey); 50 50 pd->tkey++; ··· 54 54 { 55 55 /* Drop reference taken during previous invocation */ 56 56 if (pd->session) 57 - l2tp_session_dec_refcount(pd->session); 57 + l2tp_session_put(pd->session); 58 58 59 59 pd->session = l2tp_session_get_next(pd->net, pd->tunnel->sock, 60 60 pd->tunnel->version, ··· 111 111 * or l2tp_dfs_next_tunnel(). 112 112 */ 113 113 if (pd->session) { 114 - l2tp_session_dec_refcount(pd->session); 114 + l2tp_session_put(pd->session); 115 115 pd->session = NULL; 116 116 } 117 117 if (pd->tunnel) { 118 - l2tp_tunnel_dec_refcount(pd->tunnel); 118 + l2tp_tunnel_put(pd->tunnel); 119 119 pd->tunnel = NULL; 120 120 } 121 121 }
+5 -5
net/l2tp/l2tp_eth.c
··· 283 283 284 284 spriv = l2tp_session_priv(session); 285 285 286 - l2tp_session_inc_refcount(session); 286 + refcount_inc(&session->ref_count); 287 287 288 288 rtnl_lock(); 289 289 ··· 301 301 if (rc < 0) { 302 302 rtnl_unlock(); 303 303 l2tp_session_delete(session); 304 - l2tp_session_dec_refcount(session); 304 + l2tp_session_put(session); 305 305 free_netdev(dev); 306 306 307 307 return rc; ··· 312 312 313 313 rtnl_unlock(); 314 314 315 - l2tp_session_dec_refcount(session); 315 + l2tp_session_put(session); 316 316 317 317 __module_get(THIS_MODULE); 318 318 319 319 return 0; 320 320 321 321 err_sess_dev: 322 - l2tp_session_dec_refcount(session); 322 + l2tp_session_put(session); 323 323 free_netdev(dev); 324 324 err_sess: 325 - l2tp_session_dec_refcount(session); 325 + l2tp_session_put(session); 326 326 err: 327 327 return rc; 328 328 }
+3 -3
net/l2tp/l2tp_ip.c
··· 167 167 goto discard_sess; 168 168 169 169 l2tp_recv_common(session, skb, ptr, optr, 0, skb->len); 170 - l2tp_session_dec_refcount(session); 170 + l2tp_session_put(session); 171 171 172 172 return 0; 173 173 ··· 200 200 return sk_receive_skb(sk, skb, 1); 201 201 202 202 discard_sess: 203 - l2tp_session_dec_refcount(session); 203 + l2tp_session_put(session); 204 204 goto discard; 205 205 206 206 discard_put: ··· 265 265 tunnel = l2tp_sk_to_tunnel(sk); 266 266 if (tunnel) { 267 267 l2tp_tunnel_delete(tunnel); 268 - l2tp_tunnel_dec_refcount(tunnel); 268 + l2tp_tunnel_put(tunnel); 269 269 } 270 270 } 271 271
+3 -3
net/l2tp/l2tp_ip6.c
··· 177 177 goto discard_sess; 178 178 179 179 l2tp_recv_common(session, skb, ptr, optr, 0, skb->len); 180 - l2tp_session_dec_refcount(session); 180 + l2tp_session_put(session); 181 181 182 182 return 0; 183 183 ··· 210 210 return sk_receive_skb(sk, skb, 1); 211 211 212 212 discard_sess: 213 - l2tp_session_dec_refcount(session); 213 + l2tp_session_put(session); 214 214 goto discard; 215 215 216 216 discard_put: ··· 276 276 tunnel = l2tp_sk_to_tunnel(sk); 277 277 if (tunnel) { 278 278 l2tp_tunnel_delete(tunnel); 279 - l2tp_tunnel_dec_refcount(tunnel); 279 + l2tp_tunnel_put(tunnel); 280 280 } 281 281 } 282 282
+19 -19
net/l2tp/l2tp_netlink.c
··· 63 63 if (tunnel) { 64 64 session = l2tp_session_get(net, tunnel->sock, tunnel->version, 65 65 tunnel_id, session_id); 66 - l2tp_tunnel_dec_refcount(tunnel); 66 + l2tp_tunnel_put(tunnel); 67 67 } 68 68 } 69 69 ··· 242 242 if (ret < 0) 243 243 goto out; 244 244 245 - l2tp_tunnel_inc_refcount(tunnel); 245 + refcount_inc(&tunnel->ref_count); 246 246 ret = l2tp_tunnel_register(tunnel, net, &cfg); 247 247 if (ret < 0) { 248 248 kfree(tunnel); ··· 250 250 } 251 251 ret = l2tp_tunnel_notify(&l2tp_nl_family, info, tunnel, 252 252 L2TP_CMD_TUNNEL_CREATE); 253 - l2tp_tunnel_dec_refcount(tunnel); 253 + l2tp_tunnel_put(tunnel); 254 254 255 255 out: 256 256 return ret; ··· 280 280 281 281 l2tp_tunnel_delete(tunnel); 282 282 283 - l2tp_tunnel_dec_refcount(tunnel); 283 + l2tp_tunnel_put(tunnel); 284 284 285 285 out: 286 286 return ret; ··· 308 308 ret = l2tp_tunnel_notify(&l2tp_nl_family, info, 309 309 tunnel, L2TP_CMD_TUNNEL_MODIFY); 310 310 311 - l2tp_tunnel_dec_refcount(tunnel); 311 + l2tp_tunnel_put(tunnel); 312 312 313 313 out: 314 314 return ret; ··· 479 479 if (ret < 0) 480 480 goto err_nlmsg_tunnel; 481 481 482 - l2tp_tunnel_dec_refcount(tunnel); 482 + l2tp_tunnel_put(tunnel); 483 483 484 484 return genlmsg_unicast(net, msg, info->snd_portid); 485 485 486 486 err_nlmsg_tunnel: 487 - l2tp_tunnel_dec_refcount(tunnel); 487 + l2tp_tunnel_put(tunnel); 488 488 err_nlmsg: 489 489 nlmsg_free(msg); 490 490 err: ··· 511 511 if (l2tp_nl_tunnel_send(skb, NETLINK_CB(cb->skb).portid, 512 512 cb->nlh->nlmsg_seq, NLM_F_MULTI, 513 513 tunnel, L2TP_CMD_TUNNEL_GET) < 0) { 514 - l2tp_tunnel_dec_refcount(tunnel); 514 + l2tp_tunnel_put(tunnel); 515 515 goto out; 516 516 } 517 - l2tp_tunnel_dec_refcount(tunnel); 517 + l2tp_tunnel_put(tunnel); 518 518 519 519 key++; 520 520 } ··· 647 647 if (session) { 648 648 ret = l2tp_session_notify(&l2tp_nl_family, info, session, 649 649 L2TP_CMD_SESSION_CREATE); 650 - l2tp_session_dec_refcount(session); 650 + l2tp_session_put(session); 651 651 } 652 652 } 653 653 654 654 out_tunnel: 655 - l2tp_tunnel_dec_refcount(tunnel); 655 + l2tp_tunnel_put(tunnel); 656 656 out: 657 657 return ret; 658 658 } ··· 677 677 if (l2tp_nl_cmd_ops[pw_type] && l2tp_nl_cmd_ops[pw_type]->session_delete) 678 678 l2tp_nl_cmd_ops[pw_type]->session_delete(session); 679 679 680 - l2tp_session_dec_refcount(session); 680 + l2tp_session_put(session); 681 681 682 682 out: 683 683 return ret; ··· 713 713 ret = l2tp_session_notify(&l2tp_nl_family, info, 714 714 session, L2TP_CMD_SESSION_MODIFY); 715 715 716 - l2tp_session_dec_refcount(session); 716 + l2tp_session_put(session); 717 717 718 718 out: 719 719 return ret; ··· 824 824 825 825 ret = genlmsg_unicast(genl_info_net(info), msg, info->snd_portid); 826 826 827 - l2tp_session_dec_refcount(session); 827 + l2tp_session_put(session); 828 828 829 829 return ret; 830 830 831 831 err_ref_msg: 832 832 nlmsg_free(msg); 833 833 err_ref: 834 - l2tp_session_dec_refcount(session); 834 + l2tp_session_put(session); 835 835 err: 836 836 return ret; 837 837 } ··· 856 856 tunnel->tunnel_id, &skey); 857 857 if (!session) { 858 858 tkey++; 859 - l2tp_tunnel_dec_refcount(tunnel); 859 + l2tp_tunnel_put(tunnel); 860 860 tunnel = NULL; 861 861 skey = 0; 862 862 continue; ··· 865 865 if (l2tp_nl_session_send(skb, NETLINK_CB(cb->skb).portid, 866 866 cb->nlh->nlmsg_seq, NLM_F_MULTI, 867 867 session, L2TP_CMD_SESSION_GET) < 0) { 868 - l2tp_session_dec_refcount(session); 869 - l2tp_tunnel_dec_refcount(tunnel); 868 + l2tp_session_put(session); 869 + l2tp_tunnel_put(tunnel); 870 870 break; 871 871 } 872 - l2tp_session_dec_refcount(session); 872 + l2tp_session_put(session); 873 873 874 874 skey++; 875 875 }
+23 -23
net/l2tp/l2tp_ppp.c
··· 313 313 l2tp_xmit_skb(session, skb); 314 314 local_bh_enable(); 315 315 316 - l2tp_session_dec_refcount(session); 316 + l2tp_session_put(session); 317 317 318 318 return total_len; 319 319 320 320 error_put_sess: 321 - l2tp_session_dec_refcount(session); 321 + l2tp_session_put(session); 322 322 error: 323 323 return error; 324 324 } ··· 372 372 l2tp_xmit_skb(session, skb); 373 373 local_bh_enable(); 374 374 375 - l2tp_session_dec_refcount(session); 375 + l2tp_session_put(session); 376 376 377 377 return 1; 378 378 379 379 abort_put_sess: 380 - l2tp_session_dec_refcount(session); 380 + l2tp_session_put(session); 381 381 abort: 382 382 /* Free the original skb */ 383 383 kfree_skb(skb); ··· 413 413 sock_put(ps->__sk); 414 414 415 415 /* drop ref taken when we referenced socket via sk_user_data */ 416 - l2tp_session_dec_refcount(session); 416 + l2tp_session_put(session); 417 417 } 418 418 } 419 419 ··· 444 444 if (session) { 445 445 l2tp_session_delete(session); 446 446 /* drop ref taken by pppol2tp_sock_to_session */ 447 - l2tp_session_dec_refcount(session); 447 + l2tp_session_put(session); 448 448 } 449 449 450 450 release_sock(sk); ··· 668 668 if (error < 0) 669 669 return ERR_PTR(error); 670 670 671 - l2tp_tunnel_inc_refcount(tunnel); 671 + refcount_inc(&tunnel->ref_count); 672 672 error = l2tp_tunnel_register(tunnel, net, &tcfg); 673 673 if (error < 0) { 674 674 kfree(tunnel); ··· 684 684 685 685 /* Error if socket is not prepped */ 686 686 if (!tunnel->sock) { 687 - l2tp_tunnel_dec_refcount(tunnel); 687 + l2tp_tunnel_put(tunnel); 688 688 return ERR_PTR(-ENOENT); 689 689 } 690 690 } ··· 774 774 775 775 pppol2tp_session_init(session); 776 776 ps = l2tp_session_priv(session); 777 - l2tp_session_inc_refcount(session); 777 + refcount_inc(&session->ref_count); 778 778 779 779 mutex_lock(&ps->sk_lock); 780 780 error = l2tp_session_register(session, tunnel); 781 781 if (error < 0) { 782 782 mutex_unlock(&ps->sk_lock); 783 - l2tp_session_dec_refcount(session); 783 + l2tp_session_put(session); 784 784 goto end; 785 785 } 786 786 ··· 836 836 l2tp_tunnel_delete(tunnel); 837 837 } 838 838 if (drop_refcnt) 839 - l2tp_session_dec_refcount(session); 840 - l2tp_tunnel_dec_refcount(tunnel); 839 + l2tp_session_put(session); 840 + l2tp_tunnel_put(tunnel); 841 841 release_sock(sk); 842 842 843 843 return error; ··· 877 877 return 0; 878 878 879 879 err_sess: 880 - l2tp_session_dec_refcount(session); 880 + l2tp_session_put(session); 881 881 err: 882 882 return error; 883 883 } ··· 988 988 989 989 error = len; 990 990 991 - l2tp_session_dec_refcount(session); 991 + l2tp_session_put(session); 992 992 end: 993 993 return error; 994 994 } ··· 1038 1038 return -EBADR; 1039 1039 1040 1040 if (session->pwtype != L2TP_PWTYPE_PPP) { 1041 - l2tp_session_dec_refcount(session); 1041 + l2tp_session_put(session); 1042 1042 return -EBADR; 1043 1043 } 1044 1044 1045 1045 pppol2tp_copy_stats(stats, &session->stats); 1046 - l2tp_session_dec_refcount(session); 1046 + l2tp_session_put(session); 1047 1047 1048 1048 return 0; 1049 1049 } ··· 1261 1261 err = pppol2tp_session_setsockopt(sk, session, optname, val); 1262 1262 } 1263 1263 1264 - l2tp_session_dec_refcount(session); 1264 + l2tp_session_put(session); 1265 1265 end: 1266 1266 return err; 1267 1267 } ··· 1382 1382 err = 0; 1383 1383 1384 1384 end_put_sess: 1385 - l2tp_session_dec_refcount(session); 1385 + l2tp_session_put(session); 1386 1386 end: 1387 1387 return err; 1388 1388 } ··· 1407 1407 { 1408 1408 /* Drop reference taken during previous invocation */ 1409 1409 if (pd->tunnel) 1410 - l2tp_tunnel_dec_refcount(pd->tunnel); 1410 + l2tp_tunnel_put(pd->tunnel); 1411 1411 1412 1412 for (;;) { 1413 1413 pd->tunnel = l2tp_tunnel_get_next(net, &pd->tkey); ··· 1417 1417 if (!pd->tunnel || pd->tunnel->version == 2) 1418 1418 return; 1419 1419 1420 - l2tp_tunnel_dec_refcount(pd->tunnel); 1420 + l2tp_tunnel_put(pd->tunnel); 1421 1421 } 1422 1422 } 1423 1423 ··· 1425 1425 { 1426 1426 /* Drop reference taken during previous invocation */ 1427 1427 if (pd->session) 1428 - l2tp_session_dec_refcount(pd->session); 1428 + l2tp_session_put(pd->session); 1429 1429 1430 1430 pd->session = l2tp_session_get_next(net, pd->tunnel->sock, 1431 1431 pd->tunnel->version, ··· 1485 1485 * or pppol2tp_next_tunnel(). 1486 1486 */ 1487 1487 if (pd->session) { 1488 - l2tp_session_dec_refcount(pd->session); 1488 + l2tp_session_put(pd->session); 1489 1489 pd->session = NULL; 1490 1490 } 1491 1491 if (pd->tunnel) { 1492 - l2tp_tunnel_dec_refcount(pd->tunnel); 1492 + l2tp_tunnel_put(pd->tunnel); 1493 1493 pd->tunnel = NULL; 1494 1494 } 1495 1495 }