@@ -72,9 +72,10 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
72
72
{
73
73
struct rds_conn_path * cp = rm -> m_inc .i_conn_path ;
74
74
struct rds_tcp_connection * tc = cp -> cp_transport_data ;
75
+ struct msghdr msg = {};
76
+ struct bio_vec bvec ;
75
77
int done = 0 ;
76
78
int ret = 0 ;
77
- int more ;
78
79
79
80
if (hdr_off == 0 ) {
80
81
/*
@@ -111,15 +112,17 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
111
112
goto out ;
112
113
}
113
114
114
- more = rm -> data .op_nents > 1 ? (MSG_MORE | MSG_SENDPAGE_NOTLAST ) : 0 ;
115
115
while (sg < rm -> data .op_nents ) {
116
- int flags = MSG_DONTWAIT | MSG_NOSIGNAL | more ;
117
-
118
- ret = tc -> t_sock -> ops -> sendpage (tc -> t_sock ,
119
- sg_page (& rm -> data .op_sg [sg ]),
120
- rm -> data .op_sg [sg ].offset + off ,
121
- rm -> data .op_sg [sg ].length - off ,
122
- flags );
116
+ msg .msg_flags = MSG_SPLICE_PAGES | MSG_DONTWAIT | MSG_NOSIGNAL ;
117
+ if (sg + 1 < rm -> data .op_nents )
118
+ msg .msg_flags |= MSG_MORE ;
119
+
120
+ bvec_set_page (& bvec , sg_page (& rm -> data .op_sg [sg ]),
121
+ rm -> data .op_sg [sg ].length - off ,
122
+ rm -> data .op_sg [sg ].offset + off );
123
+ iov_iter_bvec (& msg .msg_iter , ITER_SOURCE , & bvec , 1 ,
124
+ rm -> data .op_sg [sg ].length - off );
125
+ ret = sock_sendmsg (tc -> t_sock , & msg );
123
126
rdsdebug ("tcp sendpage %p:%u:%u ret %d\n" , (void * )sg_page (& rm -> data .op_sg [sg ]),
124
127
rm -> data .op_sg [sg ].offset + off , rm -> data .op_sg [sg ].length - off ,
125
128
ret );
@@ -132,8 +135,6 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm,
132
135
off = 0 ;
133
136
sg ++ ;
134
137
}
135
- if (sg == rm -> data .op_nents - 1 )
136
- more = 0 ;
137
138
}
138
139
139
140
out :
0 commit comments