All of lore.kernel.org
 help / color / mirror / Atom feed
From: Minchan Kim <minchan@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	npiggin@gmail.com, kamezawa.hiroyu@jp.fujitsu.com,
	kosaki.motohiro@gmail.com, rientjes@google.com,
	Neil Brown <neilb@suse.de>,
	Artem Bityutskiy <dedekind1@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>,
	Theodore Ts'o <tytso@mit.edu>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Steven Whitehouse <swhiteho@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	James Morris <jmorris@namei.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Sage Weil <sage@newdream.net>
Subject: Re: [RFC] vmalloc: add warning in __vmalloc
Date: Mon, 30 Apr 2012 10:52:30 +0900	[thread overview]
Message-ID: <4F9DF05E.7080707@kernel.org> (raw)
In-Reply-To: <20120427150030.6183a286.akpm@linux-foundation.org>

On 04/28/2012 07:00 AM, Andrew Morton wrote:

> On Fri, 27 Apr 2012 17:42:24 +0900
> Minchan Kim <minchan@kernel.org> wrote:
> 
>> Now there are several places to use __vmalloc with GFP_ATOMIC,
>> GFP_NOIO, GFP_NOFS but unfortunately __vmalloc calls map_vm_area
>> which calls alloc_pages with GFP_KERNEL to allocate page tables.
>> It means it's possible to happen deadlock.
>> I don't know why it doesn't have reported until now.
>>
>> Firstly, I tried passing gfp_t to lower functions to support __vmalloc
>> with such flags but other mm guys don't want and decided that
>> all of caller should be fixed.
>>
>> http://marc.info/?l=linux-kernel&m=133517143616544&w=2
>>
>> To begin with, let's listen other's opinion whether they can fix it
>> by other approach without calling __vmalloc with such flags.
>>
>> So this patch adds warning to detect and to be fixed hopely.
>> I Cced related maintainers.
>> If I miss someone, please Cced them.
>>
>> side-note:
>>   I added WARN_ON instead of WARN_ONCE to detect all of callers
>>   and each WARN_ON for each flag to detect to use any flag easily.
>>   After we fix all of caller or reduce such caller, we can merge
>>   a warning with WARN_ONCE.
> 
> Just WARN_ONCE, please.  If that exposes some sort of calamity then we
> can reconsider.


NP.

> 
>>
>> ...
>>
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -1700,6 +1700,15 @@ static void *__vmalloc_node(unsigned long size, unsigned long align,
>>  			    gfp_t gfp_mask, pgprot_t prot,
>>  			    int node, void *caller)
>>  {
>> +	/*
>> +	 * This function calls map_vm_area so that it allocates
>> +	 * page table with GFP_KERNEL so caller should avoid using
>> +	 * GFP_NOIO, GFP_NOFS and !__GFP_WAIT.
>> +	 */
>> +	WARN_ON(!(gfp_mask & __GFP_WAIT));
>> +	WARN_ON(!(gfp_mask & __GFP_IO));
>> +	WARN_ON(!(gfp_mask & __GFP_FS));
>> +
>>  	return __vmalloc_node_range(size, align, VMALLOC_START, VMALLOC_END,
>>  				gfp_mask, prot, node, caller);
>>  }
> 
> This seems strange.  There are many entry points to this code and the
> patch appears to go into a randomly-chosen middle point in the various
> call chains and sticks a check in there.  Why was __vmalloc_node()
> chosen?  Does this provide full coverage or all entry points?


I think it covers all of caller with calls __vmalloc with gfp_flags.
Only exception is __vmalloc_node_range which is called by module_alloc
but it surely calls __vmalloc_node_range with GFP_KERNEL so it's no problem now.
If you want to catch potential use of __vmalloc_node_range in future, I can move it
to it. 

> 
> 
> 
> Also, the patch won't warn in the most problematic cases such as
> vmalloc() being called from a __GFP_NOFS context.  Presumably there are


I agree but this patch's goal is just to prevent calling __vmalloc with GFP_ATOMIC, GFP_NOFS and
GFP_NOIO. We should consider vmalloc on __GFP_NOFS context as another problem and maybe
reclaimfs lockdep would be a good start point.

> might_sleep() warnings somewhere on the allocation path which will

> catch vmalloc() being called from atomic contexts.


Yes.

> 
> I'm not sure what to do about that - we don't have machinery in place
> to be able to detect when a GFP_KERNEL allocation is deadlockable. 
> Perhaps a lot of hacking on lockdep might get us this - we'd need to
> teach lockdep about which locks prohibit FS entry, which locks prevent
> IO entry, etc.  And there are secret locks such as ext3/4
> journal_start(), and bitlocks and lock_page().  eek.

> 

> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
> 



-- 
Kind regards,
Minchan Kim

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Minchan Kim <minchan@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	npiggin@gmail.com, kamezawa.hiroyu@jp.fujitsu.com,
	kosaki.motohiro@gmail.com, rientjes@google.com,
	Neil Brown <neilb@suse.de>,
	Artem Bityutskiy <dedekind1@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Steven Whitehouse <swhiteho@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	James Morris <jmorris@namei.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Sage Weil <sage@newdream.net>
Subject: Re: [RFC] vmalloc: add warning in __vmalloc
Date: Mon, 30 Apr 2012 10:52:30 +0900	[thread overview]
Message-ID: <4F9DF05E.7080707@kernel.org> (raw)
In-Reply-To: <20120427150030.6183a286.akpm@linux-foundation.org>

On 04/28/2012 07:00 AM, Andrew Morton wrote:

> On Fri, 27 Apr 2012 17:42:24 +0900
> Minchan Kim <minchan@kernel.org> wrote:
> 
>> Now there are several places to use __vmalloc with GFP_ATOMIC,
>> GFP_NOIO, GFP_NOFS but unfortunately __vmalloc calls map_vm_area
>> which calls alloc_pages with GFP_KERNEL to allocate page tables.
>> It means it's possible to happen deadlock.
>> I don't know why it doesn't have reported until now.
>>
>> Firstly, I tried passing gfp_t to lower functions to support __vmalloc
>> with such flags but other mm guys don't want and decided that
>> all of caller should be fixed.
>>
>> http://marc.info/?l=linux-kernel&m=133517143616544&w=2
>>
>> To begin with, let's listen other's opinion whether they can fix it
>> by other approach without calling __vmalloc with such flags.
>>
>> So this patch adds warning to detect and to be fixed hopely.
>> I Cced related maintainers.
>> If I miss someone, please Cced them.
>>
>> side-note:
>>   I added WARN_ON instead of WARN_ONCE to detect all of callers
>>   and each WARN_ON for each flag to detect to use any flag easily.
>>   After we fix all of caller or reduce such caller, we can merge
>>   a warning with WARN_ONCE.
> 
> Just WARN_ONCE, please.  If that exposes some sort of calamity then we
> can reconsider.


NP.

> 
>>
>> ...
>>
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -1700,6 +1700,15 @@ static void *__vmalloc_node(unsigned long size, unsigned long align,
>>  			    gfp_t gfp_mask, pgprot_t prot,
>>  			    int node, void *caller)
>>  {
>> +	/*
>> +	 * This function calls map_vm_area so that it allocates
>> +	 * page table with GFP_KERNEL so caller should avoid using
>> +	 * GFP_NOIO, GFP_NOFS and !__GFP_WAIT.
>> +	 */
>> +	WARN_ON(!(gfp_mask & __GFP_WAIT));
>> +	WARN_ON(!(gfp_mask & __GFP_IO));
>> +	WARN_ON(!(gfp_mask & __GFP_FS));
>> +
>>  	return __vmalloc_node_range(size, align, VMALLOC_START, VMALLOC_END,
>>  				gfp_mask, prot, node, caller);
>>  }
> 
> This seems strange.  There are many entry points to this code and the
> patch appears to go into a randomly-chosen middle point in the various
> call chains and sticks a check in there.  Why was __vmalloc_node()
> chosen?  Does this provide full coverage or all entry points?


I think it covers all of caller with calls __vmalloc with gfp_flags.
Only exception is __vmalloc_node_range which is called by module_alloc
but it surely calls __vmalloc_node_range with GFP_KERNEL so it's no problem now.
If you want to catch potential use of __vmalloc_node_range in future, I can move it
to it. 

> 
> 
> 
> Also, the patch won't warn in the most problematic cases such as
> vmalloc() being called from a __GFP_NOFS context.  Presumably there are


I agree but this patch's goal is just to prevent calling __vmalloc with GFP_ATOMIC, GFP_NOFS and
GFP_NOIO. We should consider vmalloc on __GFP_NOFS context as another problem and maybe
reclaimfs lockdep would be a good start point.

> might_sleep() warnings somewhere on the allocation path which will

> catch vmalloc() being called from atomic contexts.


Yes.

> 
> I'm not sure what to do about that - we don't have machinery in place
> to be able to detect when a GFP_KERNEL allocation is deadlockable. 
> Perhaps a lot of hacking on lockdep might get us this - we'd need to
> teach lockdep about which locks prohibit FS entry, which locks prevent
> IO entry, etc.  And there are secret locks such as ext3/4
> journal_start(), and bitlocks and lock_page().  eek.

> 

> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
> 



-- 
Kind regards,
Minchan Kim

  reply	other threads:[~2012-04-30  1:52 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-27  8:42 [RFC] vmalloc: add warning in __vmalloc Minchan Kim
2012-04-27  9:16 ` Steven Whitehouse
2012-04-27  9:16   ` Steven Whitehouse
2012-04-27 10:36 ` David Rientjes
2012-04-27 10:36   ` David Rientjes
2012-05-01  3:13   ` Nick Piggin
2012-05-01  3:13     ` Nick Piggin
2012-05-01 20:22     ` David Rientjes
2012-05-01 20:22       ` David Rientjes
2012-05-01 23:18       ` Nick Piggin
2012-05-01 23:18         ` Nick Piggin
2012-05-02  1:01         ` David Rientjes
2012-05-02  1:01           ` David Rientjes
2012-04-27 22:00 ` Andrew Morton
2012-04-27 22:00   ` Andrew Morton
2012-04-30  1:52   ` Minchan Kim [this message]
2012-04-30  1:52     ` Minchan Kim

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=4F9DF05E.7080707@kernel.org \
    --to=minchan@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=dedekind1@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=jmorris@namei.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kosaki.motohiro@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=neilb@suse.de \
    --cc=npiggin@gmail.com \
    --cc=rientjes@google.com \
    --cc=sage@newdream.net \
    --cc=swhiteho@redhat.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /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.