Skip to content

Commit 0af87a0

Browse files
metze-sambasmfrench
authored andcommitted
smb: server: inline smb_direct_create_header() into smb_direct_post_send_data()
The point is that ib_dma_map_single() is done first, but the 'Fill in the packet header' will be done after smbdirect_map_sges_from_iter(). This will simplify further changes in order to share common code with the client. Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 0184d2b commit 0af87a0

1 file changed

Lines changed: 56 additions & 70 deletions

File tree

fs/smb/server/transport_rdma.c

Lines changed: 56 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
833767
static 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,
966952
err:
967953
smbdirect_connection_free_send_io(msg);
968954
flush_failed:
969-
header_failed:
955+
alloc_failed:
970956
atomic_inc(&sc->send_io.credits.count);
971957
credit_failed:
972958
atomic_inc(&sc->send_io.lcredits.count);

0 commit comments

Comments
 (0)