vmxnet3_xdp.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Linux driver for VMware's vmxnet3 ethernet NIC.
  4. * Copyright (C) 2008-2023, VMware, Inc. All Rights Reserved.
  5. * Maintained by: pv-drivers@vmware.com
  6. *
  7. */
  8. #include "vmxnet3_int.h"
  9. #include "vmxnet3_xdp.h"
  10. static void
  11. vmxnet3_xdp_exchange_program(struct vmxnet3_adapter *adapter,
  12. struct bpf_prog *prog)
  13. {
  14. rcu_assign_pointer(adapter->xdp_bpf_prog, prog);
  15. }
  16. static inline struct vmxnet3_tx_queue *
  17. vmxnet3_xdp_get_tq(struct vmxnet3_adapter *adapter)
  18. {
  19. struct vmxnet3_tx_queue *tq;
  20. int tq_number;
  21. int cpu;
  22. tq_number = adapter->num_tx_queues;
  23. cpu = smp_processor_id();
  24. if (likely(cpu < tq_number))
  25. tq = &adapter->tx_queue[cpu];
  26. else
  27. tq = &adapter->tx_queue[cpu % tq_number];
  28. return tq;
  29. }
  30. static int
  31. vmxnet3_xdp_set(struct net_device *netdev, struct netdev_bpf *bpf,
  32. struct netlink_ext_ack *extack)
  33. {
  34. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  35. struct bpf_prog *new_bpf_prog = bpf->prog;
  36. struct bpf_prog *old_bpf_prog;
  37. bool need_update;
  38. bool running;
  39. int err;
  40. if (new_bpf_prog && netdev->mtu > VMXNET3_XDP_MAX_MTU) {
  41. NL_SET_ERR_MSG_FMT_MOD(extack, "MTU %u too large for XDP",
  42. netdev->mtu);
  43. return -EOPNOTSUPP;
  44. }
  45. if (adapter->netdev->features & NETIF_F_LRO) {
  46. NL_SET_ERR_MSG_MOD(extack, "LRO is not supported with XDP");
  47. adapter->netdev->features &= ~NETIF_F_LRO;
  48. }
  49. old_bpf_prog = rcu_dereference(adapter->xdp_bpf_prog);
  50. if (!new_bpf_prog && !old_bpf_prog)
  51. return 0;
  52. running = netif_running(netdev);
  53. need_update = !!old_bpf_prog != !!new_bpf_prog;
  54. if (running && need_update)
  55. vmxnet3_quiesce_dev(adapter);
  56. vmxnet3_xdp_exchange_program(adapter, new_bpf_prog);
  57. if (old_bpf_prog)
  58. bpf_prog_put(old_bpf_prog);
  59. if (!running || !need_update)
  60. return 0;
  61. if (new_bpf_prog)
  62. xdp_features_set_redirect_target(netdev, false);
  63. else
  64. xdp_features_clear_redirect_target(netdev);
  65. vmxnet3_reset_dev(adapter);
  66. vmxnet3_rq_destroy_all(adapter);
  67. vmxnet3_adjust_rx_ring_size(adapter);
  68. err = vmxnet3_rq_create_all(adapter);
  69. if (err) {
  70. NL_SET_ERR_MSG_MOD(extack,
  71. "failed to re-create rx queues for XDP.");
  72. return -EOPNOTSUPP;
  73. }
  74. err = vmxnet3_activate_dev(adapter);
  75. if (err) {
  76. NL_SET_ERR_MSG_MOD(extack,
  77. "failed to activate device for XDP.");
  78. return -EOPNOTSUPP;
  79. }
  80. clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);
  81. return 0;
  82. }
  83. /* This is the main xdp call used by kernel to set/unset eBPF program. */
  84. int
  85. vmxnet3_xdp(struct net_device *netdev, struct netdev_bpf *bpf)
  86. {
  87. switch (bpf->command) {
  88. case XDP_SETUP_PROG:
  89. return vmxnet3_xdp_set(netdev, bpf, bpf->extack);
  90. default:
  91. return -EINVAL;
  92. }
  93. return 0;
  94. }
  95. static int
  96. vmxnet3_xdp_xmit_frame(struct vmxnet3_adapter *adapter,
  97. struct xdp_frame *xdpf,
  98. struct vmxnet3_tx_queue *tq, bool dma_map)
  99. {
  100. struct vmxnet3_tx_buf_info *tbi = NULL;
  101. union Vmxnet3_GenericDesc *gdesc;
  102. struct vmxnet3_tx_ctx ctx;
  103. int tx_num_deferred;
  104. struct page *page;
  105. u32 buf_size;
  106. u32 dw2;
  107. spin_lock_irq(&tq->tx_lock);
  108. dw2 = (tq->tx_ring.gen ^ 0x1) << VMXNET3_TXD_GEN_SHIFT;
  109. dw2 |= xdpf->len;
  110. ctx.sop_txd = tq->tx_ring.base + tq->tx_ring.next2fill;
  111. gdesc = ctx.sop_txd;
  112. buf_size = xdpf->len;
  113. tbi = tq->buf_info + tq->tx_ring.next2fill;
  114. if (vmxnet3_cmd_ring_desc_avail(&tq->tx_ring) == 0) {
  115. tq->stats.tx_ring_full++;
  116. spin_unlock_irq(&tq->tx_lock);
  117. return -ENOSPC;
  118. }
  119. tbi->map_type = VMXNET3_MAP_XDP;
  120. if (dma_map) { /* ndo_xdp_xmit */
  121. tbi->dma_addr = dma_map_single(&adapter->pdev->dev,
  122. xdpf->data, buf_size,
  123. DMA_TO_DEVICE);
  124. if (dma_mapping_error(&adapter->pdev->dev, tbi->dma_addr)) {
  125. spin_unlock_irq(&tq->tx_lock);
  126. return -EFAULT;
  127. }
  128. tbi->map_type |= VMXNET3_MAP_SINGLE;
  129. } else { /* XDP buffer from page pool */
  130. page = virt_to_page(xdpf->data);
  131. tbi->dma_addr = page_pool_get_dma_addr(page) +
  132. (xdpf->data - (void *)xdpf);
  133. dma_sync_single_for_device(&adapter->pdev->dev,
  134. tbi->dma_addr, buf_size,
  135. DMA_TO_DEVICE);
  136. }
  137. tbi->xdpf = xdpf;
  138. tbi->len = buf_size;
  139. gdesc = tq->tx_ring.base + tq->tx_ring.next2fill;
  140. WARN_ON_ONCE(gdesc->txd.gen == tq->tx_ring.gen);
  141. gdesc->txd.addr = cpu_to_le64(tbi->dma_addr);
  142. gdesc->dword[2] = cpu_to_le32(dw2);
  143. /* Setup the EOP desc */
  144. gdesc->dword[3] = cpu_to_le32(VMXNET3_TXD_CQ | VMXNET3_TXD_EOP);
  145. gdesc->txd.om = 0;
  146. gdesc->txd.msscof = 0;
  147. gdesc->txd.hlen = 0;
  148. gdesc->txd.ti = 0;
  149. tx_num_deferred = le32_to_cpu(tq->shared->txNumDeferred);
  150. le32_add_cpu(&tq->shared->txNumDeferred, 1);
  151. tx_num_deferred++;
  152. vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring);
  153. /* set the last buf_info for the pkt */
  154. tbi->sop_idx = ctx.sop_txd - tq->tx_ring.base;
  155. dma_wmb();
  156. gdesc->dword[2] = cpu_to_le32(le32_to_cpu(gdesc->dword[2]) ^
  157. VMXNET3_TXD_GEN);
  158. spin_unlock_irq(&tq->tx_lock);
  159. /* No need to handle the case when tx_num_deferred doesn't reach
  160. * threshold. Backend driver at hypervisor side will poll and reset
  161. * tq->shared->txNumDeferred to 0.
  162. */
  163. if (tx_num_deferred >= le32_to_cpu(tq->shared->txThreshold)) {
  164. tq->shared->txNumDeferred = 0;
  165. VMXNET3_WRITE_BAR0_REG(adapter,
  166. VMXNET3_REG_TXPROD + tq->qid * 8,
  167. tq->tx_ring.next2fill);
  168. }
  169. return 0;
  170. }
  171. static int
  172. vmxnet3_xdp_xmit_back(struct vmxnet3_adapter *adapter,
  173. struct xdp_frame *xdpf)
  174. {
  175. struct vmxnet3_tx_queue *tq;
  176. struct netdev_queue *nq;
  177. int err;
  178. tq = vmxnet3_xdp_get_tq(adapter);
  179. if (tq->stopped)
  180. return -ENETDOWN;
  181. nq = netdev_get_tx_queue(adapter->netdev, tq->qid);
  182. __netif_tx_lock(nq, smp_processor_id());
  183. err = vmxnet3_xdp_xmit_frame(adapter, xdpf, tq, false);
  184. __netif_tx_unlock(nq);
  185. return err;
  186. }
  187. /* ndo_xdp_xmit */
  188. int
  189. vmxnet3_xdp_xmit(struct net_device *dev,
  190. int n, struct xdp_frame **frames, u32 flags)
  191. {
  192. struct vmxnet3_adapter *adapter = netdev_priv(dev);
  193. struct vmxnet3_tx_queue *tq;
  194. struct netdev_queue *nq;
  195. int i;
  196. if (unlikely(test_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)))
  197. return -ENETDOWN;
  198. if (unlikely(test_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state)))
  199. return -EINVAL;
  200. tq = vmxnet3_xdp_get_tq(adapter);
  201. if (tq->stopped)
  202. return -ENETDOWN;
  203. nq = netdev_get_tx_queue(adapter->netdev, tq->qid);
  204. __netif_tx_lock(nq, smp_processor_id());
  205. for (i = 0; i < n; i++) {
  206. if (vmxnet3_xdp_xmit_frame(adapter, frames[i], tq, true)) {
  207. tq->stats.xdp_xmit_err++;
  208. break;
  209. }
  210. }
  211. tq->stats.xdp_xmit += i;
  212. __netif_tx_unlock(nq);
  213. return i;
  214. }
  215. static int
  216. vmxnet3_run_xdp(struct vmxnet3_rx_queue *rq, struct xdp_buff *xdp,
  217. struct bpf_prog *prog)
  218. {
  219. struct xdp_frame *xdpf;
  220. struct page *page;
  221. int err;
  222. u32 act;
  223. rq->stats.xdp_packets++;
  224. act = bpf_prog_run_xdp(prog, xdp);
  225. page = virt_to_page(xdp->data_hard_start);
  226. switch (act) {
  227. case XDP_PASS:
  228. return act;
  229. case XDP_REDIRECT:
  230. err = xdp_do_redirect(rq->adapter->netdev, xdp, prog);
  231. if (!err) {
  232. rq->stats.xdp_redirects++;
  233. } else {
  234. rq->stats.xdp_drops++;
  235. page_pool_recycle_direct(rq->page_pool, page);
  236. }
  237. return act;
  238. case XDP_TX:
  239. xdpf = xdp_convert_buff_to_frame(xdp);
  240. if (unlikely(!xdpf ||
  241. vmxnet3_xdp_xmit_back(rq->adapter, xdpf))) {
  242. rq->stats.xdp_drops++;
  243. page_pool_recycle_direct(rq->page_pool, page);
  244. } else {
  245. rq->stats.xdp_tx++;
  246. }
  247. return act;
  248. default:
  249. bpf_warn_invalid_xdp_action(rq->adapter->netdev, prog, act);
  250. fallthrough;
  251. case XDP_ABORTED:
  252. trace_xdp_exception(rq->adapter->netdev, prog, act);
  253. rq->stats.xdp_aborted++;
  254. break;
  255. case XDP_DROP:
  256. rq->stats.xdp_drops++;
  257. break;
  258. }
  259. page_pool_recycle_direct(rq->page_pool, page);
  260. return act;
  261. }
  262. static struct sk_buff *
  263. vmxnet3_build_skb(struct vmxnet3_rx_queue *rq, struct page *page,
  264. const struct xdp_buff *xdp)
  265. {
  266. struct sk_buff *skb;
  267. skb = build_skb(page_address(page), PAGE_SIZE);
  268. if (unlikely(!skb)) {
  269. page_pool_recycle_direct(rq->page_pool, page);
  270. rq->stats.rx_buf_alloc_failure++;
  271. return NULL;
  272. }
  273. /* bpf prog might change len and data position. */
  274. skb_reserve(skb, xdp->data - xdp->data_hard_start);
  275. skb_put(skb, xdp->data_end - xdp->data);
  276. skb_mark_for_recycle(skb);
  277. return skb;
  278. }
  279. /* Handle packets from DataRing. */
  280. int
  281. vmxnet3_process_xdp_small(struct vmxnet3_adapter *adapter,
  282. struct vmxnet3_rx_queue *rq,
  283. void *data, int len,
  284. struct sk_buff **skb_xdp_pass)
  285. {
  286. struct bpf_prog *xdp_prog;
  287. struct xdp_buff xdp;
  288. struct page *page;
  289. int act;
  290. page = page_pool_alloc_pages(rq->page_pool, GFP_ATOMIC);
  291. if (unlikely(!page)) {
  292. rq->stats.rx_buf_alloc_failure++;
  293. return XDP_DROP;
  294. }
  295. xdp_init_buff(&xdp, PAGE_SIZE, &rq->xdp_rxq);
  296. xdp_prepare_buff(&xdp, page_address(page), rq->page_pool->p.offset,
  297. len, false);
  298. xdp_buff_clear_frags_flag(&xdp);
  299. /* Must copy the data because it's at dataring. */
  300. memcpy(xdp.data, data, len);
  301. xdp_prog = rcu_dereference(rq->adapter->xdp_bpf_prog);
  302. if (!xdp_prog) {
  303. act = XDP_PASS;
  304. goto out_skb;
  305. }
  306. act = vmxnet3_run_xdp(rq, &xdp, xdp_prog);
  307. if (act != XDP_PASS)
  308. return act;
  309. out_skb:
  310. *skb_xdp_pass = vmxnet3_build_skb(rq, page, &xdp);
  311. if (!*skb_xdp_pass)
  312. return XDP_DROP;
  313. /* No need to refill. */
  314. return likely(*skb_xdp_pass) ? act : XDP_DROP;
  315. }
  316. int
  317. vmxnet3_process_xdp(struct vmxnet3_adapter *adapter,
  318. struct vmxnet3_rx_queue *rq,
  319. struct Vmxnet3_RxCompDesc *rcd,
  320. struct vmxnet3_rx_buf_info *rbi,
  321. struct Vmxnet3_RxDesc *rxd,
  322. struct sk_buff **skb_xdp_pass)
  323. {
  324. struct bpf_prog *xdp_prog;
  325. dma_addr_t new_dma_addr;
  326. struct xdp_buff xdp;
  327. struct page *page;
  328. void *new_data;
  329. int act;
  330. page = rbi->page;
  331. dma_sync_single_for_cpu(&adapter->pdev->dev,
  332. page_pool_get_dma_addr(page) +
  333. rq->page_pool->p.offset, rbi->len,
  334. page_pool_get_dma_dir(rq->page_pool));
  335. xdp_init_buff(&xdp, PAGE_SIZE, &rq->xdp_rxq);
  336. xdp_prepare_buff(&xdp, page_address(page), rq->page_pool->p.offset,
  337. rcd->len, false);
  338. xdp_buff_clear_frags_flag(&xdp);
  339. xdp_prog = rcu_dereference(rq->adapter->xdp_bpf_prog);
  340. if (!xdp_prog) {
  341. act = XDP_PASS;
  342. goto out_skb;
  343. }
  344. act = vmxnet3_run_xdp(rq, &xdp, xdp_prog);
  345. if (act == XDP_PASS) {
  346. out_skb:
  347. *skb_xdp_pass = vmxnet3_build_skb(rq, page, &xdp);
  348. if (!*skb_xdp_pass)
  349. act = XDP_DROP;
  350. }
  351. new_data = vmxnet3_pp_get_buff(rq->page_pool, &new_dma_addr,
  352. GFP_ATOMIC);
  353. if (!new_data) {
  354. rq->stats.rx_buf_alloc_failure++;
  355. return XDP_DROP;
  356. }
  357. rbi->page = virt_to_page(new_data);
  358. rbi->dma_addr = new_dma_addr;
  359. rxd->addr = cpu_to_le64(rbi->dma_addr);
  360. rxd->len = rbi->len;
  361. return act;
  362. }