2013-03-25 12:00:03

by Jeff Layton

[permalink] [raw]
Subject: [PATCH] nfs: allow the v4.1 callback thread to freeze

The v4.1 callback thread has set_freezable() at the top, but it doesn't
ever try to freeze within the loop. Have it call try_to_freeze() at the
top of the loop. If a freeze event occurs, recheck kthread_should_stop()
after thawing.

Reported-by: Yanchuan Nian <[email protected]>
Signed-off-by: Jeff Layton <[email protected]>
---
fs/nfs/callback.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index 5088b57..cff089a 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -125,6 +125,9 @@ nfs41_callback_svc(void *vrqstp)
set_freezable();

while (!kthread_should_stop()) {
+ if (try_to_freeze())
+ continue;
+
prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
spin_lock_bh(&serv->sv_cb_lock);
if (!list_empty(&serv->sv_cb_list)) {
--
1.7.11.7



2013-03-26 12:16:12

by Yanchuan Nian

[permalink] [raw]
Subject: Re: [PATCH] nfs: allow the v4.1 callback thread to freeze

On Mon, Mar 25, 2013 at 07:59:57AM -0400, Jeff Layton wrote:
> The v4.1 callback thread has set_freezable() at the top, but it doesn't
> ever try to freeze within the loop. Have it call try_to_freeze() at the
> top of the loop. If a freeze event occurs, recheck kthread_should_stop()
> after thawing.
>
> Reported-by: Yanchuan Nian <[email protected]>
> Signed-off-by: Jeff Layton <[email protected]>
> ---
> fs/nfs/callback.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
> index 5088b57..cff089a 100644
> --- a/fs/nfs/callback.c
> +++ b/fs/nfs/callback.c
> @@ -125,6 +125,9 @@ nfs41_callback_svc(void *vrqstp)
> set_freezable();
>
> while (!kthread_should_stop()) {
> + if (try_to_freeze())
> + continue;
> +
> prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
> spin_lock_bh(&serv->sv_cb_lock);
> if (!list_empty(&serv->sv_cb_list)) {

Tested, and the client suspends successfully now.
> --
> 1.7.11.7