linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Omar Sandoval <osandov@osandov.com>
To: linux-btrfs@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org, kernel-team@fb.com
Subject: [PATCH v3 3/5] btrfs: send: allocate send buffer with alloc_page() and vmap() for v2
Date: Fri, 22 Jan 2021 12:47:48 -0800	[thread overview]
Message-ID: <41449ae28ca4133f7aa27e6ec477d0c60586b3d4.1611347187.git.osandov@fb.com> (raw)
In-Reply-To: <cover.1611347187.git.osandov@fb.com>

From: Omar Sandoval <osandov@fb.com>

For encoded writes, we need the raw pages for reading compressed data
directly via a bio. So, replace kvmalloc() with vmap() so we have access
to the raw pages. 144k is large enough that it usually gets allocated
with vmalloc(), anyways.

Signed-off-by: Omar Sandoval <osandov@fb.com>
---
 fs/btrfs/send.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 98948568017c..25b1a60a568c 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -81,6 +81,7 @@ struct send_ctx {
 	char *send_buf;
 	u32 send_size;
 	u32 send_max_size;
+	struct page **send_buf_pages;
 	u64 total_send_size;
 	u64 cmd_send_size[BTRFS_SEND_C_MAX + 1];
 	u64 flags;	/* 'flags' member of btrfs_ioctl_send_args is u64 */
@@ -7203,6 +7204,7 @@ long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg)
 	struct btrfs_root *clone_root;
 	struct send_ctx *sctx = NULL;
 	u32 i;
+	u32 send_buf_num_pages = 0;
 	u64 *clone_sources_tmp = NULL;
 	int clone_sources_to_rollback = 0;
 	size_t alloc_size;
@@ -7283,10 +7285,28 @@ long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg)
 	if (sctx->flags & BTRFS_SEND_FLAG_STREAM_V2) {
 		sctx->send_max_size = ALIGN(SZ_16K + BTRFS_MAX_COMPRESSED,
 					    PAGE_SIZE);
+		send_buf_num_pages = sctx->send_max_size >> PAGE_SHIFT;
+		sctx->send_buf_pages = kcalloc(send_buf_num_pages,
+					       sizeof(*sctx->send_buf_pages),
+					       GFP_KERNEL);
+		if (!sctx->send_buf_pages) {
+			send_buf_num_pages = 0;
+			ret = -ENOMEM;
+			goto out;
+		}
+		for (i = 0; i < send_buf_num_pages; i++) {
+			sctx->send_buf_pages[i] = alloc_page(GFP_KERNEL);
+			if (!sctx->send_buf_pages[i]) {
+				ret = -ENOMEM;
+				goto out;
+			}
+		}
+		sctx->send_buf = vmap(sctx->send_buf_pages, send_buf_num_pages,
+				      VM_MAP, PAGE_KERNEL);
 	} else {
 		sctx->send_max_size = BTRFS_SEND_BUF_SIZE_V1;
+		sctx->send_buf = kvmalloc(sctx->send_max_size, GFP_KERNEL);
 	}
-	sctx->send_buf = kvmalloc(sctx->send_max_size, GFP_KERNEL);
 	if (!sctx->send_buf) {
 		ret = -ENOMEM;
 		goto out;
@@ -7495,7 +7515,16 @@ long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg)
 			fput(sctx->send_filp);
 
 		kvfree(sctx->clone_roots);
-		kvfree(sctx->send_buf);
+		if (sctx->flags & BTRFS_SEND_FLAG_STREAM_V2) {
+			vunmap(sctx->send_buf);
+			for (i = 0; i < send_buf_num_pages; i++) {
+				if (sctx->send_buf_pages[i])
+					__free_page(sctx->send_buf_pages[i]);
+			}
+			kfree(sctx->send_buf_pages);
+		} else {
+			kvfree(sctx->send_buf);
+		}
 
 		name_cache_free(sctx);
 
-- 
2.30.0


  parent reply	other threads:[~2021-01-22 20:55 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-22 20:47 [PATCH v3 0/5] btrfs: implement send/receive of compressed extents without decompressing Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 1/5] btrfs: add send stream v2 definitions Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 01/11] btrfs-progs: receive: support v2 send stream larger tlv_len Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 02/11] btrfs-progs: receive: dynamically allocate sctx->read_buf Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 2/5] btrfs: send: write larger chunks when using stream v2 Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 03/11] btrfs-progs: receive: support v2 send stream DATA tlv format Omar Sandoval
2021-01-22 20:47 ` Omar Sandoval [this message]
2021-01-22 20:47 ` [PATCH v3 04/11] btrfs-progs: receive: add send stream v2 cmds and attrs to send.h Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 4/5] btrfs: send: send compressed extents with encoded writes Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 05/11] btrfs-progs: receive: add stub implementation for pwritev2 Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 5/5] btrfs: send: enable support for stream v2 and compressed writes Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 06/11] btrfs-progs: receive: process encoded_write commands Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 07/11] btrfs-progs: receive: encoded_write fallback to explicit decode and write Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 08/11] btrfs-progs: receive: process fallocate commands Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 09/11] btrfs-progs: receive: process setflags ioctl commands Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 10/11] btrfs-progs: send: stream v2 ioctl flags Omar Sandoval
2021-01-22 20:47 ` [PATCH v3 11/11] btrfs-progs: receive: add tests for basic encoded_write send/receive Omar Sandoval

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41449ae28ca4133f7aa27e6ec477d0c60586b3d4.1611347187.git.osandov@fb.com \
    --to=osandov@osandov.com \
    --cc=kernel-team@fb.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).