@@ -168,7 +168,7 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
168168 * disable[_delayed]_work_sync()
169169 */
170170 disable_work (& sc -> disconnect_work );
171- disable_work (& info -> post_send_credits_work );
171+ disable_work (& sc -> recv_io . posted . refill_work );
172172 disable_work (& info -> mr_recovery_work );
173173 disable_delayed_work (& info -> idle_timer_work );
174174
@@ -482,18 +482,15 @@ static bool process_negotiation_response(
482482 log_rdma_event (ERR , "error: credits_requested==0\n" );
483483 return false;
484484 }
485- info -> receive_credit_target = le16_to_cpu (packet -> credits_requested );
486- info -> receive_credit_target = min_t (u16 , info -> receive_credit_target , sp -> recv_credit_max );
485+ sc -> recv_io . credits . target = le16_to_cpu (packet -> credits_requested );
486+ sc -> recv_io . credits . target = min_t (u16 , sc -> recv_io . credits . target , sp -> recv_credit_max );
487487
488488 if (packet -> credits_granted == 0 ) {
489489 log_rdma_event (ERR , "error: credits_granted==0\n" );
490490 return false;
491491 }
492492 atomic_set (& sc -> send_io .credits .count , le16_to_cpu (packet -> credits_granted ));
493493
494- atomic_set (& info -> receive_credits , 0 );
495- atomic_set (& info -> receive_posted , 0 );
496-
497494 if (le32_to_cpu (packet -> preferred_send_size ) > sp -> max_recv_size ) {
498495 log_rdma_event (ERR , "error: preferred_send_size=%d\n" ,
499496 le32_to_cpu (packet -> preferred_send_size ));
@@ -536,17 +533,17 @@ static void smbd_post_send_credits(struct work_struct *work)
536533{
537534 int rc ;
538535 struct smbdirect_recv_io * response ;
536+ struct smbdirect_socket * sc =
537+ container_of (work , struct smbdirect_socket , recv_io .posted .refill_work );
539538 struct smbd_connection * info =
540- container_of (work , struct smbd_connection ,
541- post_send_credits_work );
542- struct smbdirect_socket * sc = & info -> socket ;
539+ container_of (sc , struct smbd_connection , socket );
543540
544541 if (sc -> status != SMBDIRECT_SOCKET_CONNECTED ) {
545542 return ;
546543 }
547544
548- if (info -> receive_credit_target >
549- atomic_read (& info -> receive_credits )) {
545+ if (sc -> recv_io . credits . target >
546+ atomic_read (& sc -> recv_io . credits . count )) {
550547 while (true) {
551548 response = get_receive_buffer (info );
552549 if (!response )
@@ -561,14 +558,14 @@ static void smbd_post_send_credits(struct work_struct *work)
561558 break ;
562559 }
563560
564- atomic_inc (& info -> receive_posted );
561+ atomic_inc (& sc -> recv_io . posted . count );
565562 }
566563 }
567564
568565 /* Promptly send an immediate packet as defined in [MS-SMBD] 3.1.1.1 */
569566 info -> send_immediate = true;
570- if (atomic_read (& info -> receive_credits ) <
571- info -> receive_credit_target - 1 ) {
567+ if (atomic_read (& sc -> recv_io . credits . count ) <
568+ sc -> recv_io . credits . target - 1 ) {
572569 if (info -> keep_alive_requested == KEEP_ALIVE_PENDING ||
573570 info -> send_immediate ) {
574571 log_keep_alive (INFO , "send an empty message\n" );
@@ -661,15 +658,15 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
661658 sc -> recv_io .reassembly .full_packet_received = true;
662659 }
663660
664- atomic_dec (& info -> receive_posted );
665- atomic_dec (& info -> receive_credits );
666- old_recv_credit_target = info -> receive_credit_target ;
667- info -> receive_credit_target =
661+ atomic_dec (& sc -> recv_io . posted . count );
662+ atomic_dec (& sc -> recv_io . credits . count );
663+ old_recv_credit_target = sc -> recv_io . credits . target ;
664+ sc -> recv_io . credits . target =
668665 le16_to_cpu (data_transfer -> credits_requested );
669- info -> receive_credit_target =
670- min_t (u16 , info -> receive_credit_target , sp -> recv_credit_max );
671- info -> receive_credit_target =
672- max_t (u16 , info -> receive_credit_target , 1 );
666+ sc -> recv_io . credits . target =
667+ min_t (u16 , sc -> recv_io . credits . target , sp -> recv_credit_max );
668+ sc -> recv_io . credits . target =
669+ max_t (u16 , sc -> recv_io . credits . target , 1 );
673670 if (le16_to_cpu (data_transfer -> credits_granted )) {
674671 atomic_add (le16_to_cpu (data_transfer -> credits_granted ),
675672 & sc -> send_io .credits .count );
@@ -698,8 +695,8 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
698695 * reassembly queue and wake up the reading thread
699696 */
700697 if (data_length ) {
701- if (info -> receive_credit_target > old_recv_credit_target )
702- queue_work (info -> workqueue , & info -> post_send_credits_work );
698+ if (sc -> recv_io . credits . target > old_recv_credit_target )
699+ queue_work (info -> workqueue , & sc -> recv_io . posted . refill_work );
703700
704701 enqueue_reassembly (info , response , data_length );
705702 wake_up (& sc -> recv_io .reassembly .wait_queue );
@@ -960,16 +957,17 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
960957 */
961958static int manage_credits_prior_sending (struct smbd_connection * info )
962959{
960+ struct smbdirect_socket * sc = & info -> socket ;
963961 int new_credits ;
964962
965- if (atomic_read (& info -> receive_credits ) >= info -> receive_credit_target )
963+ if (atomic_read (& sc -> recv_io . credits . count ) >= sc -> recv_io . credits . target )
966964 return 0 ;
967965
968- new_credits = atomic_read (& info -> receive_posted );
966+ new_credits = atomic_read (& sc -> recv_io . posted . count );
969967 if (new_credits == 0 )
970968 return 0 ;
971969
972- new_credits -= atomic_read (& info -> receive_credits );
970+ new_credits -= atomic_read (& sc -> recv_io . credits . count );
973971 if (new_credits <= 0 )
974972 return 0 ;
975973
@@ -1123,7 +1121,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
11231121 packet -> credits_requested = cpu_to_le16 (sp -> send_credit_target );
11241122
11251123 new_credits = manage_credits_prior_sending (info );
1126- atomic_add (new_credits , & info -> receive_credits );
1124+ atomic_add (new_credits , & sc -> recv_io . credits . count );
11271125 packet -> credits_granted = cpu_to_le16 (new_credits );
11281126
11291127 info -> send_immediate = false;
@@ -1181,7 +1179,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
11811179 mempool_free (request , sc -> send_io .mem .pool );
11821180
11831181 /* roll back the granted receive credits */
1184- atomic_sub (new_credits , & info -> receive_credits );
1182+ atomic_sub (new_credits , & sc -> recv_io . credits . count );
11851183
11861184err_alloc :
11871185 if (atomic_dec_and_test (& sc -> send_io .pending .count ))
@@ -1414,7 +1412,7 @@ static void put_receive_buffer(
14141412 info -> count_put_receive_buffer ++ ;
14151413 spin_unlock_irqrestore (& sc -> recv_io .free .lock , flags );
14161414
1417- queue_work (info -> workqueue , & info -> post_send_credits_work );
1415+ queue_work (info -> workqueue , & sc -> recv_io . posted . refill_work );
14181416}
14191417
14201418/* Preallocate all receive buffer on transport establishment */
@@ -1512,8 +1510,8 @@ void smbd_destroy(struct TCP_Server_Info *server)
15121510 sc -> status == SMBDIRECT_SOCKET_DISCONNECTED );
15131511 }
15141512
1515- log_rdma_event (INFO , "cancelling post_send_credits_work \n" );
1516- disable_work_sync (& info -> post_send_credits_work );
1513+ log_rdma_event (INFO , "cancelling recv_io.posted.refill_work \n" );
1514+ disable_work_sync (& sc -> recv_io . posted . refill_work );
15171515
15181516 log_rdma_event (INFO , "destroying qp\n" );
15191517 ib_drain_qp (sc -> ib .qp );
@@ -1865,7 +1863,7 @@ static struct smbd_connection *_smbd_get_connection(
18651863 queue_delayed_work (info -> workqueue , & info -> idle_timer_work ,
18661864 msecs_to_jiffies (sp -> keepalive_interval_msec ));
18671865
1868- INIT_WORK (& info -> post_send_credits_work , smbd_post_send_credits );
1866+ INIT_WORK (& sc -> recv_io . posted . refill_work , smbd_post_send_credits );
18691867
18701868 rc = smbd_negotiate (info );
18711869 if (rc ) {
0 commit comments