ipoib_rx.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
  2. /*
  3. * Copyright(c) 2020 Intel Corporation.
  4. *
  5. */
  6. #include "netdev.h"
  7. #include "ipoib.h"
  8. #define HFI1_IPOIB_SKB_PAD ((NET_SKB_PAD) + (NET_IP_ALIGN))
  9. static void copy_ipoib_buf(struct sk_buff *skb, void *data, int size)
  10. {
  11. skb_checksum_none_assert(skb);
  12. skb->protocol = *((__be16 *)data);
  13. skb_put_data(skb, data, size);
  14. skb->mac_header = HFI1_IPOIB_PSEUDO_LEN;
  15. skb_pull(skb, HFI1_IPOIB_ENCAP_LEN);
  16. }
  17. static struct sk_buff *prepare_frag_skb(struct napi_struct *napi, int size)
  18. {
  19. struct sk_buff *skb;
  20. int skb_size = SKB_DATA_ALIGN(size + HFI1_IPOIB_SKB_PAD);
  21. void *frag;
  22. skb_size += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
  23. skb_size = SKB_DATA_ALIGN(skb_size);
  24. frag = napi_alloc_frag(skb_size);
  25. if (unlikely(!frag))
  26. return napi_alloc_skb(napi, size);
  27. skb = build_skb(frag, skb_size);
  28. if (unlikely(!skb)) {
  29. skb_free_frag(frag);
  30. return NULL;
  31. }
  32. skb_reserve(skb, HFI1_IPOIB_SKB_PAD);
  33. return skb;
  34. }
  35. struct sk_buff *hfi1_ipoib_prepare_skb(struct hfi1_netdev_rxq *rxq,
  36. int size, void *data)
  37. {
  38. struct napi_struct *napi = &rxq->napi;
  39. int skb_size = size + HFI1_IPOIB_ENCAP_LEN;
  40. struct sk_buff *skb;
  41. /*
  42. * For smaller(4k + skb overhead) allocations we will go using
  43. * napi cache. Otherwise we will try to use napi frag cache.
  44. */
  45. if (size <= SKB_WITH_OVERHEAD(PAGE_SIZE))
  46. skb = napi_alloc_skb(napi, skb_size);
  47. else
  48. skb = prepare_frag_skb(napi, skb_size);
  49. if (unlikely(!skb))
  50. return NULL;
  51. copy_ipoib_buf(skb, data, size);
  52. return skb;
  53. }
  54. int hfi1_ipoib_rxq_init(struct net_device *netdev)
  55. {
  56. struct hfi1_ipoib_dev_priv *ipoib_priv = hfi1_ipoib_priv(netdev);
  57. struct hfi1_devdata *dd = ipoib_priv->dd;
  58. int ret;
  59. ret = hfi1_netdev_rx_init(dd);
  60. if (ret)
  61. return ret;
  62. hfi1_init_aip_rsm(dd);
  63. return ret;
  64. }
  65. void hfi1_ipoib_rxq_deinit(struct net_device *netdev)
  66. {
  67. struct hfi1_ipoib_dev_priv *ipoib_priv = hfi1_ipoib_priv(netdev);
  68. struct hfi1_devdata *dd = ipoib_priv->dd;
  69. hfi1_deinit_aip_rsm(dd);
  70. hfi1_netdev_rx_destroy(dd);
  71. }