hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/hw/hfi1/sdma.h
....@@ -636,7 +636,10 @@
636636 struct sdma_txreq *tx,
637637 int type,
638638 dma_addr_t addr,
639
- size_t len)
639
+ size_t len,
640
+ void *pinning_ctx,
641
+ void (*ctx_get)(void *),
642
+ void (*ctx_put)(void *))
640643 {
641644 struct sdma_desc *desc = &tx->descp[tx->num_desc];
642645
....@@ -653,6 +656,11 @@
653656 << SDMA_DESC0_PHY_ADDR_SHIFT) |
654657 (((u64)len & SDMA_DESC0_BYTE_COUNT_MASK)
655658 << SDMA_DESC0_BYTE_COUNT_SHIFT);
659
+
660
+ desc->pinning_ctx = pinning_ctx;
661
+ desc->ctx_put = ctx_put;
662
+ if (pinning_ctx && ctx_get)
663
+ ctx_get(pinning_ctx);
656664 }
657665
658666 /* helper to extend txreq */
....@@ -672,14 +680,13 @@
672680 static inline void _sdma_close_tx(struct hfi1_devdata *dd,
673681 struct sdma_txreq *tx)
674682 {
675
- tx->descp[tx->num_desc].qw[0] |=
676
- SDMA_DESC0_LAST_DESC_FLAG;
677
- tx->descp[tx->num_desc].qw[1] |=
678
- dd->default_desc1;
683
+ u16 last_desc = tx->num_desc - 1;
684
+
685
+ tx->descp[last_desc].qw[0] |= SDMA_DESC0_LAST_DESC_FLAG;
686
+ tx->descp[last_desc].qw[1] |= dd->default_desc1;
679687 if (tx->flags & SDMA_TXREQ_F_URGENT)
680
- tx->descp[tx->num_desc].qw[1] |=
681
- (SDMA_DESC1_HEAD_TO_HOST_FLAG |
682
- SDMA_DESC1_INT_REQ_FLAG);
688
+ tx->descp[last_desc].qw[1] |= (SDMA_DESC1_HEAD_TO_HOST_FLAG |
689
+ SDMA_DESC1_INT_REQ_FLAG);
683690 }
684691
685692 static inline int _sdma_txadd_daddr(
....@@ -687,15 +694,20 @@
687694 int type,
688695 struct sdma_txreq *tx,
689696 dma_addr_t addr,
690
- u16 len)
697
+ u16 len,
698
+ void *pinning_ctx,
699
+ void (*ctx_get)(void *),
700
+ void (*ctx_put)(void *))
691701 {
692702 int rval = 0;
693703
694704 make_tx_sdma_desc(
695705 tx,
696706 type,
697
- addr, len);
707
+ addr, len,
708
+ pinning_ctx, ctx_get, ctx_put);
698709 WARN_ON(len > tx->tlen);
710
+ tx->num_desc++;
699711 tx->tlen -= len;
700712 /* special cases for last */
701713 if (!tx->tlen) {
....@@ -707,7 +719,6 @@
707719 _sdma_close_tx(dd, tx);
708720 }
709721 }
710
- tx->num_desc++;
711722 return rval;
712723 }
713724
....@@ -718,6 +729,14 @@
718729 * @page: page to map
719730 * @offset: offset within the page
720731 * @len: length in bytes
732
+ * @pinning_ctx: context to be stored on struct sdma_desc .pinning_ctx. Not
733
+ * added if coalesce buffer is used. E.g. pointer to pinned-page
734
+ * cache entry for the sdma_desc.
735
+ * @ctx_get: optional function to take reference to @pinning_ctx. Not called if
736
+ * @pinning_ctx is NULL.
737
+ * @ctx_put: optional function to release reference to @pinning_ctx after
738
+ * sdma_desc completes. May be called in interrupt context so must
739
+ * not sleep. Not called if @pinning_ctx is NULL.
721740 *
722741 * This is used to add a page/offset/length descriptor.
723742 *
....@@ -732,7 +751,10 @@
732751 struct sdma_txreq *tx,
733752 struct page *page,
734753 unsigned long offset,
735
- u16 len)
754
+ u16 len,
755
+ void *pinning_ctx,
756
+ void (*ctx_get)(void *),
757
+ void (*ctx_put)(void *))
736758 {
737759 dma_addr_t addr;
738760 int rval;
....@@ -756,8 +778,8 @@
756778 return -ENOSPC;
757779 }
758780
759
- return _sdma_txadd_daddr(
760
- dd, SDMA_MAP_PAGE, tx, addr, len);
781
+ return _sdma_txadd_daddr(dd, SDMA_MAP_PAGE, tx, addr, len,
782
+ pinning_ctx, ctx_get, ctx_put);
761783 }
762784
763785 /**
....@@ -791,7 +813,8 @@
791813 return rval;
792814 }
793815
794
- return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len);
816
+ return _sdma_txadd_daddr(dd, SDMA_MAP_NONE, tx, addr, len,
817
+ NULL, NULL, NULL);
795818 }
796819
797820 /**
....@@ -837,8 +860,8 @@
837860 return -ENOSPC;
838861 }
839862
840
- return _sdma_txadd_daddr(
841
- dd, SDMA_MAP_SINGLE, tx, addr, len);
863
+ return _sdma_txadd_daddr(dd, SDMA_MAP_SINGLE, tx, addr, len,
864
+ NULL, NULL, NULL);
842865 }
843866
844867 struct iowait_work;
....@@ -1089,5 +1112,4 @@
10891112 extern uint mod_num_sdma;
10901113
10911114 void sdma_update_lmc(struct hfi1_devdata *dd, u64 mask, u32 lid);
1092
-
10931115 #endif