mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
genetlink: extend info user-storage to match NL cb ctx
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>
This commit is contained in:
parent
80c549cd1a
commit
13d68a1643
@ -284,7 +284,7 @@ int vxlan_mdb_dump(struct net_device *dev, struct sk_buff *skb,
|
|||||||
|
|
||||||
ASSERT_RTNL();
|
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,
|
nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
|
||||||
cb->nlh->nlmsg_seq, RTM_NEWMDB, sizeof(*bpm),
|
cb->nlh->nlmsg_seq, RTM_NEWMDB, sizeof(*bpm),
|
||||||
|
@ -34,6 +34,7 @@ struct netlink_skb_parms {
|
|||||||
|
|
||||||
#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))
|
#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb))
|
||||||
#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
|
#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds)
|
||||||
|
#define NETLINK_CTX_SIZE 48
|
||||||
|
|
||||||
|
|
||||||
void netlink_table_grab(void);
|
void netlink_table_grab(void);
|
||||||
@ -293,7 +294,7 @@ struct netlink_callback {
|
|||||||
int flags;
|
int flags;
|
||||||
bool strict_check;
|
bool strict_check;
|
||||||
union {
|
union {
|
||||||
u8 ctx[48];
|
u8 ctx[NETLINK_CTX_SIZE];
|
||||||
|
|
||||||
/* args is deprecated. Cast a struct over ctx instead
|
/* args is deprecated. Cast a struct over ctx instead
|
||||||
* for proper type safety.
|
* for proper type safety.
|
||||||
@ -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) > \
|
BUILD_BUG_ON(sizeof(type_name) > \
|
||||||
sizeof_field(struct netlink_callback, ctx))
|
sizeof_field(struct netlink_callback, ctx))
|
||||||
|
|
||||||
|
@ -124,7 +124,8 @@ struct genl_family {
|
|||||||
* @genlhdr: generic netlink message header
|
* @genlhdr: generic netlink message header
|
||||||
* @attrs: netlink attributes
|
* @attrs: netlink attributes
|
||||||
* @_net: network namespace
|
* @_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
|
* @extack: extended ACK report struct
|
||||||
*/
|
*/
|
||||||
struct genl_info {
|
struct genl_info {
|
||||||
@ -135,7 +136,10 @@ struct genl_info {
|
|||||||
struct genlmsghdr * genlhdr;
|
struct genlmsghdr * genlhdr;
|
||||||
struct nlattr ** attrs;
|
struct nlattr ** attrs;
|
||||||
possible_net_t _net;
|
possible_net_t _net;
|
||||||
void * user_ptr[2];
|
union {
|
||||||
|
u8 ctx[NETLINK_CTX_SIZE];
|
||||||
|
void * user_ptr[2];
|
||||||
|
};
|
||||||
struct netlink_ext_ack *extack;
|
struct netlink_ext_ack *extack;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ struct netdev_nl_dump_ctx {
|
|||||||
|
|
||||||
static struct netdev_nl_dump_ctx *netdev_dump_ctx(struct netlink_callback *cb)
|
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;
|
return (struct netdev_nl_dump_ctx *)cb->ctx;
|
||||||
}
|
}
|
||||||
|
@ -6243,7 +6243,7 @@ static int rtnl_mdb_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
|||||||
int idx, s_idx;
|
int idx, s_idx;
|
||||||
int err;
|
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) {
|
if (cb->strict_check) {
|
||||||
err = rtnl_mdb_valid_dump_req(cb->nlh, cb->extack);
|
err = rtnl_mdb_valid_dump_req(cb->nlh, cb->extack);
|
||||||
|
@ -166,7 +166,7 @@ int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,
|
|||||||
static inline struct devlink_nl_dump_state *
|
static inline struct devlink_nl_dump_state *
|
||||||
devlink_dump_state(struct netlink_callback *cb)
|
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;
|
return (struct devlink_nl_dump_state *)cb->ctx;
|
||||||
}
|
}
|
||||||
|
@ -224,7 +224,7 @@ struct rss_nl_dump_ctx {
|
|||||||
|
|
||||||
static struct rss_nl_dump_ctx *rss_dump_ctx(struct netlink_callback *cb)
|
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;
|
return (struct rss_nl_dump_ctx *)cb->ctx;
|
||||||
}
|
}
|
||||||
|
@ -3870,7 +3870,7 @@ static int __init ctnetlink_init(void)
|
|||||||
{
|
{
|
||||||
int ret;
|
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);
|
ret = nfnetlink_subsys_register(&ctnl_subsys);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -997,7 +997,7 @@ static int genl_start(struct netlink_callback *cb)
|
|||||||
info->info.attrs = attrs;
|
info->info.attrs = attrs;
|
||||||
genl_info_net_set(&info->info, sock_net(cb->skb->sk));
|
genl_info_net_set(&info->info, sock_net(cb->skb->sk));
|
||||||
info->info.extack = cb->extack;
|
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;
|
cb->data = info;
|
||||||
if (ops->start) {
|
if (ops->start) {
|
||||||
@ -1104,7 +1104,7 @@ static int genl_family_rcv_msg_doit(const struct genl_family *family,
|
|||||||
info.attrs = attrbuf;
|
info.attrs = attrbuf;
|
||||||
info.extack = extack;
|
info.extack = extack;
|
||||||
genl_info_net_set(&info, net);
|
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) {
|
if (ops->pre_doit) {
|
||||||
err = ops->pre_doit(ops, skb, &info);
|
err = ops->pre_doit(ops, skb, &info);
|
||||||
|
Loading…
Reference in New Issue
Block a user