* [PATCH 0/2] xdp: adjust xdp redirect tracepoint
@ 2017-08-17 16:22 Jesper Dangaard Brouer
2017-08-17 16:22 ` [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors Jesper Dangaard Brouer
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Jesper Dangaard Brouer @ 2017-08-17 16:22 UTC (permalink / raw)
To: netdev; +Cc: John Fastabend, Jesper Dangaard Brouer
Working on streamlining the tracepoints for XDP. The eBPF programs
and XDP have no flow-control or queueing. Investigating using
tracepoint to provide a feedback on XDP_REDIRECT xmit overflow events.
---
Jesper Dangaard Brouer (2):
ixgbe: change ndo_xdp_xmit return code on xmit errors
xdp: adjust xdp redirect tracepoint to include return error code
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +-
include/trace/events/xdp.h | 11 +++++++----
net/core/filter.c | 19 ++++++++++++-------
3 files changed, 20 insertions(+), 12 deletions(-)
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors 2017-08-17 16:22 [PATCH 0/2] xdp: adjust xdp redirect tracepoint Jesper Dangaard Brouer @ 2017-08-17 16:22 ` Jesper Dangaard Brouer 2017-08-17 18:32 ` John Fastabend 2017-08-17 16:22 ` [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code Jesper Dangaard Brouer 2017-08-18 23:19 ` [PATCH 0/2] xdp: adjust xdp redirect tracepoint David Miller 2 siblings, 1 reply; 10+ messages in thread From: Jesper Dangaard Brouer @ 2017-08-17 16:22 UTC (permalink / raw) To: netdev; +Cc: John Fastabend, Jesper Dangaard Brouer Use errno -ENOSPC ("No space left on device") when the XDP xmit have no space left on the TX ring buffer, instead of -ENOMEM. Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> --- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index f9fd8d8f1bef..017cd5e85c97 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -9860,7 +9860,7 @@ static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_buff *xdp) err = ixgbe_xmit_xdp_ring(adapter, xdp); if (err != IXGBE_XDP_TX) - return -ENOMEM; + return -ENOSPC; return 0; } ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors 2017-08-17 16:22 ` [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors Jesper Dangaard Brouer @ 2017-08-17 18:32 ` John Fastabend 0 siblings, 0 replies; 10+ messages in thread From: John Fastabend @ 2017-08-17 18:32 UTC (permalink / raw) To: Jesper Dangaard Brouer, netdev On 08/17/2017 09:22 AM, Jesper Dangaard Brouer wrote: > Use errno -ENOSPC ("No space left on device") when the XDP xmit > have no space left on the TX ring buffer, instead of -ENOMEM. > > Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> > --- > Seems like an improvement to me. You could also potentially distinguish between DMA mapping errors and descriptor overrun but likely not needed. Acked-by: John Fastabend <john.fastabend@gmail.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-17 16:22 [PATCH 0/2] xdp: adjust xdp redirect tracepoint Jesper Dangaard Brouer 2017-08-17 16:22 ` [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors Jesper Dangaard Brouer @ 2017-08-17 16:22 ` Jesper Dangaard Brouer 2017-08-17 18:46 ` John Fastabend 2017-08-18 23:19 ` [PATCH 0/2] xdp: adjust xdp redirect tracepoint David Miller 2 siblings, 1 reply; 10+ messages in thread From: Jesper Dangaard Brouer @ 2017-08-17 16:22 UTC (permalink / raw) To: netdev; +Cc: John Fastabend, Jesper Dangaard Brouer The return error code need to be included in the tracepoint xdp:xdp_redirect, else its not possible to distinguish successful or failed XDP_REDIRECT transmits. XDP have no queuing mechanism. Thus, it is fairly easily to overrun a NIC transmit queue. The eBPF program invoking helpers (bpf_redirect or bpf_redirect_map) to redirect a packet doesn't get any feedback whether the packet was actually transmitted. Info on failed transmits in the tracepoint xdp:xdp_redirect, is interesting as this opens for providing a feedback-loop to the receiving XDP program. Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> --- include/trace/events/xdp.h | 11 +++++++---- net/core/filter.c | 19 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/trace/events/xdp.h b/include/trace/events/xdp.h index 7b1eb7b4be41..0e42e69f773b 100644 --- a/include/trace/events/xdp.h +++ b/include/trace/events/xdp.h @@ -53,15 +53,16 @@ TRACE_EVENT(xdp_redirect, TP_PROTO(const struct net_device *from, const struct net_device *to, - const struct bpf_prog *xdp, u32 act), + const struct bpf_prog *xdp, u32 act, int err), - TP_ARGS(from, to, xdp, act), + TP_ARGS(from, to, xdp, act, err), TP_STRUCT__entry( __string(name_from, from->name) __string(name_to, to->name) __array(u8, prog_tag, 8) __field(u32, act) + __field(int, err) ), TP_fast_assign( @@ -70,12 +71,14 @@ TRACE_EVENT(xdp_redirect, __assign_str(name_from, from->name); __assign_str(name_to, to->name); __entry->act = act; + __entry->err = err; ), - TP_printk("prog=%s from=%s to=%s action=%s", + TP_printk("prog=%s from=%s to=%s action=%s err=%d", __print_hex_str(__entry->prog_tag, 8), __get_str(name_from), __get_str(name_to), - __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB)) + __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), + __entry->err) ); #endif /* _TRACE_XDP_H */ diff --git a/net/core/filter.c b/net/core/filter.c index 5afe3ac191ec..70c9631da7f2 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2496,14 +2496,16 @@ int xdp_do_redirect_map(struct net_device *dev, struct xdp_buff *xdp, struct bpf_map *map = ri->map; u32 index = ri->ifindex; struct net_device *fwd; - int err = -EINVAL; + int err; ri->ifindex = 0; ri->map = NULL; fwd = __dev_map_lookup_elem(map, index); - if (!fwd) + if (!fwd) { + err = -EINVAL; goto out; + } if (ri->map_to_flush && (ri->map_to_flush != map)) xdp_do_flush_map(); @@ -2513,7 +2515,7 @@ int xdp_do_redirect_map(struct net_device *dev, struct xdp_buff *xdp, ri->map_to_flush = map; out: - trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT); + trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT, err); return err; } @@ -2523,6 +2525,7 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, struct redirect_info *ri = this_cpu_ptr(&redirect_info); struct net_device *fwd; u32 index = ri->ifindex; + int err; if (ri->map) return xdp_do_redirect_map(dev, xdp, xdp_prog); @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, ri->map = NULL; if (unlikely(!fwd)) { bpf_warn_invalid_xdp_redirect(index); - return -EINVAL; + err = -EINVAL; + goto out; } - trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT); - - return __bpf_tx_xdp(fwd, NULL, xdp, 0); + err = __bpf_tx_xdp(fwd, NULL, xdp, 0); +out: + trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT, err); + return err; } EXPORT_SYMBOL_GPL(xdp_do_redirect); ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-17 16:22 ` [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code Jesper Dangaard Brouer @ 2017-08-17 18:46 ` John Fastabend 2017-08-17 19:28 ` Jesper Dangaard Brouer 0 siblings, 1 reply; 10+ messages in thread From: John Fastabend @ 2017-08-17 18:46 UTC (permalink / raw) To: Jesper Dangaard Brouer, netdev On 08/17/2017 09:22 AM, Jesper Dangaard Brouer wrote: > The return error code need to be included in the tracepoint > xdp:xdp_redirect, else its not possible to distinguish successful or > failed XDP_REDIRECT transmits. > > XDP have no queuing mechanism. Thus, it is fairly easily to overrun a > NIC transmit queue. The eBPF program invoking helpers (bpf_redirect > or bpf_redirect_map) to redirect a packet doesn't get any feedback > whether the packet was actually transmitted. > > Info on failed transmits in the tracepoint xdp:xdp_redirect, is > interesting as this opens for providing a feedback-loop to the > receiving XDP program. > > Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> > --- [...] > @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, > ri->map = NULL; > if (unlikely(!fwd)) { > bpf_warn_invalid_xdp_redirect(index); > - return -EINVAL; > + err = -EINVAL; > + goto out; It doesn't look like there is a check in trace_xdp_redirect to avoid dereferencing a NULL fwd pointer here (*to in trace code path). Did I miss something? > } > > - trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT); > - > - return __bpf_tx_xdp(fwd, NULL, xdp, 0); > + err = __bpf_tx_xdp(fwd, NULL, xdp, 0); > +out: > + trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT, err); > + return err; > } > EXPORT_SYMBOL_GPL(xdp_do_redirect); > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-17 18:46 ` John Fastabend @ 2017-08-17 19:28 ` Jesper Dangaard Brouer 2017-08-17 19:43 ` John Fastabend 0 siblings, 1 reply; 10+ messages in thread From: Jesper Dangaard Brouer @ 2017-08-17 19:28 UTC (permalink / raw) To: John Fastabend; +Cc: netdev, brouer On Thu, 17 Aug 2017 11:46:10 -0700 John Fastabend <john.fastabend@gmail.com> wrote: > On 08/17/2017 09:22 AM, Jesper Dangaard Brouer wrote: > > The return error code need to be included in the tracepoint > > xdp:xdp_redirect, else its not possible to distinguish successful or > > failed XDP_REDIRECT transmits. > > > > XDP have no queuing mechanism. Thus, it is fairly easily to overrun a > > NIC transmit queue. The eBPF program invoking helpers (bpf_redirect > > or bpf_redirect_map) to redirect a packet doesn't get any feedback > > whether the packet was actually transmitted. > > > > Info on failed transmits in the tracepoint xdp:xdp_redirect, is > > interesting as this opens for providing a feedback-loop to the > > receiving XDP program. > > > > Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> > > --- > > [...] > > > @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, > > ri->map = NULL; > > if (unlikely(!fwd)) { > > bpf_warn_invalid_xdp_redirect(index); > > - return -EINVAL; > > + err = -EINVAL; > > + goto out; > > It doesn't look like there is a check in trace_xdp_redirect to > avoid dereferencing a NULL fwd pointer here (*to in trace code > path). Did I miss something? Nice that you spotted this in your review, but the __string() macro used in trace code already takes case of this, see output: xdp:xdp_redirect: prog=39cf08f65683838a from=ixgbe2 to=(null) action=REDIRECT err=-22 > > } > > > > - trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT); > > - > > - return __bpf_tx_xdp(fwd, NULL, xdp, 0); > > + err = __bpf_tx_xdp(fwd, NULL, xdp, 0); > > +out: > > + trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT, err); > > + return err; > > } > > EXPORT_SYMBOL_GPL(xdp_do_redirect); -- Best regards, Jesper Dangaard Brouer MSc.CS, Principal Kernel Engineer at Red Hat LinkedIn: http://www.linkedin.com/in/brouer ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-17 19:28 ` Jesper Dangaard Brouer @ 2017-08-17 19:43 ` John Fastabend 2017-08-18 12:29 ` Jesper Dangaard Brouer 0 siblings, 1 reply; 10+ messages in thread From: John Fastabend @ 2017-08-17 19:43 UTC (permalink / raw) To: Jesper Dangaard Brouer; +Cc: netdev On 08/17/2017 12:28 PM, Jesper Dangaard Brouer wrote: > > On Thu, 17 Aug 2017 11:46:10 -0700 John Fastabend <john.fastabend@gmail.com> wrote: > >> On 08/17/2017 09:22 AM, Jesper Dangaard Brouer wrote: >>> The return error code need to be included in the tracepoint >>> xdp:xdp_redirect, else its not possible to distinguish successful or >>> failed XDP_REDIRECT transmits. >>> >>> XDP have no queuing mechanism. Thus, it is fairly easily to overrun a >>> NIC transmit queue. The eBPF program invoking helpers (bpf_redirect >>> or bpf_redirect_map) to redirect a packet doesn't get any feedback >>> whether the packet was actually transmitted. >>> >>> Info on failed transmits in the tracepoint xdp:xdp_redirect, is >>> interesting as this opens for providing a feedback-loop to the >>> receiving XDP program. >>> >>> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com> >>> --- >> >> [...] >> >>> @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, >>> ri->map = NULL; >>> if (unlikely(!fwd)) { >>> bpf_warn_invalid_xdp_redirect(index); I think we should drop the warn_invalid now that we have a tracepoint. The tracepoint is much nicer for debugging vs a warning for what might be a valid case depending on xdp program. >>> - return -EINVAL; >>> + err = -EINVAL; >>> + goto out; >> >> It doesn't look like there is a check in trace_xdp_redirect to >> avoid dereferencing a NULL fwd pointer here (*to in trace code >> path). Did I miss something? > > Nice that you spotted this in your review, but the __string() macro > used in trace code already takes case of this, see output: > > xdp:xdp_redirect: prog=39cf08f65683838a from=ixgbe2 to=(null) action=REDIRECT err=-22 Great thanks. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-17 19:43 ` John Fastabend @ 2017-08-18 12:29 ` Jesper Dangaard Brouer 2017-08-18 12:38 ` Daniel Borkmann 0 siblings, 1 reply; 10+ messages in thread From: Jesper Dangaard Brouer @ 2017-08-18 12:29 UTC (permalink / raw) To: John Fastabend; +Cc: netdev, brouer On Thu, 17 Aug 2017 12:43:18 -0700 John Fastabend <john.fastabend@gmail.com> wrote: > >>> @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, > >>> ri->map = NULL; > >>> if (unlikely(!fwd)) { > >>> bpf_warn_invalid_xdp_redirect(index); > > I think we should drop the warn_invalid now that we have a tracepoint. > The tracepoint is much nicer for debugging vs a warning for what might > be a valid case depending on xdp program. I agree. I'll do that in a follow up patch. I'll likely remove the bpf_warn_invalid_xdp_redirect() function completely. We also have bpf_warn_invalid_xdp_action() but that might be relevant to keep around(?). -- Best regards, Jesper Dangaard Brouer MSc.CS, Principal Kernel Engineer at Red Hat LinkedIn: http://www.linkedin.com/in/brouer ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code 2017-08-18 12:29 ` Jesper Dangaard Brouer @ 2017-08-18 12:38 ` Daniel Borkmann 0 siblings, 0 replies; 10+ messages in thread From: Daniel Borkmann @ 2017-08-18 12:38 UTC (permalink / raw) To: Jesper Dangaard Brouer, John Fastabend; +Cc: netdev On 08/18/2017 02:29 PM, Jesper Dangaard Brouer wrote: > On Thu, 17 Aug 2017 12:43:18 -0700 > John Fastabend <john.fastabend@gmail.com> wrote: > >>>>> @@ -2532,12 +2535,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp, >>>>> ri->map = NULL; >>>>> if (unlikely(!fwd)) { >>>>> bpf_warn_invalid_xdp_redirect(index); >> >> I think we should drop the warn_invalid now that we have a tracepoint. >> The tracepoint is much nicer for debugging vs a warning for what might >> be a valid case depending on xdp program. > > I agree. I'll do that in a follow up patch. I'll likely remove the > bpf_warn_invalid_xdp_redirect() function completely. +1 > We also have bpf_warn_invalid_xdp_action() but that might be relevant > to keep around(?). Keeping this is fine, imo. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/2] xdp: adjust xdp redirect tracepoint 2017-08-17 16:22 [PATCH 0/2] xdp: adjust xdp redirect tracepoint Jesper Dangaard Brouer 2017-08-17 16:22 ` [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors Jesper Dangaard Brouer 2017-08-17 16:22 ` [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code Jesper Dangaard Brouer @ 2017-08-18 23:19 ` David Miller 2 siblings, 0 replies; 10+ messages in thread From: David Miller @ 2017-08-18 23:19 UTC (permalink / raw) To: brouer; +Cc: netdev, john.fastabend From: Jesper Dangaard Brouer <brouer@redhat.com> Date: Thu, 17 Aug 2017 18:22:27 +0200 > Working on streamlining the tracepoints for XDP. The eBPF programs > and XDP have no flow-control or queueing. Investigating using > tracepoint to provide a feedback on XDP_REDIRECT xmit overflow events. Series applied, thanks. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-08-18 23:19 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-08-17 16:22 [PATCH 0/2] xdp: adjust xdp redirect tracepoint Jesper Dangaard Brouer 2017-08-17 16:22 ` [PATCH 1/2] ixgbe: change ndo_xdp_xmit return code on xmit errors Jesper Dangaard Brouer 2017-08-17 18:32 ` John Fastabend 2017-08-17 16:22 ` [PATCH 2/2] xdp: adjust xdp redirect tracepoint to include return error code Jesper Dangaard Brouer 2017-08-17 18:46 ` John Fastabend 2017-08-17 19:28 ` Jesper Dangaard Brouer 2017-08-17 19:43 ` John Fastabend 2017-08-18 12:29 ` Jesper Dangaard Brouer 2017-08-18 12:38 ` Daniel Borkmann 2017-08-18 23:19 ` [PATCH 0/2] xdp: adjust xdp redirect tracepoint David Miller
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.