Merge tag 'v4.5-rc6' into locking/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
@@ -271,7 +271,7 @@ static int restore_sigregs_ext32(struct pt_regs *regs,
|
||||
|
||||
/* Restore high gprs from signal stack */
|
||||
if (__copy_from_user(&gprs_high, &sregs_ext->gprs_high,
|
||||
sizeof(&sregs_ext->gprs_high)))
|
||||
sizeof(sregs_ext->gprs_high)))
|
||||
return -EFAULT;
|
||||
for (i = 0; i < NUM_GPRS; i++)
|
||||
*(__u32 *)®s->gprs[i] = gprs_high[i];
|
||||
|
||||
@@ -260,12 +260,13 @@ static unsigned long __store_trace(struct perf_callchain_entry *entry,
|
||||
void perf_callchain_kernel(struct perf_callchain_entry *entry,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long head;
|
||||
unsigned long head, frame_size;
|
||||
struct stack_frame *head_sf;
|
||||
|
||||
if (user_mode(regs))
|
||||
return;
|
||||
|
||||
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
|
||||
head = regs->gprs[15];
|
||||
head_sf = (struct stack_frame *) head;
|
||||
|
||||
@@ -273,8 +274,9 @@ void perf_callchain_kernel(struct perf_callchain_entry *entry,
|
||||
return;
|
||||
|
||||
head = head_sf->back_chain;
|
||||
head = __store_trace(entry, head, S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack);
|
||||
head = __store_trace(entry, head,
|
||||
S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack + frame_size);
|
||||
|
||||
__store_trace(entry, head, S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE);
|
||||
|
||||
@@ -59,26 +59,32 @@ static unsigned long save_context_stack(struct stack_trace *trace,
|
||||
}
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
static void __save_stack_trace(struct stack_trace *trace, unsigned long sp)
|
||||
{
|
||||
register unsigned long sp asm ("15");
|
||||
unsigned long orig_sp, new_sp;
|
||||
unsigned long new_sp, frame_size;
|
||||
|
||||
orig_sp = sp;
|
||||
new_sp = save_context_stack(trace, orig_sp,
|
||||
S390_lowcore.panic_stack - PAGE_SIZE,
|
||||
S390_lowcore.panic_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
|
||||
new_sp = save_context_stack(trace, sp,
|
||||
S390_lowcore.panic_stack + frame_size - PAGE_SIZE,
|
||||
S390_lowcore.panic_stack + frame_size, 1);
|
||||
new_sp = save_context_stack(trace, new_sp,
|
||||
S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack + frame_size, 1);
|
||||
save_context_stack(trace, new_sp,
|
||||
S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE, 1);
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
register unsigned long r15 asm ("15");
|
||||
unsigned long sp;
|
||||
|
||||
sp = r15;
|
||||
__save_stack_trace(trace, sp);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
@@ -86,6 +92,10 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
unsigned long sp, low, high;
|
||||
|
||||
sp = tsk->thread.ksp;
|
||||
if (tsk == current) {
|
||||
/* Get current stack pointer. */
|
||||
asm volatile("la %0,0(15)" : "=a" (sp));
|
||||
}
|
||||
low = (unsigned long) task_stack_page(tsk);
|
||||
high = (unsigned long) task_pt_regs(tsk);
|
||||
save_context_stack(trace, sp, low, high, 0);
|
||||
@@ -93,3 +103,14 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||
|
||||
void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
|
||||
{
|
||||
unsigned long sp;
|
||||
|
||||
sp = kernel_stack_pointer(regs);
|
||||
__save_stack_trace(trace, sp);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_regs);
|
||||
|
||||
@@ -18,6 +18,9 @@ void trace_s390_diagnose_norecursion(int diag_nr)
|
||||
unsigned long flags;
|
||||
unsigned int *depth;
|
||||
|
||||
/* Avoid lockdep recursion. */
|
||||
if (IS_ENABLED(CONFIG_LOCKDEP))
|
||||
return;
|
||||
local_irq_save(flags);
|
||||
depth = this_cpu_ptr(&diagnose_trace_depth);
|
||||
if (*depth == 0) {
|
||||
|
||||
Reference in New Issue
Block a user