netdev_rx_queue.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <linux/ethtool_netlink.h>
  3. #include <linux/netdevice.h>
  4. #include <net/netdev_lock.h>
  5. #include <net/netdev_queues.h>
  6. #include <net/netdev_rx_queue.h>
  7. #include <net/page_pool/memory_provider.h>
  8. #include "dev.h"
  9. #include "page_pool_priv.h"
  10. /* See also page_pool_is_unreadable() */
  11. bool netif_rxq_has_unreadable_mp(struct net_device *dev, int idx)
  12. {
  13. struct netdev_rx_queue *rxq = __netif_get_rx_queue(dev, idx);
  14. return !!rxq->mp_params.mp_ops;
  15. }
  16. EXPORT_SYMBOL(netif_rxq_has_unreadable_mp);
  17. static int netdev_rx_queue_reconfig(struct net_device *dev,
  18. unsigned int rxq_idx,
  19. struct netdev_queue_config *qcfg_old,
  20. struct netdev_queue_config *qcfg_new)
  21. {
  22. struct netdev_rx_queue *rxq = __netif_get_rx_queue(dev, rxq_idx);
  23. const struct netdev_queue_mgmt_ops *qops = dev->queue_mgmt_ops;
  24. void *new_mem, *old_mem;
  25. int err;
  26. if (!qops || !qops->ndo_queue_stop || !qops->ndo_queue_mem_free ||
  27. !qops->ndo_queue_mem_alloc || !qops->ndo_queue_start)
  28. return -EOPNOTSUPP;
  29. netdev_assert_locked(dev);
  30. new_mem = kvzalloc(qops->ndo_queue_mem_size, GFP_KERNEL);
  31. if (!new_mem)
  32. return -ENOMEM;
  33. old_mem = kvzalloc(qops->ndo_queue_mem_size, GFP_KERNEL);
  34. if (!old_mem) {
  35. err = -ENOMEM;
  36. goto err_free_new_mem;
  37. }
  38. err = qops->ndo_queue_mem_alloc(dev, qcfg_new, new_mem, rxq_idx);
  39. if (err)
  40. goto err_free_old_mem;
  41. err = page_pool_check_memory_provider(dev, rxq);
  42. if (err)
  43. goto err_free_new_queue_mem;
  44. if (netif_running(dev)) {
  45. err = qops->ndo_queue_stop(dev, old_mem, rxq_idx);
  46. if (err)
  47. goto err_free_new_queue_mem;
  48. err = qops->ndo_queue_start(dev, qcfg_new, new_mem, rxq_idx);
  49. if (err)
  50. goto err_start_queue;
  51. } else {
  52. swap(new_mem, old_mem);
  53. }
  54. qops->ndo_queue_mem_free(dev, old_mem);
  55. kvfree(old_mem);
  56. kvfree(new_mem);
  57. return 0;
  58. err_start_queue:
  59. /* Restarting the queue with old_mem should be successful as we haven't
  60. * changed any of the queue configuration, and there is not much we can
  61. * do to recover from a failure here.
  62. *
  63. * WARN if we fail to recover the old rx queue, and at least free
  64. * old_mem so we don't also leak that.
  65. */
  66. if (qops->ndo_queue_start(dev, qcfg_old, old_mem, rxq_idx)) {
  67. WARN(1,
  68. "Failed to restart old queue in error path. RX queue %d may be unhealthy.",
  69. rxq_idx);
  70. qops->ndo_queue_mem_free(dev, old_mem);
  71. }
  72. err_free_new_queue_mem:
  73. qops->ndo_queue_mem_free(dev, new_mem);
  74. err_free_old_mem:
  75. kvfree(old_mem);
  76. err_free_new_mem:
  77. kvfree(new_mem);
  78. return err;
  79. }
  80. int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx)
  81. {
  82. struct netdev_queue_config qcfg;
  83. netdev_queue_config(dev, rxq_idx, &qcfg);
  84. return netdev_rx_queue_reconfig(dev, rxq_idx, &qcfg, &qcfg);
  85. }
  86. EXPORT_SYMBOL_NS_GPL(netdev_rx_queue_restart, "NETDEV_INTERNAL");
  87. int __net_mp_open_rxq(struct net_device *dev, unsigned int rxq_idx,
  88. const struct pp_memory_provider_params *p,
  89. struct netlink_ext_ack *extack)
  90. {
  91. const struct netdev_queue_mgmt_ops *qops = dev->queue_mgmt_ops;
  92. struct netdev_queue_config qcfg[2];
  93. struct netdev_rx_queue *rxq;
  94. int ret;
  95. if (!qops)
  96. return -EOPNOTSUPP;
  97. if (rxq_idx >= dev->real_num_rx_queues) {
  98. NL_SET_ERR_MSG(extack, "rx queue index out of range");
  99. return -ERANGE;
  100. }
  101. rxq_idx = array_index_nospec(rxq_idx, dev->real_num_rx_queues);
  102. if (dev->cfg->hds_config != ETHTOOL_TCP_DATA_SPLIT_ENABLED) {
  103. NL_SET_ERR_MSG(extack, "tcp-data-split is disabled");
  104. return -EINVAL;
  105. }
  106. if (dev->cfg->hds_thresh) {
  107. NL_SET_ERR_MSG(extack, "hds-thresh is not zero");
  108. return -EINVAL;
  109. }
  110. if (dev_xdp_prog_count(dev)) {
  111. NL_SET_ERR_MSG(extack, "unable to custom memory provider to device with XDP program attached");
  112. return -EEXIST;
  113. }
  114. if (p->rx_page_size && !(qops->supported_params & QCFG_RX_PAGE_SIZE)) {
  115. NL_SET_ERR_MSG(extack, "device does not support: rx_page_size");
  116. return -EOPNOTSUPP;
  117. }
  118. rxq = __netif_get_rx_queue(dev, rxq_idx);
  119. if (rxq->mp_params.mp_ops) {
  120. NL_SET_ERR_MSG(extack, "designated queue already memory provider bound");
  121. return -EEXIST;
  122. }
  123. #ifdef CONFIG_XDP_SOCKETS
  124. if (rxq->pool) {
  125. NL_SET_ERR_MSG(extack, "designated queue already in use by AF_XDP");
  126. return -EBUSY;
  127. }
  128. #endif
  129. netdev_queue_config(dev, rxq_idx, &qcfg[0]);
  130. rxq->mp_params = *p;
  131. ret = netdev_queue_config_validate(dev, rxq_idx, &qcfg[1], extack);
  132. if (ret)
  133. goto err_clear_mp;
  134. ret = netdev_rx_queue_reconfig(dev, rxq_idx, &qcfg[0], &qcfg[1]);
  135. if (ret)
  136. goto err_clear_mp;
  137. return 0;
  138. err_clear_mp:
  139. memset(&rxq->mp_params, 0, sizeof(rxq->mp_params));
  140. return ret;
  141. }
  142. int net_mp_open_rxq(struct net_device *dev, unsigned int rxq_idx,
  143. struct pp_memory_provider_params *p)
  144. {
  145. int ret;
  146. netdev_lock(dev);
  147. ret = __net_mp_open_rxq(dev, rxq_idx, p, NULL);
  148. netdev_unlock(dev);
  149. return ret;
  150. }
  151. void __net_mp_close_rxq(struct net_device *dev, unsigned int ifq_idx,
  152. const struct pp_memory_provider_params *old_p)
  153. {
  154. struct netdev_queue_config qcfg[2];
  155. struct netdev_rx_queue *rxq;
  156. int err;
  157. if (WARN_ON_ONCE(ifq_idx >= dev->real_num_rx_queues))
  158. return;
  159. rxq = __netif_get_rx_queue(dev, ifq_idx);
  160. /* Callers holding a netdev ref may get here after we already
  161. * went thru shutdown via dev_memory_provider_uninstall().
  162. */
  163. if (dev->reg_state > NETREG_REGISTERED &&
  164. !rxq->mp_params.mp_ops)
  165. return;
  166. if (WARN_ON_ONCE(rxq->mp_params.mp_ops != old_p->mp_ops ||
  167. rxq->mp_params.mp_priv != old_p->mp_priv))
  168. return;
  169. netdev_queue_config(dev, ifq_idx, &qcfg[0]);
  170. memset(&rxq->mp_params, 0, sizeof(rxq->mp_params));
  171. netdev_queue_config(dev, ifq_idx, &qcfg[1]);
  172. err = netdev_rx_queue_reconfig(dev, ifq_idx, &qcfg[0], &qcfg[1]);
  173. WARN_ON(err && err != -ENETDOWN);
  174. }
  175. void net_mp_close_rxq(struct net_device *dev, unsigned ifq_idx,
  176. struct pp_memory_provider_params *old_p)
  177. {
  178. netdev_lock(dev);
  179. __net_mp_close_rxq(dev, ifq_idx, old_p);
  180. netdev_unlock(dev);
  181. }