From: Pavel Machek This adds few more places where it is possible freeze kernel threads. From: Nigel Cunningham Signed-off-by: Pavel Machek Signed-off-by: Andrew Morton --- 25-akpm/drivers/media/video/msp3400.c | 8 ++++++-- 25-akpm/drivers/media/video/tvaudio.c | 1 + 25-akpm/drivers/pnp/pnpbios/core.c | 6 +++++- 25-akpm/fs/afs/kafsasyncd.c | 2 ++ 25-akpm/fs/afs/kafstimod.c | 2 ++ 25-akpm/fs/lockd/clntproc.c | 1 + 25-akpm/kernel/signal.c | 2 ++ 25-akpm/net/rxrpc/krxiod.c | 2 ++ 25-akpm/net/rxrpc/krxsecd.c | 2 ++ 25-akpm/net/rxrpc/krxtimod.c | 2 ++ 25-akpm/net/sunrpc/svcsock.c | 1 + 11 files changed, 26 insertions(+), 3 deletions(-) diff -puN drivers/media/video/msp3400.c~swsusp-add-missing-refrigerator-calls drivers/media/video/msp3400.c --- 25/drivers/media/video/msp3400.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/drivers/media/video/msp3400.c 2005-03-16 21:42:00.000000000 -0800 @@ -734,6 +734,7 @@ static int msp34xx_sleep(struct msp3400c { DECLARE_WAITQUEUE(wait, current); +again: add_wait_queue(&msp->wq, &wait); if (!kthread_should_stop()) { if (timeout < 0) { @@ -749,9 +750,12 @@ static int msp34xx_sleep(struct msp3400c #endif } } - if (current->flags & PF_FREEZE) - refrigerator(PF_FREEZE); + remove_wait_queue(&msp->wq, &wait); + + if (try_to_freeze(PF_FREEZE)) + goto again; + return msp->restart; } diff -puN drivers/media/video/tvaudio.c~swsusp-add-missing-refrigerator-calls drivers/media/video/tvaudio.c --- 25/drivers/media/video/tvaudio.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/drivers/media/video/tvaudio.c 2005-03-16 21:42:00.000000000 -0800 @@ -286,6 +286,7 @@ static int chip_thread(void *data) schedule(); } remove_wait_queue(&chip->wq, &wait); + try_to_freeze(PF_FREEZE); if (chip->done || signal_pending(current)) break; dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); diff -puN drivers/pnp/pnpbios/core.c~swsusp-add-missing-refrigerator-calls drivers/pnp/pnpbios/core.c --- 25/drivers/pnp/pnpbios/core.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/drivers/pnp/pnpbios/core.c 2005-03-16 21:42:00.000000000 -0800 @@ -180,8 +180,12 @@ static int pnp_dock_thread(void * unused * Poll every 2 seconds */ msleep_interruptible(2000); - if(signal_pending(current)) + + if(signal_pending(current)) { + if (try_to_freeze(PF_FREEZE)) + continue; break; + } status = pnp_bios_dock_station_info(&now); diff -puN fs/afs/kafsasyncd.c~swsusp-add-missing-refrigerator-calls fs/afs/kafsasyncd.c --- 25/fs/afs/kafsasyncd.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/fs/afs/kafsasyncd.c 2005-03-16 21:42:00.000000000 -0800 @@ -116,6 +116,8 @@ static int kafsasyncd(void *arg) remove_wait_queue(&kafsasyncd_sleepq, &myself); set_current_state(TASK_RUNNING); + try_to_freeze(PF_FREEZE); + /* discard pending signals */ afs_discard_my_signals(); diff -puN fs/afs/kafstimod.c~swsusp-add-missing-refrigerator-calls fs/afs/kafstimod.c --- 25/fs/afs/kafstimod.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/fs/afs/kafstimod.c 2005-03-16 21:42:00.000000000 -0800 @@ -91,6 +91,8 @@ static int kafstimod(void *arg) complete_and_exit(&kafstimod_dead, 0); } + try_to_freeze(PF_FREEZE); + /* discard pending signals */ afs_discard_my_signals(); diff -puN fs/lockd/clntproc.c~swsusp-add-missing-refrigerator-calls fs/lockd/clntproc.c --- 25/fs/lockd/clntproc.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/fs/lockd/clntproc.c 2005-03-16 21:42:00.000000000 -0800 @@ -312,6 +312,7 @@ static int nlm_wait_on_grace(wait_queue_ prepare_to_wait(queue, &wait, TASK_INTERRUPTIBLE); if (!signalled ()) { schedule_timeout(NLMCLNT_GRACE_WAIT); + try_to_freeze(PF_FREEZE); if (!signalled ()) status = 0; } diff -puN kernel/signal.c~swsusp-add-missing-refrigerator-calls kernel/signal.c --- 25/kernel/signal.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/kernel/signal.c 2005-03-16 21:42:00.000000000 -0800 @@ -2219,6 +2219,8 @@ sys_rt_sigtimedwait(const sigset_t __use current->state = TASK_INTERRUPTIBLE; timeout = schedule_timeout(timeout); + if (current->flags & PF_FREEZE) + refrigerator(PF_FREEZE); spin_lock_irq(¤t->sighand->siglock); sig = dequeue_signal(current, &these, &info); current->blocked = current->real_blocked; diff -puN net/rxrpc/krxiod.c~swsusp-add-missing-refrigerator-calls net/rxrpc/krxiod.c --- 25/net/rxrpc/krxiod.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/net/rxrpc/krxiod.c 2005-03-16 21:42:00.000000000 -0800 @@ -138,6 +138,8 @@ static int rxrpc_krxiod(void *arg) _debug("### End Work"); + try_to_freeze(PF_FREEZE); + /* discard pending signals */ rxrpc_discard_my_signals(); diff -puN net/rxrpc/krxsecd.c~swsusp-add-missing-refrigerator-calls net/rxrpc/krxsecd.c --- 25/net/rxrpc/krxsecd.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/net/rxrpc/krxsecd.c 2005-03-16 21:42:00.000000000 -0800 @@ -107,6 +107,8 @@ static int rxrpc_krxsecd(void *arg) _debug("### End Inbound Calls"); + try_to_freeze(PF_FREEZE); + /* discard pending signals */ rxrpc_discard_my_signals(); diff -puN net/rxrpc/krxtimod.c~swsusp-add-missing-refrigerator-calls net/rxrpc/krxtimod.c --- 25/net/rxrpc/krxtimod.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/net/rxrpc/krxtimod.c 2005-03-16 21:42:00.000000000 -0800 @@ -90,6 +90,8 @@ static int krxtimod(void *arg) complete_and_exit(&krxtimod_dead, 0); } + try_to_freeze(PF_FREEZE); + /* discard pending signals */ rxrpc_discard_my_signals(); diff -puN net/sunrpc/svcsock.c~swsusp-add-missing-refrigerator-calls net/sunrpc/svcsock.c --- 25/net/sunrpc/svcsock.c~swsusp-add-missing-refrigerator-calls 2005-03-16 21:42:00.000000000 -0800 +++ 25-akpm/net/sunrpc/svcsock.c 2005-03-16 21:42:00.000000000 -0800 @@ -1186,6 +1186,7 @@ svc_recv(struct svc_serv *serv, struct s arg->len = (pages-1)*PAGE_SIZE; arg->tail[0].iov_len = 0; + try_to_freeze(PF_FREEZE); if (signalled()) return -EINTR; _