On Sat, Oct 12, 2019 at 6:52 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > On Thu, Oct 10, 2019 at 1:12 AM Magnus Karlsson > <magnus.karlsson@xxxxxxxxx> wrote: > > > > Added sections on all the bind flags, libbpf, all the setsockopts and > > all the getsockopts. Also updated the document to reflect the latest > > features and to correct some spelling errors. > > > > Signed-off-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > > thanks for the update. Overall looks good. > Few nits below: Will fix all your comments and send out a v2. Thanks: Magnus > > +What socket will then a packet arrive on? This is decided by the XDP > > +program. Put all the sockets in the XSK_MAP and just indicate which > > +index in the array you would like to send each packet to. A simple > > +round-robin example of distributing packets is shown below: > > + > > +.. code-block:: c > > + > > + #define KBUILD_MODNAME "af_xdp_example" > > what is this for? > It's not a kernel module. > > > + #include <uapi/linux/bpf.h> > > why 'uapi' ? It should use only user space headers. > > > + #include "bpf_helpers.h" > > + > > + #define MAX_SOCKS 16 > > + > > + struct bpf_map_def SEC("maps") xsks_map = { > > + .type = BPF_MAP_TYPE_XSKMAP, > > + .key_size = sizeof(int), > > + .value_size = sizeof(int), > > + .max_entries = MAX_SOCKS, > > + }; > > Could you switch to BTF defined maps? > libbpf will forever support old style as well, > but documentation should point to the latest. > > > + > > + struct bpf_map_def SEC("maps") rr_map = { > > + .type = BPF_MAP_TYPE_PERCPU_ARRAY, > > + .key_size = sizeof(int), > > + .value_size = sizeof(unsigned int), > > + .max_entries = 1, > > + }; > > + > > + SEC("xdp_sock") int xdp_sock_prog(struct xdp_md *ctx) > > + { > > + int key = 0, idx; > > + unsigned int *rr; > > + > > + rr = bpf_map_lookup_elem(&rr_map, &key); > > + if (!rr) > > + return XDP_ABORTED; > > + > > + *rr = (*rr + 1) & (MAX_SOCKS - 1); > > + idx = *rr; > > + > > + return bpf_redirect_map(&xsks_map, idx, 0); > > + } > > + > > + char _license[] SEC("license") = "GPL"; > > Above sample doesn't use gpl-only helpers. Why add above line? > > > +.. code-block:: c > > + > > + if (xsk_ring_prod__needs_wakeup(&my_tx_ring)) > > + sendto(xsk_socket__fd(xsk_handle), NULL, 0, MSG_DONTWAIT, NULL, 0); > > + > > +I.e., only use the syscall if the flag is set. > > + > > +We recommend that you always enable this mode as it can lead to > > +magnitudes better performance if you run the application and the > > +driver on the same core and somewhat better performance even if you > > +use different cores for the application and the kernel driver, as it > > +reduces the number of syscalls needed for the TX path. > > "magnitudes better performance"? Is it really at least 20 times better? > > > -Naive ring dequeue and enqueue could look like this:: > > +Naive ring dequeue and enqueue could look like this: > > lol. That's a good typo.