i40e XDP - inform user if MTU exceeds rx_buf_len when loading program

Message ID CAH1YEqHzsuUETUi-P6c75bp1ThNfWAiE4m+wqKW3PXpsgoUJ-Q@mail.gmail.com
State New
Headers show
Series
  • i40e XDP - inform user if MTU exceeds rx_buf_len when loading program
Related show

Commit Message

Garrett K Jan. 25, 2019, 8:48 p.m.
Hi,

A coworker reached out to me after updating distributions on a lab machine.
A previously-working eBFP/XDP program suddenly stopped working, reporting
"invalid argument" when attempting to load it with iproute2.

write(2, "RTNETLINK answers: Invalid argum"..., 36RTNETLINK answers:
Invalid argument

It looks like their MTU was somehow set to 9000 after the update. Reducing
the MTU allowed the program to load.

I _think_ that error was coming from i40e_main.c:i40e_xdp_setup(). If
that's the indeed true, and if it's possible, it might be helpful to bubble
an error message back up to the user. Maybe something like this?

for this report.

Cheers,

Garrett Kuchta

Comments

Björn Töpel Feb. 14, 2019, 7:06 a.m. | #1
On Fri, 25 Jan 2019 at 21:48, Garrett K <gkuchta@gmail.com> wrote:
>
> Hi,
>
> A coworker reached out to me after updating distributions on a lab machine. A previously-working eBFP/XDP program suddenly stopped working, reporting "invalid argument" when attempting to load it with iproute2.
>
> write(2, "RTNETLINK answers: Invalid argum"..., 36RTNETLINK answers: Invalid argument
>
> It looks like their MTU was somehow set to 9000 after the update. Reducing the MTU allowed the program to load.
>
> I _think_ that error was coming from i40e_main.c:i40e_xdp_setup(). If that's the indeed true, and if it's possible, it might be helpful to bubble an error message back up to the user. Maybe something like this?
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index f52e2c46e6a7..134ecbbbb84f 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -11872,8 +11872,11 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi,
>         int i;
>
>         /* Don't allow frames that span over multiple buffers */
> -       if (frame_size > vsi->rx_buf_len)
> +       if (frame_size > vsi->rx_buf_len) {
> +               netdev_warn(vsi->netdev, "Frame size %d exceeds rx_buf_len %d; reduce device MTU.\n",
> +                       frame_size, vsi->rx_buf_len);
>                 return -EINVAL;
> +       }
>

Garrett, apologies for the slow get-back.

Indeed, XDP does not currently support all MTUs. Logging the cause of
might be a good idea, but I'd prefer if errors like this were passed
as an "netlink extended ACK report" i.e. via netlink instead of the
kernel ring. This requires more plumbing though.

Other Intel drivers, e.g. ixgbe, has even more XDP constraints and
should probably be reviewed as well.


Cheers,
Björn

> Thank you for the consideration, and apologies if this isn't the right list for this report.
>
> Cheers,
>
> Garrett Kuchta
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan@osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan

Patch

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index f52e2c46e6a7..134ecbbbb84f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -11872,8 +11872,11 @@  static int i40e_xdp_setup(struct i40e_vsi *vsi,
        int i;

        /* Don't allow frames that span over multiple buffers */
-       if (frame_size > vsi->rx_buf_len)
+       if (frame_size > vsi->rx_buf_len) {
+               netdev_warn(vsi->netdev, "Frame size %d exceeds rx_buf_len
%d; reduce device MTU.\n",
+                       frame_size, vsi->rx_buf_len);
                return -EINVAL;
+       }

Thank you for the consideration, and apologies if this isn't the right list