Message ID | 20250214223829.1195855-1-joshwash@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | gve: set xdp redirect target only when it is available | expand |
Hello, This patch is meant to be destined to the net tree, I forgot to add the prefix when generating the patch. Please disregard this patch; I will post a new version soon. My apologies, Josh Washington On Fri, Feb 14, 2025 at 2:38 PM <joshwash@google.com> wrote: > > From: Joshua Washington <joshwash@google.com> > > Before this patch the NETDEV_XDP_ACT_NDO_XMIT XDP feature flag is set by > default as part of driver initialization, and is never cleared. However, > this flag differs from others in that it is used as an indicator for > whether the driver is ready to perform the ndo_xdp_xmit operation as > part of an XDP_REDIRECT. Kernel helpers > xdp_features_(set|clear)_redirect_target exist to convey this meaning. > > This patch ensures that the netdev is only reported as a redirect target > when XDP queues exist to forward traffic. > > Fixes: 39a7f4aa3e4a ("gve: Add XDP REDIRECT support for GQI-QPL format") > Cc: stable@vger.kernel.org > Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com> > Reviewed-by: Jeroen de Borst <jeroendb@google.com> > Signed-off-by: Joshua Washington <joshwash@google.com> > --- > drivers/net/ethernet/google/gve/gve.h | 10 ++++++++++ > drivers/net/ethernet/google/gve/gve_main.c | 6 +++++- > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h > index 8167cc5fb0df..78d2a19593d1 100644 > --- a/drivers/net/ethernet/google/gve/gve.h > +++ b/drivers/net/ethernet/google/gve/gve.h > @@ -1116,6 +1116,16 @@ static inline u32 gve_xdp_tx_start_queue_id(struct gve_priv *priv) > return gve_xdp_tx_queue_id(priv, 0); > } > > +static inline bool gve_supports_xdp_xmit(struct gve_priv *priv) > +{ > + switch (priv->queue_format) { > + case GVE_GQI_QPL_FORMAT: > + return true; > + default: > + return false; > + } > +} > + > /* gqi napi handler defined in gve_main.c */ > int gve_napi_poll(struct napi_struct *napi, int budget); > > diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c > index 533e659b15b3..92237fb0b60c 100644 > --- a/drivers/net/ethernet/google/gve/gve_main.c > +++ b/drivers/net/ethernet/google/gve/gve_main.c > @@ -1903,6 +1903,8 @@ static void gve_turndown(struct gve_priv *priv) > /* Stop tx queues */ > netif_tx_disable(priv->dev); > > + xdp_features_clear_redirect_target(priv->dev); > + > gve_clear_napi_enabled(priv); > gve_clear_report_stats(priv); > > @@ -1972,6 +1974,9 @@ static void gve_turnup(struct gve_priv *priv) > napi_schedule(&block->napi); > } > > + if (priv->num_xdp_queues && gve_supports_xdp_xmit(priv)) > + xdp_features_set_redirect_target(priv->dev, false); > + > gve_set_napi_enabled(priv); > } > > @@ -2246,7 +2251,6 @@ static void gve_set_netdev_xdp_features(struct gve_priv *priv) > if (priv->queue_format == GVE_GQI_QPL_FORMAT) { > xdp_features = NETDEV_XDP_ACT_BASIC; > xdp_features |= NETDEV_XDP_ACT_REDIRECT; > - xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; > xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY; > } else { > xdp_features = 0; > -- > 2.48.1.601.g30ceb7b040-goog >
diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h index 8167cc5fb0df..78d2a19593d1 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1116,6 +1116,16 @@ static inline u32 gve_xdp_tx_start_queue_id(struct gve_priv *priv) return gve_xdp_tx_queue_id(priv, 0); } +static inline bool gve_supports_xdp_xmit(struct gve_priv *priv) +{ + switch (priv->queue_format) { + case GVE_GQI_QPL_FORMAT: + return true; + default: + return false; + } +} + /* gqi napi handler defined in gve_main.c */ int gve_napi_poll(struct napi_struct *napi, int budget); diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c index 533e659b15b3..92237fb0b60c 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -1903,6 +1903,8 @@ static void gve_turndown(struct gve_priv *priv) /* Stop tx queues */ netif_tx_disable(priv->dev); + xdp_features_clear_redirect_target(priv->dev); + gve_clear_napi_enabled(priv); gve_clear_report_stats(priv); @@ -1972,6 +1974,9 @@ static void gve_turnup(struct gve_priv *priv) napi_schedule(&block->napi); } + if (priv->num_xdp_queues && gve_supports_xdp_xmit(priv)) + xdp_features_set_redirect_target(priv->dev, false); + gve_set_napi_enabled(priv); } @@ -2246,7 +2251,6 @@ static void gve_set_netdev_xdp_features(struct gve_priv *priv) if (priv->queue_format == GVE_GQI_QPL_FORMAT) { xdp_features = NETDEV_XDP_ACT_BASIC; xdp_features |= NETDEV_XDP_ACT_REDIRECT; - xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY; } else { xdp_features = 0;