aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-07-21 01:07:24 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-21 01:07:24 -0400
commit1c137ef48662904ba83812de94dce01f99b24f0c (patch)
tree200e2c322ef0863e1940ee08af5ae1d38947877e
parentf67fe5c80ba09edeca7f3d05800382cca89bc1d5 (diff)
parentd9094bda5c985d1f9da66e9e3fd6323b49dee44d (diff)
Merge branch 'xdp-cleanups'
Brenden Blanco says: ==================== misc cleanups for xdp This addresses several of the non-blocking comments left over from the xdp patch set. See individual patches for details. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c6
-rw-r--r--net/core/rtnetlink.c4
-rw-r--r--samples/bpf/xdp1_kern.c12
-rw-r--r--samples/bpf/xdp2_kern.c14
4 files changed, 21 insertions, 15 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 11d88c817137..a02dec6fb256 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -535,9 +535,11 @@ void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
535{ 535{
536 struct mlx4_en_dev *mdev = priv->mdev; 536 struct mlx4_en_dev *mdev = priv->mdev;
537 struct mlx4_en_rx_ring *ring = *pring; 537 struct mlx4_en_rx_ring *ring = *pring;
538 struct bpf_prog *old_prog;
538 539
539 if (ring->xdp_prog) 540 old_prog = READ_ONCE(ring->xdp_prog);
540 bpf_prog_put(ring->xdp_prog); 541 if (old_prog)
542 bpf_prog_put(old_prog);
541 mlx4_free_hwq_res(mdev->dev, &ring->wqres, size * stride + TXBB_SIZE); 543 mlx4_free_hwq_res(mdev->dev, &ring->wqres, size * stride + TXBB_SIZE);
542 vfree(ring->rx_info); 544 vfree(ring->rx_info);
543 ring->rx_info = NULL; 545 ring->rx_info = NULL;
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index eba2b8260dbd..189cc78c77eb 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2109,6 +2109,10 @@ static int do_setlink(const struct sk_buff *skb,
2109 if (err < 0) 2109 if (err < 0)
2110 goto errout; 2110 goto errout;
2111 2111
2112 if (xdp[IFLA_XDP_ATTACHED]) {
2113 err = -EINVAL;
2114 goto errout;
2115 }
2112 if (xdp[IFLA_XDP_FD]) { 2116 if (xdp[IFLA_XDP_FD]) {
2113 err = dev_change_xdp_fd(dev, 2117 err = dev_change_xdp_fd(dev,
2114 nla_get_s32(xdp[IFLA_XDP_FD])); 2118 nla_get_s32(xdp[IFLA_XDP_FD]));
diff --git a/samples/bpf/xdp1_kern.c b/samples/bpf/xdp1_kern.c
index e7dd8ac40d12..219742106bfd 100644
--- a/samples/bpf/xdp1_kern.c
+++ b/samples/bpf/xdp1_kern.c
@@ -14,7 +14,7 @@
14#include <linux/ipv6.h> 14#include <linux/ipv6.h>
15#include "bpf_helpers.h" 15#include "bpf_helpers.h"
16 16
17struct bpf_map_def SEC("maps") dropcnt = { 17struct bpf_map_def SEC("maps") rxcnt = {
18 .type = BPF_MAP_TYPE_PERCPU_ARRAY, 18 .type = BPF_MAP_TYPE_PERCPU_ARRAY,
19 .key_size = sizeof(u32), 19 .key_size = sizeof(u32),
20 .value_size = sizeof(long), 20 .value_size = sizeof(long),
@@ -49,7 +49,7 @@ int xdp_prog1(struct xdp_md *ctx)
49 long *value; 49 long *value;
50 u16 h_proto; 50 u16 h_proto;
51 u64 nh_off; 51 u64 nh_off;
52 u32 index; 52 u32 ipproto;
53 53
54 nh_off = sizeof(*eth); 54 nh_off = sizeof(*eth);
55 if (data + nh_off > data_end) 55 if (data + nh_off > data_end)
@@ -77,13 +77,13 @@ int xdp_prog1(struct xdp_md *ctx)
77 } 77 }
78 78
79 if (h_proto == htons(ETH_P_IP)) 79 if (h_proto == htons(ETH_P_IP))
80 index = parse_ipv4(data, nh_off, data_end); 80 ipproto = parse_ipv4(data, nh_off, data_end);
81 else if (h_proto == htons(ETH_P_IPV6)) 81 else if (h_proto == htons(ETH_P_IPV6))
82 index = parse_ipv6(data, nh_off, data_end); 82 ipproto = parse_ipv6(data, nh_off, data_end);
83 else 83 else
84 index = 0; 84 ipproto = 0;
85 85
86 value = bpf_map_lookup_elem(&dropcnt, &index); 86 value = bpf_map_lookup_elem(&rxcnt, &ipproto);
87 if (value) 87 if (value)
88 *value += 1; 88 *value += 1;
89 89
diff --git a/samples/bpf/xdp2_kern.c b/samples/bpf/xdp2_kern.c
index 38fe7e1d0db4..e01288867d15 100644
--- a/samples/bpf/xdp2_kern.c
+++ b/samples/bpf/xdp2_kern.c
@@ -14,7 +14,7 @@
14#include <linux/ipv6.h> 14#include <linux/ipv6.h>
15#include "bpf_helpers.h" 15#include "bpf_helpers.h"
16 16
17struct bpf_map_def SEC("maps") dropcnt = { 17struct bpf_map_def SEC("maps") rxcnt = {
18 .type = BPF_MAP_TYPE_PERCPU_ARRAY, 18 .type = BPF_MAP_TYPE_PERCPU_ARRAY,
19 .key_size = sizeof(u32), 19 .key_size = sizeof(u32),
20 .value_size = sizeof(long), 20 .value_size = sizeof(long),
@@ -65,7 +65,7 @@ int xdp_prog1(struct xdp_md *ctx)
65 long *value; 65 long *value;
66 u16 h_proto; 66 u16 h_proto;
67 u64 nh_off; 67 u64 nh_off;
68 u32 index; 68 u32 ipproto;
69 69
70 nh_off = sizeof(*eth); 70 nh_off = sizeof(*eth);
71 if (data + nh_off > data_end) 71 if (data + nh_off > data_end)
@@ -93,17 +93,17 @@ int xdp_prog1(struct xdp_md *ctx)
93 } 93 }
94 94
95 if (h_proto == htons(ETH_P_IP)) 95 if (h_proto == htons(ETH_P_IP))
96 index = parse_ipv4(data, nh_off, data_end); 96 ipproto = parse_ipv4(data, nh_off, data_end);
97 else if (h_proto == htons(ETH_P_IPV6)) 97 else if (h_proto == htons(ETH_P_IPV6))
98 index = parse_ipv6(data, nh_off, data_end); 98 ipproto = parse_ipv6(data, nh_off, data_end);
99 else 99 else
100 index = 0; 100 ipproto = 0;
101 101
102 value = bpf_map_lookup_elem(&dropcnt, &index); 102 value = bpf_map_lookup_elem(&rxcnt, &ipproto);
103 if (value) 103 if (value)
104 *value += 1; 104 *value += 1;
105 105
106 if (index == 17) { 106 if (ipproto == IPPROTO_UDP) {
107 swap_src_dst_mac(data); 107 swap_src_dst_mac(data);
108 rc = XDP_TX; 108 rc = XDP_TX;
109 } 109 }