2021-06-03 12:45:43

by chenguanyou

[permalink] [raw]
Subject: [PATCH] [fuse] alloc_page nofs avoid deadlock

ABA deadlock

PID: 17172 TASK: ffffffc0c162c000 CPU: 6 COMMAND: "Thread-21"

PID: 9652 TASK: ffffffc0c9ce0000 CPU: 4 COMMAND: "kworker/u16:8"

Signed-off-by: chenguanyou <[email protected]>
---
fs/fuse/dev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index c0fee830a34e..d36125ff0405 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -721,7 +721,7 @@ static int fuse_copy_fill(struct fuse_copy_state *cs)
if (cs->nr_segs >= cs->pipe->max_usage)
return -EIO;

- page = alloc_page(GFP_HIGHUSER);
+ page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
if (!page)
return -ENOMEM;

--
2.17.1


2021-06-03 12:57:52

by Michal Hocko

[permalink] [raw]
Subject: Re: [PATCH] [fuse] alloc_page nofs avoid deadlock

On Thu 03-06-21 20:41:05, chenguanyou wrote:
> ABA deadlock
>
> PID: 17172 TASK: ffffffc0c162c000 CPU: 6 COMMAND: "Thread-21"
>
> PID: 9652 TASK: ffffffc0c9ce0000 CPU: 4 COMMAND: "kworker/u16:8"

Please be much more specific about the underlying issue and what the
actual lock dependency during the reclaim is. The above is essentially
void of any relevant information.

> Signed-off-by: chenguanyou <[email protected]>
> ---
> fs/fuse/dev.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> index c0fee830a34e..d36125ff0405 100644
> --- a/fs/fuse/dev.c
> +++ b/fs/fuse/dev.c
> @@ -721,7 +721,7 @@ static int fuse_copy_fill(struct fuse_copy_state *cs)
> if (cs->nr_segs >= cs->pipe->max_usage)
> return -EIO;
>
> - page = alloc_page(GFP_HIGHUSER);
> + page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
> if (!page)
> return -ENOMEM;
>
> --
> 2.17.1

--
Michal Hocko
SUSE Labs