@@ -493,10 +493,54 @@ static inline void *smbdirect_recv_io_payload(struct smbdirect_recv_io *response
493493 return (void * )response -> packet ;
494494}
495495
496+ static struct smbdirect_send_io * smbd_alloc_send_io (struct smbdirect_socket * sc )
497+ {
498+ struct smbdirect_send_io * msg ;
499+
500+ msg = mempool_alloc (sc -> send_io .mem .pool , GFP_KERNEL );
501+ if (!msg )
502+ return ERR_PTR (- ENOMEM );
503+ msg -> socket = sc ;
504+ INIT_LIST_HEAD (& msg -> sibling_list );
505+ msg -> num_sge = 0 ;
506+
507+ return msg ;
508+ }
509+
510+ static void smbd_free_send_io (struct smbdirect_send_io * msg )
511+ {
512+ struct smbdirect_socket * sc = msg -> socket ;
513+ size_t i ;
514+
515+ /*
516+ * The list needs to be empty!
517+ * The caller should take care of it.
518+ */
519+ WARN_ON_ONCE (!list_empty (& msg -> sibling_list ));
520+
521+ /*
522+ * Note we call ib_dma_unmap_page(), even if some sges are mapped using
523+ * ib_dma_map_single().
524+ *
525+ * The difference between _single() and _page() only matters for the
526+ * ib_dma_map_*() case.
527+ *
528+ * For the ib_dma_unmap_*() case it does not matter as both take the
529+ * dma_addr_t and dma_unmap_single_attrs() is just an alias to
530+ * dma_unmap_page_attrs().
531+ */
532+ for (i = 0 ; i < msg -> num_sge ; i ++ )
533+ ib_dma_unmap_page (sc -> ib .dev ,
534+ msg -> sge [i ].addr ,
535+ msg -> sge [i ].length ,
536+ DMA_TO_DEVICE );
537+
538+ mempool_free (msg , sc -> send_io .mem .pool );
539+ }
540+
496541/* Called when a RDMA send is done */
497542static void send_done (struct ib_cq * cq , struct ib_wc * wc )
498543{
499- int i ;
500544 struct smbdirect_send_io * request =
501545 container_of (wc -> wr_cqe , struct smbdirect_send_io , cqe );
502546 struct smbdirect_socket * sc = request -> socket ;
@@ -505,12 +549,8 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
505549 log_rdma_send (INFO , "smbdirect_send_io 0x%p completed wc->status=%s\n" ,
506550 request , ib_wc_status_msg (wc -> status ));
507551
508- for (i = 0 ; i < request -> num_sge ; i ++ )
509- ib_dma_unmap_single (sc -> ib .dev ,
510- request -> sge [i ].addr ,
511- request -> sge [i ].length ,
512- DMA_TO_DEVICE );
513- mempool_free (request , sc -> send_io .mem .pool );
552+ /* Note this frees wc->wr_cqe, but not wc */
553+ smbd_free_send_io (request );
514554 lcredits += 1 ;
515555
516556 if (wc -> status != IB_WC_SUCCESS || wc -> opcode != IB_WC_SEND ) {
@@ -963,15 +1003,13 @@ static int smbd_post_send_negotiate_req(struct smbdirect_socket *sc)
9631003{
9641004 struct smbdirect_socket_parameters * sp = & sc -> parameters ;
9651005 struct ib_send_wr send_wr ;
966- int rc = - ENOMEM ;
1006+ int rc ;
9671007 struct smbdirect_send_io * request ;
9681008 struct smbdirect_negotiate_req * packet ;
9691009
970- request = mempool_alloc (sc -> send_io .mem .pool , GFP_KERNEL );
971- if (!request )
972- return rc ;
973-
974- request -> socket = sc ;
1010+ request = smbd_alloc_send_io (sc );
1011+ if (IS_ERR (request ))
1012+ return PTR_ERR (request );
9751013
9761014 packet = smbdirect_send_io_payload (request );
9771015 packet -> min_version = cpu_to_le16 (SMBDIRECT_V1 );
@@ -983,14 +1021,14 @@ static int smbd_post_send_negotiate_req(struct smbdirect_socket *sc)
9831021 packet -> max_fragmented_size =
9841022 cpu_to_le32 (sp -> max_fragmented_recv_size );
9851023
986- request -> num_sge = 1 ;
9871024 request -> sge [0 ].addr = ib_dma_map_single (
9881025 sc -> ib .dev , (void * )packet ,
9891026 sizeof (* packet ), DMA_TO_DEVICE );
9901027 if (ib_dma_mapping_error (sc -> ib .dev , request -> sge [0 ].addr )) {
9911028 rc = - EIO ;
9921029 goto dma_mapping_failed ;
9931030 }
1031+ request -> num_sge = 1 ;
9941032
9951033 request -> sge [0 ].length = sizeof (* packet );
9961034 request -> sge [0 ].lkey = sc -> ib .pd -> local_dma_lkey ;
@@ -1020,13 +1058,11 @@ static int smbd_post_send_negotiate_req(struct smbdirect_socket *sc)
10201058 /* if we reach here, post send failed */
10211059 log_rdma_send (ERR , "ib_post_send failed rc=%d\n" , rc );
10221060 atomic_dec (& sc -> send_io .pending .count );
1023- ib_dma_unmap_single (sc -> ib .dev , request -> sge [0 ].addr ,
1024- request -> sge [0 ].length , DMA_TO_DEVICE );
10251061
10261062 smbd_disconnect_rdma_connection (sc );
10271063
10281064dma_mapping_failed :
1029- mempool_free (request , sc -> send_io . mem . pool );
1065+ smbd_free_send_io (request );
10301066 return rc ;
10311067}
10321068
@@ -1187,7 +1223,7 @@ static int smbd_post_send_iter(struct smbdirect_socket *sc,
11871223 int * _remaining_data_length )
11881224{
11891225 struct smbdirect_socket_parameters * sp = & sc -> parameters ;
1190- int i , rc ;
1226+ int rc ;
11911227 int header_length ;
11921228 int data_length ;
11931229 struct smbdirect_send_io * request ;
@@ -1208,13 +1244,12 @@ static int smbd_post_send_iter(struct smbdirect_socket *sc,
12081244 goto err_wait_credit ;
12091245 }
12101246
1211- request = mempool_alloc (sc -> send_io . mem . pool , GFP_KERNEL );
1212- if (! request ) {
1213- rc = - ENOMEM ;
1247+ request = smbd_alloc_send_io (sc );
1248+ if (IS_ERR ( request ) ) {
1249+ rc = PTR_ERR ( request ) ;
12141250 goto err_alloc ;
12151251 }
12161252
1217- request -> socket = sc ;
12181253 memset (request -> sge , 0 , sizeof (request -> sge ));
12191254
12201255 /* Map the packet to DMA */
@@ -1292,13 +1327,7 @@ static int smbd_post_send_iter(struct smbdirect_socket *sc,
12921327 return 0 ;
12931328
12941329err_dma :
1295- for (i = 0 ; i < request -> num_sge ; i ++ )
1296- if (request -> sge [i ].addr )
1297- ib_dma_unmap_single (sc -> ib .dev ,
1298- request -> sge [i ].addr ,
1299- request -> sge [i ].length ,
1300- DMA_TO_DEVICE );
1301- mempool_free (request , sc -> send_io .mem .pool );
1330+ smbd_free_send_io (request );
13021331
13031332err_alloc :
13041333 atomic_inc (& sc -> send_io .credits .count );
0 commit comments