summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérôme Glisse <jglisse@redhat.com>2019-04-16 12:35:16 -0400
committerJérôme Glisse <jglisse@redhat.com>2019-04-16 13:46:40 -0400
commitb1c6ca3901733e7223756928f4dbc6d81db164e9 (patch)
tree13da3206af2adb342fe2e23c8a96f1a615138c77
parent0299e9776da232b9aaf6b57f97e34f1a0865faa2 (diff)
net/tls: keep track of pages that are coming from GUPgup-scatterlist-v1
Keep track of pages that are coming from GUP (get_user_pages*()) so that we can call the appropriate put_user_page() for those. Signed-off-by: Jérôme Glisse <jglisse@redhat.com> Cc: iommu@lists.linux-foundation.org Cc: linux-fsdevel@vger.kernel.org Cc: linux-block@vger.kernel.org Cc: linux-mm@kvack.org Cc: netdev@vger.kernel.org Cc: John Hubbard <jhubbard@nvidia.com> Cc: Jan Kara <jack@suse.cz> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Thomas Hellstrom <thellstrom@vmware.com> Cc: Sakari Ailus <sakari.ailus@linux.intel.com> Cc: Jason Gunthorpe <jgg@mellanox.com> Cc: Boris Pismenny <borisp@mellanox.com> Cc: Aviad Yehezkel <aviadye@mellanox.com> Cc: Dave Watson <davejwatson@fb.com> Cc: John Fastabend <john.fastabend@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r--net/tls/tls_sw.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
index 1de69e016c3d..4b4856590d57 100644
--- a/net/tls/tls_sw.c
+++ b/net/tls/tls_sw.c
@@ -1274,6 +1274,8 @@ static int tls_setup_from_iter(struct sock *sk, struct iov_iter *from,
size_t offset;
while (length > 0) {
+ bool from_gup;
+
i = 0;
maxpages = to_max_pages - num_elem;
if (maxpages == 0) {
@@ -1288,6 +1290,7 @@ static int tls_setup_from_iter(struct sock *sk, struct iov_iter *from,
goto out;
}
+ from_gup = iov_iter_get_pages_use_gup(from);
iov_iter_advance(from, copied);
length -= copied;
@@ -1295,8 +1298,12 @@ static int tls_setup_from_iter(struct sock *sk, struct iov_iter *from,
while (copied) {
use = min_t(int, copied, PAGE_SIZE - offset);
- sg_set_page(&to[num_elem],
- pages[i], use, offset);
+ if (from_gup)
+ sg_set_gup_page(&to[num_elem],
+ pages[i], use, offset);
+ else
+ sg_set_page(&to[num_elem],
+ pages[i], use, offset);
sg_unmark_end(&to[num_elem]);
/* We do not uncharge memory from this API */