netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Quentin Monnet <quentin.monnet@netronome.com>
To: daniel@iogearbox.net, alexei.starovoitov@gmail.com,
	netdev@vger.kernel.org
Cc: oss-drivers@netronome.com, jakub.kicinski@netronome.com
Subject: [PATCH bpf-next v2 04/14] nfp: bpf: don't allow changing MTU above BPF offload limit when active
Date: Wed, 10 Jan 2018 12:25:57 +0000	[thread overview]
Message-ID: <1515587167-1959-5-git-send-email-quentin.monnet@netronome.com> (raw)
In-Reply-To: <1515587167-1959-1-git-send-email-quentin.monnet@netronome.com>

From: Jakub Kicinski <jakub.kicinski@netronome.com>

When BPF offload is active we need may need to restrict the MTU
changes more than just to the limitation of the kernel XDP datapath.
Allow the BPF code to veto a MTU change.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
---
 drivers/net/ethernet/netronome/nfp/bpf/main.c       | 20 ++++++++++++++++++++
 drivers/net/ethernet/netronome/nfp/nfp_app.h        | 13 +++++++++++++
 drivers/net/ethernet/netronome/nfp/nfp_net_common.c |  5 +++++
 drivers/net/ethernet/netronome/nfp/nfp_net_repr.c   |  8 ++++++++
 4 files changed, 46 insertions(+)

diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c
index 4b63167906ca..978086580ca0 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/main.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c
@@ -195,6 +195,24 @@ static bool nfp_bpf_tc_busy(struct nfp_app *app, struct nfp_net *nn)
 }
 
 static int
+nfp_bpf_change_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu)
+{
+	struct nfp_net *nn = netdev_priv(netdev);
+	unsigned int max_mtu;
+
+	if (~nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF)
+		return 0;
+
+	max_mtu = nn_readb(nn, NFP_NET_CFG_BPF_INL_MTU) * 64 - 32;
+	if (new_mtu > max_mtu) {
+		nn_info(nn, "BPF offload active, MTU over %u not supported\n",
+			max_mtu);
+		return -EBUSY;
+	}
+	return 0;
+}
+
+static int
 nfp_bpf_parse_cap_adjust_head(struct nfp_app_bpf *bpf, void __iomem *value,
 			      u32 length)
 {
@@ -311,6 +329,8 @@ const struct nfp_app_type app_bpf = {
 	.init		= nfp_bpf_init,
 	.clean		= nfp_bpf_clean,
 
+	.change_mtu	= nfp_bpf_change_mtu,
+
 	.extra_cap	= nfp_bpf_extra_cap,
 
 	.vnic_alloc	= nfp_bpf_vnic_alloc,
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_app.h b/drivers/net/ethernet/netronome/nfp/nfp_app.h
index 3af1943a8521..e6b59c28c4ca 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_app.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_app.h
@@ -82,6 +82,8 @@ extern const struct nfp_app_type app_flower;
  * @repr_clean:	representor about to be unregistered
  * @repr_open:	representor netdev open callback
  * @repr_stop:	representor netdev stop callback
+ * @change_mtu:	MTU change on a netdev has been requested (veto-only, change
+ *		is not guaranteed to be committed)
  * @start:	start application logic
  * @stop:	stop application logic
  * @ctrl_msg_rx:    control message handler
@@ -120,6 +122,9 @@ struct nfp_app_type {
 	int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr);
 	int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr);
 
+	int (*change_mtu)(struct nfp_app *app, struct net_device *netdev,
+			  int new_mtu);
+
 	int (*start)(struct nfp_app *app);
 	void (*stop)(struct nfp_app *app);
 
@@ -242,6 +247,14 @@ nfp_app_repr_clean(struct nfp_app *app, struct net_device *netdev)
 		app->type->repr_clean(app, netdev);
 }
 
+static inline int
+nfp_app_change_mtu(struct nfp_app *app, struct net_device *netdev, int new_mtu)
+{
+	if (!app || !app->type->change_mtu)
+		return 0;
+	return app->type->change_mtu(app, netdev, new_mtu);
+}
+
 static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
 {
 	app->ctrl = ctrl;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 104d6c520a52..33cbb9b35e68 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -3049,6 +3049,11 @@ static int nfp_net_change_mtu(struct net_device *netdev, int new_mtu)
 {
 	struct nfp_net *nn = netdev_priv(netdev);
 	struct nfp_net_dp *dp;
+	int err;
+
+	err = nfp_app_change_mtu(nn->app, netdev, new_mtu);
+	if (err)
+		return err;
 
 	dp = nfp_net_clone_dp(nn);
 	if (!dp)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
index f50aa119570a..317f87cc3cc6 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
@@ -186,6 +186,13 @@ nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev,
 	return -EINVAL;
 }
 
+static int nfp_repr_change_mtu(struct net_device *netdev, int new_mtu)
+{
+	struct nfp_repr *repr = netdev_priv(netdev);
+
+	return nfp_app_change_mtu(repr->app, netdev, new_mtu);
+}
+
 static netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev)
 {
 	struct nfp_repr *repr = netdev_priv(netdev);
@@ -240,6 +247,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
 	.ndo_open		= nfp_repr_open,
 	.ndo_stop		= nfp_repr_stop,
 	.ndo_start_xmit		= nfp_repr_xmit,
+	.ndo_change_mtu		= nfp_repr_change_mtu,
 	.ndo_get_stats64	= nfp_repr_get_stats64,
 	.ndo_has_offload_stats	= nfp_repr_has_offload_stats,
 	.ndo_get_offload_stats	= nfp_repr_get_offload_stats,
-- 
2.7.4

  parent reply	other threads:[~2018-01-10 12:27 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-10 12:25 [PATCH bpf-next v2 00/14] nfp: bpf: relocations, verifier log, signed jumps and other updates Quentin Monnet
2018-01-10 12:25 ` [PATCH bpf-next v2 01/14] nfp: don't try to register XDP rxq structures on control queues Quentin Monnet
2018-01-10 12:25 ` [PATCH bpf-next v2 02/14] nfp: fix incumbent kdoc warnings Quentin Monnet
2018-01-10 12:25 ` [PATCH bpf-next v2 03/14] nfp: bpf: round up the size of the stack Quentin Monnet
2018-01-10 12:25 ` Quentin Monnet [this message]
2018-01-10 12:25 ` [PATCH bpf-next v2 05/14] nfp: bpf: allow disabling TC offloads when XDP active Quentin Monnet
2018-01-10 12:25 ` [PATCH bpf-next v2 06/14] nfp: bpf: move jump resolution to jit.c Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 07/14] nfp: bpf: add helpers for modifying branch addresses Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 08/14] nfp: bpf: relocate jump targets just before the load Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 09/14] nfp: bpf: don't depend on high order allocations for program image Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 10/14] nfp: bpf: use a large constant in unresolved branches Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 11/14] nfp: hand over to BPF offload app at coarser granularity Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 12/14] nfp: bpf: add signed jump insns Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 13/14] bpf: export function to write into verifier log buffer Quentin Monnet
2018-01-10 12:26 ` [PATCH bpf-next v2 14/14] nfp: bpf: reuse verifier log for debug messages Quentin Monnet
2018-01-10 14:05 ` [PATCH bpf-next v2 00/14] nfp: bpf: relocations, verifier log, signed jumps and other updates Daniel Borkmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1515587167-1959-5-git-send-email-quentin.monnet@netronome.com \
    --to=quentin.monnet@netronome.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=jakub.kicinski@netronome.com \
    --cc=netdev@vger.kernel.org \
    --cc=oss-drivers@netronome.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).