Skip to content

Commit 26acc98

Browse files
dhowellsPaolo Abeni
authored andcommitted
chelsio: Convert chtls_sendpage() to use MSG_SPLICE_PAGES
Convert chtls_sendpage() to use sendmsg() with MSG_SPLICE_PAGES rather than directly splicing in the pages itself. This allows ->sendpage() to be replaced by something that can handle multiple multipage folios in a single transaction. Signed-off-by: David Howells <[email protected]> cc: Ayush Sawal <[email protected]> cc: "David S. Miller" <[email protected]> cc: Eric Dumazet <[email protected]> cc: Jakub Kicinski <[email protected]> cc: Paolo Abeni <[email protected]> cc: Jens Axboe <[email protected]> cc: Matthew Wilcox <[email protected]> cc: [email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent 116f7b3 commit 26acc98

File tree

1 file changed

+7
-102
lines changed
  • drivers/net/ethernet/chelsio/inline_crypto/chtls

1 file changed

+7
-102
lines changed

drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c

Lines changed: 7 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,110 +1240,15 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
12401240
int chtls_sendpage(struct sock *sk, struct page *page,
12411241
int offset, size_t size, int flags)
12421242
{
1243-
struct chtls_sock *csk;
1244-
struct chtls_dev *cdev;
1245-
int mss, err, copied;
1246-
struct tcp_sock *tp;
1247-
long timeo;
1248-
1249-
tp = tcp_sk(sk);
1250-
copied = 0;
1251-
csk = rcu_dereference_sk_user_data(sk);
1252-
cdev = csk->cdev;
1253-
lock_sock(sk);
1254-
timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
1243+
struct msghdr msg = { .msg_flags = flags | MSG_SPLICE_PAGES, };
1244+
struct bio_vec bvec;
12551245

1256-
err = sk_stream_wait_connect(sk, &timeo);
1257-
if (!sk_in_state(sk, TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) &&
1258-
err != 0)
1259-
goto out_err;
1260-
1261-
mss = csk->mss;
1262-
csk_set_flag(csk, CSK_TX_MORE_DATA);
1263-
1264-
while (size > 0) {
1265-
struct sk_buff *skb = skb_peek_tail(&csk->txq);
1266-
int copy, i;
1267-
1268-
if (!skb || (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) ||
1269-
(copy = mss - skb->len) <= 0) {
1270-
new_buf:
1271-
if (!csk_mem_free(cdev, sk))
1272-
goto wait_for_sndbuf;
1246+
if (flags & MSG_SENDPAGE_NOTLAST)
1247+
msg.msg_flags |= MSG_MORE;
12731248

1274-
if (is_tls_tx(csk)) {
1275-
skb = get_record_skb(sk,
1276-
select_size(sk, size,
1277-
flags,
1278-
TX_TLSHDR_LEN),
1279-
true);
1280-
} else {
1281-
skb = get_tx_skb(sk, 0);
1282-
}
1283-
if (!skb)
1284-
goto wait_for_memory;
1285-
copy = mss;
1286-
}
1287-
if (copy > size)
1288-
copy = size;
1289-
1290-
i = skb_shinfo(skb)->nr_frags;
1291-
if (skb_can_coalesce(skb, i, page, offset)) {
1292-
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
1293-
} else if (i < MAX_SKB_FRAGS) {
1294-
get_page(page);
1295-
skb_fill_page_desc(skb, i, page, offset, copy);
1296-
} else {
1297-
tx_skb_finalize(skb);
1298-
push_frames_if_head(sk);
1299-
goto new_buf;
1300-
}
1301-
1302-
skb->len += copy;
1303-
if (skb->len == mss)
1304-
tx_skb_finalize(skb);
1305-
skb->data_len += copy;
1306-
skb->truesize += copy;
1307-
sk->sk_wmem_queued += copy;
1308-
tp->write_seq += copy;
1309-
copied += copy;
1310-
offset += copy;
1311-
size -= copy;
1312-
1313-
if (corked(tp, flags) &&
1314-
(sk_stream_wspace(sk) < sk_stream_min_wspace(sk)))
1315-
ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_NO_APPEND;
1316-
1317-
if (!size)
1318-
break;
1319-
1320-
if (unlikely(ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND))
1321-
push_frames_if_head(sk);
1322-
continue;
1323-
wait_for_sndbuf:
1324-
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
1325-
wait_for_memory:
1326-
err = csk_wait_memory(cdev, sk, &timeo);
1327-
if (err)
1328-
goto do_error;
1329-
}
1330-
out:
1331-
csk_reset_flag(csk, CSK_TX_MORE_DATA);
1332-
if (copied)
1333-
chtls_tcp_push(sk, flags);
1334-
done:
1335-
release_sock(sk);
1336-
return copied;
1337-
1338-
do_error:
1339-
if (copied)
1340-
goto out;
1341-
1342-
out_err:
1343-
if (csk_conn_inline(csk))
1344-
csk_reset_flag(csk, CSK_TX_MORE_DATA);
1345-
copied = sk_stream_error(sk, flags, err);
1346-
goto done;
1249+
bvec_set_page(&bvec, page, size, offset);
1250+
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
1251+
return chtls_sendmsg(sk, &msg, size);
13471252
}
13481253

13491254
static void chtls_select_window(struct sock *sk)

0 commit comments

Comments
 (0)