@@ -997,25 +997,28 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
997
997
u32 h2cdata_left = req -> h2cdata_left ;
998
998
999
999
while (true) {
1000
+ struct bio_vec bvec ;
1001
+ struct msghdr msg = {
1002
+ .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES ,
1003
+ };
1000
1004
struct page * page = nvme_tcp_req_cur_page (req );
1001
1005
size_t offset = nvme_tcp_req_cur_offset (req );
1002
1006
size_t len = nvme_tcp_req_cur_length (req );
1003
1007
bool last = nvme_tcp_pdu_last_send (req , len );
1004
1008
int req_data_sent = req -> data_sent ;
1005
- int ret , flags = MSG_DONTWAIT ;
1009
+ int ret ;
1006
1010
1007
1011
if (last && !queue -> data_digest && !nvme_tcp_queue_more (queue ))
1008
- flags |= MSG_EOR ;
1012
+ msg . msg_flags |= MSG_EOR ;
1009
1013
else
1010
- flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST ;
1014
+ msg . msg_flags |= MSG_MORE ;
1011
1015
1012
- if (sendpage_ok (page )) {
1013
- ret = kernel_sendpage (queue -> sock , page , offset , len ,
1014
- flags );
1015
- } else {
1016
- ret = sock_no_sendpage (queue -> sock , page , offset , len ,
1017
- flags );
1018
- }
1016
+ if (!sendpage_ok (page ))
1017
+ msg .msg_flags &= ~MSG_SPLICE_PAGES ,
1018
+
1019
+ bvec_set_page (& bvec , page , len , offset );
1020
+ iov_iter_bvec (& msg .msg_iter , ITER_SOURCE , & bvec , 1 , len );
1021
+ ret = sock_sendmsg (queue -> sock , & msg );
1019
1022
if (ret <= 0 )
1020
1023
return ret ;
1021
1024
@@ -1054,22 +1057,24 @@ static int nvme_tcp_try_send_cmd_pdu(struct nvme_tcp_request *req)
1054
1057
{
1055
1058
struct nvme_tcp_queue * queue = req -> queue ;
1056
1059
struct nvme_tcp_cmd_pdu * pdu = nvme_tcp_req_cmd_pdu (req );
1060
+ struct bio_vec bvec ;
1061
+ struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES , };
1057
1062
bool inline_data = nvme_tcp_has_inline_data (req );
1058
1063
u8 hdgst = nvme_tcp_hdgst_len (queue );
1059
1064
int len = sizeof (* pdu ) + hdgst - req -> offset ;
1060
- int flags = MSG_DONTWAIT ;
1061
1065
int ret ;
1062
1066
1063
1067
if (inline_data || nvme_tcp_queue_more (queue ))
1064
- flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST ;
1068
+ msg . msg_flags |= MSG_MORE ;
1065
1069
else
1066
- flags |= MSG_EOR ;
1070
+ msg . msg_flags |= MSG_EOR ;
1067
1071
1068
1072
if (queue -> hdr_digest && !req -> offset )
1069
1073
nvme_tcp_hdgst (queue -> snd_hash , pdu , sizeof (* pdu ));
1070
1074
1071
- ret = kernel_sendpage (queue -> sock , virt_to_page (pdu ),
1072
- offset_in_page (pdu ) + req -> offset , len , flags );
1075
+ bvec_set_virt (& bvec , (void * )pdu + req -> offset , len );
1076
+ iov_iter_bvec (& msg .msg_iter , ITER_SOURCE , & bvec , 1 , len );
1077
+ ret = sock_sendmsg (queue -> sock , & msg );
1073
1078
if (unlikely (ret <= 0 ))
1074
1079
return ret ;
1075
1080
@@ -1093,6 +1098,8 @@ static int nvme_tcp_try_send_data_pdu(struct nvme_tcp_request *req)
1093
1098
{
1094
1099
struct nvme_tcp_queue * queue = req -> queue ;
1095
1100
struct nvme_tcp_data_pdu * pdu = nvme_tcp_req_data_pdu (req );
1101
+ struct bio_vec bvec ;
1102
+ struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_MORE , };
1096
1103
u8 hdgst = nvme_tcp_hdgst_len (queue );
1097
1104
int len = sizeof (* pdu ) - req -> offset + hdgst ;
1098
1105
int ret ;
@@ -1101,13 +1108,11 @@ static int nvme_tcp_try_send_data_pdu(struct nvme_tcp_request *req)
1101
1108
nvme_tcp_hdgst (queue -> snd_hash , pdu , sizeof (* pdu ));
1102
1109
1103
1110
if (!req -> h2cdata_left )
1104
- ret = kernel_sendpage (queue -> sock , virt_to_page (pdu ),
1105
- offset_in_page (pdu ) + req -> offset , len ,
1106
- MSG_DONTWAIT | MSG_MORE | MSG_SENDPAGE_NOTLAST );
1107
- else
1108
- ret = sock_no_sendpage (queue -> sock , virt_to_page (pdu ),
1109
- offset_in_page (pdu ) + req -> offset , len ,
1110
- MSG_DONTWAIT | MSG_MORE );
1111
+ msg .msg_flags |= MSG_SPLICE_PAGES ;
1112
+
1113
+ bvec_set_virt (& bvec , (void * )pdu + req -> offset , len );
1114
+ iov_iter_bvec (& msg .msg_iter , ITER_SOURCE , & bvec , 1 , len );
1115
+ ret = sock_sendmsg (queue -> sock , & msg );
1111
1116
if (unlikely (ret <= 0 ))
1112
1117
return ret ;
1113
1118
0 commit comments