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

rtnetlink: Compute and store minimum ifinfo dump size

The message size allocated for rtnl ifinfo dumps was limited to
a single page. This is not enough for additional interface info
available with devices that support SR-IOV and caused a bug in
which VF info would not be displayed if more than approximately
40 VFs were created per interface.

Implement a new function pointer for the rtnl_register service that will
calculate the amount of data required for the ifinfo dump and allocate
enough data to satisfy the request.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

authored by

Greg Rose and committed by
Jeff Kirsher
c7ac8679 929dd047

+158 -90
+1 -1
drivers/infiniband/core/netlink.c
··· 148 148 return -EINVAL; 149 149 return netlink_dump_start(nls, skb, nlh, 150 150 client->cb_table[op].dump, 151 - NULL); 151 + NULL, 0); 152 152 } 153 153 } 154 154
+4 -2
include/linux/netlink.h
··· 221 221 int (*dump)(struct sk_buff * skb, 222 222 struct netlink_callback *cb); 223 223 int (*done)(struct netlink_callback *cb); 224 - int family; 224 + u16 family; 225 + u16 min_dump_alloc; 225 226 long args[6]; 226 227 }; 227 228 ··· 260 259 extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, 261 260 const struct nlmsghdr *nlh, 262 261 int (*dump)(struct sk_buff *skb, struct netlink_callback*), 263 - int (*done)(struct netlink_callback*)); 262 + int (*done)(struct netlink_callback*), 263 + u16 min_dump_alloc); 264 264 265 265 266 266 #define NL_NONROOT_RECV 0x1
+5 -2
include/net/rtnetlink.h
··· 6 6 7 7 typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, void *); 8 8 typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); 9 + typedef u16 (*rtnl_calcit_func)(struct sk_buff *); 9 10 10 11 extern int __rtnl_register(int protocol, int msgtype, 11 - rtnl_doit_func, rtnl_dumpit_func); 12 + rtnl_doit_func, rtnl_dumpit_func, 13 + rtnl_calcit_func); 12 14 extern void rtnl_register(int protocol, int msgtype, 13 - rtnl_doit_func, rtnl_dumpit_func); 15 + rtnl_doit_func, rtnl_dumpit_func, 16 + rtnl_calcit_func); 14 17 extern int rtnl_unregister(int protocol, int msgtype); 15 18 extern void rtnl_unregister_all(int protocol); 16 19
+10 -5
net/bridge/br_netlink.c
··· 218 218 if (err < 0) 219 219 goto err1; 220 220 221 - err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, br_dump_ifinfo); 221 + err = __rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, 222 + br_dump_ifinfo, NULL); 222 223 if (err) 223 224 goto err2; 224 - err = __rtnl_register(PF_BRIDGE, RTM_SETLINK, br_rtm_setlink, NULL); 225 + err = __rtnl_register(PF_BRIDGE, RTM_SETLINK, 226 + br_rtm_setlink, NULL, NULL); 225 227 if (err) 226 228 goto err3; 227 - err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, br_fdb_add, NULL); 229 + err = __rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, 230 + br_fdb_add, NULL, NULL); 228 231 if (err) 229 232 goto err3; 230 - err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH, br_fdb_delete, NULL); 233 + err = __rtnl_register(PF_BRIDGE, RTM_DELNEIGH, 234 + br_fdb_delete, NULL, NULL); 231 235 if (err) 232 236 goto err3; 233 - err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, br_fdb_dump); 237 + err = __rtnl_register(PF_BRIDGE, RTM_GETNEIGH, 238 + NULL, br_fdb_dump, NULL); 234 239 if (err) 235 240 goto err3; 236 241
+3 -3
net/core/fib_rules.c
··· 740 740 static int __init fib_rules_init(void) 741 741 { 742 742 int err; 743 - rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL); 744 - rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL); 745 - rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule); 743 + rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, NULL); 744 + rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, NULL); 745 + rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule, NULL); 746 746 747 747 err = register_pernet_subsys(&fib_rules_net_ops); 748 748 if (err < 0)
+6 -5
net/core/neighbour.c
··· 2909 2909 2910 2910 static int __init neigh_init(void) 2911 2911 { 2912 - rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL); 2913 - rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL); 2914 - rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info); 2912 + rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, NULL); 2913 + rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, NULL); 2914 + rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, NULL); 2915 2915 2916 - rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info); 2917 - rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL); 2916 + rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info, 2917 + NULL); 2918 + rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, NULL); 2918 2919 2919 2920 return 0; 2920 2921 }
+49 -11
net/core/rtnetlink.c
··· 56 56 struct rtnl_link { 57 57 rtnl_doit_func doit; 58 58 rtnl_dumpit_func dumpit; 59 + rtnl_calcit_func calcit; 59 60 }; 60 61 61 62 static DEFINE_MUTEX(rtnl_mutex); 63 + static u16 min_ifinfo_dump_size; 62 64 63 65 void rtnl_lock(void) 64 66 { ··· 146 144 return tab ? tab[msgindex].dumpit : NULL; 147 145 } 148 146 147 + static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex) 148 + { 149 + struct rtnl_link *tab; 150 + 151 + if (protocol <= RTNL_FAMILY_MAX) 152 + tab = rtnl_msg_handlers[protocol]; 153 + else 154 + tab = NULL; 155 + 156 + if (tab == NULL || tab[msgindex].calcit == NULL) 157 + tab = rtnl_msg_handlers[PF_UNSPEC]; 158 + 159 + return tab ? tab[msgindex].calcit : NULL; 160 + } 161 + 149 162 /** 150 163 * __rtnl_register - Register a rtnetlink message type 151 164 * @protocol: Protocol family or PF_UNSPEC 152 165 * @msgtype: rtnetlink message type 153 166 * @doit: Function pointer called for each request message 154 167 * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message 168 + * @calcit: Function pointer to calc size of dump message 155 169 * 156 170 * Registers the specified function pointers (at least one of them has 157 171 * to be non-NULL) to be called whenever a request message for the ··· 180 162 * Returns 0 on success or a negative error code. 181 163 */ 182 164 int __rtnl_register(int protocol, int msgtype, 183 - rtnl_doit_func doit, rtnl_dumpit_func dumpit) 165 + rtnl_doit_func doit, rtnl_dumpit_func dumpit, 166 + rtnl_calcit_func calcit) 184 167 { 185 168 struct rtnl_link *tab; 186 169 int msgindex; ··· 204 185 if (dumpit) 205 186 tab[msgindex].dumpit = dumpit; 206 187 188 + if (calcit) 189 + tab[msgindex].calcit = calcit; 190 + 207 191 return 0; 208 192 } 209 193 EXPORT_SYMBOL_GPL(__rtnl_register); ··· 221 199 * of memory implies no sense in continuing. 222 200 */ 223 201 void rtnl_register(int protocol, int msgtype, 224 - rtnl_doit_func doit, rtnl_dumpit_func dumpit) 202 + rtnl_doit_func doit, rtnl_dumpit_func dumpit, 203 + rtnl_calcit_func calcit) 225 204 { 226 - if (__rtnl_register(protocol, msgtype, doit, dumpit) < 0) 205 + if (__rtnl_register(protocol, msgtype, doit, dumpit, calcit) < 0) 227 206 panic("Unable to register rtnetlink message handler, " 228 207 "protocol = %d, message type = %d\n", 229 208 protocol, msgtype); ··· 1841 1818 return err; 1842 1819 } 1843 1820 1821 + static u16 rtnl_calcit(struct sk_buff *skb) 1822 + { 1823 + return min_ifinfo_dump_size; 1824 + } 1825 + 1844 1826 static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) 1845 1827 { 1846 1828 int idx; ··· 1875 1847 struct net *net = dev_net(dev); 1876 1848 struct sk_buff *skb; 1877 1849 int err = -ENOBUFS; 1850 + size_t if_info_size; 1878 1851 1879 - skb = nlmsg_new(if_nlmsg_size(dev), GFP_KERNEL); 1852 + skb = nlmsg_new((if_info_size = if_nlmsg_size(dev)), GFP_KERNEL); 1880 1853 if (skb == NULL) 1881 1854 goto errout; 1855 + 1856 + min_ifinfo_dump_size = max_t(u16, if_info_size, min_ifinfo_dump_size); 1882 1857 1883 1858 err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0); 1884 1859 if (err < 0) { ··· 1933 1902 if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { 1934 1903 struct sock *rtnl; 1935 1904 rtnl_dumpit_func dumpit; 1905 + rtnl_calcit_func calcit; 1906 + u16 min_dump_alloc = 0; 1936 1907 1937 1908 dumpit = rtnl_get_dumpit(family, type); 1938 1909 if (dumpit == NULL) 1939 1910 return -EOPNOTSUPP; 1911 + calcit = rtnl_get_calcit(family, type); 1912 + if (calcit) 1913 + min_dump_alloc = calcit(skb); 1940 1914 1941 1915 __rtnl_unlock(); 1942 1916 rtnl = net->rtnl; 1943 - err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); 1917 + err = netlink_dump_start(rtnl, skb, nlh, dumpit, 1918 + NULL, min_dump_alloc); 1944 1919 rtnl_lock(); 1945 1920 return err; 1946 1921 } ··· 2056 2019 netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV); 2057 2020 register_netdevice_notifier(&rtnetlink_dev_notifier); 2058 2021 2059 - rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, rtnl_dump_ifinfo); 2060 - rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL); 2061 - rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL); 2062 - rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL); 2022 + rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, 2023 + rtnl_dump_ifinfo, rtnl_calcit); 2024 + rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL); 2025 + rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL); 2026 + rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL); 2063 2027 2064 - rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all); 2065 - rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all); 2028 + rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, NULL); 2029 + rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, NULL); 2066 2030 } 2067 2031
+2 -2
net/dcb/dcbnl.c
··· 1819 1819 { 1820 1820 INIT_LIST_HEAD(&dcb_app_list); 1821 1821 1822 - rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL); 1823 - rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL); 1822 + rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, NULL); 1823 + rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, NULL); 1824 1824 1825 1825 return 0; 1826 1826 }
+3 -3
net/decnet/dn_dev.c
··· 1414 1414 1415 1415 dn_dev_devices_on(); 1416 1416 1417 - rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL); 1418 - rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL); 1419 - rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr); 1417 + rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL, NULL); 1418 + rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL, NULL); 1419 + rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr, NULL); 1420 1420 1421 1421 proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops); 1422 1422
+2 -2
net/decnet/dn_fib.c
··· 763 763 764 764 register_dnaddr_notifier(&dn_fib_dnaddr_notifier); 765 765 766 - rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL); 767 - rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL); 766 + rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL, NULL); 767 + rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL, NULL); 768 768 } 769 769 770 770
+3 -2
net/decnet/dn_route.c
··· 1841 1841 proc_net_fops_create(&init_net, "decnet_cache", S_IRUGO, &dn_rt_cache_seq_fops); 1842 1842 1843 1843 #ifdef CONFIG_DECNET_ROUTER 1844 - rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, dn_fib_dump); 1844 + rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, 1845 + dn_fib_dump, NULL); 1845 1846 #else 1846 1847 rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, 1847 - dn_cache_dump); 1848 + dn_cache_dump, NULL); 1848 1849 #endif 1849 1850 } 1850 1851
+3 -3
net/ipv4/devinet.c
··· 1833 1833 1834 1834 rtnl_af_register(&inet_af_ops); 1835 1835 1836 - rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL); 1837 - rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL); 1838 - rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr); 1836 + rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL); 1837 + rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL); 1838 + rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL); 1839 1839 } 1840 1840
+3 -3
net/ipv4/fib_frontend.c
··· 1124 1124 1125 1125 void __init ip_fib_init(void) 1126 1126 { 1127 - rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL); 1128 - rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL); 1129 - rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib); 1127 + rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL); 1128 + rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL); 1129 + rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL); 1130 1130 1131 1131 register_pernet_subsys(&fib_net_ops); 1132 1132 register_netdevice_notifier(&fib_netdev_notifier);
+1 -1
net/ipv4/inet_diag.c
··· 871 871 } 872 872 873 873 return netlink_dump_start(idiagnl, skb, nlh, 874 - inet_diag_dump, NULL); 874 + inet_diag_dump, NULL, 0); 875 875 } 876 876 877 877 return inet_diag_get_exact(skb, nlh);
+2 -1
net/ipv4/ipmr.c
··· 2544 2544 goto add_proto_fail; 2545 2545 } 2546 2546 #endif 2547 - rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, NULL, ipmr_rtm_dumproute); 2547 + rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, 2548 + NULL, ipmr_rtm_dumproute, NULL); 2548 2549 return 0; 2549 2550 2550 2551 #ifdef CONFIG_IP_PIMSM_V2
+1 -1
net/ipv4/route.c
··· 3295 3295 xfrm_init(); 3296 3296 xfrm4_init(ip_rt_max_size); 3297 3297 #endif 3298 - rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL); 3298 + rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL); 3299 3299 3300 3300 #ifdef CONFIG_SYSCTL 3301 3301 register_pernet_subsys(&sysctl_route_ops);
+10 -6
net/ipv6/addrconf.c
··· 4727 4727 if (err < 0) 4728 4728 goto errout_af; 4729 4729 4730 - err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo); 4730 + err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo, 4731 + NULL); 4731 4732 if (err < 0) 4732 4733 goto errout; 4733 4734 4734 4735 /* Only the first call to __rtnl_register can fail */ 4735 - __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL); 4736 - __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL); 4737 - __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, inet6_dump_ifaddr); 4738 - __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, inet6_dump_ifmcaddr); 4739 - __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, inet6_dump_ifacaddr); 4736 + __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, NULL); 4737 + __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, NULL); 4738 + __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, 4739 + inet6_dump_ifaddr, NULL); 4740 + __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, 4741 + inet6_dump_ifmcaddr, NULL); 4742 + __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, 4743 + inet6_dump_ifacaddr, NULL); 4740 4744 4741 4745 ipv6_addr_label_rtnl_register(); 4742 4746
+6 -3
net/ipv6/addrlabel.c
··· 592 592 593 593 void __init ipv6_addr_label_rtnl_register(void) 594 594 { 595 - __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, NULL); 596 - __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, NULL); 597 - __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, ip6addrlbl_dump); 595 + __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, 596 + NULL, NULL); 597 + __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, 598 + NULL, NULL); 599 + __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, 600 + ip6addrlbl_dump, NULL); 598 601 } 599 602
+2 -1
net/ipv6/ip6_fib.c
··· 1586 1586 if (ret) 1587 1587 goto out_kmem_cache_create; 1588 1588 1589 - ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib); 1589 + ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, 1590 + NULL); 1590 1591 if (ret) 1591 1592 goto out_unregister_subsys; 1592 1593 out:
+2 -1
net/ipv6/ip6mr.c
··· 1354 1354 goto add_proto_fail; 1355 1355 } 1356 1356 #endif 1357 - rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, ip6mr_rtm_dumproute); 1357 + rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, 1358 + ip6mr_rtm_dumproute, NULL); 1358 1359 return 0; 1359 1360 #ifdef CONFIG_IPV6_PIMSM_V2 1360 1361 add_proto_fail:
+3 -3
net/ipv6/route.c
··· 2925 2925 goto xfrm6_init; 2926 2926 2927 2927 ret = -ENOBUFS; 2928 - if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL) || 2929 - __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL) || 2930 - __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL)) 2928 + if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) || 2929 + __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) || 2930 + __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL)) 2931 2931 goto fib6_rules_init; 2932 2932 2933 2933 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
+1 -1
net/netfilter/ipset/ip_set_core.c
··· 1120 1120 1121 1121 return netlink_dump_start(ctnl, skb, nlh, 1122 1122 ip_set_dump_start, 1123 - ip_set_dump_done); 1123 + ip_set_dump_done, 0); 1124 1124 } 1125 1125 1126 1126 /* Add, del and test */
+2 -2
net/netfilter/nf_conntrack_netlink.c
··· 970 970 971 971 if (nlh->nlmsg_flags & NLM_F_DUMP) 972 972 return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, 973 - ctnetlink_done); 973 + ctnetlink_done, 0); 974 974 975 975 err = ctnetlink_parse_zone(cda[CTA_ZONE], &zone); 976 976 if (err < 0) ··· 1840 1840 if (nlh->nlmsg_flags & NLM_F_DUMP) { 1841 1841 return netlink_dump_start(ctnl, skb, nlh, 1842 1842 ctnetlink_exp_dump_table, 1843 - ctnetlink_exp_done); 1843 + ctnetlink_exp_done, 0); 1844 1844 } 1845 1845 1846 1846 err = ctnetlink_parse_zone(cda[CTA_EXPECT_ZONE], &zone);
+11 -6
net/netlink/af_netlink.c
··· 1659 1659 { 1660 1660 struct netlink_sock *nlk = nlk_sk(sk); 1661 1661 struct netlink_callback *cb; 1662 - struct sk_buff *skb; 1662 + struct sk_buff *skb = NULL; 1663 1663 struct nlmsghdr *nlh; 1664 1664 int len, err = -ENOBUFS; 1665 - 1666 - skb = sock_rmalloc(sk, NLMSG_GOODSIZE, 0, GFP_KERNEL); 1667 - if (!skb) 1668 - goto errout; 1665 + int alloc_size; 1669 1666 1670 1667 mutex_lock(nlk->cb_mutex); 1671 1668 ··· 1671 1674 err = -EINVAL; 1672 1675 goto errout_skb; 1673 1676 } 1677 + 1678 + alloc_size = max_t(int, cb->min_dump_alloc, NLMSG_GOODSIZE); 1679 + 1680 + skb = sock_rmalloc(sk, alloc_size, 0, GFP_KERNEL); 1681 + if (!skb) 1682 + goto errout; 1674 1683 1675 1684 len = cb->dump(skb, cb); 1676 1685 ··· 1724 1721 const struct nlmsghdr *nlh, 1725 1722 int (*dump)(struct sk_buff *skb, 1726 1723 struct netlink_callback *), 1727 - int (*done)(struct netlink_callback *)) 1724 + int (*done)(struct netlink_callback *), 1725 + u16 min_dump_alloc) 1728 1726 { 1729 1727 struct netlink_callback *cb; 1730 1728 struct sock *sk; ··· 1739 1735 cb->dump = dump; 1740 1736 cb->done = done; 1741 1737 cb->nlh = nlh; 1738 + cb->min_dump_alloc = min_dump_alloc; 1742 1739 atomic_inc(&skb->users); 1743 1740 cb->skb = skb; 1744 1741
+1 -1
net/netlink/genetlink.c
··· 525 525 526 526 genl_unlock(); 527 527 err = netlink_dump_start(net->genl_sock, skb, nlh, 528 - ops->dumpit, ops->done); 528 + ops->dumpit, ops->done, 0); 529 529 genl_lock(); 530 530 return err; 531 531 }
+7 -6
net/phonet/pn_netlink.c
··· 289 289 290 290 int __init phonet_netlink_register(void) 291 291 { 292 - int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, NULL); 292 + int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, 293 + NULL, NULL); 293 294 if (err) 294 295 return err; 295 296 296 297 /* Further __rtnl_register() cannot fail */ 297 - __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL); 298 - __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit); 299 - __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL); 300 - __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL); 301 - __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit); 298 + __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, NULL); 299 + __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, NULL); 300 + __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, NULL); 301 + __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, NULL); 302 + __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, NULL); 302 303 return 0; 303 304 }
+4 -3
net/sched/act_api.c
··· 1115 1115 1116 1116 static int __init tc_action_init(void) 1117 1117 { 1118 - rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL); 1119 - rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL); 1120 - rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action); 1118 + rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL); 1119 + rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL); 1120 + rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action, 1121 + NULL); 1121 1122 1122 1123 return 0; 1123 1124 }
+3 -3
net/sched/cls_api.c
··· 610 610 611 611 static int __init tc_filter_init(void) 612 612 { 613 - rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL); 614 - rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL); 613 + rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, NULL); 614 + rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, NULL); 615 615 rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter, 616 - tc_dump_tfilter); 616 + tc_dump_tfilter, NULL); 617 617 618 618 return 0; 619 619 }
+6 -6
net/sched/sch_api.c
··· 1792 1792 register_qdisc(&pfifo_head_drop_qdisc_ops); 1793 1793 register_qdisc(&mq_qdisc_ops); 1794 1794 1795 - rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL); 1796 - rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL); 1797 - rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc); 1798 - rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL); 1799 - rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL); 1800 - rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass); 1795 + rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, NULL); 1796 + rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, NULL); 1797 + rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, NULL); 1798 + rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, NULL); 1799 + rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, NULL); 1800 + rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, NULL); 1801 1801 1802 1802 return 0; 1803 1803 }
+2 -1
net/xfrm/xfrm_user.c
··· 2299 2299 if (link->dump == NULL) 2300 2300 return -EINVAL; 2301 2301 2302 - return netlink_dump_start(net->xfrm.nlsk, skb, nlh, link->dump, link->done); 2302 + return netlink_dump_start(net->xfrm.nlsk, skb, nlh, 2303 + link->dump, link->done, 0); 2303 2304 } 2304 2305 2305 2306 err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs, XFRMA_MAX,