[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAH2r5ms8pg7VW7JMa_eCUomEC1cfiM+rG_JZ6F7cHB=MtZwF0A@mail.gmail.com>
Date: Thu, 29 Sep 2011 11:39:53 -0500
From: Steve French <smfrench@...il.com>
To: Jeff Layton <jlayton@...hat.com>
Cc: trond.myklebust@...app.com, pavel@....cz, rjw@...k.pl,
linux-pm@...ts.linux-foundation.org, linux-cifs@...r.kernel.org,
linux-nfs@...r.kernel.org, john@...va.com,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/4] cifs, freezer: add wait_event_freezekillable and have
cifs use it
On Thu, Sep 29, 2011 at 5:41 AM, Jeff Layton <jlayton@...hat.com> wrote:
> On Wed, 28 Sep 2011 23:28:02 -0500
> Steve French <smfrench@...il.com> wrote:
>
>> The general idea of the patch seems like a good idea to
>> me. Assuming testing feedback was good from the problem
>> reporters, what tree would you want it merged from?
>>
>
> There's the rub -- this requires a number of changes in different
> areas. What I really need at this point is a verdict on patch #1. If
> that looks OK, then that should probably go in via the one of the
> linux-pm trees. Then patch #2 can probably go in via your tree and 3
> and 4 can go in via Trond's.
Yes - makes sense, but wonder about ways to test the various
suspend/hibernate cases to make sure they work.
>
> However, none of this should go in unless #1 is ok. Make sense?
>
>> On Wed, Sep 28, 2011 at 6:52 AM, Jeff Layton <jlayton@...hat.com> wrote:
>> > 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@...hat.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 10ca6b2..791bc4f 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>
>> > @@ -324,7 +325,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.6.2
>> >
>> >
>>
>>
>>
>
>
> --
> Jeff Layton <jlayton@...hat.com>
>
--
Thanks,
Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists