Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: - procfs updates - various misc bits - lib/ updates - epoll updates - autofs - fatfs - a few more MM bits * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (58 commits) mm/page_io.c: fix polled swap page in checkpatch: add Co-developed-by to signature tags docs: fix Co-Developed-by docs drivers/base/platform.c: kmemleak ignore a known leak fs: don't open code lru_to_page() fs/: remove caller signal_pending branch predictions mm/: remove caller signal_pending branch predictions arch/arc/mm/fault.c: remove caller signal_pending_branch predictions kernel/sched/: remove caller signal_pending branch predictions kernel/locking/mutex.c: remove caller signal_pending branch predictions mm: select HAVE_MOVE_PMD on x86 for faster mremap mm: speed up mremap by 20x on large regions mm: treewide: remove unused address argument from pte_alloc functions initramfs: cleanup incomplete rootfs scripts/gdb: fix lx-version string output kernel/kcov.c: mark write_comp_data() as notrace kernel/sysctl: add panic_print into sysctl panic: add options to print system info when panic happens bfs: extra sanity checking and static inode bitmap exec: separate MM_ANONPAGES and RLIMIT_STACK accounting ...
This commit is contained in:
@@ -164,10 +164,6 @@ static inline void free_task_struct(struct task_struct *tsk)
|
||||
}
|
||||
#endif
|
||||
|
||||
void __weak arch_release_thread_stack(unsigned long *stack)
|
||||
{
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ARCH_THREAD_STACK_ALLOCATOR
|
||||
|
||||
/*
|
||||
@@ -422,7 +418,6 @@ static void release_task_stack(struct task_struct *tsk)
|
||||
return; /* Better to leak the stack than to free prematurely */
|
||||
|
||||
account_kernel_stack(tsk, -1);
|
||||
arch_release_thread_stack(tsk->stack);
|
||||
free_thread_stack(tsk);
|
||||
tsk->stack = NULL;
|
||||
#ifdef CONFIG_VMAP_STACK
|
||||
|
@@ -34,7 +34,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;
|
||||
* is disabled during the critical section. It also controls the size of
|
||||
* the RCU grace period. So it needs to be upper-bound.
|
||||
*/
|
||||
#define HUNG_TASK_BATCHING 1024
|
||||
#define HUNG_TASK_LOCK_BREAK (HZ / 10)
|
||||
|
||||
/*
|
||||
* Zero means infinite timeout - no checking done:
|
||||
@@ -112,8 +112,11 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
|
||||
|
||||
trace_sched_process_hang(t);
|
||||
|
||||
if (!sysctl_hung_task_warnings && !sysctl_hung_task_panic)
|
||||
return;
|
||||
if (sysctl_hung_task_panic) {
|
||||
console_verbose();
|
||||
hung_task_show_lock = true;
|
||||
hung_task_call_panic = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ok, the task did not get scheduled for more than 2 minutes,
|
||||
@@ -135,11 +138,6 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
|
||||
}
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
if (sysctl_hung_task_panic) {
|
||||
hung_task_show_lock = true;
|
||||
hung_task_call_panic = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -173,7 +171,7 @@ static bool rcu_lock_break(struct task_struct *g, struct task_struct *t)
|
||||
static void check_hung_uninterruptible_tasks(unsigned long timeout)
|
||||
{
|
||||
int max_count = sysctl_hung_task_check_count;
|
||||
int batch_count = HUNG_TASK_BATCHING;
|
||||
unsigned long last_break = jiffies;
|
||||
struct task_struct *g, *t;
|
||||
|
||||
/*
|
||||
@@ -188,10 +186,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
|
||||
for_each_process_thread(g, t) {
|
||||
if (!max_count--)
|
||||
goto unlock;
|
||||
if (!--batch_count) {
|
||||
batch_count = HUNG_TASK_BATCHING;
|
||||
if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) {
|
||||
if (!rcu_lock_break(g, t))
|
||||
goto unlock;
|
||||
last_break = jiffies;
|
||||
}
|
||||
/* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */
|
||||
if (t->state == TASK_UNINTERRUPTIBLE)
|
||||
|
@@ -112,7 +112,7 @@ void notrace __sanitizer_cov_trace_pc(void)
|
||||
EXPORT_SYMBOL(__sanitizer_cov_trace_pc);
|
||||
|
||||
#ifdef CONFIG_KCOV_ENABLE_COMPARISONS
|
||||
static void write_comp_data(u64 type, u64 arg1, u64 arg2, u64 ip)
|
||||
static void notrace write_comp_data(u64 type, u64 arg1, u64 arg2, u64 ip)
|
||||
{
|
||||
struct task_struct *t;
|
||||
u64 *area;
|
||||
|
@@ -987,7 +987,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
||||
* wait_lock. This ensures the lock cancellation is ordered
|
||||
* against mutex_unlock() and wake-ups do not go missing.
|
||||
*/
|
||||
if (unlikely(signal_pending_state(state, current))) {
|
||||
if (signal_pending_state(state, current)) {
|
||||
ret = -EINTR;
|
||||
goto err;
|
||||
}
|
||||
|
@@ -46,6 +46,13 @@ int panic_on_warn __read_mostly;
|
||||
int panic_timeout = CONFIG_PANIC_TIMEOUT;
|
||||
EXPORT_SYMBOL_GPL(panic_timeout);
|
||||
|
||||
#define PANIC_PRINT_TASK_INFO 0x00000001
|
||||
#define PANIC_PRINT_MEM_INFO 0x00000002
|
||||
#define PANIC_PRINT_TIMER_INFO 0x00000004
|
||||
#define PANIC_PRINT_LOCK_INFO 0x00000008
|
||||
#define PANIC_PRINT_FTRACE_INFO 0x00000010
|
||||
unsigned long panic_print;
|
||||
|
||||
ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
|
||||
|
||||
EXPORT_SYMBOL(panic_notifier_list);
|
||||
@@ -125,6 +132,24 @@ void nmi_panic(struct pt_regs *regs, const char *msg)
|
||||
}
|
||||
EXPORT_SYMBOL(nmi_panic);
|
||||
|
||||
static void panic_print_sys_info(void)
|
||||
{
|
||||
if (panic_print & PANIC_PRINT_TASK_INFO)
|
||||
show_state();
|
||||
|
||||
if (panic_print & PANIC_PRINT_MEM_INFO)
|
||||
show_mem(0, NULL);
|
||||
|
||||
if (panic_print & PANIC_PRINT_TIMER_INFO)
|
||||
sysrq_timer_list_show();
|
||||
|
||||
if (panic_print & PANIC_PRINT_LOCK_INFO)
|
||||
debug_show_all_locks();
|
||||
|
||||
if (panic_print & PANIC_PRINT_FTRACE_INFO)
|
||||
ftrace_dump(DUMP_ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* panic - halt the system
|
||||
* @fmt: The text string to print
|
||||
@@ -254,6 +279,8 @@ void panic(const char *fmt, ...)
|
||||
debug_locks_off();
|
||||
console_flush_on_panic();
|
||||
|
||||
panic_print_sys_info();
|
||||
|
||||
if (!panic_blink)
|
||||
panic_blink = no_blink;
|
||||
|
||||
@@ -658,6 +685,7 @@ void refcount_error_report(struct pt_regs *regs, const char *err)
|
||||
#endif
|
||||
|
||||
core_param(panic, panic_timeout, int, 0644);
|
||||
core_param(panic_print, panic_print, ulong, 0644);
|
||||
core_param(pause_on_oops, pause_on_oops, int, 0644);
|
||||
core_param(panic_on_warn, panic_on_warn, int, 0644);
|
||||
core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644);
|
||||
|
@@ -3416,7 +3416,7 @@ static void __sched notrace __schedule(bool preempt)
|
||||
|
||||
switch_count = &prev->nivcsw;
|
||||
if (!preempt && prev->state) {
|
||||
if (unlikely(signal_pending_state(prev->state, prev))) {
|
||||
if (signal_pending_state(prev->state, prev)) {
|
||||
prev->state = TASK_RUNNING;
|
||||
} else {
|
||||
deactivate_task(rq, prev, DEQUEUE_SLEEP | DEQUEUE_NOCLOCK);
|
||||
|
@@ -93,7 +93,7 @@ long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait
|
||||
long ret = 0;
|
||||
|
||||
raw_spin_lock_irqsave(&q->lock, flags);
|
||||
if (unlikely(signal_pending_state(state, current))) {
|
||||
if (signal_pending_state(state, current)) {
|
||||
/*
|
||||
* See prepare_to_wait_event(). TL;DR, subsequent swake_up_one()
|
||||
* must not see us.
|
||||
|
@@ -264,7 +264,7 @@ long prepare_to_wait_event(struct wait_queue_head *wq_head, struct wait_queue_en
|
||||
long ret = 0;
|
||||
|
||||
spin_lock_irqsave(&wq_head->lock, flags);
|
||||
if (unlikely(signal_pending_state(state, current))) {
|
||||
if (signal_pending_state(state, current)) {
|
||||
/*
|
||||
* Exclusive waiter must not fail if it was selected by wakeup,
|
||||
* it should "consume" the condition we were waiting for.
|
||||
|
@@ -807,6 +807,13 @@ static struct ctl_table kern_table[] = {
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec,
|
||||
},
|
||||
{
|
||||
.procname = "panic_print",
|
||||
.data = &panic_print,
|
||||
.maxlen = sizeof(unsigned long),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_doulongvec_minmax,
|
||||
},
|
||||
#if defined CONFIG_PRINTK
|
||||
{
|
||||
.procname = "printk",
|
||||
@@ -2787,6 +2794,8 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
|
||||
bool neg;
|
||||
|
||||
left -= proc_skip_spaces(&p);
|
||||
if (!left)
|
||||
break;
|
||||
|
||||
err = proc_get_long(&p, &left, &val, &neg,
|
||||
proc_wspace_sep,
|
||||
|
@@ -140,6 +140,7 @@ static const struct bin_table bin_kern_table[] = {
|
||||
{ CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" },
|
||||
{ CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
|
||||
{ CTL_INT, KERN_PANIC_ON_WARN, "panic_on_warn" },
|
||||
{ CTL_ULONG, KERN_PANIC_PRINT, "panic_print" },
|
||||
{}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user