diff options
| author | Takashi Iwai <tiwai@suse.de> | 2012-01-31 15:13:14 +0100 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2012-01-31 15:13:14 +0100 | 
| commit | ea51e5040e24eefe44d70bc654a237ca1f0225b0 (patch) | |
| tree | df2e5922dcdfafae62a10d8cd97f98121064fc23 /kernel/kthread.c | |
| parent | 3422a47041b8cb8f14ac1e3926bcf711121df6dc (diff) | |
| parent | 8dbd52daee38adaae4d5a674bcca837e694a4f4c (diff) | |
Merge branch 'fix/asoc' into for-linus
Diffstat (limited to 'kernel/kthread.c')
| -rw-r--r-- | kernel/kthread.c | 27 | 
1 files changed, 26 insertions, 1 deletions
| diff --git a/kernel/kthread.c b/kernel/kthread.c index b6d216a92639..3d3de633702e 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -59,6 +59,31 @@ int kthread_should_stop(void)  EXPORT_SYMBOL(kthread_should_stop);  /** + * kthread_freezable_should_stop - should this freezable kthread return now? + * @was_frozen: optional out parameter, indicates whether %current was frozen + * + * kthread_should_stop() for freezable kthreads, which will enter + * refrigerator if necessary.  This function is safe from kthread_stop() / + * freezer deadlock and freezable kthreads should use this function instead + * of calling try_to_freeze() directly. + */ +bool kthread_freezable_should_stop(bool *was_frozen) +{ +	bool frozen = false; + +	might_sleep(); + +	if (unlikely(freezing(current))) +		frozen = __refrigerator(true); + +	if (was_frozen) +		*was_frozen = frozen; + +	return kthread_should_stop(); +} +EXPORT_SYMBOL_GPL(kthread_freezable_should_stop); + +/**   * kthread_data - return data value specified on kthread creation   * @task: kthread task in question   * @@ -257,7 +282,7 @@ int kthreadd(void *unused)  	set_cpus_allowed_ptr(tsk, cpu_all_mask);  	set_mems_allowed(node_states[N_HIGH_MEMORY]); -	current->flags |= PF_NOFREEZE | PF_FREEZER_NOSIG; +	current->flags |= PF_NOFREEZE;  	for (;;) {  		set_current_state(TASK_INTERRUPTIBLE); | 
