On 07/24/2016 06:57 PM, Tom Herbert wrote:
On Tue, Jul 19, 2016 at 2:16 PM, Brenden Blanco <bbla...@plumgrid.com> wrote:
Add support for the BPF_PROG_TYPE_XDP hook in mlx4 driver.
In tc/socket bpf programs, helpers linearize skb fragments as needed
when the program touches the packet data. However, in the pursuit of
speed, XDP programs will not be allowed to use these slower functions,
especially if it involves allocating an skb.
Therefore, disallow MTU settings that would produce a multi-fragment
packet that XDP programs would fail to access. Future enhancements could
be done to increase the allowable MTU.
The xdp program is present as a per-ring data structure, but as of yet
it is not possible to set at that granularity through any ndo.
Signed-off-by: Brenden Blanco <bbla...@plumgrid.com>
[...]
+ if (prog) {
+ prog = bpf_prog_add(prog, priv->rx_ring_num - 1);
+ if (IS_ERR(prog))
+ return PTR_ERR(prog);
+ }
+
+ priv->xdp_ring_num = xdp_ring_num;
+
+ /* This xchg is paired with READ_ONCE in the fast path */
+ for (i = 0; i < priv->rx_ring_num; i++) {
+ old_prog = xchg(&priv->rx_ring[i]->xdp_prog, prog);
This can be done under a lock instead of relying on xchg.
+ if (old_prog)
+ bpf_prog_put(old_prog);
I don't see how this can work. Even after setting the new program, the
old program might still be run (pointer dereferenced before xchg).
Either rcu needs to be used or the queue should stopped and synced
before setting the new program.
It's a strict requirement that all BPF programs must run under RCU.