Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

smc: Drop smc_sendpage() in favour of smc_sendmsg() + MSG_SPLICE_PAGES

Drop the smc_sendpage() code as smc_sendmsg() just passes the call down to
the underlying TCP socket and smc_tx_sendpage() is just a wrapper around
its sendmsg implementation.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Karsten Graul <kgraul@linux.ibm.com>
cc: Wenjia Zhang <wenjia@linux.ibm.com>
cc: Jan Karcher <jaka@linux.ibm.com>
cc: "D. Wythe" <alibuda@linux.alibaba.com>
cc: Tony Lu <tonylu@linux.alibaba.com>
cc: Wen Gu <guwen@linux.alibaba.com>
cc: Jens Axboe <axboe@kernel.dk>
cc: Matthew Wilcox <willy@infradead.org>
Link: https://lore.kernel.org/r/20230623225513.2732256-10-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

David Howells and committed by
Jakub Kicinski
2f8bc2bb c336a799

+1 -52
-29
net/smc/af_smc.c
··· 3133 3133 return put_user(answ, (int __user *)arg); 3134 3134 } 3135 3135 3136 - static ssize_t smc_sendpage(struct socket *sock, struct page *page, 3137 - int offset, size_t size, int flags) 3138 - { 3139 - struct sock *sk = sock->sk; 3140 - struct smc_sock *smc; 3141 - int rc = -EPIPE; 3142 - 3143 - smc = smc_sk(sk); 3144 - lock_sock(sk); 3145 - if (sk->sk_state != SMC_ACTIVE) { 3146 - release_sock(sk); 3147 - goto out; 3148 - } 3149 - release_sock(sk); 3150 - if (smc->use_fallback) { 3151 - rc = kernel_sendpage(smc->clcsock, page, offset, 3152 - size, flags); 3153 - } else { 3154 - lock_sock(sk); 3155 - rc = smc_tx_sendpage(smc, page, offset, size, flags); 3156 - release_sock(sk); 3157 - SMC_STAT_INC(smc, sendpage_cnt); 3158 - } 3159 - 3160 - out: 3161 - return rc; 3162 - } 3163 - 3164 3136 /* Map the affected portions of the rmbe into an spd, note the number of bytes 3165 3137 * to splice in conn->splice_pending, and press 'go'. Delays consumer cursor 3166 3138 * updates till whenever a respective page has been fully processed. ··· 3204 3232 .sendmsg = smc_sendmsg, 3205 3233 .recvmsg = smc_recvmsg, 3206 3234 .mmap = sock_no_mmap, 3207 - .sendpage = smc_sendpage, 3208 3235 .splice_read = smc_splice_read, 3209 3236 }; 3210 3237
+1 -1
net/smc/smc_stats.c
··· 227 227 SMC_NLA_STATS_PAD)) 228 228 goto errattr; 229 229 if (nla_put_u64_64bit(skb, SMC_NLA_STATS_T_SENDPAGE_CNT, 230 - smc_tech->sendpage_cnt, 230 + 0, 231 231 SMC_NLA_STATS_PAD)) 232 232 goto errattr; 233 233 if (nla_put_u64_64bit(skb, SMC_NLA_STATS_T_CORK_CNT,
-1
net/smc/smc_stats.h
··· 71 71 u64 clnt_v2_succ_cnt; 72 72 u64 srv_v1_succ_cnt; 73 73 u64 srv_v2_succ_cnt; 74 - u64 sendpage_cnt; 75 74 u64 urg_data_cnt; 76 75 u64 splice_cnt; 77 76 u64 cork_cnt;
-19
net/smc/smc_tx.c
··· 297 297 return rc; 298 298 } 299 299 300 - int smc_tx_sendpage(struct smc_sock *smc, struct page *page, int offset, 301 - size_t size, int flags) 302 - { 303 - struct msghdr msg = {.msg_flags = flags}; 304 - char *kaddr = kmap(page); 305 - struct kvec iov; 306 - int rc; 307 - 308 - if (flags & MSG_SENDPAGE_NOTLAST) 309 - msg.msg_flags |= MSG_MORE; 310 - 311 - iov.iov_base = kaddr + offset; 312 - iov.iov_len = size; 313 - iov_iter_kvec(&msg.msg_iter, ITER_SOURCE, &iov, 1, size); 314 - rc = smc_tx_sendmsg(smc, &msg, size); 315 - kunmap(page); 316 - return rc; 317 - } 318 - 319 300 /***************************** sndbuf consumer *******************************/ 320 301 321 302 /* sndbuf consumer: actual data transfer of one target chunk with ISM write */
-2
net/smc/smc_tx.h
··· 31 31 void smc_tx_work(struct work_struct *work); 32 32 void smc_tx_init(struct smc_sock *smc); 33 33 int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len); 34 - int smc_tx_sendpage(struct smc_sock *smc, struct page *page, int offset, 35 - size_t size, int flags); 36 34 int smc_tx_sndbuf_nonempty(struct smc_connection *conn); 37 35 void smc_tx_sndbuf_nonfull(struct smc_sock *smc); 38 36 void smc_tx_consumer_update(struct smc_connection *conn, bool force);