diff options
Diffstat (limited to 'net/devlink/devl_internal.h')
| -rw-r--r-- | net/devlink/devl_internal.h | 80 | 
1 files changed, 75 insertions, 5 deletions
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index 183dbe3807ab..c7a8e13f917c 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -3,6 +3,7 @@   * Copyright (c) 2016 Jiri Pirko <[email protected]>   */ +#include <linux/device.h>  #include <linux/etherdevice.h>  #include <linux/mutex.h>  #include <linux/netdevice.h> @@ -90,10 +91,29 @@ extern struct genl_family devlink_nl_family;  struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *indexp); +static inline bool __devl_is_registered(struct devlink *devlink) +{ +	return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); +} +  static inline bool devl_is_registered(struct devlink *devlink)  {  	devl_assert_locked(devlink); -	return xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); +	return __devl_is_registered(devlink); +} + +static inline void devl_dev_lock(struct devlink *devlink, bool dev_lock) +{ +	if (dev_lock) +		device_lock(devlink->dev); +	devl_lock(devlink); +} + +static inline void devl_dev_unlock(struct devlink *devlink, bool dev_lock) +{ +	devl_unlock(devlink); +	if (dev_lock) +		device_unlock(devlink->dev);  }  typedef void devlink_rel_notify_cb_t(struct devlink *devlink, u32 obj_index); @@ -111,9 +131,6 @@ int devlink_rel_devlink_handle_put(struct sk_buff *msg, struct devlink *devlink,  				   bool *msg_updated);  /* Netlink */ -#define DEVLINK_NL_FLAG_NEED_PORT		BIT(0) -#define DEVLINK_NL_FLAG_NEED_DEVLINK_OR_PORT	BIT(1) -  enum devlink_multicast_groups {  	DEVLINK_MCGRP_CONFIG,  }; @@ -140,7 +157,8 @@ typedef int devlink_nl_dump_one_func_t(struct sk_buff *msg,  				       int flags);  struct devlink * -devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs); +devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs, +			    bool dev_lock);  int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,  		      devlink_nl_dump_one_func_t *dump_one); @@ -167,6 +185,58 @@ int devlink_nl_put_nested_handle(struct sk_buff *msg, struct net *net,  				 struct devlink *devlink, int attrtype);  int devlink_nl_msg_reply_and_new(struct sk_buff **msg, struct genl_info *info); +static inline bool devlink_nl_notify_need(struct devlink *devlink) +{ +	return genl_has_listeners(&devlink_nl_family, devlink_net(devlink), +				  DEVLINK_MCGRP_CONFIG); +} + +struct devlink_obj_desc { +	struct rcu_head rcu; +	const char *bus_name; +	const char *dev_name; +	unsigned int port_index; +	bool port_index_valid; +	long data[]; +}; + +static inline void devlink_nl_obj_desc_init(struct devlink_obj_desc *desc, +					    struct devlink *devlink) +{ +	memset(desc, 0, sizeof(*desc)); +	desc->bus_name = devlink->dev->bus->name; +	desc->dev_name = dev_name(devlink->dev); +} + +static inline void devlink_nl_obj_desc_port_set(struct devlink_obj_desc *desc, +						struct devlink_port *devlink_port) +{ +	desc->port_index = devlink_port->index; +	desc->port_index_valid = true; +} + +int devlink_nl_notify_filter(struct sock *dsk, struct sk_buff *skb, void *data); + +static inline void devlink_nl_notify_send_desc(struct devlink *devlink, +					       struct sk_buff *msg, +					       struct devlink_obj_desc *desc) +{ +	genlmsg_multicast_netns_filtered(&devlink_nl_family, +					 devlink_net(devlink), +					 msg, 0, DEVLINK_MCGRP_CONFIG, +					 GFP_KERNEL, +					 devlink_nl_notify_filter, desc); +} + +static inline void devlink_nl_notify_send(struct devlink *devlink, +					  struct sk_buff *msg) +{ +	struct devlink_obj_desc desc; + +	devlink_nl_obj_desc_init(&desc, devlink); +	devlink_nl_notify_send_desc(devlink, msg, &desc); +} +  /* Notify */  void devlink_notify_register(struct devlink *devlink);  void devlink_notify_unregister(struct devlink *devlink);  |