Commit 7e275196 authored by Heiko Carstens's avatar Heiko Carstens Committed by Linus Torvalds

[PATCH] s390: Core changes

s390 core changes:
 - Fix mm_struct leak on cpu hotplug.
 - Improved cpu detection logic to avoid long delay at system start.
 - Call cpu_relax() in cpu hotplug wait loop.
 - Remove #define of account_system_vtime for CONFIG_VIRT_CPU_ACCOUNTING=n.
 - Regenerate default configuration.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7e2066ed
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.10 # Linux kernel version: 2.6.11-rc1
# Mon Dec 27 11:03:23 2004 # Fri Jan 14 14:56:51 2005
# #
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_S390=y CONFIG_ARCH_S390=y
CONFIG_UID16=y CONFIG_UID16=y
...@@ -142,6 +143,7 @@ CONFIG_SCSI_LOGGING=y ...@@ -142,6 +143,7 @@ CONFIG_SCSI_LOGGING=y
# #
# CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_SPI_ATTRS is not set
CONFIG_SCSI_FC_ATTRS=y CONFIG_SCSI_FC_ATTRS=y
# CONFIG_SCSI_ISCSI_ATTRS is not set
# #
# SCSI low-level drivers # SCSI low-level drivers
...@@ -184,6 +186,7 @@ CONFIG_IOSCHED_NOOP=y ...@@ -184,6 +186,7 @@ CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y CONFIG_IOSCHED_CFQ=y
# CONFIG_ATA_OVER_ETH is not set
# #
# Multi-device support (RAID and LVM) # Multi-device support (RAID and LVM)
...@@ -530,6 +533,7 @@ CONFIG_MAGIC_SYSRQ=y ...@@ -530,6 +533,7 @@ CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_FS is not set
# #
# Security options # Security options
......
...@@ -98,6 +98,8 @@ void __devinit cpu_init (void) ...@@ -98,6 +98,8 @@ void __devinit cpu_init (void)
clear_thread_flag(TIF_USEDFPU); clear_thread_flag(TIF_USEDFPU);
current->used_math = 0; current->used_math = 0;
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
if (current->mm) if (current->mm)
BUG(); BUG();
enter_lazy_tlb(&init_mm, current); enter_lazy_tlb(&init_mm, current);
......
...@@ -486,48 +486,38 @@ void smp_ctl_clear_bit(int cr, int bit) { ...@@ -486,48 +486,38 @@ void smp_ctl_clear_bit(int cr, int bit) {
* Lets check how many CPUs we have. * Lets check how many CPUs we have.
*/ */
#ifdef CONFIG_HOTPLUG_CPU
void void
__init smp_check_cpus(unsigned int max_cpus) __init smp_check_cpus(unsigned int max_cpus)
{ {
int cpu; int cpu, num_cpus;
__u16 boot_cpu_addr;
/* /*
* cpu 0 is the boot cpu. See smp_prepare_boot_cpu. * cpu 0 is the boot cpu. See smp_prepare_boot_cpu.
*/ */
for (cpu = 1; cpu < max_cpus; cpu++)
cpu_set(cpu, cpu_possible_map);
}
#else /* CONFIG_HOTPLUG_CPU */ boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr;
__cpu_logical_map[0] = boot_cpu_addr;
current_thread_info()->cpu = 0;
num_cpus = 1;
for (cpu = 0; cpu <= 65535 && num_cpus < max_cpus; cpu++) {
if ((__u16) cpu == boot_cpu_addr)
continue;
__cpu_logical_map[num_cpus] = (__u16) cpu;
if (signal_processor(num_cpus, sigp_sense) ==
sigp_not_operational)
continue;
cpu_set(num_cpus, cpu_present_map);
num_cpus++;
}
void for (cpu = 1; cpu < max_cpus; cpu++)
__init smp_check_cpus(unsigned int max_cpus) cpu_set(cpu, cpu_possible_map);
{
int curr_cpu, num_cpus;
__u16 boot_cpu_addr;
boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; printk("Detected %d CPU's\n",(int) num_cpus);
current_thread_info()->cpu = 0; printk("Boot cpu address %2X\n", boot_cpu_addr);
num_cpus = 1;
for (curr_cpu = 0;
curr_cpu <= 65535 && num_cpus < max_cpus; curr_cpu++) {
if ((__u16) curr_cpu == boot_cpu_addr)
continue;
__cpu_logical_map[num_cpus] = (__u16) curr_cpu;
if (signal_processor(num_cpus, sigp_sense) ==
sigp_not_operational)
continue;
cpu_set(num_cpus, cpu_possible_map);
num_cpus++;
}
printk("Detected %d CPU's\n",(int) num_cpus);
printk("Boot cpu address %2X\n", boot_cpu_addr);
} }
#endif /* CONFIG_HOTPLUG_CPU */
/* /*
* Activate a secondary processor. * Activate a secondary processor.
*/ */
...@@ -571,8 +561,6 @@ static void __init smp_create_idle(unsigned int cpu) ...@@ -571,8 +561,6 @@ static void __init smp_create_idle(unsigned int cpu)
p = fork_idle(cpu); p = fork_idle(cpu);
if (IS_ERR(p)) if (IS_ERR(p))
panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
atomic_inc(&init_mm.mm_count);
p->active_mm = &init_mm;
current_set[cpu] = p; current_set[cpu] = p;
} }
...@@ -681,7 +669,8 @@ __cpu_up(unsigned int cpu) ...@@ -681,7 +669,8 @@ __cpu_up(unsigned int cpu)
eieio(); eieio();
signal_processor(cpu,sigp_restart); signal_processor(cpu,sigp_restart);
while (!cpu_online(cpu)); while (!cpu_online(cpu))
cpu_relax();
return 0; return 0;
} }
...@@ -736,13 +725,15 @@ void ...@@ -736,13 +725,15 @@ void
__cpu_die(unsigned int cpu) __cpu_die(unsigned int cpu)
{ {
/* Wait until target cpu is down */ /* Wait until target cpu is down */
while (!cpu_stopped(cpu)); while (!cpu_stopped(cpu))
cpu_relax();
printk("Processor %d spun down\n", cpu); printk("Processor %d spun down\n", cpu);
} }
void void
cpu_die(void) cpu_die(void)
{ {
idle_task_exit();
signal_processor(smp_processor_id(), sigp_stop); signal_processor(smp_processor_id(), sigp_stop);
BUG(); BUG();
for(;;); for(;;);
...@@ -806,6 +797,7 @@ void __devinit smp_prepare_boot_cpu(void) ...@@ -806,6 +797,7 @@ void __devinit smp_prepare_boot_cpu(void)
void smp_cpus_done(unsigned int max_cpus) void smp_cpus_done(unsigned int max_cpus)
{ {
cpu_present_map = cpu_possible_map;
} }
/* /*
......
...@@ -119,8 +119,6 @@ extern void account_system_vtime(struct task_struct *); ...@@ -119,8 +119,6 @@ extern void account_system_vtime(struct task_struct *);
#else #else
#define account_system_vtime(prev)
#define finish_arch_switch(rq, prev) do { \ #define finish_arch_switch(rq, prev) do { \
set_fs(current->thread.mm_segment); \ set_fs(current->thread.mm_segment); \
spin_unlock_irq(&(rq)->lock); \ spin_unlock_irq(&(rq)->lock); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment