diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/core.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d8d76a65cfdd..7cbb5658be80 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -6162,6 +6162,34 @@ void ___might_sleep(const char *file, int line, int preempt_offset) | |||
| 6162 | add_taint(TAINT_WARN, LOCKDEP_STILL_OK); | 6162 | add_taint(TAINT_WARN, LOCKDEP_STILL_OK); |
| 6163 | } | 6163 | } |
| 6164 | EXPORT_SYMBOL(___might_sleep); | 6164 | EXPORT_SYMBOL(___might_sleep); |
| 6165 | |||
| 6166 | void __cant_sleep(const char *file, int line, int preempt_offset) | ||
| 6167 | { | ||
| 6168 | static unsigned long prev_jiffy; | ||
| 6169 | |||
| 6170 | if (irqs_disabled()) | ||
| 6171 | return; | ||
| 6172 | |||
| 6173 | if (!IS_ENABLED(CONFIG_PREEMPT_COUNT)) | ||
| 6174 | return; | ||
| 6175 | |||
| 6176 | if (preempt_count() > preempt_offset) | ||
| 6177 | return; | ||
| 6178 | |||
| 6179 | if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) | ||
| 6180 | return; | ||
| 6181 | prev_jiffy = jiffies; | ||
| 6182 | |||
| 6183 | printk(KERN_ERR "BUG: assuming atomic context at %s:%d\n", file, line); | ||
| 6184 | printk(KERN_ERR "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", | ||
| 6185 | in_atomic(), irqs_disabled(), | ||
| 6186 | current->pid, current->comm); | ||
| 6187 | |||
| 6188 | debug_show_held_locks(current); | ||
| 6189 | dump_stack(); | ||
| 6190 | add_taint(TAINT_WARN, LOCKDEP_STILL_OK); | ||
| 6191 | } | ||
| 6192 | EXPORT_SYMBOL_GPL(__cant_sleep); | ||
| 6165 | #endif | 6193 | #endif |
| 6166 | 6194 | ||
| 6167 | #ifdef CONFIG_MAGIC_SYSRQ | 6195 | #ifdef CONFIG_MAGIC_SYSRQ |
