nfp: bpf: allow receiving perf events on data queues
authorJakub Kicinski <jakub.kicinski@netronome.com>
Thu, 26 Jul 2018 02:53:33 +0000 (19:53 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 27 Jul 2018 05:14:35 +0000 (07:14 +0200)
Control queue is fairly low latency, and requires SKB allocations,
which means we can't even reach 0.5Msps with perf events.  Allow
perf events to be delivered to data queues.  This allows us to not
only use multiple queues, but also receive and deliver to user space
more than 5Msps per queue (Xeon E5-2630 v4 2.20GHz, no retpolines).

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
drivers/net/ethernet/netronome/nfp/bpf/cmsg.c
drivers/net/ethernet/netronome/nfp/bpf/main.c
drivers/net/ethernet/netronome/nfp/bpf/main.h

index 0a89b53962aaae86432bf74d236b5023ceae4bb3..1946291bf4fdd8d810138181fb639dd8af6410e4 100644 (file)
@@ -468,3 +468,21 @@ err_unlock:
 err_free:
        dev_kfree_skb_any(skb);
 }
+
+void
+nfp_bpf_ctrl_msg_rx_raw(struct nfp_app *app, const void *data, unsigned int len)
+{
+       struct nfp_app_bpf *bpf = app->priv;
+       const struct cmsg_hdr *hdr = data;
+
+       if (unlikely(len < sizeof(struct cmsg_reply_map_simple))) {
+               cmsg_warn(bpf, "cmsg drop - too short %d!\n", len);
+               return;
+       }
+
+       if (hdr->type == CMSG_TYPE_BPF_EVENT)
+               nfp_bpf_event_output(bpf, data, len);
+       else
+               cmsg_warn(bpf, "cmsg drop - msg type %d with raw buffer!\n",
+                         hdr->type);
+}
index 994d2b756fe16881380f78f67628d546b14967ee..192e88981fb23d58b79dbd2fe2847bd10f58f0b6 100644 (file)
@@ -490,6 +490,7 @@ const struct nfp_app_type app_bpf = {
        .vnic_free      = nfp_bpf_vnic_free,
 
        .ctrl_msg_rx    = nfp_bpf_ctrl_msg_rx,
+       .ctrl_msg_rx_raw        = nfp_bpf_ctrl_msg_rx_raw,
 
        .setup_tc       = nfp_bpf_setup_tc,
        .bpf            = nfp_ndo_bpf,
index e25d3c0c7e4306fe0ce9252bd85935e41761b3bb..017e0ae5e7364c5939f85840ec92cc59e21c870b 100644 (file)
@@ -505,4 +505,7 @@ int nfp_bpf_event_output(struct nfp_app_bpf *bpf, const void *data,
                         unsigned int len);
 
 void nfp_bpf_ctrl_msg_rx(struct nfp_app *app, struct sk_buff *skb);
+void
+nfp_bpf_ctrl_msg_rx_raw(struct nfp_app *app, const void *data,
+                       unsigned int len);
 #endif