Commit 11280dde authored by Jiri Pirko's avatar Jiri Pirko Committed by Paolo Abeni
Browse files

devlink: introduce __devl_is_registered() helper and use it instead of xa_get_mark()



Introduce __devl_is_registered() which does not assert on devlink
instance lock and use it in notifications which may be called
without devlink instance lock held.

Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 337ad364
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -91,10 +91,15 @@ 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)
+1 −1
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ static void devlink_linecard_notify(struct devlink_linecard *linecard,
	WARN_ON(cmd != DEVLINK_CMD_LINECARD_NEW &&
		cmd != DEVLINK_CMD_LINECARD_DEL);

	if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED))
	if (!__devl_is_registered(devlink))
		return;

	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+1 −1
Original line number Diff line number Diff line
@@ -512,7 +512,7 @@ static void devlink_port_notify(struct devlink_port *devlink_port,

	WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL);

	if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED))
	if (!__devl_is_registered(devlink))
		return;

	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+2 −1
Original line number Diff line number Diff line
@@ -234,7 +234,8 @@ static void devlink_nl_region_notify(struct devlink_region *region,
	struct sk_buff *msg;

	WARN_ON(cmd != DEVLINK_CMD_REGION_NEW && cmd != DEVLINK_CMD_REGION_DEL);
	if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED))

	if (!__devl_is_registered(devlink))
		return;

	msg = devlink_nl_region_notify_build(region, snapshot, cmd, 0, 0);