Commit 8d2f518c authored by Michal Swiatkowski's avatar Michal Swiatkowski Committed by Tony Nguyen
Browse files

ice: move devlink locking outside the port creation



In case of subfunction lock will be taken for whole port creation and
removing. Do the same in VF case.

Signed-off-by: default avatarMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Tested-by: default avatarSujai Buvaneswaran <sujai.buvaneswaran@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 639ac8ce
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -794,10 +794,8 @@ int ice_devlink_rate_init_tx_topology(struct devlink *devlink, struct ice_vsi *v

	tc_node = pi->root->children[0];
	mutex_lock(&pi->sched_lock);
	devl_lock(devlink);
	for (i = 0; i < tc_node->num_children; i++)
		ice_traverse_tx_tree(devlink, tc_node->children[i], tc_node, pf);
	devl_unlock(devlink);
	mutex_unlock(&pi->sched_lock);

	return 0;
+2 −2
Original line number Diff line number Diff line
@@ -407,7 +407,7 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
	devlink_port_attrs_set(devlink_port, &attrs);
	devlink = priv_to_devlink(pf);

	err = devlink_port_register(devlink, devlink_port, vsi->idx);
	err = devl_port_register(devlink, devlink_port, vsi->idx);
	if (err) {
		dev_err(dev, "Failed to create devlink port for VF %d, error %d\n",
			vf->vf_id, err);
@@ -426,5 +426,5 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
void ice_devlink_destroy_vf_port(struct ice_vf *vf)
{
	devl_rate_leaf_destroy(&vf->devlink_port);
	devlink_port_unregister(&vf->devlink_port);
	devl_port_unregister(&vf->devlink_port);
}
+7 −2
Original line number Diff line number Diff line
@@ -423,6 +423,7 @@ static void ice_eswitch_start_reprs(struct ice_pf *pf)
int
ice_eswitch_attach(struct ice_pf *pf, struct ice_vf *vf)
{
	struct devlink *devlink = priv_to_devlink(pf);
	struct ice_repr *repr;
	int err;

@@ -437,7 +438,9 @@ ice_eswitch_attach(struct ice_pf *pf, struct ice_vf *vf)

	ice_eswitch_stop_reprs(pf);

	devl_lock(devlink);
	repr = ice_repr_add_vf(vf);
	devl_unlock(devlink);
	if (IS_ERR(repr)) {
		err = PTR_ERR(repr);
		goto err_create_repr;
@@ -460,7 +463,9 @@ ice_eswitch_attach(struct ice_pf *pf, struct ice_vf *vf)
err_xa_alloc:
	ice_eswitch_release_repr(pf, repr);
err_setup_repr:
	devl_lock(devlink);
	ice_repr_rem_vf(repr);
	devl_unlock(devlink);
err_create_repr:
	if (xa_empty(&pf->eswitch.reprs))
		ice_eswitch_disable_switchdev(pf);
@@ -484,6 +489,7 @@ void ice_eswitch_detach(struct ice_pf *pf, struct ice_vf *vf)
		ice_eswitch_disable_switchdev(pf);

	ice_eswitch_release_repr(pf, repr);
	devl_lock(devlink);
	ice_repr_rem_vf(repr);

	if (xa_empty(&pf->eswitch.reprs)) {
@@ -491,12 +497,11 @@ void ice_eswitch_detach(struct ice_pf *pf, struct ice_vf *vf)
		 * no point in keeping the nodes
		 */
		ice_devlink_rate_clear_tx_topology(ice_get_main_vsi(pf));
		devl_lock(devlink);
		devl_rate_nodes_destroy(devlink);
		devl_unlock(devlink);
	} else {
		ice_eswitch_start_reprs(pf);
	}
	devl_unlock(devlink);
}

/**
+0 −2
Original line number Diff line number Diff line
@@ -285,9 +285,7 @@ ice_repr_reg_netdev(struct net_device *netdev)

static void ice_repr_remove_node(struct devlink_port *devlink_port)
{
	devl_lock(devlink_port->devlink);
	devl_rate_leaf_destroy(devlink_port);
	devl_unlock(devlink_port->devlink);
}

/**