Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+17 -15
+2 -4
net/devlink/core.c
··· 178 178 * a notification of a change of this object should be sent 179 179 * over netlink. The parent devlink instance lock needs to be 180 180 * taken during the notification preparation. 181 - * However, since the devlink lock of nested instance is held here, 182 - * we would end with wrong devlink instance lock ordering and 183 - * deadlock. Therefore the work is utilized to avoid that. 181 + * Since the parent may or may not be locked, 'work' is utilized. 184 182 */ 185 183 void devlink_rel_nested_in_notify(struct devlink *devlink) 186 184 { ··· 475 477 WARN_ON(!list_empty(&devlink->resource_list)); 476 478 WARN_ON(!list_empty(&devlink->dpipe_table_list)); 477 479 WARN_ON(!list_empty(&devlink->sb_list)); 478 - WARN_ON(!list_empty(&devlink->rate_list)); 480 + WARN_ON(devlink_rates_check(devlink, NULL, NULL)); 479 481 WARN_ON(!list_empty(&devlink->linecard_list)); 480 482 WARN_ON(!xa_empty(&devlink->ports)); 481 483
+4 -3
net/devlink/dev.c
··· 434 434 WARN_ON(!list_empty(&devlink->trap_list)); 435 435 WARN_ON(!list_empty(&devlink->dpipe_table_list)); 436 436 WARN_ON(!list_empty(&devlink->sb_list)); 437 - WARN_ON(!list_empty(&devlink->rate_list)); 437 + WARN_ON(devlink_rates_check(devlink, NULL, NULL)); 438 438 WARN_ON(!list_empty(&devlink->linecard_list)); 439 439 WARN_ON(!xa_empty(&devlink->ports)); 440 440 } ··· 713 713 if (info->attrs[DEVLINK_ATTR_ESWITCH_MODE]) { 714 714 if (!ops->eswitch_mode_set) 715 715 return -EOPNOTSUPP; 716 - mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]); 717 - err = devlink_rate_nodes_check(devlink, mode, info->extack); 716 + err = devlink_rates_check(devlink, devlink_rate_is_node, 717 + info->extack); 718 718 if (err) 719 719 return err; 720 + mode = nla_get_u16(info->attrs[DEVLINK_ATTR_ESWITCH_MODE]); 720 721 err = ops->eswitch_mode_set(devlink, mode, info->extack); 721 722 if (err) 722 723 return err;
+4 -2
net/devlink/devl_internal.h
··· 297 297 struct genl_info *info); 298 298 299 299 /* Rates */ 300 - int devlink_rate_nodes_check(struct devlink *devlink, u16 mode, 301 - struct netlink_ext_ack *extack); 300 + bool devlink_rate_is_node(const struct devlink_rate *devlink_rate); 301 + int devlink_rates_check(struct devlink *devlink, 302 + bool (*rate_filter)(const struct devlink_rate *), 303 + struct netlink_ext_ack *extack); 302 304 303 305 /* Linecards */ 304 306 unsigned int devlink_linecard_index(struct devlink_linecard *linecard);
+7 -6
net/devlink/rate.c
··· 12 12 return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF; 13 13 } 14 14 15 - static inline bool 16 - devlink_rate_is_node(struct devlink_rate *devlink_rate) 15 + bool devlink_rate_is_node(const struct devlink_rate *devlink_rate) 17 16 { 18 17 return devlink_rate->type == DEVLINK_RATE_TYPE_NODE; 19 18 } ··· 687 688 return err; 688 689 } 689 690 690 - int devlink_rate_nodes_check(struct devlink *devlink, u16 mode, 691 - struct netlink_ext_ack *extack) 691 + int devlink_rates_check(struct devlink *devlink, 692 + bool (*rate_filter)(const struct devlink_rate *), 693 + struct netlink_ext_ack *extack) 692 694 { 693 695 struct devlink_rate *devlink_rate; 694 696 695 697 list_for_each_entry(devlink_rate, &devlink->rate_list, list) 696 - if (devlink_rate_is_node(devlink_rate)) { 697 - NL_SET_ERR_MSG(extack, "Rate node(s) exists."); 698 + if (!rate_filter || rate_filter(devlink_rate)) { 699 + if (extack) 700 + NL_SET_ERR_MSG(extack, "Rate node(s) exists."); 698 701 return -EBUSY; 699 702 } 700 703 return 0;