Every devmem dmabuf binding today hands the page_pool PAGE_SIZE niovs. This caps a single RX descriptor at PAGE_SIZE, burning CPU on buffer churn for large flows. Add a bind-time netlink attribute, NETDEV_A_DMABUF_RX_PAGE_SIZE, that lets userspace request a larger niov size. The value must be a power of two >= PAGE_SIZE. The TX path is changed to always pass PAGE_SIZE. Measurements: Setup: kperf in devmem RX/TX cuda mode, 4 flows, 64 MB messages, 60s, dctcp, num-rx-queues=4, dmabuf-rx/tx-size-mb=2048, 10 runs per niov size, mlx5. CPU Util: niov net sirq % net idle % app sys % app idle % ----- ---------------- ---------------- ---------------- ---------------- 4K 62.38 +/- 8.27 33.40 +/- 7.51 54.15 +/- 10.23 43.67 +/- 10.53 16K 58.91 +/- 5.35 35.23 +/- 5.88 41.05 +/- 8.87 56.42 +/- 9.24 32K 64.12 +/- 0.68 31.09 +/- 1.48 44.54 +/- 3.51 52.63 +/- 3.65 64K 54.69 +/- 5.54 39.67 +/- 5.81 35.47 +/- 3.11 61.97 +/- 3.27 RX app sys % drops ~19% from 4K to 64K. Throughput: niov RX dev Gbps RX flow avg Gbps ----- ---------------- ----------------- 4K 300.63 +/- 53.21 75.16 +/- 13.30 16K 321.35 +/- 28.20 80.34 +/- 7.05 32K 347.63 +/- 2.20 86.91 +/- 0.55 64K 332.11 +/- 14.26 83.03 +/- 3.56 Throughput seems to increase, but the stdev is pretty wide so could just be noise. kperf support (not yet merged): https://github.com/facebookexperimental/kperf/commit/8837577f920876bce6986ec18869ac04439ebcd2
Showing the changes to include/uapi (1 of 8 files). Show all
Unified · Split
| @@ -219,6 +219,7 @@ enum { · 218 unmodified lines | |||
| 219 | NETDEV_A_DMABUF_QUEUES, | 219 | NETDEV_A_DMABUF_QUEUES, |
| 220 | NETDEV_A_DMABUF_FD, | 220 | NETDEV_A_DMABUF_FD, |
| 221 | NETDEV_A_DMABUF_ID, | 221 | NETDEV_A_DMABUF_ID, |
| 222 | NETDEV_A_DMABUF_RX_PAGE_SIZE, | ||
| 222 | 223 | ||
| 223 | __NETDEV_A_DMABUF_MAX, | 224 | __NETDEV_A_DMABUF_MAX, |
| 224 | NETDEV_A_DMABUF_MAX = (__NETDEV_A_DMABUF_MAX - 1) | 225 | NETDEV_A_DMABUF_MAX = (__NETDEV_A_DMABUF_MAX - 1) |