@@ -764,72 +764,6 @@ static int wait_for_send_credits(struct smbdirect_socket *sc,
764764 1 );
765765}
766766
767- static int smb_direct_create_header (struct smbdirect_socket * sc ,
768- int size , int remaining_data_length ,
769- int new_credits ,
770- struct smbdirect_send_io * * sendmsg_out )
771- {
772- struct smbdirect_socket_parameters * sp = & sc -> parameters ;
773- struct smbdirect_send_io * sendmsg ;
774- struct smbdirect_data_transfer * packet ;
775- int header_length ;
776- int ret ;
777-
778- sendmsg = smbdirect_connection_alloc_send_io (sc );
779- if (IS_ERR (sendmsg ))
780- return PTR_ERR (sendmsg );
781-
782- /* Fill in the packet header */
783- packet = (struct smbdirect_data_transfer * )sendmsg -> packet ;
784- packet -> credits_requested = cpu_to_le16 (sp -> send_credit_target );
785- packet -> credits_granted = cpu_to_le16 (new_credits );
786-
787- packet -> flags = 0 ;
788- if (smbdirect_connection_request_keep_alive (sc ))
789- packet -> flags |= cpu_to_le16 (SMBDIRECT_FLAG_RESPONSE_REQUESTED );
790-
791- packet -> reserved = 0 ;
792- if (!size )
793- packet -> data_offset = 0 ;
794- else
795- packet -> data_offset = cpu_to_le32 (24 );
796- packet -> data_length = cpu_to_le32 (size );
797- packet -> remaining_data_length = cpu_to_le32 (remaining_data_length );
798- packet -> padding = 0 ;
799-
800- ksmbd_debug (RDMA ,
801- "credits_requested=%d credits_granted=%d data_offset=%d data_length=%d remaining_data_length=%d\n" ,
802- le16_to_cpu (packet -> credits_requested ),
803- le16_to_cpu (packet -> credits_granted ),
804- le32_to_cpu (packet -> data_offset ),
805- le32_to_cpu (packet -> data_length ),
806- le32_to_cpu (packet -> remaining_data_length ));
807-
808- /* Map the packet to DMA */
809- header_length = sizeof (struct smbdirect_data_transfer );
810- /* If this is a packet without payload, don't send padding */
811- if (!size )
812- header_length =
813- offsetof(struct smbdirect_data_transfer , padding );
814-
815- sendmsg -> sge [0 ].addr = ib_dma_map_single (sc -> ib .dev ,
816- (void * )packet ,
817- header_length ,
818- DMA_TO_DEVICE );
819- ret = ib_dma_mapping_error (sc -> ib .dev , sendmsg -> sge [0 ].addr );
820- if (ret ) {
821- smbdirect_connection_free_send_io (sendmsg );
822- return ret ;
823- }
824-
825- sendmsg -> num_sge = 1 ;
826- sendmsg -> sge [0 ].length = header_length ;
827- sendmsg -> sge [0 ].lkey = sc -> ib .pd -> local_dma_lkey ;
828-
829- * sendmsg_out = sendmsg ;
830- return 0 ;
831- }
832-
833767static int post_sendmsg (struct smbdirect_socket * sc ,
834768 struct smbdirect_send_batch * send_ctx ,
835769 struct smbdirect_send_io * msg )
@@ -873,13 +807,23 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
873807 struct iov_iter * iter ,
874808 size_t * _remaining_data_length )
875809{
810+ const struct smbdirect_socket_parameters * sp = & sc -> parameters ;
876811 int ret ;
877812 struct smbdirect_send_io * msg ;
813+ struct smbdirect_data_transfer * packet ;
814+ size_t header_length ;
878815 u32 remaining_data_length = 0 ;
879816 u32 data_length = 0 ;
880817 struct smbdirect_send_batch _send_ctx ;
881818 u16 new_credits ;
882819
820+ if (iter ) {
821+ header_length = sizeof (struct smbdirect_data_transfer );
822+ } else {
823+ /* If this is a packet without payload, don't send padding */
824+ header_length = offsetof(struct smbdirect_data_transfer , padding );
825+ }
826+
883827 if (!send_ctx ) {
884828 smb_direct_send_ctx_init (& _send_ctx , false, 0 );
885829 send_ctx = & _send_ctx ;
@@ -922,10 +866,24 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
922866 remaining_data_length = * _remaining_data_length ;
923867 }
924868
925- ret = smb_direct_create_header (sc , data_length , remaining_data_length ,
926- new_credits , & msg );
869+ msg = smbdirect_connection_alloc_send_io (sc );
870+ if (IS_ERR (msg )) {
871+ ret = PTR_ERR (msg );
872+ goto alloc_failed ;
873+ }
874+
875+ /* Map the packet to DMA */
876+ msg -> sge [0 ].addr = ib_dma_map_single (sc -> ib .dev ,
877+ msg -> packet ,
878+ header_length ,
879+ DMA_TO_DEVICE );
880+ ret = ib_dma_mapping_error (sc -> ib .dev , msg -> sge [0 ].addr );
927881 if (ret )
928- goto header_failed ;
882+ goto err ;
883+
884+ msg -> sge [0 ].length = header_length ;
885+ msg -> sge [0 ].lkey = sc -> ib .pd -> local_dma_lkey ;
886+ msg -> num_sge = 1 ;
929887
930888 if (iter ) {
931889 struct smbdirect_map_sges extract = {
@@ -947,6 +905,34 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
947905 msg -> num_sge = extract .num_sge ;
948906 }
949907
908+ /* Fill in the packet header */
909+ packet = (struct smbdirect_data_transfer * )msg -> packet ;
910+ packet -> credits_requested = cpu_to_le16 (sp -> send_credit_target );
911+ new_credits = smbdirect_connection_grant_recv_credits (sc );
912+ packet -> credits_granted = cpu_to_le16 (new_credits );
913+
914+ packet -> flags = 0 ;
915+ if (smbdirect_connection_request_keep_alive (sc ))
916+ packet -> flags |= cpu_to_le16 (SMBDIRECT_FLAG_RESPONSE_REQUESTED );
917+
918+ packet -> reserved = 0 ;
919+ if (!data_length )
920+ packet -> data_offset = 0 ;
921+ else
922+ packet -> data_offset = cpu_to_le32 (24 );
923+ packet -> data_length = cpu_to_le32 (data_length );
924+ packet -> remaining_data_length = cpu_to_le32 (remaining_data_length );
925+ packet -> padding = 0 ;
926+
927+ ksmbd_debug (RDMA ,
928+ "credits_req=%u credits_granted=%u flags=0x%x ofs=%u len=%u remaining=%u\n" ,
929+ le16_to_cpu (packet -> credits_requested ),
930+ le16_to_cpu (packet -> credits_granted ),
931+ le16_to_cpu (packet -> flags ),
932+ le32_to_cpu (packet -> data_offset ),
933+ le32_to_cpu (packet -> data_length ),
934+ le32_to_cpu (packet -> remaining_data_length ));
935+
950936 ret = post_sendmsg (sc , send_ctx , msg );
951937 if (ret )
952938 goto err ;
@@ -966,7 +952,7 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
966952err :
967953 smbdirect_connection_free_send_io (msg );
968954flush_failed :
969- header_failed :
955+ alloc_failed :
970956 atomic_inc (& sc -> send_io .credits .count );
971957credit_failed :
972958 atomic_inc (& sc -> send_io .lcredits .count );
0 commit comments