mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-04 22:54:43 -04:00
Merge branch 'devlink-and-mlx5-support-cross-function-rate-scheduling'
Tariq Toukan says: ==================== devlink and mlx5: Support cross-function rate scheduling [part] Apply trivial cleanups from the series to make it smaller. ==================== Link: https://patch.msgid.link/20260128112544.1661250-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -178,9 +178,7 @@ int devlink_rel_nested_in_add(u32 *rel_index, u32 devlink_index,
|
||||
* a notification of a change of this object should be sent
|
||||
* over netlink. The parent devlink instance lock needs to be
|
||||
* taken during the notification preparation.
|
||||
* However, since the devlink lock of nested instance is held here,
|
||||
* we would end with wrong devlink instance lock ordering and
|
||||
* deadlock. Therefore the work is utilized to avoid that.
|
||||
* Since the parent may or may not be locked, 'work' is utilized.
|
||||
*/
|
||||
void devlink_rel_nested_in_notify(struct devlink *devlink)
|
||||
{
|
||||
@@ -477,7 +475,7 @@ void devlink_free(struct devlink *devlink)
|
||||
WARN_ON(!list_empty(&devlink->resource_list));
|
||||
WARN_ON(!list_empty(&devlink->dpipe_table_list));
|
||||
WARN_ON(!list_empty(&devlink->sb_list));
|
||||
WARN_ON(!list_empty(&devlink->rate_list));
|
||||
WARN_ON(devlink_rates_check(devlink, NULL, NULL));
|
||||
WARN_ON(!list_empty(&devlink->linecard_list));
|
||||
WARN_ON(!xa_empty(&devlink->ports));
|
||||
|
||||
|
||||
@@ -434,7 +434,7 @@ static void devlink_reload_reinit_sanity_check(struct devlink *devlink)
|
||||
WARN_ON(!list_empty(&devlink->trap_list));
|
||||
WARN_ON(!list_empty(&devlink->dpipe_table_list));
|
||||
WARN_ON(!list_empty(&devlink->sb_list));
|
||||
WARN_ON(!list_empty(&devlink->rate_list));
|
||||
WARN_ON(devlink_rates_check(devlink, NULL, NULL));
|
||||
WARN_ON(!list_empty(&devlink->linecard_list));
|
||||
WARN_ON(!xa_empty(&devlink->ports));
|
||||
}
|
||||
@@ -713,10 +713,11 @@ int devlink_nl_eswitch_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
if (info->attrs[DEVLINK_ATTR_ESWITCH_MODE]) {
|
||||
if (!ops->eswitch_mode_set)
|
||||
return -EOPNOTSUPP;
|
||||
mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
|
||||
err = devlink_rate_nodes_check(devlink, mode, info->extack);
|
||||
err = devlink_rates_check(devlink, devlink_rate_is_node,
|
||||
info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]);
|
||||
err = ops->eswitch_mode_set(devlink, mode, info->extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -297,8 +297,10 @@ int devlink_resources_validate(struct devlink *devlink,
|
||||
struct genl_info *info);
|
||||
|
||||
/* Rates */
|
||||
int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack);
|
||||
bool devlink_rate_is_node(const struct devlink_rate *devlink_rate);
|
||||
int devlink_rates_check(struct devlink *devlink,
|
||||
bool (*rate_filter)(const struct devlink_rate *),
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
/* Linecards */
|
||||
unsigned int devlink_linecard_index(struct devlink_linecard *linecard);
|
||||
|
||||
@@ -12,8 +12,7 @@ devlink_rate_is_leaf(struct devlink_rate *devlink_rate)
|
||||
return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
devlink_rate_is_node(struct devlink_rate *devlink_rate)
|
||||
bool devlink_rate_is_node(const struct devlink_rate *devlink_rate)
|
||||
{
|
||||
return devlink_rate->type == DEVLINK_RATE_TYPE_NODE;
|
||||
}
|
||||
@@ -688,14 +687,16 @@ int devlink_nl_rate_del_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
return err;
|
||||
}
|
||||
|
||||
int devlink_rate_nodes_check(struct devlink *devlink, u16 mode,
|
||||
struct netlink_ext_ack *extack)
|
||||
int devlink_rates_check(struct devlink *devlink,
|
||||
bool (*rate_filter)(const struct devlink_rate *),
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct devlink_rate *devlink_rate;
|
||||
|
||||
list_for_each_entry(devlink_rate, &devlink->rate_list, list)
|
||||
if (devlink_rate_is_node(devlink_rate)) {
|
||||
NL_SET_ERR_MSG(extack, "Rate node(s) exists.");
|
||||
if (!rate_filter || rate_filter(devlink_rate)) {
|
||||
if (extack)
|
||||
NL_SET_ERR_MSG(extack, "Rate node(s) exists.");
|
||||
return -EBUSY;
|
||||
}
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user