Message ID | 4EBAA63B.4040902@canonical.com |
---|---|
State | New |
Headers | show |
On 09.11.2011 17:11, Chris J Arges wrote: > SRU Justification: > > Impact: > If a cifs share is mounted in ubuntu-natty and we try to suspend cifsd > prevents the laptop from suspending. > > Fix: > Apply f06ac72e929115f2772c29727152ba0832d641e4 cherry picked from > upstream commit (this is already in ubuntu-oneric) to ubuntu-natty linux > kernel. > This small patch allows the laptop to suspend even if a cifs share is > mounted. > > Testcase: > Boot ubuntu-natty. Mount cifs share. Suspend or Hibernate. (This will > not work.) > Boot ubuntu-natty with cifs patch applied. Mount cifs share. Suspend or > Hibernate. (This works.) > > > > > > The patch looks to be consistent with the upstream patch. However there seemed to have been a few follow-ups (of which the last one looks a bit worrying): * [CIFS] Fixup trivial checkpatch warning * Fix build break when freezer not configured * PM / Freezer: Reimplement wait_event_freezekillable using freezer_do_not_count/freezer_count Ok, it may not be something to worry as that is about another patch added in the 3.2 time-frame but but so is the initial one... -Stefan
On Wed, Nov 09, 2011 at 05:43:54PM +0100, Stefan Bader wrote: > On 09.11.2011 17:11, Chris J Arges wrote: > > SRU Justification: > > > > Impact: > > If a cifs share is mounted in ubuntu-natty and we try to suspend cifsd > > prevents the laptop from suspending. > > > > Fix: > > Apply f06ac72e929115f2772c29727152ba0832d641e4 cherry picked from > > upstream commit (this is already in ubuntu-oneric) to ubuntu-natty linux > > kernel. > > This small patch allows the laptop to suspend even if a cifs share is > > mounted. > > > > Testcase: > > Boot ubuntu-natty. Mount cifs share. Suspend or Hibernate. (This will > > not work.) > > Boot ubuntu-natty with cifs patch applied. Mount cifs share. Suspend or > > Hibernate. (This works.) > > > > > > > > > > > > > The patch looks to be consistent with the upstream patch. However there seemed > to have been a few follow-ups (of which the last one looks a bit worrying): > > * [CIFS] Fixup trivial checkpatch warning > * Fix build break when freezer not configured > * PM / Freezer: Reimplement wait_event_freezekillable using > freezer_do_not_count/freezer_count I was looking at this too. It looks to me like the cherry picked patch shouldn't fix the problem without also picking up 2792065 "PM / Freezer: Make fake_signal_wake_up() wake TASK_KILLABLE tasks too" (although to my understanding it has been verified to fix the problem, so I'm a bit confused on that point). 2792065 is later reverted though. It seems to me that it would be a good idea to additionally pick up 6f35c4a "PM / Freezer: Reimplement wait_event_freezekillable using freezer_do_not_count/freezer_count" to get to the solution that's now upstream, and probably e0c8ea1 "Fix build break when freezer not configured" as well since it's trivial and fixes a potential build failure.
On 11/09/2011 11:02 AM, Seth Forshee wrote: > On Wed, Nov 09, 2011 at 05:43:54PM +0100, Stefan Bader wrote: >> On 09.11.2011 17:11, Chris J Arges wrote: >>> SRU Justification: >>> >>> Impact: >>> If a cifs share is mounted in ubuntu-natty and we try to suspend cifsd >>> prevents the laptop from suspending. >>> >>> Fix: >>> Apply f06ac72e929115f2772c29727152ba0832d641e4 cherry picked from >>> upstream commit (this is already in ubuntu-oneric) to ubuntu-natty linux >>> kernel. >>> This small patch allows the laptop to suspend even if a cifs share is >>> mounted. >>> >>> Testcase: >>> Boot ubuntu-natty. Mount cifs share. Suspend or Hibernate. (This will >>> not work.) >>> Boot ubuntu-natty with cifs patch applied. Mount cifs share. Suspend or >>> Hibernate. (This works.) >>> >>> >>> >>> >>> >>> >> The patch looks to be consistent with the upstream patch. However there seemed >> to have been a few follow-ups (of which the last one looks a bit worrying): >> >> * [CIFS] Fixup trivial checkpatch warning >> * Fix build break when freezer not configured >> * PM / Freezer: Reimplement wait_event_freezekillable using >> freezer_do_not_count/freezer_count > I was looking at this too. It looks to me like the cherry picked patch > shouldn't fix the problem without also picking up 2792065 "PM / Freezer: > Make fake_signal_wake_up() wake TASK_KILLABLE tasks too" (although to my > understanding it has been verified to fix the problem, so I'm a bit > confused on that point). 2792065 is later reverted though. > > It seems to me that it would be a good idea to additionally pick up > 6f35c4a "PM / Freezer: Reimplement wait_event_freezekillable using > freezer_do_not_count/freezer_count" to get to the solution that's now > upstream, and probably e0c8ea1 "Fix build break when freezer not > configured" as well since it's trivial and fixes a potential build > failure. Ok I'll pick up these patches and test as well. --chris
On 11/09/2011 10:22 AM, Chris J Arges wrote: > On 11/09/2011 11:02 AM, Seth Forshee wrote: >> On Wed, Nov 09, 2011 at 05:43:54PM +0100, Stefan Bader wrote: >>> On 09.11.2011 17:11, Chris J Arges wrote: >>>> SRU Justification: >>>> >>>> Impact: >>>> If a cifs share is mounted in ubuntu-natty and we try to suspend cifsd >>>> prevents the laptop from suspending. >>>> >>>> Fix: >>>> Apply f06ac72e929115f2772c29727152ba0832d641e4 cherry picked from >>>> upstream commit (this is already in ubuntu-oneric) to ubuntu-natty linux >>>> kernel. >>>> This small patch allows the laptop to suspend even if a cifs share is >>>> mounted. >>>> >>>> Testcase: >>>> Boot ubuntu-natty. Mount cifs share. Suspend or Hibernate. (This will >>>> not work.) >>>> Boot ubuntu-natty with cifs patch applied. Mount cifs share. Suspend or >>>> Hibernate. (This works.) >>>> >>>> >>>> >>>> >>>> >>>> >>> The patch looks to be consistent with the upstream patch. However there seemed >>> to have been a few follow-ups (of which the last one looks a bit worrying): >>> >>> * [CIFS] Fixup trivial checkpatch warning >>> * Fix build break when freezer not configured >>> * PM / Freezer: Reimplement wait_event_freezekillable using >>> freezer_do_not_count/freezer_count >> I was looking at this too. It looks to me like the cherry picked patch >> shouldn't fix the problem without also picking up 2792065 "PM / Freezer: >> Make fake_signal_wake_up() wake TASK_KILLABLE tasks too" (although to my >> understanding it has been verified to fix the problem, so I'm a bit >> confused on that point). 2792065 is later reverted though. >> >> It seems to me that it would be a good idea to additionally pick up >> 6f35c4a "PM / Freezer: Reimplement wait_event_freezekillable using >> freezer_do_not_count/freezer_count" to get to the solution that's now >> upstream, and probably e0c8ea1 "Fix build break when freezer not >> configured" as well since it's trivial and fixes a potential build >> failure. > Ok I'll pick up these patches and test as well. > --chris > > > Looks like you need these patches: 6f35c4abd7f0294166a5e0ab0401fe7949b33034 PM / Freezer: Reimplement wait_event_freezekillable using freezer_do_not_ e0c8ea1a69410ef44043646938a6a4175f5307e4 Fix build break when freezer not configured b957ae9c53d5715a07f8bac644d8ff0a407c7e07 [CIFS] Fixup trivial checkpatch warning f06ac72e929115f2772c29727152ba0832d641e4 cifs, freezer: add wait_event_freezekillable and have cifs use it Once accepted these patches would make good material for stable@vger.kernel.org rtg
From 7d58ea603394ba00dece56514baca9ffc94b0c64 Mon Sep 17 00:00:00 2001 From: Jeff Layton <jlayton@redhat.com> Date: Wed, 19 Oct 2011 15:30:40 -0400 Subject: [PATCH] cifs, freezer: add wait_event_freezekillable and have cifs use it Buglink: https://bugs.launchpad.net/bugs/24330 CIFS currently uses wait_event_killable to put tasks to sleep while they await replies from the server. That function though does not allow the freezer to run. In many cases, the network interface may be going down anyway, in which case the reply will never come. The client then ends up blocking the computer from suspending. Fix this by adding a new wait_event_freezable variant -- wait_event_freezekillable. The idea is to combine the behavior of wait_event_killable and wait_event_freezable -- put the task to sleep and only allow it to be awoken by fatal signals, but also allow the freezer to do its job. Signed-off-by: Jeff Layton <jlayton@redhat.com> (cherry picked from commit f06ac72e929115f2772c29727152ba0832d641e4) Signed-off-by: Chris J Arges <chris.j.arges@canonical.com> --- fs/cifs/transport.c | 3 ++- include/linux/freezer.h | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index c1b9c4b..23a33ef 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -26,6 +26,7 @@ #include <linux/wait.h> #include <linux/net.h> #include <linux/delay.h> +#include <linux/freezer.h> #include <asm/uaccess.h> #include <asm/processor.h> #include <linux/mempool.h> @@ -328,7 +329,7 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ) { int error; - error = wait_event_killable(server->response_q, + error = wait_event_freezekillable(server->response_q, midQ->midState != MID_REQUEST_SUBMITTED); if (error < 0) return -ERESTARTSYS; diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 1effc8b..3672f73 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -134,10 +134,25 @@ static inline void set_freezable_with_signal(void) } /* - * Freezer-friendly wrappers around wait_event_interruptible() and - * wait_event_interruptible_timeout(), originally defined in <linux/wait.h> + * Freezer-friendly wrappers around wait_event_interruptible(), + * wait_event_killable() and wait_event_interruptible_timeout(), originally + * defined in <linux/wait.h> */ +#define wait_event_freezekillable(wq, condition) \ +({ \ + int __retval; \ + do { \ + __retval = wait_event_killable(wq, \ + (condition) || freezing(current)); \ + if (__retval && !freezing(current)) \ + break; \ + else if (!(condition)) \ + __retval = -ERESTARTSYS; \ + } while (try_to_freeze()); \ + __retval; \ +}) + #define wait_event_freezable(wq, condition) \ ({ \ int __retval; \ -- 1.7.0.4