netlink: add net device refcount tracker to struct ethnl_req_info
Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b60645248a
commit
e4b8954074
@ -141,6 +141,7 @@ int ethnl_parse_header_dev_get(struct ethnl_req_info *req_info,
|
|||||||
}
|
}
|
||||||
|
|
||||||
req_info->dev = dev;
|
req_info->dev = dev;
|
||||||
|
netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
|
||||||
req_info->flags = flags;
|
req_info->flags = flags;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -399,7 +400,7 @@ static int ethnl_default_doit(struct sk_buff *skb, struct genl_info *info)
|
|||||||
ops->cleanup_data(reply_data);
|
ops->cleanup_data(reply_data);
|
||||||
|
|
||||||
genlmsg_end(rskb, reply_payload);
|
genlmsg_end(rskb, reply_payload);
|
||||||
dev_put(req_info->dev);
|
dev_put_track(req_info->dev, &req_info->dev_tracker);
|
||||||
kfree(reply_data);
|
kfree(reply_data);
|
||||||
kfree(req_info);
|
kfree(req_info);
|
||||||
return genlmsg_reply(rskb, info);
|
return genlmsg_reply(rskb, info);
|
||||||
@ -411,7 +412,7 @@ err_cleanup:
|
|||||||
if (ops->cleanup_data)
|
if (ops->cleanup_data)
|
||||||
ops->cleanup_data(reply_data);
|
ops->cleanup_data(reply_data);
|
||||||
err_dev:
|
err_dev:
|
||||||
dev_put(req_info->dev);
|
dev_put_track(req_info->dev, &req_info->dev_tracker);
|
||||||
kfree(reply_data);
|
kfree(reply_data);
|
||||||
kfree(req_info);
|
kfree(req_info);
|
||||||
return ret;
|
return ret;
|
||||||
@ -547,7 +548,7 @@ static int ethnl_default_start(struct netlink_callback *cb)
|
|||||||
* same parser as for non-dump (doit) requests is used, it
|
* same parser as for non-dump (doit) requests is used, it
|
||||||
* would take reference to the device if it finds one
|
* would take reference to the device if it finds one
|
||||||
*/
|
*/
|
||||||
dev_put(req_info->dev);
|
dev_put_track(req_info->dev, &req_info->dev_tracker);
|
||||||
req_info->dev = NULL;
|
req_info->dev = NULL;
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
req_info->dev = dev;
|
req_info->dev = dev;
|
||||||
|
netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
|
||||||
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
|
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
|
||||||
|
|
||||||
ethnl_init_reply_data(reply_data, ops, dev);
|
ethnl_init_reply_data(reply_data, ops, dev);
|
||||||
|
@ -222,6 +222,7 @@ static inline unsigned int ethnl_reply_header_size(void)
|
|||||||
/**
|
/**
|
||||||
* struct ethnl_req_info - base type of request information for GET requests
|
* struct ethnl_req_info - base type of request information for GET requests
|
||||||
* @dev: network device the request is for (may be null)
|
* @dev: network device the request is for (may be null)
|
||||||
|
* @dev_tracker: refcount tracker for @dev reference
|
||||||
* @flags: request flags common for all request types
|
* @flags: request flags common for all request types
|
||||||
*
|
*
|
||||||
* This is a common base for request specific structures holding data from
|
* This is a common base for request specific structures holding data from
|
||||||
@ -230,6 +231,7 @@ static inline unsigned int ethnl_reply_header_size(void)
|
|||||||
*/
|
*/
|
||||||
struct ethnl_req_info {
|
struct ethnl_req_info {
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
netdevice_tracker dev_tracker;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user