Re: [RFC -v2 7/8] btrfs: Prevent from early transaction abort

2015-08-19 Thread Michal Hocko
On Tue 18-08-15 19:29:14, Michal Hocko wrote:
> On Tue 18-08-15 13:11:44, Chris Mason wrote:
> > On Tue, Aug 18, 2015 at 12:40:32PM +0200, Michal Hocko wrote:
> > > From: Michal Hocko 
> > > 
> > > Btrfs relies on GFP_NOFS allocation when commiting the transaction but
> > > since "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM"
> > > those allocations are allowed to fail which can lead to a pre-mature
> > > transaction abort:
> > 
> > I can either put the btrfs nofail ones on my pull for Linus, or you can
> > add my sob and send as one unit.  Just let me know how you'd rather do
> > it.
> 
> OK, I will rephrase the changelogs (tomorrow) to not refer to an
> unmerged patch and would appreciate if you can take them and route them
> through your tree. I will then drop them from my pile.

Poste in a separate thread
http://lkml.kernel.org/r/1439986661-15896-1-git-send-email-mho...@kernel.org
-- 
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC -v2 7/8] btrfs: Prevent from early transaction abort

2015-08-18 Thread Michal Hocko
On Tue 18-08-15 13:11:44, Chris Mason wrote:
> On Tue, Aug 18, 2015 at 12:40:32PM +0200, Michal Hocko wrote:
> > From: Michal Hocko 
> > 
> > Btrfs relies on GFP_NOFS allocation when commiting the transaction but
> > since "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM"
> > those allocations are allowed to fail which can lead to a pre-mature
> > transaction abort:
> 
> I can either put the btrfs nofail ones on my pull for Linus, or you can
> add my sob and send as one unit.  Just let me know how you'd rather do
> it.

OK, I will rephrase the changelogs (tomorrow) to not refer to an
unmerged patch and would appreciate if you can take them and route them
through your tree. I will then drop them from my pile.

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


Re: [RFC -v2 7/8] btrfs: Prevent from early transaction abort

2015-08-18 Thread Chris Mason
On Tue, Aug 18, 2015 at 12:40:32PM +0200, Michal Hocko wrote:
> From: Michal Hocko 
> 
> Btrfs relies on GFP_NOFS allocation when commiting the transaction but
> since "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM"
> those allocations are allowed to fail which can lead to a pre-mature
> transaction abort:

I can either put the btrfs nofail ones on my pull for Linus, or you can
add my sob and send as one unit.  Just let me know how you'd rather do
it.

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


Re: [RFC -v2 7/8] btrfs: Prevent from early transaction abort

2015-08-18 Thread Michal Hocko
On Tue 18-08-15 12:40:31, Michal Hocko wrote:
[...]
> @@ -4867,9 +4865,7 @@ struct extent_buffer *alloc_extent_buffer(struct 
> btrfs_fs_info *fs_info,
>   return NULL;
>  
>   for (i = 0; i < num_pages; i++, index++) {
> - p = find_or_create_page(mapping, index, GFP_NOFS);
> - if (!p)
> - goto free_eb;
> + p = find_or_create_page(mapping, index, GFP_NOFS|__GFP_NOFAIL);
>  
>   spin_lock(&mapping->private_lock);
>   if (PagePrivate(p)) {

Same here. find_or_create_page might return NULL.
---
>From f430e5f54367b8815e1099f26fedd2873b597a07 Mon Sep 17 00:00:00 2001
From: Michal Hocko 
Date: Wed, 15 Jul 2015 19:27:06 +0200
Subject: [PATCH] btrfs: Prevent from early transaction abort

Btrfs relies on GFP_NOFS allocation when commiting the transaction but
since "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM"
those allocations are allowed to fail which can lead to a pre-mature
transaction abort:

[   55.328093] Call Trace:
[   55.328890]  [] dump_stack+0x4f/0x7b
[   55.330518]  [] ? console_unlock+0x334/0x363
[   55.332738]  [] __alloc_pages_nodemask+0x81d/0x8d4
[   55.334910]  [] pagecache_get_page+0x10e/0x20c
[   55.336844]  [] alloc_extent_buffer+0xd0/0x350 [btrfs]
[   55.338973]  [] btrfs_find_create_tree_block+0x15/0x17 
[btrfs]
[   55.341329]  [] btrfs_alloc_tree_block+0x18c/0x405 [btrfs]
[   55.343566]  [] split_leaf+0x1e4/0x6a6 [btrfs]
[   55.345577]  [] btrfs_search_slot+0x671/0x831 [btrfs]
[   55.347679]  [] ? get_parent_ip+0xe/0x3e
[   55.349434]  [] btrfs_insert_empty_items+0x5d/0xa8 [btrfs]
[   55.351681]  [] __btrfs_run_delayed_refs+0x7a6/0xf35 
[btrfs]
[   55.353979]  [] btrfs_run_delayed_refs+0x6e/0x226 [btrfs]
[   55.356212]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.358378]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.360626]  [] btrfs_commit_transaction+0x4c/0xaba [btrfs]
[   55.362894]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.365221]  [] btrfs_sync_file+0x29c/0x310 [btrfs]
[   55.367273]  [] vfs_fsync_range+0x8f/0x9e
[   55.369047]  [] vfs_fsync+0x1c/0x1e
[   55.370654]  [] do_fsync+0x34/0x4e
[   55.372246]  [] SyS_fsync+0x10/0x14
[   55.373851]  [] system_call_fastpath+0x12/0x6f
[   55.381070] BTRFS: error (device hdb1) in btrfs_run_delayed_refs:2821: 
errno=-12 Out of memory
[   55.382431] BTRFS warning (device hdb1): Skipping commit of aborted 
transaction.
[   55.382433] BTRFS warning (device hdb1): cleanup_transaction:1692: Aborting 
unused transaction(IO failure).
[   55.384280] [ cut here ]
[   55.384312] WARNING: CPU: 0 PID: 3010 at fs/btrfs/delayed-ref.c:438 
btrfs_select_ref_head+0xd9/0xfe [btrfs]()
[...]
[   55.384337] Call Trace:
[   55.384353]  [] dump_stack+0x4f/0x7b
[   55.384357]  [] ? down_trylock+0x2d/0x37
[   55.384359]  [] warn_slowpath_common+0xa1/0xbb
[   55.384398]  [] ? btrfs_select_ref_head+0xd9/0xfe [btrfs]
[   55.384400]  [] warn_slowpath_null+0x1a/0x1c
[   55.384423]  [] btrfs_select_ref_head+0xd9/0xfe [btrfs]
[   55.384446]  [] ? __btrfs_run_delayed_refs+0xa2/0xf35 
[btrfs]
[   55.384455]  [] __btrfs_run_delayed_refs+0xab/0xf35 [btrfs]
[   55.384476]  [] btrfs_run_delayed_refs+0x6e/0x226 [btrfs]
[   55.384499]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384521]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384543]  [] btrfs_commit_transaction+0x4c/0xaba [btrfs]
[   55.384565]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384588]  [] btrfs_sync_file+0x29c/0x310 [btrfs]
[   55.384591]  [] vfs_fsync_range+0x8f/0x9e
[   55.384592]  [] vfs_fsync+0x1c/0x1e
[   55.384593]  [] do_fsync+0x34/0x4e
[   55.384594]  [] SyS_fsync+0x10/0x14
[   55.384595]  [] system_call_fastpath+0x12/0x6f
[...]
[   55.384608] ---[ end trace c29799da1d4dd621 ]---
[   55.437323] BTRFS info (device hdb1): forced readonly
[   55.438815] BTRFS info (device hdb1): delayed_refs has NO entry

Fix this by reintroducing the no-fail behavior of this allocation path
with the explicit __GFP_NOFAIL.

Signed-off-by: Michal Hocko 
---
 fs/btrfs/extent_io.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index c374e1e71e5f..f4d6eea975d7 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4607,9 +4607,7 @@ __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 
start,
 {
struct extent_buffer *eb = NULL;
 
-   eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS);
-   if (eb == NULL)
-   return NULL;
+   eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS|__GFP_NOFAIL);
eb->start = start;
eb->len = len;
eb->fs_info = fs_info;
@@ -4867,7 +4865,7 @@ struct extent_buffer *alloc_extent_buffer(struct 
btrfs_fs_info *fs_info,
return NULL;
 
for (i = 0; i < num_pages; i++, index++) {
-   p = find_or_create_page(mapping, index, GFP_NOFS);
+   p = find_or_create_p

[RFC -v2 7/8] btrfs: Prevent from early transaction abort

2015-08-18 Thread Michal Hocko
From: Michal Hocko 

Btrfs relies on GFP_NOFS allocation when commiting the transaction but
since "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM"
those allocations are allowed to fail which can lead to a pre-mature
transaction abort:

[   55.328093] Call Trace:
[   55.328890]  [] dump_stack+0x4f/0x7b
[   55.330518]  [] ? console_unlock+0x334/0x363
[   55.332738]  [] __alloc_pages_nodemask+0x81d/0x8d4
[   55.334910]  [] pagecache_get_page+0x10e/0x20c
[   55.336844]  [] alloc_extent_buffer+0xd0/0x350 [btrfs]
[   55.338973]  [] btrfs_find_create_tree_block+0x15/0x17 
[btrfs]
[   55.341329]  [] btrfs_alloc_tree_block+0x18c/0x405 [btrfs]
[   55.343566]  [] split_leaf+0x1e4/0x6a6 [btrfs]
[   55.345577]  [] btrfs_search_slot+0x671/0x831 [btrfs]
[   55.347679]  [] ? get_parent_ip+0xe/0x3e
[   55.349434]  [] btrfs_insert_empty_items+0x5d/0xa8 [btrfs]
[   55.351681]  [] __btrfs_run_delayed_refs+0x7a6/0xf35 
[btrfs]
[   55.353979]  [] btrfs_run_delayed_refs+0x6e/0x226 [btrfs]
[   55.356212]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.358378]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.360626]  [] btrfs_commit_transaction+0x4c/0xaba [btrfs]
[   55.362894]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.365221]  [] btrfs_sync_file+0x29c/0x310 [btrfs]
[   55.367273]  [] vfs_fsync_range+0x8f/0x9e
[   55.369047]  [] vfs_fsync+0x1c/0x1e
[   55.370654]  [] do_fsync+0x34/0x4e
[   55.372246]  [] SyS_fsync+0x10/0x14
[   55.373851]  [] system_call_fastpath+0x12/0x6f
[   55.381070] BTRFS: error (device hdb1) in btrfs_run_delayed_refs:2821: 
errno=-12 Out of memory
[   55.382431] BTRFS warning (device hdb1): Skipping commit of aborted 
transaction.
[   55.382433] BTRFS warning (device hdb1): cleanup_transaction:1692: Aborting 
unused transaction(IO failure).
[   55.384280] [ cut here ]
[   55.384312] WARNING: CPU: 0 PID: 3010 at fs/btrfs/delayed-ref.c:438 
btrfs_select_ref_head+0xd9/0xfe [btrfs]()
[...]
[   55.384337] Call Trace:
[   55.384353]  [] dump_stack+0x4f/0x7b
[   55.384357]  [] ? down_trylock+0x2d/0x37
[   55.384359]  [] warn_slowpath_common+0xa1/0xbb
[   55.384398]  [] ? btrfs_select_ref_head+0xd9/0xfe [btrfs]
[   55.384400]  [] warn_slowpath_null+0x1a/0x1c
[   55.384423]  [] btrfs_select_ref_head+0xd9/0xfe [btrfs]
[   55.384446]  [] ? __btrfs_run_delayed_refs+0xa2/0xf35 
[btrfs]
[   55.384455]  [] __btrfs_run_delayed_refs+0xab/0xf35 [btrfs]
[   55.384476]  [] btrfs_run_delayed_refs+0x6e/0x226 [btrfs]
[   55.384499]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384521]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384543]  [] btrfs_commit_transaction+0x4c/0xaba [btrfs]
[   55.384565]  [] ? start_transaction+0x192/0x534 [btrfs]
[   55.384588]  [] btrfs_sync_file+0x29c/0x310 [btrfs]
[   55.384591]  [] vfs_fsync_range+0x8f/0x9e
[   55.384592]  [] vfs_fsync+0x1c/0x1e
[   55.384593]  [] do_fsync+0x34/0x4e
[   55.384594]  [] SyS_fsync+0x10/0x14
[   55.384595]  [] system_call_fastpath+0x12/0x6f
[...]
[   55.384608] ---[ end trace c29799da1d4dd621 ]---
[   55.437323] BTRFS info (device hdb1): forced readonly
[   55.438815] BTRFS info (device hdb1): delayed_refs has NO entry

Fix this by reintroducing the no-fail behavior of this allocation path
with the explicit __GFP_NOFAIL.

Signed-off-by: Michal Hocko 
---
 fs/btrfs/extent_io.c | 8 ++--
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index c374e1e71e5f..d855ddffd5fe 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4607,9 +4607,7 @@ __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 
start,
 {
struct extent_buffer *eb = NULL;
 
-   eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS);
-   if (eb == NULL)
-   return NULL;
+   eb = kmem_cache_zalloc(extent_buffer_cache, GFP_NOFS|__GFP_NOFAIL);
eb->start = start;
eb->len = len;
eb->fs_info = fs_info;
@@ -4867,9 +4865,7 @@ struct extent_buffer *alloc_extent_buffer(struct 
btrfs_fs_info *fs_info,
return NULL;
 
for (i = 0; i < num_pages; i++, index++) {
-   p = find_or_create_page(mapping, index, GFP_NOFS);
-   if (!p)
-   goto free_eb;
+   p = find_or_create_page(mapping, index, GFP_NOFS|__GFP_NOFAIL);
 
spin_lock(&mapping->private_lock);
if (PagePrivate(p)) {
-- 
2.5.0

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