All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aaron Lu <aaron.lu@linux.alibaba.com>
To: Jiufei Xue <jiufei.xue@linux.alibaba.com>, akpm@linux-foundation.org
Cc: linux-mm@kvack.org, joseph.qi@linux.alibaba.com,
	Michal Hocko <mhocko@suse.com>, Vasily Averin <vvs@virtuozzo.com>
Subject: Re: [PATCH] mm: fix sleeping function warning in alloc_swap_info
Date: Tue, 29 Jan 2019 16:53:35 +0800	[thread overview]
Message-ID: <f174c414-ed81-11a7-02cd-b024ef75d61f@linux.alibaba.com> (raw)
In-Reply-To: <20190129072154.63783-1-jiufei.xue@linux.alibaba.com>

On 2019/1/29 15:21, Jiufei Xue wrote:
> Trinity reports BUG:
> 
> sleeping function called from invalid context at mm/vmalloc.c:1477
> in_atomic(): 1, irqs_disabled(): 0, pid: 12269, name: trinity-c1
> 
> [ 2748.573460] Call Trace:
> [ 2748.575935]  dump_stack+0x91/0xeb
> [ 2748.578512]  ___might_sleep+0x21c/0x250
> [ 2748.581090]  remove_vm_area+0x1d/0x90
> [ 2748.583637]  __vunmap+0x76/0x100
> [ 2748.586120]  __se_sys_swapon+0xb9a/0x1220
> [ 2748.598973]  do_syscall_64+0x60/0x210
> [ 2748.601439]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
> 
> This is triggered by calling kvfree() inside spinlock() section in
> function alloc_swap_info().
> Fix this by moving the kvfree() after spin_unlock().

The fix looks good to me.

BTW, swap_info_struct's size has been reduced to its original size:
272 bytes by commit 66f71da9dd38("mm/swap: use nr_node_ids for
avail_lists in swap_info_struct"). I didn't use back kzalloc/kfree
in that commit since I don't see any any harm by keep using
kvzalloc/kvfree, but now looks like they're causing some trouble.

So what about using back kzalloc/kfree for swap_info_struct instead?
Can save one local variable and using kvzalloc/kvfree for a struct
that is 272 bytes doesn't really have any benefit.

Thanks,
Aaron

> 
> Fixes: 873d7bcfd066 ("mm/swapfile.c: use kvzalloc for swap_info_struct allocation")
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
> Signed-off-by: Jiufei Xue <jiufei.xue@linux.alibaba.com>
> ---
>  mm/swapfile.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index dbac1d49469d..d26c9eac3d64 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -2810,7 +2810,7 @@ late_initcall(max_swapfiles_check);
>  
>  static struct swap_info_struct *alloc_swap_info(void)
>  {
> -	struct swap_info_struct *p;
> +	struct swap_info_struct *p, *tmp = NULL;
>  	unsigned int type;
>  	int i;
>  	int size = sizeof(*p) + nr_node_ids * sizeof(struct plist_node);
> @@ -2840,7 +2840,7 @@ static struct swap_info_struct *alloc_swap_info(void)
>  		smp_wmb();
>  		nr_swapfiles++;
>  	} else {
> -		kvfree(p);
> +		tmp = p;
>  		p = swap_info[type];
>  		/*
>  		 * Do not memset this entry: a racing procfs swap_next()
> @@ -2853,6 +2853,8 @@ static struct swap_info_struct *alloc_swap_info(void)
>  		plist_node_init(&p->avail_lists[i], 0);
>  	p->flags = SWP_USED;
>  	spin_unlock(&swap_lock);
> +	kvfree(tmp);
> +
>  	spin_lock_init(&p->lock);
>  	spin_lock_init(&p->cont_lock);
>  
> 


  reply	other threads:[~2019-01-29  8:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-29  7:21 [PATCH] mm: fix sleeping function warning in alloc_swap_info Jiufei Xue
2019-01-29  8:53 ` Aaron Lu [this message]
2019-01-29 10:43   ` Joseph Qi
2019-01-29 11:19     ` Aaron Lu
2019-01-29 11:43 ` Tetsuo Handa
2019-01-29 19:13   ` Andrew Morton
2019-01-29 21:12     ` Tetsuo Handa
2019-01-29 21:51       ` Yang Shi
2019-01-30  0:42         ` Tetsuo Handa
2019-01-30  1:01           ` Andrew Morton
2019-01-30  1:11             ` Linus Torvalds
2019-01-30  1:23               ` Linus Torvalds
2019-01-30  2:54                 ` Tetsuo Handa
2019-01-30 17:18                   ` Linus Torvalds
2019-01-30 22:13                     ` Andrew Morton
2019-03-07 14:43             ` Aaron Lu
2019-03-07 14:47               ` Andrey Ryabinin
2019-03-07 15:24                 ` Aaron Lu
2019-03-07 16:33                   ` Andrey Ryabinin
2019-03-08  2:41                     ` Aaron Lu
2019-03-11  1:43                       ` Jiufei Xue

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=f174c414-ed81-11a7-02cd-b024ef75d61f@linux.alibaba.com \
    --to=aaron.lu@linux.alibaba.com \
    --cc=akpm@linux-foundation.org \
    --cc=jiufei.xue@linux.alibaba.com \
    --cc=joseph.qi@linux.alibaba.com \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=vvs@virtuozzo.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.