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

genetlink: remove userhdr from struct genl_info

Only three families use info->userhdr today and going forward
we discourage using fixed headers in new families.
So having the pointer to user header in struct genl_info
is an overkill. Compute the header pointer at runtime.

Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Link: https://lore.kernel.org/r/20230814214723.2924989-4-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+33 -27
+5 -4
drivers/block/drbd/drbd_nl.c
··· 159 159 static int drbd_adm_prepare(struct drbd_config_context *adm_ctx, 160 160 struct sk_buff *skb, struct genl_info *info, unsigned flags) 161 161 { 162 - struct drbd_genlmsghdr *d_in = info->userhdr; 162 + struct drbd_genlmsghdr *d_in = genl_info_userhdr(info); 163 163 const u8 cmd = info->genlhdr->cmd; 164 164 int err; 165 165 ··· 1396 1396 1397 1397 static bool should_set_defaults(struct genl_info *info) 1398 1398 { 1399 - unsigned flags = ((struct drbd_genlmsghdr*)info->userhdr)->flags; 1400 - return 0 != (flags & DRBD_GENL_F_SET_DEFAULTS); 1399 + struct drbd_genlmsghdr *dh = genl_info_userhdr(info); 1400 + 1401 + return 0 != (dh->flags & DRBD_GENL_F_SET_DEFAULTS); 1401 1402 } 1402 1403 1403 1404 static unsigned int drbd_al_extents_max(struct drbd_backing_dev *bdev) ··· 4277 4276 int drbd_adm_new_minor(struct sk_buff *skb, struct genl_info *info) 4278 4277 { 4279 4278 struct drbd_config_context adm_ctx; 4280 - struct drbd_genlmsghdr *dh = info->userhdr; 4279 + struct drbd_genlmsghdr *dh = genl_info_userhdr(info); 4281 4280 enum drbd_ret_code retcode; 4282 4281 4283 4282 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
+5 -2
include/net/genetlink.h
··· 95 95 * @snd_portid: netlink portid of sender 96 96 * @nlhdr: netlink message header 97 97 * @genlhdr: generic netlink message header 98 - * @userhdr: user specific header 99 98 * @attrs: netlink attributes 100 99 * @_net: network namespace 101 100 * @user_ptr: user pointers ··· 105 106 u32 snd_portid; 106 107 const struct nlmsghdr * nlhdr; 107 108 struct genlmsghdr * genlhdr; 108 - void * userhdr; 109 109 struct nlattr ** attrs; 110 110 possible_net_t _net; 111 111 void * user_ptr[2]; ··· 119 121 static inline void genl_info_net_set(struct genl_info *info, struct net *net) 120 122 { 121 123 write_pnet(&info->_net, net); 124 + } 125 + 126 + static inline void *genl_info_userhdr(const struct genl_info *info) 127 + { 128 + return (u8 *)info->genlhdr + GENL_HDRLEN; 122 129 } 123 130 124 131 #define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG((info)->extack, msg)
-1
net/netlink/genetlink.c
··· 943 943 info.snd_portid = NETLINK_CB(skb).portid; 944 944 info.nlhdr = nlh; 945 945 info.genlhdr = nlmsg_data(nlh); 946 - info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN; 947 946 info.attrs = attrbuf; 948 947 info.extack = extack; 949 948 genl_info_net_set(&info, net);
+1 -1
net/openvswitch/conntrack.c
··· 1605 1605 ovs_ct_limit_cmd_reply_start(struct genl_info *info, u8 cmd, 1606 1606 struct ovs_header **ovs_reply_header) 1607 1607 { 1608 - struct ovs_header *ovs_header = info->userhdr; 1608 + struct ovs_header *ovs_header = genl_info_userhdr(info); 1609 1609 struct sk_buff *skb; 1610 1610 1611 1611 skb = genlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+16 -13
net/openvswitch/datapath.c
··· 590 590 591 591 static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) 592 592 { 593 - struct ovs_header *ovs_header = info->userhdr; 593 + struct ovs_header *ovs_header = genl_info_userhdr(info); 594 594 struct net *net = sock_net(skb->sk); 595 595 struct nlattr **a = info->attrs; 596 596 struct sw_flow_actions *acts; ··· 967 967 { 968 968 struct net *net = sock_net(skb->sk); 969 969 struct nlattr **a = info->attrs; 970 - struct ovs_header *ovs_header = info->userhdr; 970 + struct ovs_header *ovs_header = genl_info_userhdr(info); 971 971 struct sw_flow *flow = NULL, *new_flow; 972 972 struct sw_flow_mask mask; 973 973 struct sk_buff *reply; ··· 1214 1214 { 1215 1215 struct net *net = sock_net(skb->sk); 1216 1216 struct nlattr **a = info->attrs; 1217 - struct ovs_header *ovs_header = info->userhdr; 1217 + struct ovs_header *ovs_header = genl_info_userhdr(info); 1218 1218 struct sw_flow_key key; 1219 1219 struct sw_flow *flow; 1220 1220 struct sk_buff *reply = NULL; ··· 1315 1315 static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info) 1316 1316 { 1317 1317 struct nlattr **a = info->attrs; 1318 - struct ovs_header *ovs_header = info->userhdr; 1318 + struct ovs_header *ovs_header = genl_info_userhdr(info); 1319 1319 struct net *net = sock_net(skb->sk); 1320 1320 struct sw_flow_key key; 1321 1321 struct sk_buff *reply; ··· 1374 1374 static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) 1375 1375 { 1376 1376 struct nlattr **a = info->attrs; 1377 - struct ovs_header *ovs_header = info->userhdr; 1377 + struct ovs_header *ovs_header = genl_info_userhdr(info); 1378 1378 struct net *net = sock_net(skb->sk); 1379 1379 struct sw_flow_key key; 1380 1380 struct sk_buff *reply; ··· 1642 1642 { 1643 1643 struct datapath *dp; 1644 1644 1645 - dp = lookup_datapath(sock_net(skb->sk), info->userhdr, 1645 + dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), 1646 1646 info->attrs); 1647 1647 if (IS_ERR(dp)) 1648 1648 return; ··· 1935 1935 return -ENOMEM; 1936 1936 1937 1937 ovs_lock(); 1938 - dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); 1938 + dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), 1939 + info->attrs); 1939 1940 err = PTR_ERR(dp); 1940 1941 if (IS_ERR(dp)) 1941 1942 goto err_unlock_free; ··· 1969 1968 return -ENOMEM; 1970 1969 1971 1970 ovs_lock(); 1972 - dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); 1971 + dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), 1972 + info->attrs); 1973 1973 err = PTR_ERR(dp); 1974 1974 if (IS_ERR(dp)) 1975 1975 goto err_unlock_free; ··· 2005 2003 return -ENOMEM; 2006 2004 2007 2005 ovs_lock(); 2008 - dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); 2006 + dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), 2007 + info->attrs); 2009 2008 if (IS_ERR(dp)) { 2010 2009 err = PTR_ERR(dp); 2011 2010 goto err_unlock_free; ··· 2249 2246 static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) 2250 2247 { 2251 2248 struct nlattr **a = info->attrs; 2252 - struct ovs_header *ovs_header = info->userhdr; 2249 + struct ovs_header *ovs_header = genl_info_userhdr(info); 2253 2250 struct vport_parms parms; 2254 2251 struct sk_buff *reply; 2255 2252 struct vport *vport; ··· 2351 2348 return -ENOMEM; 2352 2349 2353 2350 ovs_lock(); 2354 - vport = lookup_vport(sock_net(skb->sk), info->userhdr, a); 2351 + vport = lookup_vport(sock_net(skb->sk), genl_info_userhdr(info), a); 2355 2352 err = PTR_ERR(vport); 2356 2353 if (IS_ERR(vport)) 2357 2354 goto exit_unlock_free; ··· 2407 2404 return -ENOMEM; 2408 2405 2409 2406 ovs_lock(); 2410 - vport = lookup_vport(sock_net(skb->sk), info->userhdr, a); 2407 + vport = lookup_vport(sock_net(skb->sk), genl_info_userhdr(info), a); 2411 2408 err = PTR_ERR(vport); 2412 2409 if (IS_ERR(vport)) 2413 2410 goto exit_unlock_free; ··· 2450 2447 static int ovs_vport_cmd_get(struct sk_buff *skb, struct genl_info *info) 2451 2448 { 2452 2449 struct nlattr **a = info->attrs; 2453 - struct ovs_header *ovs_header = info->userhdr; 2450 + struct ovs_header *ovs_header = genl_info_userhdr(info); 2454 2451 struct sk_buff *reply; 2455 2452 struct vport *vport; 2456 2453 int err;
+5 -5
net/openvswitch/meter.c
··· 211 211 struct ovs_header **ovs_reply_header) 212 212 { 213 213 struct sk_buff *skb; 214 - struct ovs_header *ovs_header = info->userhdr; 214 + struct ovs_header *ovs_header = genl_info_userhdr(info); 215 215 216 216 skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 217 217 if (!skb) ··· 272 272 273 273 static int ovs_meter_cmd_features(struct sk_buff *skb, struct genl_info *info) 274 274 { 275 - struct ovs_header *ovs_header = info->userhdr; 275 + struct ovs_header *ovs_header = genl_info_userhdr(info); 276 276 struct ovs_header *ovs_reply_header; 277 277 struct nlattr *nla, *band_nla; 278 278 struct sk_buff *reply; ··· 409 409 struct dp_meter *meter, *old_meter; 410 410 struct sk_buff *reply; 411 411 struct ovs_header *ovs_reply_header; 412 - struct ovs_header *ovs_header = info->userhdr; 412 + struct ovs_header *ovs_header = genl_info_userhdr(info); 413 413 struct dp_meter_table *meter_tbl; 414 414 struct datapath *dp; 415 415 int err; ··· 482 482 483 483 static int ovs_meter_cmd_get(struct sk_buff *skb, struct genl_info *info) 484 484 { 485 - struct ovs_header *ovs_header = info->userhdr; 485 + struct ovs_header *ovs_header = genl_info_userhdr(info); 486 486 struct ovs_header *ovs_reply_header; 487 487 struct nlattr **a = info->attrs; 488 488 struct dp_meter *meter; ··· 535 535 536 536 static int ovs_meter_cmd_del(struct sk_buff *skb, struct genl_info *info) 537 537 { 538 - struct ovs_header *ovs_header = info->userhdr; 538 + struct ovs_header *ovs_header = genl_info_userhdr(info); 539 539 struct ovs_header *ovs_reply_header; 540 540 struct nlattr **a = info->attrs; 541 541 struct dp_meter *old_meter;