diff options
Diffstat (limited to 'arch/s390/kernel')
| -rw-r--r-- | arch/s390/kernel/entry.S | 20 | ||||
| -rw-r--r-- | arch/s390/kernel/entry64.S | 11 | ||||
| -rw-r--r-- | arch/s390/kernel/process.c | 3 | ||||
| -rw-r--r-- | arch/s390/kernel/setup.c | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/sys_s390.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/topology.c | 11 |
6 files changed, 33 insertions, 18 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index ed500ef799b..08844fc24a2 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
| @@ -61,22 +61,25 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
| 61 | 61 | ||
| 62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
| 64 | l %r1,BASED(.Ltrace_irq_on) | 64 | basr %r2,%r0 |
| 65 | l %r1,BASED(.Ltrace_irq_on_caller) | ||
| 65 | basr %r14,%r1 | 66 | basr %r14,%r1 |
| 66 | .endm | 67 | .endm |
| 67 | 68 | ||
| 68 | .macro TRACE_IRQS_OFF | 69 | .macro TRACE_IRQS_OFF |
| 69 | l %r1,BASED(.Ltrace_irq_off) | 70 | basr %r2,%r0 |
| 71 | l %r1,BASED(.Ltrace_irq_off_caller) | ||
| 70 | basr %r14,%r1 | 72 | basr %r14,%r1 |
| 71 | .endm | 73 | .endm |
| 72 | 74 | ||
| 73 | .macro TRACE_IRQS_CHECK | 75 | .macro TRACE_IRQS_CHECK |
| 76 | basr %r2,%r0 | ||
| 74 | tm SP_PSW(%r15),0x03 # irqs enabled? | 77 | tm SP_PSW(%r15),0x03 # irqs enabled? |
| 75 | jz 0f | 78 | jz 0f |
| 76 | l %r1,BASED(.Ltrace_irq_on) | 79 | l %r1,BASED(.Ltrace_irq_on_caller) |
| 77 | basr %r14,%r1 | 80 | basr %r14,%r1 |
| 78 | j 1f | 81 | j 1f |
| 79 | 0: l %r1,BASED(.Ltrace_irq_off) | 82 | 0: l %r1,BASED(.Ltrace_irq_off_caller) |
| 80 | basr %r14,%r1 | 83 | basr %r14,%r1 |
| 81 | 1: | 84 | 1: |
| 82 | .endm | 85 | .endm |
| @@ -1113,9 +1116,12 @@ cleanup_io_leave_insn: | |||
| 1113 | .Lschedtail: .long schedule_tail | 1116 | .Lschedtail: .long schedule_tail |
| 1114 | .Lsysc_table: .long sys_call_table | 1117 | .Lsysc_table: .long sys_call_table |
| 1115 | #ifdef CONFIG_TRACE_IRQFLAGS | 1118 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 1116 | .Ltrace_irq_on: .long trace_hardirqs_on | 1119 | .Ltrace_irq_on_caller: |
| 1117 | .Ltrace_irq_off: | 1120 | .long trace_hardirqs_on_caller |
| 1118 | .long trace_hardirqs_off | 1121 | .Ltrace_irq_off_caller: |
| 1122 | .long trace_hardirqs_off_caller | ||
| 1123 | #endif | ||
| 1124 | #ifdef CONFIG_LOCKDEP | ||
| 1119 | .Llockdep_sys_exit: | 1125 | .Llockdep_sys_exit: |
| 1120 | .long lockdep_sys_exit | 1126 | .long lockdep_sys_exit |
| 1121 | #endif | 1127 | #endif |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index d7ce150453f..41aca06682a 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
| @@ -61,19 +61,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
| 61 | 61 | ||
| 62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
| 63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
| 64 | brasl %r14,trace_hardirqs_on | 64 | basr %r2,%r0 |
| 65 | brasl %r14,trace_hardirqs_on_caller | ||
| 65 | .endm | 66 | .endm |
| 66 | 67 | ||
| 67 | .macro TRACE_IRQS_OFF | 68 | .macro TRACE_IRQS_OFF |
| 68 | brasl %r14,trace_hardirqs_off | 69 | basr %r2,%r0 |
| 70 | brasl %r14,trace_hardirqs_off_caller | ||
| 69 | .endm | 71 | .endm |
| 70 | 72 | ||
| 71 | .macro TRACE_IRQS_CHECK | 73 | .macro TRACE_IRQS_CHECK |
| 74 | basr %r2,%r0 | ||
| 72 | tm SP_PSW(%r15),0x03 # irqs enabled? | 75 | tm SP_PSW(%r15),0x03 # irqs enabled? |
| 73 | jz 0f | 76 | jz 0f |
| 74 | brasl %r14,trace_hardirqs_on | 77 | brasl %r14,trace_hardirqs_on_caller |
| 75 | j 1f | 78 | j 1f |
| 76 | 0: brasl %r14,trace_hardirqs_off | 79 | 0: brasl %r14,trace_hardirqs_off_caller |
| 77 | 1: | 80 | 1: |
| 78 | .endm | 81 | .endm |
| 79 | #else | 82 | #else |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3e2c05cb6a8..04f8c67a610 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
| @@ -136,9 +136,12 @@ static void default_idle(void) | |||
| 136 | return; | 136 | return; |
| 137 | } | 137 | } |
| 138 | trace_hardirqs_on(); | 138 | trace_hardirqs_on(); |
| 139 | /* Don't trace preempt off for idle. */ | ||
| 140 | stop_critical_timings(); | ||
| 139 | /* Wait for external, I/O or machine check interrupt. */ | 141 | /* Wait for external, I/O or machine check interrupt. */ |
| 140 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | | 142 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | |
| 141 | PSW_MASK_IO | PSW_MASK_EXT); | 143 | PSW_MASK_IO | PSW_MASK_EXT); |
| 144 | start_critical_timings(); | ||
| 142 | } | 145 | } |
| 143 | 146 | ||
| 144 | void cpu_idle(void) | 147 | void cpu_idle(void) |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 62122bad1e3..400b040df7f 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -604,13 +604,13 @@ setup_memory(void) | |||
| 604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) | 604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) |
| 605 | continue; | 605 | continue; |
| 606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); | 606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); |
| 607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; | 607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size); |
| 608 | end_chunk = min(end_chunk, end_pfn); | 608 | end_chunk = min(end_chunk, end_pfn); |
| 609 | if (start_chunk >= end_chunk) | 609 | if (start_chunk >= end_chunk) |
| 610 | continue; | 610 | continue; |
| 611 | add_active_range(0, start_chunk, end_chunk); | 611 | add_active_range(0, start_chunk, end_chunk); |
| 612 | pfn = max(start_chunk, start_pfn); | 612 | pfn = max(start_chunk, start_pfn); |
| 613 | for (; pfn <= end_chunk; pfn++) | 613 | for (; pfn < end_chunk; pfn++) |
| 614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); | 614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); |
| 615 | } | 615 | } |
| 616 | 616 | ||
diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index 5fdb799062b..4fe952e557a 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c | |||
| @@ -198,7 +198,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name) | |||
| 198 | { | 198 | { |
| 199 | int ret = sys_newuname(name); | 199 | int ret = sys_newuname(name); |
| 200 | 200 | ||
| 201 | if (current->personality == PER_LINUX32 && !ret) { | 201 | if (personality(current->personality) == PER_LINUX32 && !ret) { |
| 202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); | 202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); |
| 203 | if (ret) ret = -EFAULT; | 203 | if (ret) ret = -EFAULT; |
| 204 | } | 204 | } |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 632b13e1005..a947899dcba 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
| @@ -65,18 +65,21 @@ static int machine_has_topology_irq; | |||
| 65 | static struct timer_list topology_timer; | 65 | static struct timer_list topology_timer; |
| 66 | static void set_topology_timer(void); | 66 | static void set_topology_timer(void); |
| 67 | static DECLARE_WORK(topology_work, topology_work_fn); | 67 | static DECLARE_WORK(topology_work, topology_work_fn); |
| 68 | /* topology_lock protects the core linked list */ | ||
| 69 | static DEFINE_SPINLOCK(topology_lock); | ||
| 68 | 70 | ||
| 69 | cpumask_t cpu_core_map[NR_CPUS]; | 71 | cpumask_t cpu_core_map[NR_CPUS]; |
| 70 | 72 | ||
| 71 | cpumask_t cpu_coregroup_map(unsigned int cpu) | 73 | cpumask_t cpu_coregroup_map(unsigned int cpu) |
| 72 | { | 74 | { |
| 73 | struct core_info *core = &core_info; | 75 | struct core_info *core = &core_info; |
| 76 | unsigned long flags; | ||
| 74 | cpumask_t mask; | 77 | cpumask_t mask; |
| 75 | 78 | ||
| 76 | cpus_clear(mask); | 79 | cpus_clear(mask); |
| 77 | if (!machine_has_topology) | 80 | if (!machine_has_topology) |
| 78 | return cpu_present_map; | 81 | return cpu_present_map; |
| 79 | mutex_lock(&smp_cpu_state_mutex); | 82 | spin_lock_irqsave(&topology_lock, flags); |
| 80 | while (core) { | 83 | while (core) { |
| 81 | if (cpu_isset(cpu, core->mask)) { | 84 | if (cpu_isset(cpu, core->mask)) { |
| 82 | mask = core->mask; | 85 | mask = core->mask; |
| @@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu) | |||
| 84 | } | 87 | } |
| 85 | core = core->next; | 88 | core = core->next; |
| 86 | } | 89 | } |
| 87 | mutex_unlock(&smp_cpu_state_mutex); | 90 | spin_unlock_irqrestore(&topology_lock, flags); |
| 88 | if (cpus_empty(mask)) | 91 | if (cpus_empty(mask)) |
| 89 | mask = cpumask_of_cpu(cpu); | 92 | mask = cpumask_of_cpu(cpu); |
| 90 | return mask; | 93 | return mask; |
| @@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info) | |||
| 133 | union tl_entry *tle, *end; | 136 | union tl_entry *tle, *end; |
| 134 | struct core_info *core = &core_info; | 137 | struct core_info *core = &core_info; |
| 135 | 138 | ||
| 136 | mutex_lock(&smp_cpu_state_mutex); | 139 | spin_lock_irq(&topology_lock); |
| 137 | clear_cores(); | 140 | clear_cores(); |
| 138 | tle = info->tle; | 141 | tle = info->tle; |
| 139 | end = (union tl_entry *)((unsigned long)info + info->length); | 142 | end = (union tl_entry *)((unsigned long)info + info->length); |
| @@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info) | |||
| 157 | } | 160 | } |
| 158 | tle = next_tle(tle); | 161 | tle = next_tle(tle); |
| 159 | } | 162 | } |
| 160 | mutex_unlock(&smp_cpu_state_mutex); | 163 | spin_unlock_irq(&topology_lock); |
| 161 | } | 164 | } |
| 162 | 165 | ||
| 163 | static void topology_update_polarization_simple(void) | 166 | static void topology_update_polarization_simple(void) |
