Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: [S390] dcss: Initialize workqueue before using it. [S390] Remove BUILD_BUG_ON() in vmem code. [S390] sclp_tty/sclp_vt220: Fix scheduling while atomic [S390] dasd: fix panic caused by alias device offline [S390] dasd: add ifcc handling [S390] latencytop s390 support. [S390] Implement ext2_find_next_bit. [S390] Cleanup & optimize bitops. [S390] Define GENERIC_LOCKBREAK. [S390] console: allow vt220 console to be the only console [S390] Fix couple of section mismatches. [S390] Fix smp_call_function_mask semantics. [S390] Fix linker script. [S390] DEBUG_PAGEALLOC support for s390. [S390] cio: Add shutdown callback for ccwgroup. [S390] cio: Update documentation. [S390] cio: Clean up chsc response code handling. [S390] cio: make sense id procedure work with partial hardware response
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/sys.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/errno.h>
|
||||
@@ -830,9 +831,7 @@ mcck_return:
|
||||
* Restart interruption handler, kick starter for additional CPUs
|
||||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
.section .init.text,"ax"
|
||||
#endif
|
||||
__CPUINIT
|
||||
.globl restart_int_handler
|
||||
restart_int_handler:
|
||||
l %r15,__LC_SAVE_AREA+60 # load ksp
|
||||
@@ -845,9 +844,7 @@ restart_int_handler:
|
||||
br %r14 # branch to start_secondary
|
||||
restart_addr:
|
||||
.long start_secondary
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
.previous
|
||||
#endif
|
||||
#else
|
||||
/*
|
||||
* If we do not run with SMP enabled, let the new CPU crash ...
|
||||
|
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/sys.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/errno.h>
|
||||
@@ -801,9 +802,7 @@ mcck_return:
|
||||
* Restart interruption handler, kick starter for additional CPUs
|
||||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
.section .init.text,"ax"
|
||||
#endif
|
||||
__CPUINIT
|
||||
.globl restart_int_handler
|
||||
restart_int_handler:
|
||||
lg %r15,__LC_SAVE_AREA+120 # load ksp
|
||||
@@ -814,9 +813,7 @@ restart_int_handler:
|
||||
lmg %r6,%r15,__SF_GPRS(%r15) # load registers from clone
|
||||
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
||||
jg start_secondary
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
.previous
|
||||
#endif
|
||||
#else
|
||||
/*
|
||||
* If we do not run with SMP enabled, let the new CPU crash ...
|
||||
|
@@ -439,7 +439,7 @@ static void ipl_run(struct shutdown_trigger *trigger)
|
||||
reipl_ccw_dev(&ipl_info.data.ccw.dev_id);
|
||||
}
|
||||
|
||||
static int ipl_init(void)
|
||||
static int __init ipl_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -471,8 +471,11 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct shutdown_action ipl_action = {SHUTDOWN_ACTION_IPL_STR, ipl_run,
|
||||
ipl_init};
|
||||
static struct shutdown_action __refdata ipl_action = {
|
||||
.name = SHUTDOWN_ACTION_IPL_STR,
|
||||
.fn = ipl_run,
|
||||
.init = ipl_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* reipl shutdown action: Reboot Linux on shutdown.
|
||||
@@ -792,7 +795,7 @@ static int __init reipl_fcp_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int reipl_init(void)
|
||||
static int __init reipl_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -819,8 +822,11 @@ static int reipl_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct shutdown_action reipl_action = {SHUTDOWN_ACTION_REIPL_STR,
|
||||
reipl_run, reipl_init};
|
||||
static struct shutdown_action __refdata reipl_action = {
|
||||
.name = SHUTDOWN_ACTION_REIPL_STR,
|
||||
.fn = reipl_run,
|
||||
.init = reipl_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* dump shutdown action: Dump Linux on shutdown.
|
||||
@@ -998,7 +1004,7 @@ static int __init dump_fcp_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_init(void)
|
||||
static int __init dump_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -1020,8 +1026,11 @@ static int dump_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct shutdown_action dump_action = {SHUTDOWN_ACTION_DUMP_STR,
|
||||
dump_run, dump_init};
|
||||
static struct shutdown_action __refdata dump_action = {
|
||||
.name = SHUTDOWN_ACTION_DUMP_STR,
|
||||
.fn = dump_run,
|
||||
.init = dump_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* vmcmd shutdown action: Trigger vm command on shutdown.
|
||||
|
@@ -77,7 +77,7 @@ unsigned long machine_flags = 0;
|
||||
unsigned long elf_hwcap = 0;
|
||||
char elf_platform[ELF_PLATFORM_SIZE];
|
||||
|
||||
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
|
||||
struct mem_chunk __meminitdata memory_chunk[MEMORY_CHUNKS];
|
||||
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
|
||||
static unsigned long __initdata memory_end;
|
||||
|
||||
@@ -145,7 +145,7 @@ __setup("condev=", condev_setup);
|
||||
|
||||
static int __init conmode_setup(char *str)
|
||||
{
|
||||
#if defined(CONFIG_SCLP_CONSOLE)
|
||||
#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0)
|
||||
SET_CONSOLE_SCLP;
|
||||
#endif
|
||||
@@ -183,7 +183,7 @@ static void __init conmode_default(void)
|
||||
*/
|
||||
cpcmd("TERM CONMODE 3215", NULL, 0, NULL);
|
||||
if (ptr == NULL) {
|
||||
#if defined(CONFIG_SCLP_CONSOLE)
|
||||
#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
SET_CONSOLE_SCLP;
|
||||
#endif
|
||||
return;
|
||||
@@ -193,7 +193,7 @@ static void __init conmode_default(void)
|
||||
SET_CONSOLE_3270;
|
||||
#elif defined(CONFIG_TN3215_CONSOLE)
|
||||
SET_CONSOLE_3215;
|
||||
#elif defined(CONFIG_SCLP_CONSOLE)
|
||||
#elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
SET_CONSOLE_SCLP;
|
||||
#endif
|
||||
} else if (strncmp(ptr + 8, "3215", 4) == 0) {
|
||||
@@ -201,7 +201,7 @@ static void __init conmode_default(void)
|
||||
SET_CONSOLE_3215;
|
||||
#elif defined(CONFIG_TN3270_CONSOLE)
|
||||
SET_CONSOLE_3270;
|
||||
#elif defined(CONFIG_SCLP_CONSOLE)
|
||||
#elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
SET_CONSOLE_SCLP;
|
||||
#endif
|
||||
}
|
||||
@@ -212,7 +212,7 @@ static void __init conmode_default(void)
|
||||
SET_CONSOLE_3270;
|
||||
#endif
|
||||
} else {
|
||||
#if defined(CONFIG_SCLP_CONSOLE)
|
||||
#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
SET_CONSOLE_SCLP;
|
||||
#endif
|
||||
}
|
||||
@@ -528,7 +528,7 @@ static void __init setup_memory_end(void)
|
||||
memory_size = 0;
|
||||
memory_end &= PAGE_MASK;
|
||||
|
||||
max_mem = memory_end ? min(VMALLOC_START, memory_end) : VMALLOC_START;
|
||||
max_mem = memory_end ? min(VMEM_MAX_PHYS, memory_end) : VMEM_MAX_PHYS;
|
||||
memory_end = min(max_mem, memory_end);
|
||||
|
||||
/*
|
||||
|
@@ -225,12 +225,11 @@ EXPORT_SYMBOL(smp_call_function_single);
|
||||
* You must not call this function with disabled interrupts or from a
|
||||
* hardware interrupt handler or from a bottom half handler.
|
||||
*/
|
||||
int
|
||||
smp_call_function_mask(cpumask_t mask,
|
||||
void (*func)(void *), void *info,
|
||||
int wait)
|
||||
int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info,
|
||||
int wait)
|
||||
{
|
||||
preempt_disable();
|
||||
cpu_clear(smp_processor_id(), mask);
|
||||
__smp_call_function_map(func, info, 0, wait, mask);
|
||||
preempt_enable();
|
||||
return 0;
|
||||
@@ -1008,7 +1007,7 @@ static struct notifier_block __cpuinitdata smp_cpu_nb = {
|
||||
.notifier_call = smp_cpu_notify,
|
||||
};
|
||||
|
||||
static int smp_add_present_cpu(int cpu)
|
||||
static int __devinit smp_add_present_cpu(int cpu)
|
||||
{
|
||||
struct cpu *c = &per_cpu(cpu_devices, cpu);
|
||||
struct sys_device *s = &c->sysdev;
|
||||
@@ -1036,8 +1035,8 @@ out:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static ssize_t rescan_store(struct sys_device *dev, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t __ref rescan_store(struct sys_device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
cpumask_t newcpus;
|
||||
int cpu;
|
||||
|
@@ -14,7 +14,8 @@
|
||||
static unsigned long save_context_stack(struct stack_trace *trace,
|
||||
unsigned long sp,
|
||||
unsigned long low,
|
||||
unsigned long high)
|
||||
unsigned long high,
|
||||
int savesched)
|
||||
{
|
||||
struct stack_frame *sf;
|
||||
struct pt_regs *regs;
|
||||
@@ -47,10 +48,12 @@ static unsigned long save_context_stack(struct stack_trace *trace,
|
||||
return sp;
|
||||
regs = (struct pt_regs *)sp;
|
||||
addr = regs->psw.addr & PSW_ADDR_INSN;
|
||||
if (!trace->skip)
|
||||
trace->entries[trace->nr_entries++] = addr;
|
||||
else
|
||||
trace->skip--;
|
||||
if (savesched || !in_sched_functions(addr)) {
|
||||
if (!trace->skip)
|
||||
trace->entries[trace->nr_entries++] = addr;
|
||||
else
|
||||
trace->skip--;
|
||||
}
|
||||
if (trace->nr_entries >= trace->max_entries)
|
||||
return sp;
|
||||
low = sp;
|
||||
@@ -66,15 +69,27 @@ void save_stack_trace(struct stack_trace *trace)
|
||||
orig_sp = sp & PSW_ADDR_INSN;
|
||||
new_sp = save_context_stack(trace, orig_sp,
|
||||
S390_lowcore.panic_stack - PAGE_SIZE,
|
||||
S390_lowcore.panic_stack);
|
||||
S390_lowcore.panic_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
new_sp = save_context_stack(trace, new_sp,
|
||||
S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack);
|
||||
S390_lowcore.async_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
save_context_stack(trace, new_sp,
|
||||
S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE);
|
||||
S390_lowcore.thread_info + THREAD_SIZE, 1);
|
||||
}
|
||||
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
{
|
||||
unsigned long sp, low, high;
|
||||
|
||||
sp = tsk->thread.ksp & PSW_ADDR_INSN;
|
||||
low = (unsigned long) task_stack_page(tsk);
|
||||
high = (unsigned long) task_pt_regs(tsk);
|
||||
save_context_stack(trace, sp, low, high, 0);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
|
@@ -271,7 +271,10 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
printk("PREEMPT ");
|
||||
#endif
|
||||
#ifdef CONFIG_SMP
|
||||
printk("SMP");
|
||||
printk("SMP ");
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
printk("DEBUG_PAGEALLOC");
|
||||
#endif
|
||||
printk("\n");
|
||||
notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV);
|
||||
|
@@ -35,7 +35,7 @@ SECTIONS
|
||||
KPROBES_TEXT
|
||||
*(.fixup)
|
||||
*(.gnu.warning)
|
||||
} = 0x0700
|
||||
} :text = 0x0700
|
||||
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
|
Reference in New Issue
Block a user