diff options
author | David S. Miller <davem@davemloft.net> | 2016-07-21 01:07:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-21 01:07:24 -0400 |
commit | 1c137ef48662904ba83812de94dce01f99b24f0c (patch) | |
tree | 200e2c322ef0863e1940ee08af5ae1d38947877e | |
parent | f67fe5c80ba09edeca7f3d05800382cca89bc1d5 (diff) | |
parent | d9094bda5c985d1f9da66e9e3fd6323b49dee44d (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.c | 6 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 4 | ||||
-rw-r--r-- | samples/bpf/xdp1_kern.c | 12 | ||||
-rw-r--r-- | samples/bpf/xdp2_kern.c | 14 |
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 | ||
17 | struct bpf_map_def SEC("maps") dropcnt = { | 17 | struct 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 | ||
17 | struct bpf_map_def SEC("maps") dropcnt = { | 17 | struct 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 | } |