}
 
 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;
                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;
        }
 
 out:
-       ctx->sg_plaintext_size = size;
-       ctx->sg_plaintext_num_elem = num_elem;
+       *size_used = size;
+       *pages_used = num_elem;
+
        return rc;
 }
 
 
                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;