linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] Add more vmalloc fallbacks to memory allocations
@ 2016-04-11 17:31 David Sterba
  2016-04-11 17:31 ` [PATCH 1/6] btrfs: send: use vmalloc only as fallback for send_buf David Sterba
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Hi,

inspired by a recent fix where we tried to kmalloc a 64k nodesize buffer,
without the vmalloc fallback, and failed. This series add the "kmalloc-first
and vmalloc-fallback" logic to more places, namely to the buffers used during
send.  If the memory is not fragmented, kmalloc succeeds and does not take the
resources required for the mappings.

----------------------------------------------------------------
The following changes since commit 56f23fdbb600e6087db7b009775b95ce07cc3195:

  Btrfs: fix file/data loss caused by fsync after rename and new inode (2016-04-06 17:01:44 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git dev/kvalloc

for you to fetch changes up to c3e3930516c4d14ed1d6d70964fbc4f3faa36844:

  btrfs: clone: use vmalloc only as fallback for nodesize bufer (2016-04-11 19:06:39 +0200)

----------------------------------------------------------------
David Sterba (6):
      btrfs: send: use vmalloc only as fallback for send_buf
      btrfs: send: use vmalloc only as fallback for read_buf
      btrfs: send: use temporary variable to store allocation size
      btrfs: send: use vmalloc only as fallback for clone_roots
      btrfs: send: use vmalloc only as fallback for clone_sources_tmp
      btrfs: clone: use vmalloc only as fallback for nodesize bufer

 fs/btrfs/ioctl.c | 13 ++++++++-----
 fs/btrfs/send.c  | 56 +++++++++++++++++++++++++++++++++++---------------------
 2 files changed, 43 insertions(+), 26 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/6] btrfs: send: use vmalloc only as fallback for send_buf
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
@ 2016-04-11 17:31 ` David Sterba
  2016-04-11 17:31 ` [PATCH 2/6] btrfs: send: use vmalloc only as fallback for read_buf David Sterba
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/send.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 19b7bf4284ee..8f6f9d6d14df 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -6022,10 +6022,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 	sctx->clone_roots_cnt = arg->clone_sources_count;
 
 	sctx->send_max_size = BTRFS_SEND_BUF_SIZE;
-	sctx->send_buf = vmalloc(sctx->send_max_size);
+	sctx->send_buf = kmalloc(sctx->send_max_size, GFP_KERNEL | __GFP_NOWARN);
 	if (!sctx->send_buf) {
-		ret = -ENOMEM;
-		goto out;
+		sctx->send_buf = vmalloc(sctx->send_max_size);
+		if (!sctx->send_buf) {
+			ret = -ENOMEM;
+			goto out;
+		}
 	}
 
 	sctx->read_buf = vmalloc(BTRFS_SEND_READ_SIZE);
@@ -6214,7 +6217,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 			fput(sctx->send_filp);
 
 		vfree(sctx->clone_roots);
-		vfree(sctx->send_buf);
+		kvfree(sctx->send_buf);
 		vfree(sctx->read_buf);
 
 		name_cache_free(sctx);
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/6] btrfs: send: use vmalloc only as fallback for read_buf
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
  2016-04-11 17:31 ` [PATCH 1/6] btrfs: send: use vmalloc only as fallback for send_buf David Sterba
@ 2016-04-11 17:31 ` David Sterba
  2016-04-11 17:31 ` [PATCH 3/6] btrfs: send: use temporary variable to store allocation size David Sterba
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/send.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 8f6f9d6d14df..fc9d7f6212c1 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -6031,10 +6031,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 		}
 	}
 
-	sctx->read_buf = vmalloc(BTRFS_SEND_READ_SIZE);
+	sctx->read_buf = kmalloc(BTRFS_SEND_READ_SIZE, GFP_KERNEL | __GFP_NOWARN);
 	if (!sctx->read_buf) {
-		ret = -ENOMEM;
-		goto out;
+		sctx->read_buf = vmalloc(BTRFS_SEND_READ_SIZE);
+		if (!sctx->read_buf) {
+			ret = -ENOMEM;
+			goto out;
+		}
 	}
 
 	sctx->pending_dir_moves = RB_ROOT;
@@ -6218,7 +6221,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 
 		vfree(sctx->clone_roots);
 		kvfree(sctx->send_buf);
-		vfree(sctx->read_buf);
+		kvfree(sctx->read_buf);
 
 		name_cache_free(sctx);
 
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/6] btrfs: send: use temporary variable to store allocation size
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
  2016-04-11 17:31 ` [PATCH 1/6] btrfs: send: use vmalloc only as fallback for send_buf David Sterba
  2016-04-11 17:31 ` [PATCH 2/6] btrfs: send: use vmalloc only as fallback for read_buf David Sterba
@ 2016-04-11 17:31 ` David Sterba
  2016-04-11 17:31 ` [PATCH 4/6] btrfs: send: use vmalloc only as fallback for clone_roots David Sterba
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

We're going to use the argument multiple times later.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/send.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index fc9d7f6212c1..ab1b4d259836 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -5939,6 +5939,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 	u32 i;
 	u64 *clone_sources_tmp = NULL;
 	int clone_sources_to_rollback = 0;
+	unsigned alloc_size;
 	int sort_clone_roots = 0;
 	int index;
 
@@ -6044,24 +6045,25 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 	sctx->waiting_dir_moves = RB_ROOT;
 	sctx->orphan_dirs = RB_ROOT;
 
-	sctx->clone_roots = vzalloc(sizeof(struct clone_root) *
-			(arg->clone_sources_count + 1));
+	alloc_size = sizeof(struct clone_root) * (arg->clone_sources_count + 1);
+
+	sctx->clone_roots = vzalloc(alloc_size);
 	if (!sctx->clone_roots) {
 		ret = -ENOMEM;
 		goto out;
 	}
 
+	alloc_size = arg->clone_sources_count * sizeof(*arg->clone_sources);
+
 	if (arg->clone_sources_count) {
-		clone_sources_tmp = vmalloc(arg->clone_sources_count *
-				sizeof(*arg->clone_sources));
+		clone_sources_tmp = vmalloc(alloc_size);
 		if (!clone_sources_tmp) {
 			ret = -ENOMEM;
 			goto out;
 		}
 
 		ret = copy_from_user(clone_sources_tmp, arg->clone_sources,
-				arg->clone_sources_count *
-				sizeof(*arg->clone_sources));
+				alloc_size);
 		if (ret) {
 			ret = -EFAULT;
 			goto out;
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/6] btrfs: send: use vmalloc only as fallback for clone_roots
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
                   ` (2 preceding siblings ...)
  2016-04-11 17:31 ` [PATCH 3/6] btrfs: send: use temporary variable to store allocation size David Sterba
@ 2016-04-11 17:31 ` David Sterba
  2016-04-11 17:31 ` [PATCH 5/6] btrfs: send: use vmalloc only as fallback for clone_sources_tmp David Sterba
  2016-04-11 17:31 ` [PATCH 6/6] btrfs: clone: use vmalloc only as fallback for nodesize bufer David Sterba
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/send.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index ab1b4d259836..02967374d0d9 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -6047,10 +6047,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 
 	alloc_size = sizeof(struct clone_root) * (arg->clone_sources_count + 1);
 
-	sctx->clone_roots = vzalloc(alloc_size);
+	sctx->clone_roots = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN);
 	if (!sctx->clone_roots) {
-		ret = -ENOMEM;
-		goto out;
+		sctx->clone_roots = vzalloc(alloc_size);
+		if (!sctx->clone_roots) {
+			ret = -ENOMEM;
+			goto out;
+		}
 	}
 
 	alloc_size = arg->clone_sources_count * sizeof(*arg->clone_sources);
@@ -6221,7 +6224,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 		if (sctx->send_filp)
 			fput(sctx->send_filp);
 
-		vfree(sctx->clone_roots);
+		kvfree(sctx->clone_roots);
 		kvfree(sctx->send_buf);
 		kvfree(sctx->read_buf);
 
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 5/6] btrfs: send: use vmalloc only as fallback for clone_sources_tmp
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
                   ` (3 preceding siblings ...)
  2016-04-11 17:31 ` [PATCH 4/6] btrfs: send: use vmalloc only as fallback for clone_roots David Sterba
@ 2016-04-11 17:31 ` David Sterba
  2016-04-11 17:31 ` [PATCH 6/6] btrfs: clone: use vmalloc only as fallback for nodesize bufer David Sterba
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/send.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 02967374d0d9..53a40a7077a2 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -6059,10 +6059,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 	alloc_size = arg->clone_sources_count * sizeof(*arg->clone_sources);
 
 	if (arg->clone_sources_count) {
-		clone_sources_tmp = vmalloc(alloc_size);
+		clone_sources_tmp = kmalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN);
 		if (!clone_sources_tmp) {
-			ret = -ENOMEM;
-			goto out;
+			clone_sources_tmp = vmalloc(alloc_size);
+			if (!clone_sources_tmp) {
+				ret = -ENOMEM;
+				goto out;
+			}
 		}
 
 		ret = copy_from_user(clone_sources_tmp, arg->clone_sources,
@@ -6100,7 +6103,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 			sctx->clone_roots[i].root = clone_root;
 			clone_sources_to_rollback = i + 1;
 		}
-		vfree(clone_sources_tmp);
+		kvfree(clone_sources_tmp);
 		clone_sources_tmp = NULL;
 	}
 
@@ -6218,7 +6221,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
 		btrfs_root_dec_send_in_progress(sctx->parent_root);
 
 	kfree(arg);
-	vfree(clone_sources_tmp);
+	kvfree(clone_sources_tmp);
 
 	if (sctx) {
 		if (sctx->send_filp)
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 6/6] btrfs: clone: use vmalloc only as fallback for nodesize bufer
  2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
                   ` (4 preceding siblings ...)
  2016-04-11 17:31 ` [PATCH 5/6] btrfs: send: use vmalloc only as fallback for clone_sources_tmp David Sterba
@ 2016-04-11 17:31 ` David Sterba
  5 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2016-04-11 17:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/ioctl.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 21423dd15da4..0cb80379e6f6 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -3468,13 +3468,16 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
 	u64 last_dest_end = destoff;
 
 	ret = -ENOMEM;
-	buf = vmalloc(root->nodesize);
-	if (!buf)
-		return ret;
+	buf = kmalloc(root->nodesize, GFP_KERNEL | __GFP_NOWARN);
+	if (!buf) {
+		buf = vmalloc(root->nodesize);
+		if (!buf)
+			return ret;
+	}
 
 	path = btrfs_alloc_path();
 	if (!path) {
-		vfree(buf);
+		kvfree(buf);
 		return ret;
 	}
 
@@ -3775,7 +3778,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
 
 out:
 	btrfs_free_path(path);
-	vfree(buf);
+	kvfree(buf);
 	return ret;
 }
 
-- 
2.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-04-11 17:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-11 17:31 [PATCH 0/6] Add more vmalloc fallbacks to memory allocations David Sterba
2016-04-11 17:31 ` [PATCH 1/6] btrfs: send: use vmalloc only as fallback for send_buf David Sterba
2016-04-11 17:31 ` [PATCH 2/6] btrfs: send: use vmalloc only as fallback for read_buf David Sterba
2016-04-11 17:31 ` [PATCH 3/6] btrfs: send: use temporary variable to store allocation size David Sterba
2016-04-11 17:31 ` [PATCH 4/6] btrfs: send: use vmalloc only as fallback for clone_roots David Sterba
2016-04-11 17:31 ` [PATCH 5/6] btrfs: send: use vmalloc only as fallback for clone_sources_tmp David Sterba
2016-04-11 17:31 ` [PATCH 6/6] btrfs: clone: use vmalloc only as fallback for nodesize bufer David Sterba

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).