Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cf2e08f authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'nfp-refactor-app-init-and-minor-flower-fixes'



Jakub Kicinski says:

====================
nfp: refactor app init, and minor flower fixes

This series is a part 2 to what went into net as a simpler fix.
In net we simply moved when existing callbacks are invoked to
ensure flower app does not still use representors when lower
netdev has already been destroyed.  In this series we add a
callback to notify apps when vNIC netdevs are fully initialized
and they are about to be destroyed.  This allows flower to spawn
representors at the right time, while keeping the start/stop
callbacks for what they are intended to be used - FW initialization
over control channel.

Patch 4 improves drop monitor interaction and patch 5 changes
the default Kconfig selection of flower offload.  Patch 6 fixes
locking around representor updates which got lost in net-next.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 18a4ded9 9ce4fa54
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ config NFP_APP_FLOWER
	bool "NFP4000/NFP6000 TC Flower offload support"
	bool "NFP4000/NFP6000 TC Flower offload support"
	depends on NFP
	depends on NFP
	depends on NET_SWITCHDEV
	depends on NET_SWITCHDEV
	default y
	---help---
	---help---
	  Enable driver support for TC Flower offload on NFP4000 and NFP6000.
	  Enable driver support for TC Flower offload on NFP4000 and NFP6000.
	  Say Y, if you are planning to make use of TC Flower offload
	  Say Y, if you are planning to make use of TC Flower offload
+5 −5
Original line number Original line Diff line number Diff line
@@ -84,7 +84,7 @@ static const char *nfp_bpf_extra_cap(struct nfp_app *app, struct nfp_net *nn)
}
}


static int
static int
nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
nfp_bpf_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
{
{
	struct nfp_net_bpf_priv *priv;
	struct nfp_net_bpf_priv *priv;
	int ret;
	int ret;
@@ -106,14 +106,14 @@ nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
	setup_timer(&priv->rx_filter_stats_timer,
	setup_timer(&priv->rx_filter_stats_timer,
		    nfp_net_filter_stats_timer, (unsigned long)nn);
		    nfp_net_filter_stats_timer, (unsigned long)nn);


	ret = nfp_app_nic_vnic_init(app, nn, id);
	ret = nfp_app_nic_vnic_alloc(app, nn, id);
	if (ret)
	if (ret)
		kfree(priv);
		kfree(priv);


	return ret;
	return ret;
}
}


static void nfp_bpf_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
static void nfp_bpf_vnic_free(struct nfp_app *app, struct nfp_net *nn)
{
{
	if (nn->dp.bpf_offload_xdp)
	if (nn->dp.bpf_offload_xdp)
		nfp_bpf_xdp_offload(app, nn, NULL);
		nfp_bpf_xdp_offload(app, nn, NULL);
@@ -149,8 +149,8 @@ const struct nfp_app_type app_bpf = {


	.extra_cap	= nfp_bpf_extra_cap,
	.extra_cap	= nfp_bpf_extra_cap,


	.vnic_init	= nfp_bpf_vnic_init,
	.vnic_alloc	= nfp_bpf_vnic_alloc,
	.vnic_clean	= nfp_bpf_vnic_clean,
	.vnic_free	= nfp_bpf_vnic_free,


	.setup_tc	= nfp_bpf_setup_tc,
	.setup_tc	= nfp_bpf_setup_tc,
	.tc_busy	= nfp_bpf_tc_busy,
	.tc_busy	= nfp_bpf_tc_busy,
+8 −3
Original line number Original line Diff line number Diff line
@@ -141,12 +141,14 @@ nfp_flower_cmsg_portmod_rx(struct nfp_app *app, struct sk_buff *skb)
	msg = nfp_flower_cmsg_get_data(skb);
	msg = nfp_flower_cmsg_get_data(skb);
	link = msg->info & NFP_FLOWER_CMSG_PORTMOD_INFO_LINK;
	link = msg->info & NFP_FLOWER_CMSG_PORTMOD_INFO_LINK;


	rtnl_lock();
	rcu_read_lock();
	rcu_read_lock();
	netdev = nfp_app_repr_get(app, be32_to_cpu(msg->portnum));
	netdev = nfp_app_repr_get(app, be32_to_cpu(msg->portnum));
	rcu_read_unlock();
	if (!netdev) {
	if (!netdev) {
		nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
		nfp_flower_cmsg_warn(app, "ctrl msg for unknown port 0x%08x\n",
				     be32_to_cpu(msg->portnum));
				     be32_to_cpu(msg->portnum));
		rcu_read_unlock();
		rtnl_unlock();
		return;
		return;
	}
	}


@@ -161,7 +163,7 @@ nfp_flower_cmsg_portmod_rx(struct nfp_app *app, struct sk_buff *skb)
	} else {
	} else {
		netif_carrier_off(netdev);
		netif_carrier_off(netdev);
	}
	}
	rcu_read_unlock();
	rtnl_unlock();
}
}


static void
static void
@@ -189,8 +191,11 @@ nfp_flower_cmsg_process_one_rx(struct nfp_app *app, struct sk_buff *skb)
	default:
	default:
		nfp_flower_cmsg_warn(app, "Cannot handle invalid repr control type %u\n",
		nfp_flower_cmsg_warn(app, "Cannot handle invalid repr control type %u\n",
				     type);
				     type);
		goto out;
	}
	}


	dev_consume_skb_any(skb);
	return;
out:
out:
	dev_kfree_skb_any(skb);
	dev_kfree_skb_any(skb);
}
}
@@ -203,7 +208,7 @@ void nfp_flower_cmsg_process_rx(struct work_struct *work)
	priv = container_of(work, struct nfp_flower_priv, cmsg_work);
	priv = container_of(work, struct nfp_flower_priv, cmsg_work);


	while ((skb = skb_dequeue(&priv->cmsg_skbs)))
	while ((skb = skb_dequeue(&priv->cmsg_skbs)))
		nfp_flower_cmsg_process_one_rx(priv->nn->app, skb);
		nfp_flower_cmsg_process_one_rx(priv->app, skb);
}
}


void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
+64 −29
Original line number Original line Diff line number Diff line
@@ -127,6 +127,11 @@ nfp_flower_repr_netdev_stop(struct nfp_app *app, struct nfp_repr *repr)


static void nfp_flower_sriov_disable(struct nfp_app *app)
static void nfp_flower_sriov_disable(struct nfp_app *app)
{
{
	struct nfp_flower_priv *priv = app->priv;

	if (!priv->nn)
		return;

	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_VF);
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_VF);
}
}


@@ -203,18 +208,16 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app,


static int nfp_flower_sriov_enable(struct nfp_app *app, int num_vfs)
static int nfp_flower_sriov_enable(struct nfp_app *app, int num_vfs)
{
{
	struct nfp_flower_priv *priv = app->priv;

	if (!priv->nn)
		return 0;

	return nfp_flower_spawn_vnic_reprs(app,
	return nfp_flower_spawn_vnic_reprs(app,
					   NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF,
					   NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF,
					   NFP_REPR_TYPE_VF, num_vfs);
					   NFP_REPR_TYPE_VF, num_vfs);
}
}


static void nfp_flower_stop(struct nfp_app *app)
{
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PF);
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PHYS_PORT);

}

static int
static int
nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
{
{
@@ -300,31 +303,14 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
	return err;
	return err;
}
}


static int nfp_flower_start(struct nfp_app *app)
static int nfp_flower_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
{
	int err;

	err = nfp_flower_spawn_phy_reprs(app, app->priv);
	if (err)
		return err;

	return nfp_flower_spawn_vnic_reprs(app,
					   NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF,
					   NFP_REPR_TYPE_PF, 1);
}

static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn,
				 unsigned int id)
				 unsigned int id)
{
{
	struct nfp_flower_priv *priv = app->priv;

	if (id > 0) {
	if (id > 0) {
		nfp_warn(app->cpp, "FlowerNIC doesn't support more than one data vNIC\n");
		nfp_warn(app->cpp, "FlowerNIC doesn't support more than one data vNIC\n");
		goto err_invalid_port;
		goto err_invalid_port;
	}
	}


	priv->nn = nn;

	eth_hw_addr_random(nn->dp.netdev);
	eth_hw_addr_random(nn->dp.netdev);
	netif_keep_dst(nn->dp.netdev);
	netif_keep_dst(nn->dp.netdev);


@@ -335,6 +321,55 @@ static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn,
	return PTR_ERR_OR_ZERO(nn->port);
	return PTR_ERR_OR_ZERO(nn->port);
}
}


static void nfp_flower_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
{
	struct nfp_flower_priv *priv = app->priv;

	if (app->pf->num_vfs)
		nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_VF);
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PF);
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PHYS_PORT);

	priv->nn = NULL;
}

static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn)
{
	struct nfp_flower_priv *priv = app->priv;
	int err;

	priv->nn = nn;

	err = nfp_flower_spawn_phy_reprs(app, app->priv);
	if (err)
		goto err_clear_nn;

	err = nfp_flower_spawn_vnic_reprs(app,
					  NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF,
					  NFP_REPR_TYPE_PF, 1);
	if (err)
		goto err_destroy_reprs_phy;

	if (app->pf->num_vfs) {
		err = nfp_flower_spawn_vnic_reprs(app,
						  NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF,
						  NFP_REPR_TYPE_VF,
						  app->pf->num_vfs);
		if (err)
			goto err_destroy_reprs_pf;
	}

	return 0;

err_destroy_reprs_pf:
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PF);
err_destroy_reprs_phy:
	nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_PHYS_PORT);
err_clear_nn:
	priv->nn = NULL;
	return err;
}

static int nfp_flower_init(struct nfp_app *app)
static int nfp_flower_init(struct nfp_app *app)
{
{
	const struct nfp_pf *pf = app->pf;
	const struct nfp_pf *pf = app->pf;
@@ -374,6 +409,7 @@ static int nfp_flower_init(struct nfp_app *app)
		return -ENOMEM;
		return -ENOMEM;


	app->priv = app_priv;
	app->priv = app_priv;
	app_priv->app = app;
	skb_queue_head_init(&app_priv->cmsg_skbs);
	skb_queue_head_init(&app_priv->cmsg_skbs);
	INIT_WORK(&app_priv->cmsg_work, nfp_flower_cmsg_process_rx);
	INIT_WORK(&app_priv->cmsg_work, nfp_flower_cmsg_process_rx);


@@ -410,14 +446,13 @@ const struct nfp_app_type app_flower = {
	.init		= nfp_flower_init,
	.init		= nfp_flower_init,
	.clean		= nfp_flower_clean,
	.clean		= nfp_flower_clean,


	.vnic_alloc	= nfp_flower_vnic_alloc,
	.vnic_init	= nfp_flower_vnic_init,
	.vnic_init	= nfp_flower_vnic_init,
	.vnic_clean	= nfp_flower_vnic_clean,


	.repr_open	= nfp_flower_repr_netdev_open,
	.repr_open	= nfp_flower_repr_netdev_open,
	.repr_stop	= nfp_flower_repr_netdev_stop,
	.repr_stop	= nfp_flower_repr_netdev_stop,


	.start		= nfp_flower_start,
	.stop		= nfp_flower_stop,

	.ctrl_msg_rx	= nfp_flower_cmsg_rx,
	.ctrl_msg_rx	= nfp_flower_cmsg_rx,


	.sriov_enable	= nfp_flower_sriov_enable,
	.sriov_enable	= nfp_flower_sriov_enable,
+2 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,7 @@ struct nfp_fl_stats_id {


/**
/**
 * struct nfp_flower_priv - Flower APP per-vNIC priv data
 * struct nfp_flower_priv - Flower APP per-vNIC priv data
 * @app:		Back pointer to app
 * @nn:			Pointer to vNIC
 * @nn:			Pointer to vNIC
 * @mask_id_seed:	Seed used for mask hash table
 * @mask_id_seed:	Seed used for mask hash table
 * @flower_version:	HW version of flower
 * @flower_version:	HW version of flower
@@ -83,6 +84,7 @@ struct nfp_fl_stats_id {
 * @cmsg_skbs:		List of skbs for control message processing
 * @cmsg_skbs:		List of skbs for control message processing
 */
 */
struct nfp_flower_priv {
struct nfp_flower_priv {
	struct nfp_app *app;
	struct nfp_net *nn;
	struct nfp_net *nn;
	u32 mask_id_seed;
	u32 mask_id_seed;
	u64 flower_version;
	u64 flower_version;
Loading