Thread (219 messages) flat view 219 messages, 14 authors, 2021-02-05

Re: [RFC PATCHv2 bpf-next 1/2] xdp: add a new helper for dev map multicast support

From: Hangbin Liu <hidden>
Date: 2020-05-08 08:54:12
Also in: bpf

On Wed, May 06, 2020 at 12:00:08PM +0200, Toke Høiland-Jørgensen wrote:
quoted
No, I haven't test the performance. Do you have any suggestions about how
to test it? I'd like to try forwarding pkts to 10+ ports. But I don't know
how to test the throughput. I don't think netperf or iperf supports
this.
What I usually do when benchmarking XDP_REDIRECT is to just use pktgen
(samples/pktgen in the kernel source tree) on another machine,
specifically, like this:

./pktgen_sample03_burst_single_flow.sh  -i enp1s0f1 -d 10.70.2.2 -m ec:0d:9a:db:11:35 -t 4  -s 64

(adjust iface, IP and MAC address to your system, of course). That'll
flood the target machine with small UDP packets. On that machine, I then
run the 'xdp_redirect_map' program from samples/bpf. The bpf program
used by that sample will update an internal counter for every packet,
and the userspace prints it out, which gives you the performance (in
PPS). So just modifying that sample to using your new multicast helper
(and comparing it to regular REDIRECT to a single device) would be a
first approximation of a performance test.
Thanks for this method. I will update the sample and do some more tests.
You could do something like:

bool first = true;
for (;;) {

[...]

           if (!first) {
   		nxdpf = xdpf_clone(xdpf);
   		if (unlikely(!nxdpf))
   			return -ENOMEM;
   		bq_enqueue(dev, nxdpf, dev_rx);
           } else {
   		bq_enqueue(dev, xdpf, dev_rx);
   		first = false;
           }
}

/* didn't find anywhere to forward to, free buf */
if (first)
   xdp_return_frame_rx_napi(xdpf);
I think the first xdpf will be consumed by the driver and the later
xdpf_clone() will failed, won't it?

How about just do a xdp_return_frame_rx_napi(xdpf) after all nxdpf enqueue?
quoted
@@ -3534,6 +3539,8 @@ int xdp_do_redirect(struct net_device *dev, struct
xdp_buff *xdp,
                  struct bpf_prog *xdp_prog)
 {
      struct bpf_redirect_info *ri = this_cpu_ptr(&bpf_redirect_info);
+     bool exclude_ingress = !!(ri->flags & BPF_F_EXCLUDE_INGRESS);
+     struct bpf_map *ex_map = READ_ONCE(ri->ex_map);
I don't think you need the READ_ONCE here since there's already one
below?
BTW, I forgot to ask, why we don't need the READ_ONCE for ex_map?
I though the map and ex_map are two different pointers.
quoted
      struct bpf_map *map = READ_ONCE(ri->map);
Thanks
Hangbin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help