Skip to content

Commit

Permalink
tls: Generalize zerocopy_from_iter
Browse files Browse the repository at this point in the history
Refactor zerocopy_from_iter to take arguments for pages and size,
such that it can be used for both tx and rx. RX will also support
zerocopy direct to output iter, as long as the full message can
be copied at once (a large enough userspace buffer was provided).

Signed-off-by: Dave Watson <davejwatson@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dave Watson authored and David S. Miller committed Mar 23, 2018
1 parent ae06c70 commit 69ca929
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions net/tls/tls_sw.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,23 +226,24 @@ static int tls_sw_push_pending_record(struct sock *sk, int flags)
}

static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
int length)
int length, int *pages_used,
unsigned int *size_used,
struct scatterlist *to, int to_max_pages,
bool charge)
{
struct tls_context *tls_ctx = tls_get_ctx(sk);
struct tls_sw_context *ctx = tls_sw_ctx(tls_ctx);
struct page *pages[MAX_SKB_FRAGS];

size_t offset;
ssize_t copied, use;
int i = 0;
unsigned int size = ctx->sg_plaintext_size;
int num_elem = ctx->sg_plaintext_num_elem;
unsigned int size = *size_used;
int num_elem = *pages_used;
int rc = 0;
int maxpages;

while (length > 0) {
i = 0;
maxpages = ARRAY_SIZE(ctx->sg_plaintext_data) - num_elem;
maxpages = to_max_pages - num_elem;
if (maxpages == 0) {
rc = -EFAULT;
goto out;
Expand All @@ -262,10 +263,11 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
while (copied) {
use = min_t(int, copied, PAGE_SIZE - offset);

sg_set_page(&ctx->sg_plaintext_data[num_elem],
sg_set_page(&to[num_elem],
pages[i], use, offset);
sg_unmark_end(&ctx->sg_plaintext_data[num_elem]);
sk_mem_charge(sk, use);
sg_unmark_end(&to[num_elem]);
if (charge)
sk_mem_charge(sk, use);

offset = 0;
copied -= use;
Expand All @@ -276,8 +278,9 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
}

out:
ctx->sg_plaintext_size = size;
ctx->sg_plaintext_num_elem = num_elem;
*size_used = size;
*pages_used = num_elem;

return rc;
}

Expand Down Expand Up @@ -374,7 +377,11 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)

if (full_record || eor) {
ret = zerocopy_from_iter(sk, &msg->msg_iter,
try_to_copy);
try_to_copy, &ctx->sg_plaintext_num_elem,
&ctx->sg_plaintext_size,
ctx->sg_plaintext_data,
ARRAY_SIZE(ctx->sg_plaintext_data),
true);
if (ret)
goto fallback_to_reg_send;

Expand Down

0 comments on commit 69ca929

Please sign in to comment.