linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
@ 2011-11-16 11:55 Srivatsa S. Bhat
  2011-11-16 16:26 ` Tejun Heo
  0 siblings, 1 reply; 8+ messages in thread
From: Srivatsa S. Bhat @ 2011-11-16 11:55 UTC (permalink / raw)
  To: rjw; +Cc: pavel, lenb, ak, tj, linux-kernel, linux-pm, linux-mm

The lock_system_sleep() function is used in the memory hotplug code at
several places in order to implement mutual exclusion with hibernation.
However, this function tries to acquire the 'pm_mutex' lock using
mutex_lock() and hence blocks in TASK_UNINTERRUPTIBLE state if it doesn't
get the lock. This would lead to task freezing failures and hence
hibernation failure as a consequence, even though the hibernation call path
successfully acquired the lock.

This patch fixes this issue by modifying lock_system_sleep() to use
mutex_trylock() in a loop until the lock is acquired, instead of using
mutex_lock(), in order to avoid going to uninterruptible sleep.
Also, try_to_freeze() is called within the loop, so that we don't cause
freezing failures due to busy looping.

v2: Tejun pointed problems with using mutex_lock_interruptible() in a
    while loop, when signals not related to freezing are involved.
    So, replaced it with mutex_trylock().

Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---

 include/linux/suspend.h |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index 57a6924..c2b5aab 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -5,6 +5,7 @@
 #include <linux/notifier.h>
 #include <linux/init.h>
 #include <linux/pm.h>
+#include <linux/freezer.h>
 #include <linux/mm.h>
 #include <asm/errno.h>
 
@@ -380,7 +381,18 @@ static inline void unlock_system_sleep(void) {}
 
 static inline void lock_system_sleep(void)
 {
-	mutex_lock(&pm_mutex);
+	/*
+	 * We should not use mutex_lock() here because, in case we fail to
+	 * acquire the lock, it would put us to sleep in TASK_UNINTERRUPTIBLE
+	 * state, which would lead to task freezing failures. As a
+	 * consequence, hibernation would fail (even though it had acquired
+	 * the 'pm_mutex' lock).
+	 *
+	 * We should use try_to_freeze() in the while loop so that we don't
+	 * cause freezing failures due to busy looping.
+	 */
+	while (!mutex_trylock(&pm_mutex))
+		try_to_freeze();
 }
 
 static inline void unlock_system_sleep(void)

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 11:55 [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures Srivatsa S. Bhat
@ 2011-11-16 16:26 ` Tejun Heo
  2011-11-16 17:22   ` Srivatsa S. Bhat
  0 siblings, 1 reply; 8+ messages in thread
From: Tejun Heo @ 2011-11-16 16:26 UTC (permalink / raw)
  To: Srivatsa S. Bhat; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

Hello,

On Wed, Nov 16, 2011 at 05:25:23PM +0530, Srivatsa S. Bhat wrote:
> v2: Tejun pointed problems with using mutex_lock_interruptible() in a
>     while loop, when signals not related to freezing are involved.
>     So, replaced it with mutex_trylock().
> 
> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
> ---
> 
>  include/linux/suspend.h |   14 +++++++++++++-
>  1 files changed, 13 insertions(+), 1 deletions(-)
> 
> diff --git a/include/linux/suspend.h b/include/linux/suspend.h
> index 57a6924..c2b5aab 100644
> --- a/include/linux/suspend.h
> +++ b/include/linux/suspend.h
> @@ -5,6 +5,7 @@
>  #include <linux/notifier.h>
>  #include <linux/init.h>
>  #include <linux/pm.h>
> +#include <linux/freezer.h>
>  #include <linux/mm.h>
>  #include <asm/errno.h>
>  
> @@ -380,7 +381,18 @@ static inline void unlock_system_sleep(void) {}
>  
>  static inline void lock_system_sleep(void)
>  {
> -	mutex_lock(&pm_mutex);
> +	/*
> +	 * We should not use mutex_lock() here because, in case we fail to
> +	 * acquire the lock, it would put us to sleep in TASK_UNINTERRUPTIBLE
> +	 * state, which would lead to task freezing failures. As a
> +	 * consequence, hibernation would fail (even though it had acquired
> +	 * the 'pm_mutex' lock).
> +	 *
> +	 * We should use try_to_freeze() in the while loop so that we don't
> +	 * cause freezing failures due to busy looping.
> +	 */
> +	while (!mutex_trylock(&pm_mutex))
> +		try_to_freeze();

I'm kinda lost.  We now always busy-loop if the lock is held by
someone else.  I can't see how that is an improvement.  If this isn't
an immediate issue, wouldn't it be better to wait for proper solution?

Thank you.

-- 
tejun

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 16:26 ` Tejun Heo
@ 2011-11-16 17:22   ` Srivatsa S. Bhat
  2011-11-16 17:43     ` Tejun Heo
  0 siblings, 1 reply; 8+ messages in thread
From: Srivatsa S. Bhat @ 2011-11-16 17:22 UTC (permalink / raw)
  To: Tejun Heo; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

On 11/16/2011 09:56 PM, Tejun Heo wrote:
> Hello,
> 
> On Wed, Nov 16, 2011 at 05:25:23PM +0530, Srivatsa S. Bhat wrote:
>> v2: Tejun pointed problems with using mutex_lock_interruptible() in a
>>     while loop, when signals not related to freezing are involved.
>>     So, replaced it with mutex_trylock().
>>
>> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
>> ---
>>
>>  include/linux/suspend.h |   14 +++++++++++++-
>>  1 files changed, 13 insertions(+), 1 deletions(-)
>>
>> diff --git a/include/linux/suspend.h b/include/linux/suspend.h
>> index 57a6924..c2b5aab 100644
>> --- a/include/linux/suspend.h
>> +++ b/include/linux/suspend.h
>> @@ -5,6 +5,7 @@
>>  #include <linux/notifier.h>
>>  #include <linux/init.h>
>>  #include <linux/pm.h>
>> +#include <linux/freezer.h>
>>  #include <linux/mm.h>
>>  #include <asm/errno.h>
>>  
>> @@ -380,7 +381,18 @@ static inline void unlock_system_sleep(void) {}
>>  
>>  static inline void lock_system_sleep(void)
>>  {
>> -	mutex_lock(&pm_mutex);
>> +	/*
>> +	 * We should not use mutex_lock() here because, in case we fail to
>> +	 * acquire the lock, it would put us to sleep in TASK_UNINTERRUPTIBLE
>> +	 * state, which would lead to task freezing failures. As a
>> +	 * consequence, hibernation would fail (even though it had acquired
>> +	 * the 'pm_mutex' lock).
>> +	 *
>> +	 * We should use try_to_freeze() in the while loop so that we don't
>> +	 * cause freezing failures due to busy looping.
>> +	 */
>> +	while (!mutex_trylock(&pm_mutex))
>> +		try_to_freeze();
> 
> I'm kinda lost.  We now always busy-loop if the lock is held by
> someone else.  I can't see how that is an improvement.  If this isn't
> an immediate issue, wouldn't it be better to wait for proper solution?
> 

lock_system_sleep() is used by memory hotplug to mutually exclude itself
from hibernation. Which means if memory hotplug didn't get the lock, then
the "someone else" is going to be the hibernation code path. 
And in that case, how can this busy-loop for long? The try_to_freeze() in
the loop will co-operate with the freezing of tasks (which is carried out
during hibernation) and this task will get frozen pretty soon.
And thus, this prevents task freezing failures. However, if we had slept
uninterruptibly like the original code does, then it is a sure-shot
candidate for freezing failure.
In fact I tried using this API as a test, in another scenario and as very
much expected, I encountered freezing failures with the original code.
And with this patch applied, those failures vanished, again as expected.

So, honestly I didn't understand what is wrong with the approach of this
patch. And as a consequence, I don't see why we should wait to fix this
issue. 

[And by the way recently I happened to see yet another proposed patch
trying to make use of this API. So wouldn't it be better to fix this
ASAP, especially when we have a fix readily available?]

Thanks,
Srivatsa S. Bhat

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 17:22   ` Srivatsa S. Bhat
@ 2011-11-16 17:43     ` Tejun Heo
  2011-11-16 18:24       ` Srivatsa S. Bhat
  0 siblings, 1 reply; 8+ messages in thread
From: Tejun Heo @ 2011-11-16 17:43 UTC (permalink / raw)
  To: Srivatsa S. Bhat; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

Hello,

On Wed, Nov 16, 2011 at 10:52:14PM +0530, Srivatsa S. Bhat wrote:
> So, honestly I didn't understand what is wrong with the approach of this
> patch. And as a consequence, I don't see why we should wait to fix this
> issue. 
> 
> [And by the way recently I happened to see yet another proposed patch
> trying to make use of this API. So wouldn't it be better to fix this
> ASAP, especially when we have a fix readily available?]

It just doesn't look like a proper solution.  Nothing guarantees
freezing will happen soonish.  Not all pm operations involve freezer.
The exclusion is against mem hotplug at this point, right?  I don't
think it's a good idea to add such hack to fix a mostly theoretical
problem and it's actually quite likely someone would be scratching
head trying to figure out why the hell the CPU was hot spinning while
the system is trying to enter one of powersaving mode (we had similar
behavior in freezer code a while back and it was ugly).

So, let's either fix it properly or leave it alone.

Thank you.

-- 
tejun

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 17:43     ` Tejun Heo
@ 2011-11-16 18:24       ` Srivatsa S. Bhat
  2011-11-16 18:41         ` Tejun Heo
  0 siblings, 1 reply; 8+ messages in thread
From: Srivatsa S. Bhat @ 2011-11-16 18:24 UTC (permalink / raw)
  To: Tejun Heo; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

On 11/16/2011 11:13 PM, Tejun Heo wrote:
> Hello,
> 
> On Wed, Nov 16, 2011 at 10:52:14PM +0530, Srivatsa S. Bhat wrote:
>> So, honestly I didn't understand what is wrong with the approach of this
>> patch. And as a consequence, I don't see why we should wait to fix this
>> issue. 
>>
>> [And by the way recently I happened to see yet another proposed patch
>> trying to make use of this API. So wouldn't it be better to fix this
>> ASAP, especially when we have a fix readily available?]
> 
> It just doesn't look like a proper solution.  Nothing guarantees
> freezing will happen soonish.  Not all pm operations involve freezer.
> The exclusion is against mem hotplug at this point, right?  I don't
> think it's a good idea to add such hack to fix a mostly theoretical
> problem and it's actually quite likely someone would be scratching
> head trying to figure out why the hell the CPU was hot spinning while
> the system is trying to enter one of powersaving mode (we had similar
> behavior in freezer code a while back and it was ugly).
> 
> So, let's either fix it properly or leave it alone.
> 

Ok, so by "proper solution", are you referring to a totally different
method (than grabbing pm_mutex) to implement mutual exclusion between
subsystems and suspend/hibernation, something like the suspend blockers
stuff and friends? 
Or are you hinting at just the existing code itself being fixed more
properly than what this patch does, to avoid having side effects like
you pointed out?

I am just trying to figure out what would be the best way to proceed here.
By the way I consider it lucky that we have spotted this bug before we
actually hit it.. So I would really love to get this fixed before it
comes back to haunt us in the future ;-)

Thanks,
Srivatsa S. Bhat

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 18:24       ` Srivatsa S. Bhat
@ 2011-11-16 18:41         ` Tejun Heo
  2011-11-16 19:05           ` Srivatsa S. Bhat
  2011-11-16 21:47           ` Rafael J. Wysocki
  0 siblings, 2 replies; 8+ messages in thread
From: Tejun Heo @ 2011-11-16 18:41 UTC (permalink / raw)
  To: Srivatsa S. Bhat; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

Hello,

On Wed, Nov 16, 2011 at 11:54:04PM +0530, Srivatsa S. Bhat wrote:
> Ok, so by "proper solution", are you referring to a totally different
> method (than grabbing pm_mutex) to implement mutual exclusion between
> subsystems and suspend/hibernation, something like the suspend blockers
> stuff and friends?
> Or are you hinting at just the existing code itself being fixed more
> properly than what this patch does, to avoid having side effects like
> you pointed out?

Oh, nothing fancy.  Just something w/o busy looping would be fine.
The stinking thing is we don't have mutex_lock_freezable().  Lack of
proper freezable interface seems to be a continuing problem and I'm
not sure what the proper solution should be at this point.  Maybe we
should promote freezable to a proper task state.  Maybe freezable
kthread is a bad idea to begin with.  Maybe instead of removing
freezable_with_signal() we should make that default, that way,
freezable can hitch on the pending signal handling (this creates
another set of problems tho - ie. who's responsible for clearing
TIF_SIGPENDING?).  I don't know.

Maybe just throw in msleep(10) there with fat ugly comment explaining
why the hack is necessary?

Thanks.

-- 
tejun

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 18:41         ` Tejun Heo
@ 2011-11-16 19:05           ` Srivatsa S. Bhat
  2011-11-16 21:47           ` Rafael J. Wysocki
  1 sibling, 0 replies; 8+ messages in thread
From: Srivatsa S. Bhat @ 2011-11-16 19:05 UTC (permalink / raw)
  To: Tejun Heo; +Cc: rjw, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

On 11/17/2011 12:11 AM, Tejun Heo wrote:
> Hello,
> 
> On Wed, Nov 16, 2011 at 11:54:04PM +0530, Srivatsa S. Bhat wrote:
>> Ok, so by "proper solution", are you referring to a totally different
>> method (than grabbing pm_mutex) to implement mutual exclusion between
>> subsystems and suspend/hibernation, something like the suspend blockers
>> stuff and friends?
>> Or are you hinting at just the existing code itself being fixed more
>> properly than what this patch does, to avoid having side effects like
>> you pointed out?
> 
> Oh, nothing fancy.  Just something w/o busy looping would be fine.
> The stinking thing is we don't have mutex_lock_freezable().  Lack of
> proper freezable interface seems to be a continuing problem and I'm
> not sure what the proper solution should be at this point.  Maybe we
> should promote freezable to a proper task state.  Maybe freezable
> kthread is a bad idea to begin with.  Maybe instead of removing
> freezable_with_signal() we should make that default, that way,
> freezable can hitch on the pending signal handling (this creates
> another set of problems tho - ie. who's responsible for clearing
> TIF_SIGPENDING?).  I don't know.
> 

Thanks a lot for the explanation! I now get an idea about your thoughts
on the fundamental issues with the freezer that are causing a broad range
of problems... Hmm, definitely something to ponder over...

> Maybe just throw in msleep(10) there with fat ugly comment explaining
> why the hack is necessary?
> 

Hehe, that surely sounds like the simplest of all the approaches you
suggested ;-) I'll add this to the while loop in the patch and repost
it, hoping we can solve the fundamental issues effectively at a later time.

Thanks,
Srivatsa S. Bhat

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

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

* Re: [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures
  2011-11-16 18:41         ` Tejun Heo
  2011-11-16 19:05           ` Srivatsa S. Bhat
@ 2011-11-16 21:47           ` Rafael J. Wysocki
  1 sibling, 0 replies; 8+ messages in thread
From: Rafael J. Wysocki @ 2011-11-16 21:47 UTC (permalink / raw)
  To: Tejun Heo
  Cc: Srivatsa S. Bhat, pavel, lenb, ak, linux-kernel, linux-pm, linux-mm

On Wednesday, November 16, 2011, Tejun Heo wrote:
> Hello,
> 
> On Wed, Nov 16, 2011 at 11:54:04PM +0530, Srivatsa S. Bhat wrote:
> > Ok, so by "proper solution", are you referring to a totally different
> > method (than grabbing pm_mutex) to implement mutual exclusion between
> > subsystems and suspend/hibernation, something like the suspend blockers
> > stuff and friends?
> > Or are you hinting at just the existing code itself being fixed more
> > properly than what this patch does, to avoid having side effects like
> > you pointed out?
> 
> Oh, nothing fancy.  Just something w/o busy looping would be fine.
> The stinking thing is we don't have mutex_lock_freezable().  Lack of
> proper freezable interface seems to be a continuing problem and I'm
> not sure what the proper solution should be at this point.  Maybe we
> should promote freezable to a proper task state.  Maybe freezable
> kthread is a bad idea to begin with.

It generally is, but some of them really want to be freezable.

> Maybe instead of removing
> freezable_with_signal() we should make that default, that way,
> freezable can hitch on the pending signal handling (this creates
> another set of problems tho - ie. who's responsible for clearing
> TIF_SIGPENDING?).  I don't know.
> 
> Maybe just throw in msleep(10) there with fat ugly comment explaining
> why the hack is necessary?

Perhaps.

Thanks,
Rafael

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

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

end of thread, other threads:[~2011-11-16 21:45 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-16 11:55 [PATCH v2] PM/Memory-hotplug: Avoid task freezing failures Srivatsa S. Bhat
2011-11-16 16:26 ` Tejun Heo
2011-11-16 17:22   ` Srivatsa S. Bhat
2011-11-16 17:43     ` Tejun Heo
2011-11-16 18:24       ` Srivatsa S. Bhat
2011-11-16 18:41         ` Tejun Heo
2011-11-16 19:05           ` Srivatsa S. Bhat
2011-11-16 21:47           ` Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox