summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-08-18 16:18:47 -0700
committerDavid S. Miller <davem@davemloft.net>2017-08-18 16:18:47 -0700
commitbd1cc1a72981fb2846ea69a28407675d6d87fe50 (patch)
tree77e091a3b5de3c55433947ec41891ba2b1e52019 /net
parent3de42f5617dca6d2e5c8bbc4a07b4cfe270f8764 (diff)
parent4c03bdd7b5c084c3c6973cb2419edac5363c051f (diff)
downloadlwn-bd1cc1a72981fb2846ea69a28407675d6d87fe50.tar.gz
lwn-bd1cc1a72981fb2846ea69a28407675d6d87fe50.zip
Merge branch 'xdp-adjust-xdp-redirect-tracepoint'
Jesper Dangaard Brouer says: ==================== xdp: adjust xdp redirect tracepoint 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. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/core/filter.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/net/core/filter.c b/net/core/filter.c
index 0f4df86d936a..fa2115695037 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2535,14 +2535,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();
@@ -2552,7 +2554,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;
}
@@ -2562,6 +2564,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);
@@ -2570,12 +2573,14 @@ int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp,
ri->ifindex = 0;
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);