Commit 622110f2 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

mlxsw: spectrum: Convert callers to use new mirroring API



Previous patch added a work item in the mirroring code that will take
care of updating the active mirroring agents in response to different
events.

Change the mirroring agents update function - mlxsw_sp_span_respin() -
to invoke this work item when called.

Therefore there is no need for callers to schedule a work item
themselves.

Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8e7e6e7
Loading
Loading
Loading
Loading
+5 −24
Original line number Diff line number Diff line
@@ -1002,30 +1002,6 @@ void mlxsw_sp_span_mirror_del(struct mlxsw_sp_port *from, int span_id,
	mlxsw_sp_span_inspected_port_del(from, span_entry, type, bind);
}

void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp)
{
	int i;
	int err;

	ASSERT_RTNL();
	for (i = 0; i < mlxsw_sp->span->entries_count; i++) {
		struct mlxsw_sp_span_entry *curr = &mlxsw_sp->span->entries[i];
		struct mlxsw_sp_span_parms sparms = {NULL};

		if (!curr->ref_count)
			continue;

		err = curr->ops->parms(curr->to_dev, &sparms);
		if (err)
			continue;

		if (memcmp(&sparms, &curr->parms, sizeof(sparms))) {
			mlxsw_sp_span_entry_deconfigure(curr);
			mlxsw_sp_span_entry_configure(mlxsw_sp, curr, sparms);
		}
	}
}

static void mlxsw_sp_span_respin_work(struct work_struct *work)
{
	struct mlxsw_sp_span *span;
@@ -1054,3 +1030,8 @@ static void mlxsw_sp_span_respin_work(struct work_struct *work)
	}
	rtnl_unlock();
}

void mlxsw_sp_span_respin(struct mlxsw_sp *mlxsw_sp)
{
	mlxsw_core_schedule_work(&mlxsw_sp->span->work);
}
+2 −32
Original line number Diff line number Diff line
@@ -1778,36 +1778,6 @@ mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port,
	}
}

struct mlxsw_sp_span_respin_work {
	struct work_struct work;
	struct mlxsw_sp *mlxsw_sp;
};

static void mlxsw_sp_span_respin_work(struct work_struct *work)
{
	struct mlxsw_sp_span_respin_work *respin_work =
		container_of(work, struct mlxsw_sp_span_respin_work, work);

	rtnl_lock();
	mlxsw_sp_span_respin(respin_work->mlxsw_sp);
	rtnl_unlock();
	kfree(respin_work);
}

static void mlxsw_sp_span_respin_schedule(struct mlxsw_sp *mlxsw_sp)
{
	struct mlxsw_sp_span_respin_work *respin_work;

	respin_work = kzalloc(sizeof(*respin_work), GFP_ATOMIC);
	if (!respin_work)
		return;

	INIT_WORK(&respin_work->work, mlxsw_sp_span_respin_work);
	respin_work->mlxsw_sp = mlxsw_sp;

	mlxsw_core_schedule_work(&respin_work->work);
}

static int mlxsw_sp_port_obj_add(struct net_device *dev,
				 const struct switchdev_obj *obj,
				 struct switchdev_trans *trans,
@@ -1829,7 +1799,7 @@ static int mlxsw_sp_port_obj_add(struct net_device *dev,
			 * call for later, so that the respin logic sees the
			 * updated bridge state.
			 */
			mlxsw_sp_span_respin_schedule(mlxsw_sp_port->mlxsw_sp);
			mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
		}
		break;
	case SWITCHDEV_OBJ_ID_PORT_MDB:
@@ -1982,7 +1952,7 @@ static int mlxsw_sp_port_obj_del(struct net_device *dev,
		break;
	}

	mlxsw_sp_span_respin_schedule(mlxsw_sp_port->mlxsw_sp);
	mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);

	return err;
}