Skip to content

Commit

Permalink
genetlink: extend info user-storage to match NL cb ctx
Browse files Browse the repository at this point in the history
This allows a more uniform implementation of non-dump and dump
operations, and will be used later in the series to avoid some
per-operation allocation.

Additionally rename the NL_ASSERT_DUMP_CTX_FITS macro, to
fit a more extended usage.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Link: https://patch.msgid.link/1130cc2896626b84587a2a5f96a5c6829638f4da.1728460186.git.pabeni@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Paolo Abeni authored and Jakub Kicinski committed Oct 10, 2024
1 parent 80c549c commit 13d68a1
Show file tree
Hide file tree
Showing 9 changed files with 17 additions and 12 deletions.
2 changes: 1 addition & 1 deletion drivers/net/vxlan/vxlan_mdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ int vxlan_mdb_dump(struct net_device *dev, struct sk_buff *skb,

ASSERT_RTNL();

NL_ASSERT_DUMP_CTX_FITS(struct vxlan_mdb_dump_ctx);
NL_ASSERT_CTX_FITS(struct vxlan_mdb_dump_ctx);

nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
cb->nlh->nlmsg_seq, RTM_NEWMDB, sizeof(*bpm),
Expand Down
5 changes: 3 additions & 2 deletions include/linux/netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct netlink_skb_parms {

#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))
#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
#define NETLINK_CTX_SIZE 48


void netlink_table_grab(void);
Expand Down Expand Up @@ -293,7 +294,7 @@ struct netlink_callback {
int flags;
bool strict_check;
union {
u8 ctx[48];
u8 ctx[NETLINK_CTX_SIZE];

/* args is deprecated. Cast a struct over ctx instead
* for proper type safety.
Expand All @@ -302,7 +303,7 @@ struct netlink_callback {
};
};

#define NL_ASSERT_DUMP_CTX_FITS(type_name) \
#define NL_ASSERT_CTX_FITS(type_name) \
BUILD_BUG_ON(sizeof(type_name) > \
sizeof_field(struct netlink_callback, ctx))

Expand Down
8 changes: 6 additions & 2 deletions include/net/genetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ struct genl_family {
* @genlhdr: generic netlink message header
* @attrs: netlink attributes
* @_net: network namespace
* @user_ptr: user pointers
* @ctx: storage space for the use by the family
* @user_ptr: user pointers (deprecated, use ctx instead)
* @extack: extended ACK report struct
*/
struct genl_info {
Expand All @@ -135,7 +136,10 @@ struct genl_info {
struct genlmsghdr * genlhdr;
struct nlattr ** attrs;
possible_net_t _net;
void * user_ptr[2];
union {
u8 ctx[NETLINK_CTX_SIZE];
void * user_ptr[2];
};
struct netlink_ext_ack *extack;
};

Expand Down
2 changes: 1 addition & 1 deletion net/core/netdev-genl.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ struct netdev_nl_dump_ctx {

static struct netdev_nl_dump_ctx *netdev_dump_ctx(struct netlink_callback *cb)
{
NL_ASSERT_DUMP_CTX_FITS(struct netdev_nl_dump_ctx);
NL_ASSERT_CTX_FITS(struct netdev_nl_dump_ctx);

return (struct netdev_nl_dump_ctx *)cb->ctx;
}
Expand Down
2 changes: 1 addition & 1 deletion net/core/rtnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -6243,7 +6243,7 @@ static int rtnl_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
int idx, s_idx;
int err;

NL_ASSERT_DUMP_CTX_FITS(struct rtnl_mdb_dump_ctx);
NL_ASSERT_CTX_FITS(struct rtnl_mdb_dump_ctx);

if (cb->strict_check) {
err = rtnl_mdb_valid_dump_req(cb->nlh, cb->extack);
Expand Down
2 changes: 1 addition & 1 deletion net/devlink/devl_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,
static inline struct devlink_nl_dump_state *
devlink_dump_state(struct netlink_callback *cb)
{
NL_ASSERT_DUMP_CTX_FITS(struct devlink_nl_dump_state);
NL_ASSERT_CTX_FITS(struct devlink_nl_dump_state);

return (struct devlink_nl_dump_state *)cb->ctx;
}
Expand Down
2 changes: 1 addition & 1 deletion net/ethtool/rss.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ struct rss_nl_dump_ctx {

static struct rss_nl_dump_ctx *rss_dump_ctx(struct netlink_callback *cb)
{
NL_ASSERT_DUMP_CTX_FITS(struct rss_nl_dump_ctx);
NL_ASSERT_CTX_FITS(struct rss_nl_dump_ctx);

return (struct rss_nl_dump_ctx *)cb->ctx;
}
Expand Down
2 changes: 1 addition & 1 deletion net/netfilter/nf_conntrack_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -3870,7 +3870,7 @@ static int __init ctnetlink_init(void)
{
int ret;

NL_ASSERT_DUMP_CTX_FITS(struct ctnetlink_list_dump_ctx);
NL_ASSERT_CTX_FITS(struct ctnetlink_list_dump_ctx);

ret = nfnetlink_subsys_register(&ctnl_subsys);
if (ret < 0) {
Expand Down
4 changes: 2 additions & 2 deletions net/netlink/genetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -997,7 +997,7 @@ static int genl_start(struct netlink_callback *cb)
info->info.attrs = attrs;
genl_info_net_set(&info->info, sock_net(cb->skb->sk));
info->info.extack = cb->extack;
memset(&info->info.user_ptr, 0, sizeof(info->info.user_ptr));
memset(&info->info.ctx, 0, sizeof(info->info.ctx));

cb->data = info;
if (ops->start) {
Expand Down Expand Up @@ -1104,7 +1104,7 @@ static int genl_family_rcv_msg_doit(const struct genl_family *family,
info.attrs = attrbuf;
info.extack = extack;
genl_info_net_set(&info, net);
memset(&info.user_ptr, 0, sizeof(info.user_ptr));
memset(&info.ctx, 0, sizeof(info.ctx));

if (ops->pre_doit) {
err = ops->pre_doit(ops, skb, &info);
Expand Down

0 comments on commit 13d68a1

Please sign in to comment.