Skip to content

Commit fd31f39

Browse files
kuba-moodavem330
authored andcommitted
tls: rx: decrypt into a fresh skb
We currently CoW Rx skbs whenever we can't decrypt to a user space buffer. The skbs can be enormous (64kB) and CoW does a linear alloc which has a strong chance of failing under memory pressure. Or even without, skb_cow_data() assumes GFP_ATOMIC. Allocate a new frag'd skb and decrypt into it. We finally take advantage of the decrypted skb getting returned via darg. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent cbbdee9 commit fd31f39

File tree

2 files changed

+72
-37
lines changed

2 files changed

+72
-37
lines changed

net/tls/tls.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
#include <linux/skmsg.h>
4040
#include <net/tls.h>
4141

42+
#define TLS_PAGE_ORDER (min_t(unsigned int, PAGE_ALLOC_COSTLY_ORDER, \
43+
TLS_MAX_PAYLOAD_SIZE >> PAGE_SHIFT))
44+
4245
#define __TLS_INC_STATS(net, field) \
4346
__SNMP_INC_STATS((net)->mib.tls_statistics, field)
4447
#define TLS_INC_STATS(net, field) \

net/tls/tls_sw.c

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,29 @@ static int tls_setup_from_iter(struct iov_iter *from,
13831383
return rc;
13841384
}
13851385

1386+
static struct sk_buff *
1387+
tls_alloc_clrtxt_skb(struct sock *sk, struct sk_buff *skb,
1388+
unsigned int full_len)
1389+
{
1390+
struct strp_msg *clr_rxm;
1391+
struct sk_buff *clr_skb;
1392+
int err;
1393+
1394+
clr_skb = alloc_skb_with_frags(0, full_len, TLS_PAGE_ORDER,
1395+
&err, sk->sk_allocation);
1396+
if (!clr_skb)
1397+
return NULL;
1398+
1399+
skb_copy_header(clr_skb, skb);
1400+
clr_skb->len = full_len;
1401+
clr_skb->data_len = full_len;
1402+
1403+
clr_rxm = strp_msg(clr_skb);
1404+
clr_rxm->offset = 0;
1405+
1406+
return clr_skb;
1407+
}
1408+
13861409
/* Decrypt handlers
13871410
*
13881411
* tls_decrypt_sg() and tls_decrypt_device() are decrypt handlers.
@@ -1410,34 +1433,40 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14101433
struct tls_prot_info *prot = &tls_ctx->prot_info;
14111434
int n_sgin, n_sgout, aead_size, err, pages = 0;
14121435
struct sk_buff *skb = tls_strp_msg(ctx);
1413-
struct strp_msg *rxm = strp_msg(skb);
1414-
struct tls_msg *tlm = tls_msg(skb);
1436+
const struct strp_msg *rxm = strp_msg(skb);
1437+
const struct tls_msg *tlm = tls_msg(skb);
14151438
struct aead_request *aead_req;
1416-
struct sk_buff *unused;
14171439
struct scatterlist *sgin = NULL;
14181440
struct scatterlist *sgout = NULL;
14191441
const int data_len = rxm->full_len - prot->overhead_size;
14201442
int tail_pages = !!prot->tail_size;
14211443
struct tls_decrypt_ctx *dctx;
1444+
struct sk_buff *clear_skb;
14221445
int iv_offset = 0;
14231446
u8 *mem;
14241447

1448+
n_sgin = skb_nsg(skb, rxm->offset + prot->prepend_size,
1449+
rxm->full_len - prot->prepend_size);
1450+
if (n_sgin < 1)
1451+
return n_sgin ?: -EBADMSG;
1452+
14251453
if (darg->zc && (out_iov || out_sg)) {
1454+
clear_skb = NULL;
1455+
14261456
if (out_iov)
14271457
n_sgout = 1 + tail_pages +
14281458
iov_iter_npages_cap(out_iov, INT_MAX, data_len);
14291459
else
14301460
n_sgout = sg_nents(out_sg);
1431-
n_sgin = skb_nsg(skb, rxm->offset + prot->prepend_size,
1432-
rxm->full_len - prot->prepend_size);
14331461
} else {
1434-
n_sgout = 0;
14351462
darg->zc = false;
1436-
n_sgin = skb_cow_data(skb, 0, &unused);
1437-
}
14381463

1439-
if (n_sgin < 1)
1440-
return -EBADMSG;
1464+
clear_skb = tls_alloc_clrtxt_skb(sk, skb, rxm->full_len);
1465+
if (!clear_skb)
1466+
return -ENOMEM;
1467+
1468+
n_sgout = 1 + skb_shinfo(clear_skb)->nr_frags;
1469+
}
14411470

14421471
/* Increment to accommodate AAD */
14431472
n_sgin = n_sgin + 1;
@@ -1449,8 +1478,10 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14491478
aead_size = sizeof(*aead_req) + crypto_aead_reqsize(ctx->aead_recv);
14501479
mem = kmalloc(aead_size + struct_size(dctx, sg, n_sgin + n_sgout),
14511480
sk->sk_allocation);
1452-
if (!mem)
1453-
return -ENOMEM;
1481+
if (!mem) {
1482+
err = -ENOMEM;
1483+
goto exit_free_skb;
1484+
}
14541485

14551486
/* Segment the allocated memory */
14561487
aead_req = (struct aead_request *)mem;
@@ -1499,33 +1530,31 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
14991530
if (err < 0)
15001531
goto exit_free;
15011532

1502-
if (n_sgout) {
1503-
if (out_iov) {
1504-
sg_init_table(sgout, n_sgout);
1505-
sg_set_buf(&sgout[0], dctx->aad, prot->aad_size);
1533+
if (clear_skb) {
1534+
sg_init_table(sgout, n_sgout);
1535+
sg_set_buf(&sgout[0], dctx->aad, prot->aad_size);
15061536

1507-
err = tls_setup_from_iter(out_iov, data_len,
1508-
&pages, &sgout[1],
1509-
(n_sgout - 1 - tail_pages));
1510-
if (err < 0)
1511-
goto fallback_to_reg_recv;
1537+
err = skb_to_sgvec(clear_skb, &sgout[1], prot->prepend_size,
1538+
data_len + prot->tail_size);
1539+
if (err < 0)
1540+
goto exit_free;
1541+
} else if (out_iov) {
1542+
sg_init_table(sgout, n_sgout);
1543+
sg_set_buf(&sgout[0], dctx->aad, prot->aad_size);
15121544

1513-
if (prot->tail_size) {
1514-
sg_unmark_end(&sgout[pages]);
1515-
sg_set_buf(&sgout[pages + 1], &dctx->tail,
1516-
prot->tail_size);
1517-
sg_mark_end(&sgout[pages + 1]);
1518-
}
1519-
} else if (out_sg) {
1520-
memcpy(sgout, out_sg, n_sgout * sizeof(*sgout));
1521-
} else {
1522-
goto fallback_to_reg_recv;
1545+
err = tls_setup_from_iter(out_iov, data_len, &pages, &sgout[1],
1546+
(n_sgout - 1 - tail_pages));
1547+
if (err < 0)
1548+
goto exit_free_pages;
1549+
1550+
if (prot->tail_size) {
1551+
sg_unmark_end(&sgout[pages]);
1552+
sg_set_buf(&sgout[pages + 1], &dctx->tail,
1553+
prot->tail_size);
1554+
sg_mark_end(&sgout[pages + 1]);
15231555
}
1524-
} else {
1525-
fallback_to_reg_recv:
1526-
sgout = sgin;
1527-
pages = 0;
1528-
darg->zc = false;
1556+
} else if (out_sg) {
1557+
memcpy(sgout, out_sg, n_sgout * sizeof(*sgout));
15291558
}
15301559

15311560
/* Prepare and submit AEAD request */
@@ -1534,7 +1563,8 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
15341563
if (err)
15351564
goto exit_free_pages;
15361565

1537-
darg->skb = tls_strp_msg(ctx);
1566+
darg->skb = clear_skb ?: tls_strp_msg(ctx);
1567+
clear_skb = NULL;
15381568

15391569
if (unlikely(darg->async)) {
15401570
err = tls_strp_msg_hold(sk, skb, &ctx->async_hold);
@@ -1552,6 +1582,8 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
15521582
put_page(sg_page(&sgout[pages]));
15531583
exit_free:
15541584
kfree(mem);
1585+
exit_free_skb:
1586+
consume_skb(clear_skb);
15551587
return err;
15561588
}
15571589

0 commit comments

Comments
 (0)