diff options
Diffstat (limited to 'arch')
62 files changed, 598 insertions, 486 deletions
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 703731accda6..7bc7489223f3 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
@@ -55,7 +55,7 @@ int irq_select_affinity(unsigned int irq) | |||
55 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); | 55 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); |
56 | last_cpu = cpu; | 56 | last_cpu = cpu; |
57 | 57 | ||
58 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 58 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
59 | irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); | 59 | irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); |
60 | return 0; | 60 | return 0; |
61 | } | 61 | } |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 7141cee1fab7..4bb723eadad1 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
@@ -104,6 +104,11 @@ static struct irq_desc bad_irq_desc = { | |||
104 | .lock = SPIN_LOCK_UNLOCKED | 104 | .lock = SPIN_LOCK_UNLOCKED |
105 | }; | 105 | }; |
106 | 106 | ||
107 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
108 | /* We are not allocating bad_irq_desc.affinity or .pending_mask */ | ||
109 | #error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK." | ||
110 | #endif | ||
111 | |||
107 | /* | 112 | /* |
108 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not | 113 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not |
109 | * come via this function. Instead, they should provide their | 114 | * come via this function. Instead, they should provide their |
@@ -161,7 +166,7 @@ void __init init_IRQ(void) | |||
161 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; | 166 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; |
162 | 167 | ||
163 | #ifdef CONFIG_SMP | 168 | #ifdef CONFIG_SMP |
164 | bad_irq_desc.affinity = CPU_MASK_ALL; | 169 | cpumask_setall(bad_irq_desc.affinity); |
165 | bad_irq_desc.cpu = smp_processor_id(); | 170 | bad_irq_desc.cpu = smp_processor_id(); |
166 | #endif | 171 | #endif |
167 | init_arch_irq(); | 172 | init_arch_irq(); |
@@ -191,15 +196,16 @@ void migrate_irqs(void) | |||
191 | struct irq_desc *desc = irq_desc + i; | 196 | struct irq_desc *desc = irq_desc + i; |
192 | 197 | ||
193 | if (desc->cpu == cpu) { | 198 | if (desc->cpu == cpu) { |
194 | unsigned int newcpu = any_online_cpu(desc->affinity); | 199 | unsigned int newcpu = cpumask_any_and(desc->affinity, |
195 | 200 | cpu_online_mask); | |
196 | if (newcpu == NR_CPUS) { | 201 | if (newcpu >= nr_cpu_ids) { |
197 | if (printk_ratelimit()) | 202 | if (printk_ratelimit()) |
198 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", | 203 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", |
199 | i, cpu); | 204 | i, cpu); |
200 | 205 | ||
201 | cpus_setall(desc->affinity); | 206 | cpumask_setall(desc->affinity); |
202 | newcpu = any_online_cpu(desc->affinity); | 207 | newcpu = cpumask_any_and(desc->affinity, |
208 | cpu_online_mask); | ||
203 | } | 209 | } |
204 | 210 | ||
205 | route_irq(desc, i, newcpu); | 211 | route_irq(desc, i, newcpu); |
diff --git a/arch/arm/oprofile/op_model_mpcore.c b/arch/arm/oprofile/op_model_mpcore.c index 6d6bd5899240..853d42bb8682 100644 --- a/arch/arm/oprofile/op_model_mpcore.c +++ b/arch/arm/oprofile/op_model_mpcore.c | |||
@@ -263,7 +263,7 @@ static void em_route_irq(int irq, unsigned int cpu) | |||
263 | const struct cpumask *mask = cpumask_of(cpu); | 263 | const struct cpumask *mask = cpumask_of(cpu); |
264 | 264 | ||
265 | spin_lock_irq(&desc->lock); | 265 | spin_lock_irq(&desc->lock); |
266 | desc->affinity = *mask; | 266 | cpumask_copy(desc->affinity, mask); |
267 | desc->chip->set_affinity(irq, mask); | 267 | desc->chip->set_affinity(irq, mask); |
268 | spin_unlock_irq(&desc->lock); | 268 | spin_unlock_irq(&desc->lock); |
269 | } | 269 | } |
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index ab8209cbbad0..5780d6df1542 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c | |||
@@ -69,6 +69,11 @@ static struct irq_desc bad_irq_desc = { | |||
69 | #endif | 69 | #endif |
70 | }; | 70 | }; |
71 | 71 | ||
72 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
73 | /* We are not allocating a variable-sized bad_irq_desc.affinity */ | ||
74 | #error "Blackfin architecture does not support CONFIG_CPUMASK_OFFSTACK." | ||
75 | #endif | ||
76 | |||
72 | int show_interrupts(struct seq_file *p, void *v) | 77 | int show_interrupts(struct seq_file *p, void *v) |
73 | { | 78 | { |
74 | int i = *(loff_t *) v, j; | 79 | int i = *(loff_t *) v, j; |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 5cfd3d91001a..006ad366a454 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -880,7 +880,7 @@ iosapic_unregister_intr (unsigned int gsi) | |||
880 | if (iosapic_intr_info[irq].count == 0) { | 880 | if (iosapic_intr_info[irq].count == 0) { |
881 | #ifdef CONFIG_SMP | 881 | #ifdef CONFIG_SMP |
882 | /* Clear affinity */ | 882 | /* Clear affinity */ |
883 | cpus_setall(idesc->affinity); | 883 | cpumask_setall(idesc->affinity); |
884 | #endif | 884 | #endif |
885 | /* Clear the interrupt information */ | 885 | /* Clear the interrupt information */ |
886 | iosapic_intr_info[irq].dest = 0; | 886 | iosapic_intr_info[irq].dest = 0; |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index a58f64ca9f0e..226233a6fa19 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -103,7 +103,7 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 }; | |||
103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) | 103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) |
104 | { | 104 | { |
105 | if (irq < NR_IRQS) { | 105 | if (irq < NR_IRQS) { |
106 | cpumask_copy(&irq_desc[irq].affinity, | 106 | cpumask_copy(irq_desc[irq].affinity, |
107 | cpumask_of(cpu_logical_id(hwid))); | 107 | cpumask_of(cpu_logical_id(hwid))); |
108 | irq_redir[irq] = (char) (redir & 0xff); | 108 | irq_redir[irq] = (char) (redir & 0xff); |
109 | } | 109 | } |
@@ -148,7 +148,7 @@ static void migrate_irqs(void) | |||
148 | if (desc->status == IRQ_PER_CPU) | 148 | if (desc->status == IRQ_PER_CPU) |
149 | continue; | 149 | continue; |
150 | 150 | ||
151 | if (cpumask_any_and(&irq_desc[irq].affinity, cpu_online_mask) | 151 | if (cpumask_any_and(irq_desc[irq].affinity, cpu_online_mask) |
152 | >= nr_cpu_ids) { | 152 | >= nr_cpu_ids) { |
153 | /* | 153 | /* |
154 | * Save it for phase 2 processing | 154 | * Save it for phase 2 processing |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 28d3d483db92..927ad027820c 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -493,11 +493,13 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
494 | ia64_srlz_d(); | 494 | ia64_srlz_d(); |
495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
496 | struct irq_desc *desc = irq_to_desc(vector); | ||
497 | |||
496 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 498 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
497 | smp_local_flush_tlb(); | 499 | smp_local_flush_tlb(); |
498 | kstat_this_cpu.irqs[vector]++; | 500 | kstat_incr_irqs_this_cpu(vector, desc); |
499 | } else if (unlikely(IS_RESCHEDULE(vector))) | 501 | } else if (unlikely(IS_RESCHEDULE(vector))) |
500 | kstat_this_cpu.irqs[vector]++; | 502 | kstat_incr_irqs_this_cpu(vector, desc); |
501 | else { | 503 | else { |
502 | int irq = local_vector_to_irq(vector); | 504 | int irq = local_vector_to_irq(vector); |
503 | 505 | ||
@@ -551,11 +553,13 @@ void ia64_process_pending_intr(void) | |||
551 | * Perform normal interrupt style processing | 553 | * Perform normal interrupt style processing |
552 | */ | 554 | */ |
553 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 555 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
556 | struct irq_desc *desc = irq_to_desc(vector); | ||
557 | |||
554 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
555 | smp_local_flush_tlb(); | 559 | smp_local_flush_tlb(); |
556 | kstat_this_cpu.irqs[vector]++; | 560 | kstat_incr_irqs_this_cpu(vector, desc); |
557 | } else if (unlikely(IS_RESCHEDULE(vector))) | 561 | } else if (unlikely(IS_RESCHEDULE(vector))) |
558 | kstat_this_cpu.irqs[vector]++; | 562 | kstat_incr_irqs_this_cpu(vector, desc); |
559 | else { | 563 | else { |
560 | struct pt_regs *old_regs = set_irq_regs(NULL); | 564 | struct pt_regs *old_regs = set_irq_regs(NULL); |
561 | int irq = local_vector_to_irq(vector); | 565 | int irq = local_vector_to_irq(vector); |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 890339339035..dcb6b7c51ea7 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -75,7 +75,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
75 | msg.data = data; | 75 | msg.data = data; |
76 | 76 | ||
77 | write_msi_msg(irq, &msg); | 77 | write_msi_msg(irq, &msg); |
78 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 78 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
79 | } | 79 | } |
80 | #endif /* CONFIG_SMP */ | 80 | #endif /* CONFIG_SMP */ |
81 | 81 | ||
@@ -187,7 +187,7 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); |
188 | 188 | ||
189 | dmar_msi_write(irq, &msg); | 189 | dmar_msi_write(irq, &msg); |
190 | irq_desc[irq].affinity = *mask; | 190 | cpumask_copy(irq_desc[irq].affinity, mask); |
191 | } | 191 | } |
192 | #endif /* CONFIG_SMP */ | 192 | #endif /* CONFIG_SMP */ |
193 | 193 | ||
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c index ca553b0429ce..81e428943d73 100644 --- a/arch/ia64/sn/kernel/msi_sn.c +++ b/arch/ia64/sn/kernel/msi_sn.c | |||
@@ -205,7 +205,7 @@ static void sn_set_msi_irq_affinity(unsigned int irq, | |||
205 | msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff); | 205 | msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff); |
206 | 206 | ||
207 | write_msi_msg(irq, &msg); | 207 | write_msi_msg(irq, &msg); |
208 | irq_desc[irq].affinity = *cpu_mask; | 208 | cpumask_copy(irq_desc[irq].affinity, cpu_mask); |
209 | } | 209 | } |
210 | #endif /* CONFIG_SMP */ | 210 | #endif /* CONFIG_SMP */ |
211 | 211 | ||
diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h index abc62aa744ac..3214ade02d10 100644 --- a/arch/mips/include/asm/irq.h +++ b/arch/mips/include/asm/irq.h | |||
@@ -66,7 +66,7 @@ extern void smtc_forward_irq(unsigned int irq); | |||
66 | */ | 66 | */ |
67 | #define IRQ_AFFINITY_HOOK(irq) \ | 67 | #define IRQ_AFFINITY_HOOK(irq) \ |
68 | do { \ | 68 | do { \ |
69 | if (!cpu_isset(smp_processor_id(), irq_desc[irq].affinity)) { \ | 69 | if (!cpumask_test_cpu(smp_processor_id(), irq_desc[irq].affinity)) {\ |
70 | smtc_forward_irq(irq); \ | 70 | smtc_forward_irq(irq); \ |
71 | irq_exit(); \ | 71 | irq_exit(); \ |
72 | return; \ | 72 | return; \ |
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c index 494a49a317e9..87deb8f6c458 100644 --- a/arch/mips/kernel/irq-gic.c +++ b/arch/mips/kernel/irq-gic.c | |||
@@ -187,7 +187,7 @@ static void gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
187 | set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask); | 187 | set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask); |
188 | 188 | ||
189 | } | 189 | } |
190 | irq_desc[irq].affinity = *cpumask; | 190 | cpumask_copy(irq_desc[irq].affinity, cpumask); |
191 | spin_unlock_irqrestore(&gic_lock, flags); | 191 | spin_unlock_irqrestore(&gic_lock, flags); |
192 | 192 | ||
193 | } | 193 | } |
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index b6cca01ff82b..5f5af7d4c890 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -686,7 +686,7 @@ void smtc_forward_irq(unsigned int irq) | |||
686 | * and efficiency, we just pick the easiest one to find. | 686 | * and efficiency, we just pick the easiest one to find. |
687 | */ | 687 | */ |
688 | 688 | ||
689 | target = first_cpu(irq_desc[irq].affinity); | 689 | target = cpumask_first(irq_desc[irq].affinity); |
690 | 690 | ||
691 | /* | 691 | /* |
692 | * We depend on the platform code to have correctly processed | 692 | * We depend on the platform code to have correctly processed |
@@ -921,11 +921,13 @@ void ipi_decode(struct smtc_ipi *pipi) | |||
921 | struct clock_event_device *cd; | 921 | struct clock_event_device *cd; |
922 | void *arg_copy = pipi->arg; | 922 | void *arg_copy = pipi->arg; |
923 | int type_copy = pipi->type; | 923 | int type_copy = pipi->type; |
924 | int irq = MIPS_CPU_IRQ_BASE + 1; | ||
925 | |||
924 | smtc_ipi_nq(&freeIPIq, pipi); | 926 | smtc_ipi_nq(&freeIPIq, pipi); |
925 | switch (type_copy) { | 927 | switch (type_copy) { |
926 | case SMTC_CLOCK_TICK: | 928 | case SMTC_CLOCK_TICK: |
927 | irq_enter(); | 929 | irq_enter(); |
928 | kstat_this_cpu.irqs[MIPS_CPU_IRQ_BASE + 1]++; | 930 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
929 | cd = &per_cpu(mips_clockevent_device, cpu); | 931 | cd = &per_cpu(mips_clockevent_device, cpu); |
930 | cd->event_handler(cd); | 932 | cd->event_handler(cd); |
931 | irq_exit(); | 933 | irq_exit(); |
diff --git a/arch/mips/mti-malta/malta-smtc.c b/arch/mips/mti-malta/malta-smtc.c index aabd7274507b..5ba31888fefb 100644 --- a/arch/mips/mti-malta/malta-smtc.c +++ b/arch/mips/mti-malta/malta-smtc.c | |||
@@ -116,7 +116,7 @@ struct plat_smp_ops msmtc_smp_ops = { | |||
116 | 116 | ||
117 | void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | 117 | void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) |
118 | { | 118 | { |
119 | cpumask_t tmask = *affinity; | 119 | cpumask_t tmask; |
120 | int cpu = 0; | 120 | int cpu = 0; |
121 | void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff); | 121 | void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff); |
122 | 122 | ||
@@ -139,11 +139,12 @@ void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | |||
139 | * be made to forward to an offline "CPU". | 139 | * be made to forward to an offline "CPU". |
140 | */ | 140 | */ |
141 | 141 | ||
142 | cpumask_copy(&tmask, affinity); | ||
142 | for_each_cpu(cpu, affinity) { | 143 | for_each_cpu(cpu, affinity) { |
143 | if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu)) | 144 | if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu)) |
144 | cpu_clear(cpu, tmask); | 145 | cpu_clear(cpu, tmask); |
145 | } | 146 | } |
146 | irq_desc[irq].affinity = tmask; | 147 | cpumask_copy(irq_desc[irq].affinity, &tmask); |
147 | 148 | ||
148 | if (cpus_empty(tmask)) | 149 | if (cpus_empty(tmask)) |
149 | /* | 150 | /* |
diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index f8b18af141a1..0ecd5fe9486e 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c | |||
@@ -155,7 +155,7 @@ static void indy_buserror_irq(void) | |||
155 | int irq = SGI_BUSERR_IRQ; | 155 | int irq = SGI_BUSERR_IRQ; |
156 | 156 | ||
157 | irq_enter(); | 157 | irq_enter(); |
158 | kstat_this_cpu.irqs[irq]++; | 158 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
159 | ip22_be_interrupt(irq); | 159 | ip22_be_interrupt(irq); |
160 | irq_exit(); | 160 | irq_exit(); |
161 | } | 161 | } |
diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c index 3dcb27ec0c53..c8f7d2328b24 100644 --- a/arch/mips/sgi-ip22/ip22-time.c +++ b/arch/mips/sgi-ip22/ip22-time.c | |||
@@ -122,7 +122,7 @@ void indy_8254timer_irq(void) | |||
122 | char c; | 122 | char c; |
123 | 123 | ||
124 | irq_enter(); | 124 | irq_enter(); |
125 | kstat_this_cpu.irqs[irq]++; | 125 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
126 | printk(KERN_ALERT "Oops, got 8254 interrupt.\n"); | 126 | printk(KERN_ALERT "Oops, got 8254 interrupt.\n"); |
127 | ArcRead(0, &c, 1, &cnt); | 127 | ArcRead(0, &c, 1, &cnt); |
128 | ArcEnterInteractiveMode(); | 128 | ArcEnterInteractiveMode(); |
diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c index dddfda8e8294..314691648c97 100644 --- a/arch/mips/sibyte/bcm1480/smp.c +++ b/arch/mips/sibyte/bcm1480/smp.c | |||
@@ -178,9 +178,10 @@ struct plat_smp_ops bcm1480_smp_ops = { | |||
178 | void bcm1480_mailbox_interrupt(void) | 178 | void bcm1480_mailbox_interrupt(void) |
179 | { | 179 | { |
180 | int cpu = smp_processor_id(); | 180 | int cpu = smp_processor_id(); |
181 | int irq = K_BCM1480_INT_MBOX_0_0; | ||
181 | unsigned int action; | 182 | unsigned int action; |
182 | 183 | ||
183 | kstat_this_cpu.irqs[K_BCM1480_INT_MBOX_0_0]++; | 184 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
184 | /* Load the mailbox register to figure out what we're supposed to do */ | 185 | /* Load the mailbox register to figure out what we're supposed to do */ |
185 | action = (__raw_readq(mailbox_0_regs[cpu]) >> 48) & 0xffff; | 186 | action = (__raw_readq(mailbox_0_regs[cpu]) >> 48) & 0xffff; |
186 | 187 | ||
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c index 5950a288a7da..cad14003b84f 100644 --- a/arch/mips/sibyte/sb1250/smp.c +++ b/arch/mips/sibyte/sb1250/smp.c | |||
@@ -166,9 +166,10 @@ struct plat_smp_ops sb_smp_ops = { | |||
166 | void sb1250_mailbox_interrupt(void) | 166 | void sb1250_mailbox_interrupt(void) |
167 | { | 167 | { |
168 | int cpu = smp_processor_id(); | 168 | int cpu = smp_processor_id(); |
169 | int irq = K_INT_MBOX_0; | ||
169 | unsigned int action; | 170 | unsigned int action; |
170 | 171 | ||
171 | kstat_this_cpu.irqs[K_INT_MBOX_0]++; | 172 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
172 | /* Load the mailbox register to figure out what we're supposed to do */ | 173 | /* Load the mailbox register to figure out what we're supposed to do */ |
173 | action = (____raw_readq(mailbox_regs[cpu]) >> 48) & 0xffff; | 174 | action = (____raw_readq(mailbox_regs[cpu]) >> 48) & 0xffff; |
174 | 175 | ||
diff --git a/arch/mn10300/kernel/mn10300-watchdog.c b/arch/mn10300/kernel/mn10300-watchdog.c index 10811e981d20..2e370d88a87a 100644 --- a/arch/mn10300/kernel/mn10300-watchdog.c +++ b/arch/mn10300/kernel/mn10300-watchdog.c | |||
@@ -130,6 +130,7 @@ void watchdog_interrupt(struct pt_regs *regs, enum exception_code excep) | |||
130 | * the stack NMI-atomically, it's safe to use smp_processor_id(). | 130 | * the stack NMI-atomically, it's safe to use smp_processor_id(). |
131 | */ | 131 | */ |
132 | int sum, cpu = smp_processor_id(); | 132 | int sum, cpu = smp_processor_id(); |
133 | int irq = NMIIRQ; | ||
133 | u8 wdt, tmp; | 134 | u8 wdt, tmp; |
134 | 135 | ||
135 | wdt = WDCTR & ~WDCTR_WDCNE; | 136 | wdt = WDCTR & ~WDCTR_WDCNE; |
@@ -138,7 +139,7 @@ void watchdog_interrupt(struct pt_regs *regs, enum exception_code excep) | |||
138 | NMICR = NMICR_WDIF; | 139 | NMICR = NMICR_WDIF; |
139 | 140 | ||
140 | nmi_count(cpu)++; | 141 | nmi_count(cpu)++; |
141 | kstat_this_cpu.irqs[NMIIRQ]++; | 142 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
142 | sum = irq_stat[cpu].__irq_count; | 143 | sum = irq_stat[cpu].__irq_count; |
143 | 144 | ||
144 | if (last_irq_sums[cpu] == sum) { | 145 | if (last_irq_sums[cpu] == sum) { |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index ac2c822928c7..49482806863f 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -120,7 +120,7 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest) | |||
120 | if (CHECK_IRQ_PER_CPU(irq)) { | 120 | if (CHECK_IRQ_PER_CPU(irq)) { |
121 | /* Bad linux design decision. The mask has already | 121 | /* Bad linux design decision. The mask has already |
122 | * been set; we must reset it */ | 122 | * been set; we must reset it */ |
123 | irq_desc[irq].affinity = CPU_MASK_ALL; | 123 | cpumask_setall(irq_desc[irq].affinity); |
124 | return -EINVAL; | 124 | return -EINVAL; |
125 | } | 125 | } |
126 | 126 | ||
@@ -136,7 +136,7 @@ static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | |||
136 | if (cpu_check_affinity(irq, dest)) | 136 | if (cpu_check_affinity(irq, dest)) |
137 | return; | 137 | return; |
138 | 138 | ||
139 | irq_desc[irq].affinity = *dest; | 139 | cpumask_copy(irq_desc[irq].affinity, dest); |
140 | } | 140 | } |
141 | #endif | 141 | #endif |
142 | 142 | ||
@@ -295,7 +295,7 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
295 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | 295 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) |
296 | { | 296 | { |
297 | #ifdef CONFIG_SMP | 297 | #ifdef CONFIG_SMP |
298 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 298 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
299 | #endif | 299 | #endif |
300 | 300 | ||
301 | return per_cpu(cpu_data, cpu).txn_addr; | 301 | return per_cpu(cpu_data, cpu).txn_addr; |
@@ -352,7 +352,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
352 | irq = eirr_to_irq(eirr_val); | 352 | irq = eirr_to_irq(eirr_val); |
353 | 353 | ||
354 | #ifdef CONFIG_SMP | 354 | #ifdef CONFIG_SMP |
355 | dest = irq_desc[irq].affinity; | 355 | cpumask_copy(&dest, irq_desc[irq].affinity); |
356 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && | 356 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && |
357 | !cpu_isset(smp_processor_id(), dest)) { | 357 | !cpu_isset(smp_processor_id(), dest)) { |
358 | int cpu = first_cpu(dest); | 358 | int cpu = first_cpu(dest); |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 23b8b5e36f98..ad1e5ac721d8 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -231,7 +231,7 @@ void fixup_irqs(cpumask_t map) | |||
231 | if (irq_desc[irq].status & IRQ_PER_CPU) | 231 | if (irq_desc[irq].status & IRQ_PER_CPU) |
232 | continue; | 232 | continue; |
233 | 233 | ||
234 | cpus_and(mask, irq_desc[irq].affinity, map); | 234 | cpumask_and(&mask, irq_desc[irq].affinity, &map); |
235 | if (any_online_cpu(mask) == NR_CPUS) { | 235 | if (any_online_cpu(mask) == NR_CPUS) { |
236 | printk("Breaking affinity for irq %i\n", irq); | 236 | printk("Breaking affinity for irq %i\n", irq); |
237 | mask = map; | 237 | mask = map; |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 84e058f1e1cc..80b513449f4c 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -153,9 +153,10 @@ static int get_irq_server(unsigned int virq, unsigned int strict_check) | |||
153 | { | 153 | { |
154 | int server; | 154 | int server; |
155 | /* For the moment only implement delivery to all cpus or one cpu */ | 155 | /* For the moment only implement delivery to all cpus or one cpu */ |
156 | cpumask_t cpumask = irq_desc[virq].affinity; | 156 | cpumask_t cpumask; |
157 | cpumask_t tmp = CPU_MASK_NONE; | 157 | cpumask_t tmp = CPU_MASK_NONE; |
158 | 158 | ||
159 | cpumask_copy(&cpumask, irq_desc[virq].affinity); | ||
159 | if (!distribute_irqs) | 160 | if (!distribute_irqs) |
160 | return default_server; | 161 | return default_server; |
161 | 162 | ||
@@ -869,7 +870,7 @@ void xics_migrate_irqs_away(void) | |||
869 | virq, cpu); | 870 | virq, cpu); |
870 | 871 | ||
871 | /* Reset affinity to all cpus */ | 872 | /* Reset affinity to all cpus */ |
872 | irq_desc[virq].affinity = CPU_MASK_ALL; | 873 | cpumask_setall(irq_desc[virq].affinity); |
873 | desc->chip->set_affinity(virq, cpu_all_mask); | 874 | desc->chip->set_affinity(virq, cpu_all_mask); |
874 | unlock: | 875 | unlock: |
875 | spin_unlock_irqrestore(&desc->lock, flags); | 876 | spin_unlock_irqrestore(&desc->lock, flags); |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 3e0d89dcdba2..0afd21f9a222 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -566,9 +566,10 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic) | |||
566 | #ifdef CONFIG_SMP | 566 | #ifdef CONFIG_SMP |
567 | static int irq_choose_cpu(unsigned int virt_irq) | 567 | static int irq_choose_cpu(unsigned int virt_irq) |
568 | { | 568 | { |
569 | cpumask_t mask = irq_desc[virt_irq].affinity; | 569 | cpumask_t mask; |
570 | int cpuid; | 570 | int cpuid; |
571 | 571 | ||
572 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); | ||
572 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 573 | if (cpus_equal(mask, CPU_MASK_ALL)) { |
573 | static int irq_rover; | 574 | static int irq_rover; |
574 | static DEFINE_SPINLOCK(irq_rover_lock); | 575 | static DEFINE_SPINLOCK(irq_rover_lock); |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index cab8e0286871..4ac5c651e00d 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
@@ -247,9 +247,10 @@ struct irq_handler_data { | |||
247 | #ifdef CONFIG_SMP | 247 | #ifdef CONFIG_SMP |
248 | static int irq_choose_cpu(unsigned int virt_irq) | 248 | static int irq_choose_cpu(unsigned int virt_irq) |
249 | { | 249 | { |
250 | cpumask_t mask = irq_desc[virt_irq].affinity; | 250 | cpumask_t mask; |
251 | int cpuid; | 251 | int cpuid; |
252 | 252 | ||
253 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); | ||
253 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 254 | if (cpus_equal(mask, CPU_MASK_ALL)) { |
254 | static int irq_rover; | 255 | static int irq_rover; |
255 | static DEFINE_SPINLOCK(irq_rover_lock); | 256 | static DEFINE_SPINLOCK(irq_rover_lock); |
@@ -854,7 +855,7 @@ void fixup_irqs(void) | |||
854 | !(irq_desc[irq].status & IRQ_PER_CPU)) { | 855 | !(irq_desc[irq].status & IRQ_PER_CPU)) { |
855 | if (irq_desc[irq].chip->set_affinity) | 856 | if (irq_desc[irq].chip->set_affinity) |
856 | irq_desc[irq].chip->set_affinity(irq, | 857 | irq_desc[irq].chip->set_affinity(irq, |
857 | &irq_desc[irq].affinity); | 858 | irq_desc[irq].affinity); |
858 | } | 859 | } |
859 | spin_unlock_irqrestore(&irq_desc[irq].lock, flags); | 860 | spin_unlock_irqrestore(&irq_desc[irq].lock, flags); |
860 | } | 861 | } |
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 2db3c2229b95..db310aa00183 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c | |||
@@ -729,7 +729,7 @@ void timer_interrupt(int irq, struct pt_regs *regs) | |||
729 | 729 | ||
730 | irq_enter(); | 730 | irq_enter(); |
731 | 731 | ||
732 | kstat_this_cpu.irqs[0]++; | 732 | kstat_incr_irqs_this_cpu(0, irq_to_desc(0)); |
733 | 733 | ||
734 | if (unlikely(!evt->event_handler)) { | 734 | if (unlikely(!evt->event_handler)) { |
735 | printk(KERN_WARNING | 735 | printk(KERN_WARNING |
diff --git a/arch/x86/include/asm/apicnum.h b/arch/x86/include/asm/apicnum.h new file mode 100644 index 000000000000..82f613c607ce --- /dev/null +++ b/arch/x86/include/asm/apicnum.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef _ASM_X86_APICNUM_H | ||
2 | #define _ASM_X86_APICNUM_H | ||
3 | |||
4 | /* define MAX_IO_APICS */ | ||
5 | #ifdef CONFIG_X86_32 | ||
6 | # define MAX_IO_APICS 64 | ||
7 | #else | ||
8 | # define MAX_IO_APICS 128 | ||
9 | # define MAX_LOCAL_APIC 32768 | ||
10 | #endif | ||
11 | |||
12 | #endif /* _ASM_X86_APICNUM_H */ | ||
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index e02a359d2aa5..02b47a603fc8 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h | |||
@@ -3,6 +3,9 @@ | |||
3 | 3 | ||
4 | /* | 4 | /* |
5 | * Copyright 1992, Linus Torvalds. | 5 | * Copyright 1992, Linus Torvalds. |
6 | * | ||
7 | * Note: inlines with more than a single statement should be marked | ||
8 | * __always_inline to avoid problems with older gcc's inlining heuristics. | ||
6 | */ | 9 | */ |
7 | 10 | ||
8 | #ifndef _LINUX_BITOPS_H | 11 | #ifndef _LINUX_BITOPS_H |
@@ -53,7 +56,8 @@ | |||
53 | * Note that @nr may be almost arbitrarily large; this function is not | 56 | * Note that @nr may be almost arbitrarily large; this function is not |
54 | * restricted to acting on a single-word quantity. | 57 | * restricted to acting on a single-word quantity. |
55 | */ | 58 | */ |
56 | static inline void set_bit(unsigned int nr, volatile unsigned long *addr) | 59 | static __always_inline void |
60 | set_bit(unsigned int nr, volatile unsigned long *addr) | ||
57 | { | 61 | { |
58 | if (IS_IMMEDIATE(nr)) { | 62 | if (IS_IMMEDIATE(nr)) { |
59 | asm volatile(LOCK_PREFIX "orb %1,%0" | 63 | asm volatile(LOCK_PREFIX "orb %1,%0" |
@@ -90,7 +94,8 @@ static inline void __set_bit(int nr, volatile unsigned long *addr) | |||
90 | * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() | 94 | * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() |
91 | * in order to ensure changes are visible on other processors. | 95 | * in order to ensure changes are visible on other processors. |
92 | */ | 96 | */ |
93 | static inline void clear_bit(int nr, volatile unsigned long *addr) | 97 | static __always_inline void |
98 | clear_bit(int nr, volatile unsigned long *addr) | ||
94 | { | 99 | { |
95 | if (IS_IMMEDIATE(nr)) { | 100 | if (IS_IMMEDIATE(nr)) { |
96 | asm volatile(LOCK_PREFIX "andb %1,%0" | 101 | asm volatile(LOCK_PREFIX "andb %1,%0" |
@@ -204,7 +209,8 @@ static inline int test_and_set_bit(int nr, volatile unsigned long *addr) | |||
204 | * | 209 | * |
205 | * This is the same as test_and_set_bit on x86. | 210 | * This is the same as test_and_set_bit on x86. |
206 | */ | 211 | */ |
207 | static inline int test_and_set_bit_lock(int nr, volatile unsigned long *addr) | 212 | static __always_inline int |
213 | test_and_set_bit_lock(int nr, volatile unsigned long *addr) | ||
208 | { | 214 | { |
209 | return test_and_set_bit(nr, addr); | 215 | return test_and_set_bit(nr, addr); |
210 | } | 216 | } |
@@ -300,7 +306,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) | |||
300 | return oldbit; | 306 | return oldbit; |
301 | } | 307 | } |
302 | 308 | ||
303 | static inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) | 309 | static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) |
304 | { | 310 | { |
305 | return ((1UL << (nr % BITS_PER_LONG)) & | 311 | return ((1UL << (nr % BITS_PER_LONG)) & |
306 | (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; | 312 | (((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; |
diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index bae482df6039..f03b23e32864 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h | |||
@@ -7,6 +7,20 @@ | |||
7 | #include <linux/nodemask.h> | 7 | #include <linux/nodemask.h> |
8 | #include <linux/percpu.h> | 8 | #include <linux/percpu.h> |
9 | 9 | ||
10 | #ifdef CONFIG_SMP | ||
11 | |||
12 | extern void prefill_possible_map(void); | ||
13 | |||
14 | #else /* CONFIG_SMP */ | ||
15 | |||
16 | static inline void prefill_possible_map(void) {} | ||
17 | |||
18 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
19 | #define safe_smp_processor_id() 0 | ||
20 | #define stack_smp_processor_id() 0 | ||
21 | |||
22 | #endif /* CONFIG_SMP */ | ||
23 | |||
10 | struct x86_cpu { | 24 | struct x86_cpu { |
11 | struct cpu cpu; | 25 | struct cpu cpu; |
12 | }; | 26 | }; |
@@ -17,4 +31,11 @@ extern void arch_unregister_cpu(int); | |||
17 | #endif | 31 | #endif |
18 | 32 | ||
19 | DECLARE_PER_CPU(int, cpu_state); | 33 | DECLARE_PER_CPU(int, cpu_state); |
34 | |||
35 | #ifdef CONFIG_X86_HAS_BOOT_CPU_ID | ||
36 | extern unsigned char boot_cpu_id; | ||
37 | #else | ||
38 | #define boot_cpu_id 0 | ||
39 | #endif | ||
40 | |||
20 | #endif /* _ASM_X86_CPU_H */ | 41 | #endif /* _ASM_X86_CPU_H */ |
diff --git a/arch/x86/include/asm/cpumask.h b/arch/x86/include/asm/cpumask.h new file mode 100644 index 000000000000..26c6dad90479 --- /dev/null +++ b/arch/x86/include/asm/cpumask.h | |||
@@ -0,0 +1,28 @@ | |||
1 | #ifndef _ASM_X86_CPUMASK_H | ||
2 | #define _ASM_X86_CPUMASK_H | ||
3 | #ifndef __ASSEMBLY__ | ||
4 | #include <linux/cpumask.h> | ||
5 | |||
6 | #ifdef CONFIG_X86_64 | ||
7 | |||
8 | extern cpumask_var_t cpu_callin_mask; | ||
9 | extern cpumask_var_t cpu_callout_mask; | ||
10 | extern cpumask_var_t cpu_initialized_mask; | ||
11 | extern cpumask_var_t cpu_sibling_setup_mask; | ||
12 | |||
13 | #else /* CONFIG_X86_32 */ | ||
14 | |||
15 | extern cpumask_t cpu_callin_map; | ||
16 | extern cpumask_t cpu_callout_map; | ||
17 | extern cpumask_t cpu_initialized; | ||
18 | extern cpumask_t cpu_sibling_setup_map; | ||
19 | |||
20 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
21 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
22 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
23 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
24 | |||
25 | #endif /* CONFIG_X86_32 */ | ||
26 | |||
27 | #endif /* __ASSEMBLY__ */ | ||
28 | #endif /* _ASM_X86_CPUMASK_H */ | ||
diff --git a/arch/x86/include/asm/hardirq_32.h b/arch/x86/include/asm/hardirq_32.h index cf7954d1405f..d4b5d731073f 100644 --- a/arch/x86/include/asm/hardirq_32.h +++ b/arch/x86/include/asm/hardirq_32.h | |||
@@ -19,6 +19,9 @@ typedef struct { | |||
19 | 19 | ||
20 | DECLARE_PER_CPU(irq_cpustat_t, irq_stat); | 20 | DECLARE_PER_CPU(irq_cpustat_t, irq_stat); |
21 | 21 | ||
22 | /* We can have at most NR_VECTORS irqs routed to a cpu at a time */ | ||
23 | #define MAX_HARDIRQS_PER_CPU NR_VECTORS | ||
24 | |||
22 | #define __ARCH_IRQ_STAT | 25 | #define __ARCH_IRQ_STAT |
23 | #define __IRQ_STAT(cpu, member) (per_cpu(irq_stat, cpu).member) | 26 | #define __IRQ_STAT(cpu, member) (per_cpu(irq_stat, cpu).member) |
24 | 27 | ||
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 7a1f44ac1f17..08ec793aa043 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
@@ -114,38 +114,16 @@ struct IR_IO_APIC_route_entry { | |||
114 | extern int nr_ioapics; | 114 | extern int nr_ioapics; |
115 | extern int nr_ioapic_registers[MAX_IO_APICS]; | 115 | extern int nr_ioapic_registers[MAX_IO_APICS]; |
116 | 116 | ||
117 | /* | ||
118 | * MP-BIOS irq configuration table structures: | ||
119 | */ | ||
120 | |||
121 | #define MP_MAX_IOAPIC_PIN 127 | 117 | #define MP_MAX_IOAPIC_PIN 127 |
122 | 118 | ||
123 | struct mp_config_ioapic { | ||
124 | unsigned long mp_apicaddr; | ||
125 | unsigned int mp_apicid; | ||
126 | unsigned char mp_type; | ||
127 | unsigned char mp_apicver; | ||
128 | unsigned char mp_flags; | ||
129 | }; | ||
130 | |||
131 | struct mp_config_intsrc { | ||
132 | unsigned int mp_dstapic; | ||
133 | unsigned char mp_type; | ||
134 | unsigned char mp_irqtype; | ||
135 | unsigned short mp_irqflag; | ||
136 | unsigned char mp_srcbus; | ||
137 | unsigned char mp_srcbusirq; | ||
138 | unsigned char mp_dstirq; | ||
139 | }; | ||
140 | |||
141 | /* I/O APIC entries */ | 119 | /* I/O APIC entries */ |
142 | extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; | 120 | extern struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; |
143 | 121 | ||
144 | /* # of MP IRQ source entries */ | 122 | /* # of MP IRQ source entries */ |
145 | extern int mp_irq_entries; | 123 | extern int mp_irq_entries; |
146 | 124 | ||
147 | /* MP IRQ source entries */ | 125 | /* MP IRQ source entries */ |
148 | extern struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 126 | extern struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
149 | 127 | ||
150 | /* non-0 if default (table-less) MP configuration */ | 128 | /* non-0 if default (table-less) MP configuration */ |
151 | extern int mpc_default_type; | 129 | extern int mpc_default_type; |
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h index f7ff65032b9d..a16a2ab2b429 100644 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h | |||
@@ -105,6 +105,8 @@ | |||
105 | 105 | ||
106 | #if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER) | 106 | #if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER) |
107 | 107 | ||
108 | #include <asm/apicnum.h> /* need MAX_IO_APICS */ | ||
109 | |||
108 | #ifndef CONFIG_SPARSE_IRQ | 110 | #ifndef CONFIG_SPARSE_IRQ |
109 | # if NR_CPUS < MAX_IO_APICS | 111 | # if NR_CPUS < MAX_IO_APICS |
110 | # define NR_IRQS (NR_VECTORS + (32 * NR_CPUS)) | 112 | # define NR_IRQS (NR_VECTORS + (32 * NR_CPUS)) |
@@ -112,11 +114,12 @@ | |||
112 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | 114 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) |
113 | # endif | 115 | # endif |
114 | #else | 116 | #else |
115 | # if (8 * NR_CPUS) > (32 * MAX_IO_APICS) | 117 | |
116 | # define NR_IRQS (NR_VECTORS + (8 * NR_CPUS)) | 118 | # define NR_IRQS \ |
117 | # else | 119 | ((8 * NR_CPUS) > (32 * MAX_IO_APICS) ? \ |
118 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | 120 | (NR_VECTORS + (8 * NR_CPUS)) : \ |
119 | # endif | 121 | (NR_VECTORS + (32 * MAX_IO_APICS))) \ |
122 | |||
120 | #endif | 123 | #endif |
121 | 124 | ||
122 | #elif defined(CONFIG_X86_VOYAGER) | 125 | #elif defined(CONFIG_X86_VOYAGER) |
diff --git a/arch/x86/include/asm/mpspec_def.h b/arch/x86/include/asm/mpspec_def.h index 59568bc4767f..4a7f96d7c188 100644 --- a/arch/x86/include/asm/mpspec_def.h +++ b/arch/x86/include/asm/mpspec_def.h | |||
@@ -24,17 +24,18 @@ | |||
24 | # endif | 24 | # endif |
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | struct intel_mp_floating { | 27 | /* Intel MP Floating Pointer Structure */ |
28 | char mpf_signature[4]; /* "_MP_" */ | 28 | struct mpf_intel { |
29 | unsigned int mpf_physptr; /* Configuration table address */ | 29 | char signature[4]; /* "_MP_" */ |
30 | unsigned char mpf_length; /* Our length (paragraphs) */ | 30 | unsigned int physptr; /* Configuration table address */ |
31 | unsigned char mpf_specification;/* Specification version */ | 31 | unsigned char length; /* Our length (paragraphs) */ |
32 | unsigned char mpf_checksum; /* Checksum (makes sum 0) */ | 32 | unsigned char specification; /* Specification version */ |
33 | unsigned char mpf_feature1; /* Standard or configuration ? */ | 33 | unsigned char checksum; /* Checksum (makes sum 0) */ |
34 | unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */ | 34 | unsigned char feature1; /* Standard or configuration ? */ |
35 | unsigned char mpf_feature3; /* Unused (0) */ | 35 | unsigned char feature2; /* Bit7 set for IMCR|PIC */ |
36 | unsigned char mpf_feature4; /* Unused (0) */ | 36 | unsigned char feature3; /* Unused (0) */ |
37 | unsigned char mpf_feature5; /* Unused (0) */ | 37 | unsigned char feature4; /* Unused (0) */ |
38 | unsigned char feature5; /* Unused (0) */ | ||
38 | }; | 39 | }; |
39 | 40 | ||
40 | #define MPC_SIGNATURE "PCMP" | 41 | #define MPC_SIGNATURE "PCMP" |
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index ba3e2ff6aedc..c26c6bf4da00 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
@@ -244,7 +244,8 @@ struct pv_mmu_ops { | |||
244 | void (*flush_tlb_user)(void); | 244 | void (*flush_tlb_user)(void); |
245 | void (*flush_tlb_kernel)(void); | 245 | void (*flush_tlb_kernel)(void); |
246 | void (*flush_tlb_single)(unsigned long addr); | 246 | void (*flush_tlb_single)(unsigned long addr); |
247 | void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm, | 247 | void (*flush_tlb_others)(const struct cpumask *cpus, |
248 | struct mm_struct *mm, | ||
248 | unsigned long va); | 249 | unsigned long va); |
249 | 250 | ||
250 | /* Hooks for allocating and freeing a pagetable top-level */ | 251 | /* Hooks for allocating and freeing a pagetable top-level */ |
@@ -984,10 +985,11 @@ static inline void __flush_tlb_single(unsigned long addr) | |||
984 | PVOP_VCALL1(pv_mmu_ops.flush_tlb_single, addr); | 985 | PVOP_VCALL1(pv_mmu_ops.flush_tlb_single, addr); |
985 | } | 986 | } |
986 | 987 | ||
987 | static inline void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 988 | static inline void flush_tlb_others(const struct cpumask *cpumask, |
989 | struct mm_struct *mm, | ||
988 | unsigned long va) | 990 | unsigned long va) |
989 | { | 991 | { |
990 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va); | 992 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, cpumask, mm, va); |
991 | } | 993 | } |
992 | 994 | ||
993 | static inline int paravirt_pgd_alloc(struct mm_struct *mm) | 995 | static inline int paravirt_pgd_alloc(struct mm_struct *mm) |
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 19953df61c52..a8cea7b09434 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
@@ -17,30 +17,7 @@ | |||
17 | #endif | 17 | #endif |
18 | #include <asm/pda.h> | 18 | #include <asm/pda.h> |
19 | #include <asm/thread_info.h> | 19 | #include <asm/thread_info.h> |
20 | 20 | #include <asm/cpumask.h> | |
21 | #ifdef CONFIG_X86_64 | ||
22 | |||
23 | extern cpumask_var_t cpu_callin_mask; | ||
24 | extern cpumask_var_t cpu_callout_mask; | ||
25 | extern cpumask_var_t cpu_initialized_mask; | ||
26 | extern cpumask_var_t cpu_sibling_setup_mask; | ||
27 | |||
28 | #else /* CONFIG_X86_32 */ | ||
29 | |||
30 | extern cpumask_t cpu_callin_map; | ||
31 | extern cpumask_t cpu_callout_map; | ||
32 | extern cpumask_t cpu_initialized; | ||
33 | extern cpumask_t cpu_sibling_setup_map; | ||
34 | |||
35 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
36 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
37 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
38 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
39 | |||
40 | #endif /* CONFIG_X86_32 */ | ||
41 | |||
42 | extern void (*mtrr_hook)(void); | ||
43 | extern void zap_low_mappings(void); | ||
44 | 21 | ||
45 | extern int __cpuinit get_local_pda(int cpu); | 22 | extern int __cpuinit get_local_pda(int cpu); |
46 | 23 | ||
@@ -167,8 +144,6 @@ void play_dead_common(void); | |||
167 | void native_send_call_func_ipi(const struct cpumask *mask); | 144 | void native_send_call_func_ipi(const struct cpumask *mask); |
168 | void native_send_call_func_single_ipi(int cpu); | 145 | void native_send_call_func_single_ipi(int cpu); |
169 | 146 | ||
170 | extern void prefill_possible_map(void); | ||
171 | |||
172 | void smp_store_cpu_info(int id); | 147 | void smp_store_cpu_info(int id); |
173 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) | 148 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) |
174 | 149 | ||
@@ -177,10 +152,6 @@ static inline int num_booting_cpus(void) | |||
177 | { | 152 | { |
178 | return cpumask_weight(cpu_callout_mask); | 153 | return cpumask_weight(cpu_callout_mask); |
179 | } | 154 | } |
180 | #else | ||
181 | static inline void prefill_possible_map(void) | ||
182 | { | ||
183 | } | ||
184 | #endif /* CONFIG_SMP */ | 155 | #endif /* CONFIG_SMP */ |
185 | 156 | ||
186 | extern unsigned disabled_cpus __cpuinitdata; | 157 | extern unsigned disabled_cpus __cpuinitdata; |
@@ -205,10 +176,6 @@ extern int safe_smp_processor_id(void); | |||
205 | }) | 176 | }) |
206 | #define safe_smp_processor_id() smp_processor_id() | 177 | #define safe_smp_processor_id() smp_processor_id() |
207 | 178 | ||
208 | #else /* !CONFIG_X86_32_SMP && !CONFIG_X86_64_SMP */ | ||
209 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
210 | #define safe_smp_processor_id() 0 | ||
211 | #define stack_smp_processor_id() 0 | ||
212 | #endif | 179 | #endif |
213 | 180 | ||
214 | #ifdef CONFIG_X86_LOCAL_APIC | 181 | #ifdef CONFIG_X86_LOCAL_APIC |
@@ -251,11 +218,5 @@ static inline int hard_smp_processor_id(void) | |||
251 | 218 | ||
252 | #endif /* CONFIG_X86_LOCAL_APIC */ | 219 | #endif /* CONFIG_X86_LOCAL_APIC */ |
253 | 220 | ||
254 | #ifdef CONFIG_X86_HAS_BOOT_CPU_ID | ||
255 | extern unsigned char boot_cpu_id; | ||
256 | #else | ||
257 | #define boot_cpu_id 0 | ||
258 | #endif | ||
259 | |||
260 | #endif /* __ASSEMBLY__ */ | 221 | #endif /* __ASSEMBLY__ */ |
261 | #endif /* _ASM_X86_SMP_H */ | 222 | #endif /* _ASM_X86_SMP_H */ |
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 0e7bbb549116..17feaa9c7e76 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h | |||
@@ -113,7 +113,7 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
113 | __flush_tlb(); | 113 | __flush_tlb(); |
114 | } | 114 | } |
115 | 115 | ||
116 | static inline void native_flush_tlb_others(const cpumask_t *cpumask, | 116 | static inline void native_flush_tlb_others(const struct cpumask *cpumask, |
117 | struct mm_struct *mm, | 117 | struct mm_struct *mm, |
118 | unsigned long va) | 118 | unsigned long va) |
119 | { | 119 | { |
@@ -142,8 +142,8 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
142 | flush_tlb_mm(vma->vm_mm); | 142 | flush_tlb_mm(vma->vm_mm); |
143 | } | 143 | } |
144 | 144 | ||
145 | void native_flush_tlb_others(const cpumask_t *cpumask, struct mm_struct *mm, | 145 | void native_flush_tlb_others(const struct cpumask *cpumask, |
146 | unsigned long va); | 146 | struct mm_struct *mm, unsigned long va); |
147 | 147 | ||
148 | #define TLBSTATE_OK 1 | 148 | #define TLBSTATE_OK 1 |
149 | #define TLBSTATE_LAZY 2 | 149 | #define TLBSTATE_LAZY 2 |
@@ -166,7 +166,7 @@ static inline void reset_lazy_tlbstate(void) | |||
166 | #endif /* SMP */ | 166 | #endif /* SMP */ |
167 | 167 | ||
168 | #ifndef CONFIG_PARAVIRT | 168 | #ifndef CONFIG_PARAVIRT |
169 | #define flush_tlb_others(mask, mm, va) native_flush_tlb_others(&mask, mm, va) | 169 | #define flush_tlb_others(mask, mm, va) native_flush_tlb_others(mask, mm, va) |
170 | #endif | 170 | #endif |
171 | 171 | ||
172 | static inline void flush_tlb_kernel_range(unsigned long start, | 172 | static inline void flush_tlb_kernel_range(unsigned long start, |
@@ -175,4 +175,6 @@ static inline void flush_tlb_kernel_range(unsigned long start, | |||
175 | flush_tlb_all(); | 175 | flush_tlb_all(); |
176 | } | 176 | } |
177 | 177 | ||
178 | extern void zap_low_mappings(void); | ||
179 | |||
178 | #endif /* _ASM_X86_TLBFLUSH_H */ | 180 | #endif /* _ASM_X86_TLBFLUSH_H */ |
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index 50423c7b56b2..74e6393bfddb 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -325,7 +325,8 @@ static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) | |||
325 | #define cpubit_isset(cpu, bau_local_cpumask) \ | 325 | #define cpubit_isset(cpu, bau_local_cpumask) \ |
326 | test_bit((cpu), (bau_local_cpumask).bits) | 326 | test_bit((cpu), (bau_local_cpumask).bits) |
327 | 327 | ||
328 | extern int uv_flush_tlb_others(cpumask_t *, struct mm_struct *, unsigned long); | 328 | extern int uv_flush_tlb_others(struct cpumask *, |
329 | struct mm_struct *, unsigned long); | ||
329 | extern void uv_bau_message_intr1(void); | 330 | extern void uv_bau_message_intr1(void); |
330 | extern void uv_bau_timeout_intr1(void); | 331 | extern void uv_bau_timeout_intr1(void); |
331 | 332 | ||
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d37593c2f438..4cb5964f1499 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -912,8 +912,8 @@ static u8 __init uniq_ioapic_id(u8 id) | |||
912 | DECLARE_BITMAP(used, 256); | 912 | DECLARE_BITMAP(used, 256); |
913 | bitmap_zero(used, 256); | 913 | bitmap_zero(used, 256); |
914 | for (i = 0; i < nr_ioapics; i++) { | 914 | for (i = 0; i < nr_ioapics; i++) { |
915 | struct mp_config_ioapic *ia = &mp_ioapics[i]; | 915 | struct mpc_ioapic *ia = &mp_ioapics[i]; |
916 | __set_bit(ia->mp_apicid, used); | 916 | __set_bit(ia->apicid, used); |
917 | } | 917 | } |
918 | if (!test_bit(id, used)) | 918 | if (!test_bit(id, used)) |
919 | return id; | 919 | return id; |
@@ -945,47 +945,47 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
945 | 945 | ||
946 | idx = nr_ioapics; | 946 | idx = nr_ioapics; |
947 | 947 | ||
948 | mp_ioapics[idx].mp_type = MP_IOAPIC; | 948 | mp_ioapics[idx].type = MP_IOAPIC; |
949 | mp_ioapics[idx].mp_flags = MPC_APIC_USABLE; | 949 | mp_ioapics[idx].flags = MPC_APIC_USABLE; |
950 | mp_ioapics[idx].mp_apicaddr = address; | 950 | mp_ioapics[idx].apicaddr = address; |
951 | 951 | ||
952 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 952 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
953 | mp_ioapics[idx].mp_apicid = uniq_ioapic_id(id); | 953 | mp_ioapics[idx].apicid = uniq_ioapic_id(id); |
954 | #ifdef CONFIG_X86_32 | 954 | #ifdef CONFIG_X86_32 |
955 | mp_ioapics[idx].mp_apicver = io_apic_get_version(idx); | 955 | mp_ioapics[idx].apicver = io_apic_get_version(idx); |
956 | #else | 956 | #else |
957 | mp_ioapics[idx].mp_apicver = 0; | 957 | mp_ioapics[idx].apicver = 0; |
958 | #endif | 958 | #endif |
959 | /* | 959 | /* |
960 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups | 960 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups |
961 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). | 961 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). |
962 | */ | 962 | */ |
963 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mp_apicid; | 963 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].apicid; |
964 | mp_ioapic_routing[idx].gsi_base = gsi_base; | 964 | mp_ioapic_routing[idx].gsi_base = gsi_base; |
965 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 965 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
966 | io_apic_get_redir_entries(idx); | 966 | io_apic_get_redir_entries(idx); |
967 | 967 | ||
968 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " | 968 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
969 | "GSI %d-%d\n", idx, mp_ioapics[idx].mp_apicid, | 969 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
970 | mp_ioapics[idx].mp_apicver, mp_ioapics[idx].mp_apicaddr, | 970 | mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr, |
971 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); | 971 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); |
972 | 972 | ||
973 | nr_ioapics++; | 973 | nr_ioapics++; |
974 | } | 974 | } |
975 | 975 | ||
976 | static void assign_to_mp_irq(struct mp_config_intsrc *m, | 976 | static void assign_to_mp_irq(struct mpc_intsrc *m, |
977 | struct mp_config_intsrc *mp_irq) | 977 | struct mpc_intsrc *mp_irq) |
978 | { | 978 | { |
979 | memcpy(mp_irq, m, sizeof(struct mp_config_intsrc)); | 979 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); |
980 | } | 980 | } |
981 | 981 | ||
982 | static int mp_irq_cmp(struct mp_config_intsrc *mp_irq, | 982 | static int mp_irq_cmp(struct mpc_intsrc *mp_irq, |
983 | struct mp_config_intsrc *m) | 983 | struct mpc_intsrc *m) |
984 | { | 984 | { |
985 | return memcmp(mp_irq, m, sizeof(struct mp_config_intsrc)); | 985 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); |
986 | } | 986 | } |
987 | 987 | ||
988 | static void save_mp_irq(struct mp_config_intsrc *m) | 988 | static void save_mp_irq(struct mpc_intsrc *m) |
989 | { | 989 | { |
990 | int i; | 990 | int i; |
991 | 991 | ||
@@ -1003,7 +1003,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
1003 | { | 1003 | { |
1004 | int ioapic; | 1004 | int ioapic; |
1005 | int pin; | 1005 | int pin; |
1006 | struct mp_config_intsrc mp_irq; | 1006 | struct mpc_intsrc mp_irq; |
1007 | 1007 | ||
1008 | /* | 1008 | /* |
1009 | * Convert 'gsi' to 'ioapic.pin'. | 1009 | * Convert 'gsi' to 'ioapic.pin'. |
@@ -1021,13 +1021,13 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
1021 | if ((bus_irq == 0) && (trigger == 3)) | 1021 | if ((bus_irq == 0) && (trigger == 3)) |
1022 | trigger = 1; | 1022 | trigger = 1; |
1023 | 1023 | ||
1024 | mp_irq.mp_type = MP_INTSRC; | 1024 | mp_irq.type = MP_INTSRC; |
1025 | mp_irq.mp_irqtype = mp_INT; | 1025 | mp_irq.irqtype = mp_INT; |
1026 | mp_irq.mp_irqflag = (trigger << 2) | polarity; | 1026 | mp_irq.irqflag = (trigger << 2) | polarity; |
1027 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1027 | mp_irq.srcbus = MP_ISA_BUS; |
1028 | mp_irq.mp_srcbusirq = bus_irq; /* IRQ */ | 1028 | mp_irq.srcbusirq = bus_irq; /* IRQ */ |
1029 | mp_irq.mp_dstapic = mp_ioapics[ioapic].mp_apicid; /* APIC ID */ | 1029 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ |
1030 | mp_irq.mp_dstirq = pin; /* INTIN# */ | 1030 | mp_irq.dstirq = pin; /* INTIN# */ |
1031 | 1031 | ||
1032 | save_mp_irq(&mp_irq); | 1032 | save_mp_irq(&mp_irq); |
1033 | } | 1033 | } |
@@ -1037,7 +1037,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1037 | int i; | 1037 | int i; |
1038 | int ioapic; | 1038 | int ioapic; |
1039 | unsigned int dstapic; | 1039 | unsigned int dstapic; |
1040 | struct mp_config_intsrc mp_irq; | 1040 | struct mpc_intsrc mp_irq; |
1041 | 1041 | ||
1042 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) | 1042 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) |
1043 | /* | 1043 | /* |
@@ -1062,7 +1062,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1062 | ioapic = mp_find_ioapic(0); | 1062 | ioapic = mp_find_ioapic(0); |
1063 | if (ioapic < 0) | 1063 | if (ioapic < 0) |
1064 | return; | 1064 | return; |
1065 | dstapic = mp_ioapics[ioapic].mp_apicid; | 1065 | dstapic = mp_ioapics[ioapic].apicid; |
1066 | 1066 | ||
1067 | /* | 1067 | /* |
1068 | * Use the default configuration for the IRQs 0-15. Unless | 1068 | * Use the default configuration for the IRQs 0-15. Unless |
@@ -1072,16 +1072,14 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1072 | int idx; | 1072 | int idx; |
1073 | 1073 | ||
1074 | for (idx = 0; idx < mp_irq_entries; idx++) { | 1074 | for (idx = 0; idx < mp_irq_entries; idx++) { |
1075 | struct mp_config_intsrc *irq = mp_irqs + idx; | 1075 | struct mpc_intsrc *irq = mp_irqs + idx; |
1076 | 1076 | ||
1077 | /* Do we already have a mapping for this ISA IRQ? */ | 1077 | /* Do we already have a mapping for this ISA IRQ? */ |
1078 | if (irq->mp_srcbus == MP_ISA_BUS | 1078 | if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i) |
1079 | && irq->mp_srcbusirq == i) | ||
1080 | break; | 1079 | break; |
1081 | 1080 | ||
1082 | /* Do we already have a mapping for this IOAPIC pin */ | 1081 | /* Do we already have a mapping for this IOAPIC pin */ |
1083 | if (irq->mp_dstapic == dstapic && | 1082 | if (irq->dstapic == dstapic && irq->dstirq == i) |
1084 | irq->mp_dstirq == i) | ||
1085 | break; | 1083 | break; |
1086 | } | 1084 | } |
1087 | 1085 | ||
@@ -1090,13 +1088,13 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
1090 | continue; /* IRQ already used */ | 1088 | continue; /* IRQ already used */ |
1091 | } | 1089 | } |
1092 | 1090 | ||
1093 | mp_irq.mp_type = MP_INTSRC; | 1091 | mp_irq.type = MP_INTSRC; |
1094 | mp_irq.mp_irqflag = 0; /* Conforming */ | 1092 | mp_irq.irqflag = 0; /* Conforming */ |
1095 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1093 | mp_irq.srcbus = MP_ISA_BUS; |
1096 | mp_irq.mp_dstapic = dstapic; | 1094 | mp_irq.dstapic = dstapic; |
1097 | mp_irq.mp_irqtype = mp_INT; | 1095 | mp_irq.irqtype = mp_INT; |
1098 | mp_irq.mp_srcbusirq = i; /* Identity mapped */ | 1096 | mp_irq.srcbusirq = i; /* Identity mapped */ |
1099 | mp_irq.mp_dstirq = i; | 1097 | mp_irq.dstirq = i; |
1100 | 1098 | ||
1101 | save_mp_irq(&mp_irq); | 1099 | save_mp_irq(&mp_irq); |
1102 | } | 1100 | } |
@@ -1207,22 +1205,22 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | |||
1207 | u32 gsi, int triggering, int polarity) | 1205 | u32 gsi, int triggering, int polarity) |
1208 | { | 1206 | { |
1209 | #ifdef CONFIG_X86_MPPARSE | 1207 | #ifdef CONFIG_X86_MPPARSE |
1210 | struct mp_config_intsrc mp_irq; | 1208 | struct mpc_intsrc mp_irq; |
1211 | int ioapic; | 1209 | int ioapic; |
1212 | 1210 | ||
1213 | if (!acpi_ioapic) | 1211 | if (!acpi_ioapic) |
1214 | return 0; | 1212 | return 0; |
1215 | 1213 | ||
1216 | /* print the entry should happen on mptable identically */ | 1214 | /* print the entry should happen on mptable identically */ |
1217 | mp_irq.mp_type = MP_INTSRC; | 1215 | mp_irq.type = MP_INTSRC; |
1218 | mp_irq.mp_irqtype = mp_INT; | 1216 | mp_irq.irqtype = mp_INT; |
1219 | mp_irq.mp_irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | | 1217 | mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | |
1220 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); | 1218 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); |
1221 | mp_irq.mp_srcbus = number; | 1219 | mp_irq.srcbus = number; |
1222 | mp_irq.mp_srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); | 1220 | mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); |
1223 | ioapic = mp_find_ioapic(gsi); | 1221 | ioapic = mp_find_ioapic(gsi); |
1224 | mp_irq.mp_dstapic = mp_ioapic_routing[ioapic].apic_id; | 1222 | mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id; |
1225 | mp_irq.mp_dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1223 | mp_irq.dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base; |
1226 | 1224 | ||
1227 | save_mp_irq(&mp_irq); | 1225 | save_mp_irq(&mp_irq); |
1228 | #endif | 1226 | #endif |
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c index 0f830e4f5675..38d6aab2358d 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c | |||
@@ -895,6 +895,10 @@ void disable_local_APIC(void) | |||
895 | { | 895 | { |
896 | unsigned int value; | 896 | unsigned int value; |
897 | 897 | ||
898 | /* APIC hasn't been mapped yet */ | ||
899 | if (!apic_phys) | ||
900 | return; | ||
901 | |||
898 | clear_local_APIC(); | 902 | clear_local_APIC(); |
899 | 903 | ||
900 | /* | 904 | /* |
@@ -1126,6 +1130,11 @@ void __cpuinit setup_local_APIC(void) | |||
1126 | unsigned int value; | 1130 | unsigned int value; |
1127 | int i, j; | 1131 | int i, j; |
1128 | 1132 | ||
1133 | if (disable_apic) { | ||
1134 | disable_ioapic_setup(); | ||
1135 | return; | ||
1136 | } | ||
1137 | |||
1129 | #ifdef CONFIG_X86_32 | 1138 | #ifdef CONFIG_X86_32 |
1130 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ | 1139 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ |
1131 | if (lapic_is_integrated() && esr_disable) { | 1140 | if (lapic_is_integrated() && esr_disable) { |
@@ -1566,11 +1575,11 @@ int apic_version[MAX_APICS]; | |||
1566 | 1575 | ||
1567 | int __init APIC_init_uniprocessor(void) | 1576 | int __init APIC_init_uniprocessor(void) |
1568 | { | 1577 | { |
1569 | #ifdef CONFIG_X86_64 | ||
1570 | if (disable_apic) { | 1578 | if (disable_apic) { |
1571 | pr_info("Apic disabled\n"); | 1579 | pr_info("Apic disabled\n"); |
1572 | return -1; | 1580 | return -1; |
1573 | } | 1581 | } |
1582 | #ifdef CONFIG_X86_64 | ||
1574 | if (!cpu_has_apic) { | 1583 | if (!cpu_has_apic) { |
1575 | disable_apic = 1; | 1584 | disable_apic = 1; |
1576 | pr_info("Apic disabled by BIOS\n"); | 1585 | pr_info("Apic disabled by BIOS\n"); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 83492b1f93b1..f00258462444 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <asm/asm.h> | 21 | #include <asm/asm.h> |
22 | #include <asm/numa.h> | 22 | #include <asm/numa.h> |
23 | #include <asm/smp.h> | 23 | #include <asm/smp.h> |
24 | #include <asm/cpu.h> | ||
25 | #include <asm/cpumask.h> | ||
24 | #ifdef CONFIG_X86_LOCAL_APIC | 26 | #ifdef CONFIG_X86_LOCAL_APIC |
25 | #include <asm/mpspec.h> | 27 | #include <asm/mpspec.h> |
26 | #include <asm/apic.h> | 28 | #include <asm/apic.h> |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 6f11e029e8c5..8f3c95c7e61f 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -235,8 +235,6 @@ static u32 get_cur_val(const struct cpumask *mask) | |||
235 | return 0; | 235 | return 0; |
236 | } | 236 | } |
237 | 237 | ||
238 | cpumask_copy(cmd.mask, mask); | ||
239 | |||
240 | drv_read(&cmd); | 238 | drv_read(&cmd); |
241 | 239 | ||
242 | dprintk("get_cur_val = %u\n", cmd.val); | 240 | dprintk("get_cur_val = %u\n", cmd.val); |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 48533d77be78..58527a9fc404 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
@@ -132,7 +132,16 @@ struct _cpuid4_info { | |||
132 | union _cpuid4_leaf_ecx ecx; | 132 | union _cpuid4_leaf_ecx ecx; |
133 | unsigned long size; | 133 | unsigned long size; |
134 | unsigned long can_disable; | 134 | unsigned long can_disable; |
135 | cpumask_t shared_cpu_map; /* future?: only cpus/node is needed */ | 135 | DECLARE_BITMAP(shared_cpu_map, NR_CPUS); |
136 | }; | ||
137 | |||
138 | /* subset of above _cpuid4_info w/o shared_cpu_map */ | ||
139 | struct _cpuid4_info_regs { | ||
140 | union _cpuid4_leaf_eax eax; | ||
141 | union _cpuid4_leaf_ebx ebx; | ||
142 | union _cpuid4_leaf_ecx ecx; | ||
143 | unsigned long size; | ||
144 | unsigned long can_disable; | ||
136 | }; | 145 | }; |
137 | 146 | ||
138 | #ifdef CONFIG_PCI | 147 | #ifdef CONFIG_PCI |
@@ -263,7 +272,7 @@ amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax, | |||
263 | } | 272 | } |
264 | 273 | ||
265 | static void __cpuinit | 274 | static void __cpuinit |
266 | amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf) | 275 | amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf) |
267 | { | 276 | { |
268 | if (index < 3) | 277 | if (index < 3) |
269 | return; | 278 | return; |
@@ -271,7 +280,8 @@ amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf) | |||
271 | } | 280 | } |
272 | 281 | ||
273 | static int | 282 | static int |
274 | __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | 283 | __cpuinit cpuid4_cache_lookup_regs(int index, |
284 | struct _cpuid4_info_regs *this_leaf) | ||
275 | { | 285 | { |
276 | union _cpuid4_leaf_eax eax; | 286 | union _cpuid4_leaf_eax eax; |
277 | union _cpuid4_leaf_ebx ebx; | 287 | union _cpuid4_leaf_ebx ebx; |
@@ -299,6 +309,15 @@ __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | |||
299 | return 0; | 309 | return 0; |
300 | } | 310 | } |
301 | 311 | ||
312 | static int | ||
313 | __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | ||
314 | { | ||
315 | struct _cpuid4_info_regs *leaf_regs = | ||
316 | (struct _cpuid4_info_regs *)this_leaf; | ||
317 | |||
318 | return cpuid4_cache_lookup_regs(index, leaf_regs); | ||
319 | } | ||
320 | |||
302 | static int __cpuinit find_num_cache_leaves(void) | 321 | static int __cpuinit find_num_cache_leaves(void) |
303 | { | 322 | { |
304 | unsigned int eax, ebx, ecx, edx; | 323 | unsigned int eax, ebx, ecx, edx; |
@@ -338,11 +357,10 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
338 | * parameters cpuid leaf to find the cache details | 357 | * parameters cpuid leaf to find the cache details |
339 | */ | 358 | */ |
340 | for (i = 0; i < num_cache_leaves; i++) { | 359 | for (i = 0; i < num_cache_leaves; i++) { |
341 | struct _cpuid4_info this_leaf; | 360 | struct _cpuid4_info_regs this_leaf; |
342 | |||
343 | int retval; | 361 | int retval; |
344 | 362 | ||
345 | retval = cpuid4_cache_lookup(i, &this_leaf); | 363 | retval = cpuid4_cache_lookup_regs(i, &this_leaf); |
346 | if (retval >= 0) { | 364 | if (retval >= 0) { |
347 | switch(this_leaf.eax.split.level) { | 365 | switch(this_leaf.eax.split.level) { |
348 | case 1: | 366 | case 1: |
@@ -491,17 +509,20 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | |||
491 | num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing; | 509 | num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing; |
492 | 510 | ||
493 | if (num_threads_sharing == 1) | 511 | if (num_threads_sharing == 1) |
494 | cpu_set(cpu, this_leaf->shared_cpu_map); | 512 | cpumask_set_cpu(cpu, to_cpumask(this_leaf->shared_cpu_map)); |
495 | else { | 513 | else { |
496 | index_msb = get_count_order(num_threads_sharing); | 514 | index_msb = get_count_order(num_threads_sharing); |
497 | 515 | ||
498 | for_each_online_cpu(i) { | 516 | for_each_online_cpu(i) { |
499 | if (cpu_data(i).apicid >> index_msb == | 517 | if (cpu_data(i).apicid >> index_msb == |
500 | c->apicid >> index_msb) { | 518 | c->apicid >> index_msb) { |
501 | cpu_set(i, this_leaf->shared_cpu_map); | 519 | cpumask_set_cpu(i, |
520 | to_cpumask(this_leaf->shared_cpu_map)); | ||
502 | if (i != cpu && per_cpu(cpuid4_info, i)) { | 521 | if (i != cpu && per_cpu(cpuid4_info, i)) { |
503 | sibling_leaf = CPUID4_INFO_IDX(i, index); | 522 | sibling_leaf = |
504 | cpu_set(cpu, sibling_leaf->shared_cpu_map); | 523 | CPUID4_INFO_IDX(i, index); |
524 | cpumask_set_cpu(cpu, to_cpumask( | ||
525 | sibling_leaf->shared_cpu_map)); | ||
505 | } | 526 | } |
506 | } | 527 | } |
507 | } | 528 | } |
@@ -513,9 +534,10 @@ static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index) | |||
513 | int sibling; | 534 | int sibling; |
514 | 535 | ||
515 | this_leaf = CPUID4_INFO_IDX(cpu, index); | 536 | this_leaf = CPUID4_INFO_IDX(cpu, index); |
516 | for_each_cpu_mask_nr(sibling, this_leaf->shared_cpu_map) { | 537 | for_each_cpu(sibling, to_cpumask(this_leaf->shared_cpu_map)) { |
517 | sibling_leaf = CPUID4_INFO_IDX(sibling, index); | 538 | sibling_leaf = CPUID4_INFO_IDX(sibling, index); |
518 | cpu_clear(cpu, sibling_leaf->shared_cpu_map); | 539 | cpumask_clear_cpu(cpu, |
540 | to_cpumask(sibling_leaf->shared_cpu_map)); | ||
519 | } | 541 | } |
520 | } | 542 | } |
521 | #else | 543 | #else |
@@ -620,8 +642,9 @@ static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf, | |||
620 | int n = 0; | 642 | int n = 0; |
621 | 643 | ||
622 | if (len > 1) { | 644 | if (len > 1) { |
623 | cpumask_t *mask = &this_leaf->shared_cpu_map; | 645 | const struct cpumask *mask; |
624 | 646 | ||
647 | mask = to_cpumask(this_leaf->shared_cpu_map); | ||
625 | n = type? | 648 | n = type? |
626 | cpulist_scnprintf(buf, len-2, mask) : | 649 | cpulist_scnprintf(buf, len-2, mask) : |
627 | cpumask_scnprintf(buf, len-2, mask); | 650 | cpumask_scnprintf(buf, len-2, mask); |
@@ -684,7 +707,8 @@ static struct pci_dev *get_k8_northbridge(int node) | |||
684 | 707 | ||
685 | static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) | 708 | static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) |
686 | { | 709 | { |
687 | int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); | 710 | const struct cpumask *mask = to_cpumask(this_leaf->shared_cpu_map); |
711 | int node = cpu_to_node(cpumask_first(mask)); | ||
688 | struct pci_dev *dev = NULL; | 712 | struct pci_dev *dev = NULL; |
689 | ssize_t ret = 0; | 713 | ssize_t ret = 0; |
690 | int i; | 714 | int i; |
@@ -718,7 +742,8 @@ static ssize_t | |||
718 | store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf, | 742 | store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf, |
719 | size_t count) | 743 | size_t count) |
720 | { | 744 | { |
721 | int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); | 745 | const struct cpumask *mask = to_cpumask(this_leaf->shared_cpu_map); |
746 | int node = cpu_to_node(cpumask_first(mask)); | ||
722 | struct pci_dev *dev = NULL; | 747 | struct pci_dev *dev = NULL; |
723 | unsigned int ret, index, val; | 748 | unsigned int ret, index, val; |
724 | 749 | ||
@@ -863,7 +888,7 @@ err_out: | |||
863 | return -ENOMEM; | 888 | return -ENOMEM; |
864 | } | 889 | } |
865 | 890 | ||
866 | static cpumask_t cache_dev_map = CPU_MASK_NONE; | 891 | static DECLARE_BITMAP(cache_dev_map, NR_CPUS); |
867 | 892 | ||
868 | /* Add/Remove cache interface for CPU device */ | 893 | /* Add/Remove cache interface for CPU device */ |
869 | static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | 894 | static int __cpuinit cache_add_dev(struct sys_device * sys_dev) |
@@ -903,7 +928,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
903 | } | 928 | } |
904 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); | 929 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); |
905 | } | 930 | } |
906 | cpu_set(cpu, cache_dev_map); | 931 | cpumask_set_cpu(cpu, to_cpumask(cache_dev_map)); |
907 | 932 | ||
908 | kobject_uevent(per_cpu(cache_kobject, cpu), KOBJ_ADD); | 933 | kobject_uevent(per_cpu(cache_kobject, cpu), KOBJ_ADD); |
909 | return 0; | 934 | return 0; |
@@ -916,9 +941,9 @@ static void __cpuinit cache_remove_dev(struct sys_device * sys_dev) | |||
916 | 941 | ||
917 | if (per_cpu(cpuid4_info, cpu) == NULL) | 942 | if (per_cpu(cpuid4_info, cpu) == NULL) |
918 | return; | 943 | return; |
919 | if (!cpu_isset(cpu, cache_dev_map)) | 944 | if (!cpumask_test_cpu(cpu, to_cpumask(cache_dev_map))) |
920 | return; | 945 | return; |
921 | cpu_clear(cpu, cache_dev_map); | 946 | cpumask_clear_cpu(cpu, to_cpumask(cache_dev_map)); |
922 | 947 | ||
923 | for (i = 0; i < num_cache_leaves; i++) | 948 | for (i = 0; i < num_cache_leaves; i++) |
924 | kobject_put(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); | 949 | kobject_put(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 8ae8c4ff094d..4772e91e8246 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
@@ -67,7 +67,7 @@ static struct threshold_block threshold_defaults = { | |||
67 | struct threshold_bank { | 67 | struct threshold_bank { |
68 | struct kobject *kobj; | 68 | struct kobject *kobj; |
69 | struct threshold_block *blocks; | 69 | struct threshold_block *blocks; |
70 | cpumask_t cpus; | 70 | cpumask_var_t cpus; |
71 | }; | 71 | }; |
72 | static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]); | 72 | static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]); |
73 | 73 | ||
@@ -481,7 +481,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
481 | 481 | ||
482 | #ifdef CONFIG_SMP | 482 | #ifdef CONFIG_SMP |
483 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ | 483 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ |
484 | i = first_cpu(per_cpu(cpu_core_map, cpu)); | 484 | i = cpumask_first(&per_cpu(cpu_core_map, cpu)); |
485 | 485 | ||
486 | /* first core not up yet */ | 486 | /* first core not up yet */ |
487 | if (cpu_data(i).cpu_core_id) | 487 | if (cpu_data(i).cpu_core_id) |
@@ -501,7 +501,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
501 | if (err) | 501 | if (err) |
502 | goto out; | 502 | goto out; |
503 | 503 | ||
504 | b->cpus = per_cpu(cpu_core_map, cpu); | 504 | cpumask_copy(b->cpus, &per_cpu(cpu_core_map, cpu)); |
505 | per_cpu(threshold_banks, cpu)[bank] = b; | 505 | per_cpu(threshold_banks, cpu)[bank] = b; |
506 | goto out; | 506 | goto out; |
507 | } | 507 | } |
@@ -512,15 +512,20 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
512 | err = -ENOMEM; | 512 | err = -ENOMEM; |
513 | goto out; | 513 | goto out; |
514 | } | 514 | } |
515 | if (!alloc_cpumask_var(&b->cpus, GFP_KERNEL)) { | ||
516 | kfree(b); | ||
517 | err = -ENOMEM; | ||
518 | goto out; | ||
519 | } | ||
515 | 520 | ||
516 | b->kobj = kobject_create_and_add(name, &per_cpu(device_mce, cpu).kobj); | 521 | b->kobj = kobject_create_and_add(name, &per_cpu(device_mce, cpu).kobj); |
517 | if (!b->kobj) | 522 | if (!b->kobj) |
518 | goto out_free; | 523 | goto out_free; |
519 | 524 | ||
520 | #ifndef CONFIG_SMP | 525 | #ifndef CONFIG_SMP |
521 | b->cpus = CPU_MASK_ALL; | 526 | cpumask_setall(b->cpus); |
522 | #else | 527 | #else |
523 | b->cpus = per_cpu(cpu_core_map, cpu); | 528 | cpumask_copy(b->cpus, &per_cpu(cpu_core_map, cpu)); |
524 | #endif | 529 | #endif |
525 | 530 | ||
526 | per_cpu(threshold_banks, cpu)[bank] = b; | 531 | per_cpu(threshold_banks, cpu)[bank] = b; |
@@ -529,7 +534,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
529 | if (err) | 534 | if (err) |
530 | goto out_free; | 535 | goto out_free; |
531 | 536 | ||
532 | for_each_cpu_mask_nr(i, b->cpus) { | 537 | for_each_cpu(i, b->cpus) { |
533 | if (i == cpu) | 538 | if (i == cpu) |
534 | continue; | 539 | continue; |
535 | 540 | ||
@@ -545,6 +550,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
545 | 550 | ||
546 | out_free: | 551 | out_free: |
547 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 552 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
553 | free_cpumask_var(b->cpus); | ||
548 | kfree(b); | 554 | kfree(b); |
549 | out: | 555 | out: |
550 | return err; | 556 | return err; |
@@ -619,7 +625,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
619 | #endif | 625 | #endif |
620 | 626 | ||
621 | /* remove all sibling symlinks before unregistering */ | 627 | /* remove all sibling symlinks before unregistering */ |
622 | for_each_cpu_mask_nr(i, b->cpus) { | 628 | for_each_cpu(i, b->cpus) { |
623 | if (i == cpu) | 629 | if (i == cpu) |
624 | continue; | 630 | continue; |
625 | 631 | ||
@@ -632,6 +638,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
632 | free_out: | 638 | free_out: |
633 | kobject_del(b->kobj); | 639 | kobject_del(b->kobj); |
634 | kobject_put(b->kobj); | 640 | kobject_put(b->kobj); |
641 | free_cpumask_var(b->cpus); | ||
635 | kfree(b); | 642 | kfree(b); |
636 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 643 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
637 | } | 644 | } |
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index c689d19e35ab..11b93cabdf78 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <asm/apic.h> | 24 | #include <asm/apic.h> |
25 | #include <asm/hpet.h> | 25 | #include <asm/hpet.h> |
26 | #include <linux/kdebug.h> | 26 | #include <linux/kdebug.h> |
27 | #include <asm/smp.h> | 27 | #include <asm/cpu.h> |
28 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
29 | #include <asm/virtext.h> | 29 | #include <asm/virtext.h> |
30 | 30 | ||
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 1c4a1302536c..f79660390724 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <asm/idle.h> | 46 | #include <asm/idle.h> |
47 | #include <asm/io.h> | 47 | #include <asm/io.h> |
48 | #include <asm/smp.h> | 48 | #include <asm/smp.h> |
49 | #include <asm/cpu.h> | ||
49 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
50 | #include <asm/proto.h> | 51 | #include <asm/proto.h> |
51 | #include <asm/acpi.h> | 52 | #include <asm/acpi.h> |
@@ -82,11 +83,11 @@ static DEFINE_SPINLOCK(vector_lock); | |||
82 | int nr_ioapic_registers[MAX_IO_APICS]; | 83 | int nr_ioapic_registers[MAX_IO_APICS]; |
83 | 84 | ||
84 | /* I/O APIC entries */ | 85 | /* I/O APIC entries */ |
85 | struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; | 86 | struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; |
86 | int nr_ioapics; | 87 | int nr_ioapics; |
87 | 88 | ||
88 | /* MP IRQ source entries */ | 89 | /* MP IRQ source entries */ |
89 | struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 90 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
90 | 91 | ||
91 | /* # of MP IRQ source entries */ | 92 | /* # of MP IRQ source entries */ |
92 | int mp_irq_entries; | 93 | int mp_irq_entries; |
@@ -356,7 +357,7 @@ set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
356 | 357 | ||
357 | if (!cfg->move_in_progress) { | 358 | if (!cfg->move_in_progress) { |
358 | /* it means that domain is not changed */ | 359 | /* it means that domain is not changed */ |
359 | if (!cpumask_intersects(&desc->affinity, mask)) | 360 | if (!cpumask_intersects(desc->affinity, mask)) |
360 | cfg->move_desc_pending = 1; | 361 | cfg->move_desc_pending = 1; |
361 | } | 362 | } |
362 | } | 363 | } |
@@ -386,7 +387,7 @@ struct io_apic { | |||
386 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | 387 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) |
387 | { | 388 | { |
388 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | 389 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) |
389 | + (mp_ioapics[idx].mp_apicaddr & ~PAGE_MASK); | 390 | + (mp_ioapics[idx].apicaddr & ~PAGE_MASK); |
390 | } | 391 | } |
391 | 392 | ||
392 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | 393 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) |
@@ -579,9 +580,9 @@ set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | |||
579 | if (assign_irq_vector(irq, cfg, mask)) | 580 | if (assign_irq_vector(irq, cfg, mask)) |
580 | return BAD_APICID; | 581 | return BAD_APICID; |
581 | 582 | ||
582 | cpumask_and(&desc->affinity, cfg->domain, mask); | 583 | cpumask_and(desc->affinity, cfg->domain, mask); |
583 | set_extra_move_desc(desc, mask); | 584 | set_extra_move_desc(desc, mask); |
584 | return cpu_mask_to_apicid_and(&desc->affinity, cpu_online_mask); | 585 | return cpu_mask_to_apicid_and(desc->affinity, cpu_online_mask); |
585 | } | 586 | } |
586 | 587 | ||
587 | static void | 588 | static void |
@@ -944,10 +945,10 @@ static int find_irq_entry(int apic, int pin, int type) | |||
944 | int i; | 945 | int i; |
945 | 946 | ||
946 | for (i = 0; i < mp_irq_entries; i++) | 947 | for (i = 0; i < mp_irq_entries; i++) |
947 | if (mp_irqs[i].mp_irqtype == type && | 948 | if (mp_irqs[i].irqtype == type && |
948 | (mp_irqs[i].mp_dstapic == mp_ioapics[apic].mp_apicid || | 949 | (mp_irqs[i].dstapic == mp_ioapics[apic].apicid || |
949 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) && | 950 | mp_irqs[i].dstapic == MP_APIC_ALL) && |
950 | mp_irqs[i].mp_dstirq == pin) | 951 | mp_irqs[i].dstirq == pin) |
951 | return i; | 952 | return i; |
952 | 953 | ||
953 | return -1; | 954 | return -1; |
@@ -961,13 +962,13 @@ static int __init find_isa_irq_pin(int irq, int type) | |||
961 | int i; | 962 | int i; |
962 | 963 | ||
963 | for (i = 0; i < mp_irq_entries; i++) { | 964 | for (i = 0; i < mp_irq_entries; i++) { |
964 | int lbus = mp_irqs[i].mp_srcbus; | 965 | int lbus = mp_irqs[i].srcbus; |
965 | 966 | ||
966 | if (test_bit(lbus, mp_bus_not_pci) && | 967 | if (test_bit(lbus, mp_bus_not_pci) && |
967 | (mp_irqs[i].mp_irqtype == type) && | 968 | (mp_irqs[i].irqtype == type) && |
968 | (mp_irqs[i].mp_srcbusirq == irq)) | 969 | (mp_irqs[i].srcbusirq == irq)) |
969 | 970 | ||
970 | return mp_irqs[i].mp_dstirq; | 971 | return mp_irqs[i].dstirq; |
971 | } | 972 | } |
972 | return -1; | 973 | return -1; |
973 | } | 974 | } |
@@ -977,17 +978,17 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
977 | int i; | 978 | int i; |
978 | 979 | ||
979 | for (i = 0; i < mp_irq_entries; i++) { | 980 | for (i = 0; i < mp_irq_entries; i++) { |
980 | int lbus = mp_irqs[i].mp_srcbus; | 981 | int lbus = mp_irqs[i].srcbus; |
981 | 982 | ||
982 | if (test_bit(lbus, mp_bus_not_pci) && | 983 | if (test_bit(lbus, mp_bus_not_pci) && |
983 | (mp_irqs[i].mp_irqtype == type) && | 984 | (mp_irqs[i].irqtype == type) && |
984 | (mp_irqs[i].mp_srcbusirq == irq)) | 985 | (mp_irqs[i].srcbusirq == irq)) |
985 | break; | 986 | break; |
986 | } | 987 | } |
987 | if (i < mp_irq_entries) { | 988 | if (i < mp_irq_entries) { |
988 | int apic; | 989 | int apic; |
989 | for(apic = 0; apic < nr_ioapics; apic++) { | 990 | for(apic = 0; apic < nr_ioapics; apic++) { |
990 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic) | 991 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic) |
991 | return apic; | 992 | return apic; |
992 | } | 993 | } |
993 | } | 994 | } |
@@ -1012,23 +1013,23 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) | |||
1012 | return -1; | 1013 | return -1; |
1013 | } | 1014 | } |
1014 | for (i = 0; i < mp_irq_entries; i++) { | 1015 | for (i = 0; i < mp_irq_entries; i++) { |
1015 | int lbus = mp_irqs[i].mp_srcbus; | 1016 | int lbus = mp_irqs[i].srcbus; |
1016 | 1017 | ||
1017 | for (apic = 0; apic < nr_ioapics; apic++) | 1018 | for (apic = 0; apic < nr_ioapics; apic++) |
1018 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic || | 1019 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || |
1019 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) | 1020 | mp_irqs[i].dstapic == MP_APIC_ALL) |
1020 | break; | 1021 | break; |
1021 | 1022 | ||
1022 | if (!test_bit(lbus, mp_bus_not_pci) && | 1023 | if (!test_bit(lbus, mp_bus_not_pci) && |
1023 | !mp_irqs[i].mp_irqtype && | 1024 | !mp_irqs[i].irqtype && |
1024 | (bus == lbus) && | 1025 | (bus == lbus) && |
1025 | (slot == ((mp_irqs[i].mp_srcbusirq >> 2) & 0x1f))) { | 1026 | (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) { |
1026 | int irq = pin_2_irq(i,apic,mp_irqs[i].mp_dstirq); | 1027 | int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq); |
1027 | 1028 | ||
1028 | if (!(apic || IO_APIC_IRQ(irq))) | 1029 | if (!(apic || IO_APIC_IRQ(irq))) |
1029 | continue; | 1030 | continue; |
1030 | 1031 | ||
1031 | if (pin == (mp_irqs[i].mp_srcbusirq & 3)) | 1032 | if (pin == (mp_irqs[i].srcbusirq & 3)) |
1032 | return irq; | 1033 | return irq; |
1033 | /* | 1034 | /* |
1034 | * Use the first all-but-pin matching entry as a | 1035 | * Use the first all-but-pin matching entry as a |
@@ -1071,7 +1072,7 @@ static int EISA_ELCR(unsigned int irq) | |||
1071 | * EISA conforming in the MP table, that means its trigger type must | 1072 | * EISA conforming in the MP table, that means its trigger type must |
1072 | * be read in from the ELCR */ | 1073 | * be read in from the ELCR */ |
1073 | 1074 | ||
1074 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mp_srcbusirq)) | 1075 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].srcbusirq)) |
1075 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) | 1076 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) |
1076 | 1077 | ||
1077 | /* PCI interrupts are always polarity one level triggered, | 1078 | /* PCI interrupts are always polarity one level triggered, |
@@ -1088,13 +1089,13 @@ static int EISA_ELCR(unsigned int irq) | |||
1088 | 1089 | ||
1089 | static int MPBIOS_polarity(int idx) | 1090 | static int MPBIOS_polarity(int idx) |
1090 | { | 1091 | { |
1091 | int bus = mp_irqs[idx].mp_srcbus; | 1092 | int bus = mp_irqs[idx].srcbus; |
1092 | int polarity; | 1093 | int polarity; |
1093 | 1094 | ||
1094 | /* | 1095 | /* |
1095 | * Determine IRQ line polarity (high active or low active): | 1096 | * Determine IRQ line polarity (high active or low active): |
1096 | */ | 1097 | */ |
1097 | switch (mp_irqs[idx].mp_irqflag & 3) | 1098 | switch (mp_irqs[idx].irqflag & 3) |
1098 | { | 1099 | { |
1099 | case 0: /* conforms, ie. bus-type dependent polarity */ | 1100 | case 0: /* conforms, ie. bus-type dependent polarity */ |
1100 | if (test_bit(bus, mp_bus_not_pci)) | 1101 | if (test_bit(bus, mp_bus_not_pci)) |
@@ -1130,13 +1131,13 @@ static int MPBIOS_polarity(int idx) | |||
1130 | 1131 | ||
1131 | static int MPBIOS_trigger(int idx) | 1132 | static int MPBIOS_trigger(int idx) |
1132 | { | 1133 | { |
1133 | int bus = mp_irqs[idx].mp_srcbus; | 1134 | int bus = mp_irqs[idx].srcbus; |
1134 | int trigger; | 1135 | int trigger; |
1135 | 1136 | ||
1136 | /* | 1137 | /* |
1137 | * Determine IRQ trigger mode (edge or level sensitive): | 1138 | * Determine IRQ trigger mode (edge or level sensitive): |
1138 | */ | 1139 | */ |
1139 | switch ((mp_irqs[idx].mp_irqflag>>2) & 3) | 1140 | switch ((mp_irqs[idx].irqflag>>2) & 3) |
1140 | { | 1141 | { |
1141 | case 0: /* conforms, ie. bus-type dependent */ | 1142 | case 0: /* conforms, ie. bus-type dependent */ |
1142 | if (test_bit(bus, mp_bus_not_pci)) | 1143 | if (test_bit(bus, mp_bus_not_pci)) |
@@ -1214,16 +1215,16 @@ int (*ioapic_renumber_irq)(int ioapic, int irq); | |||
1214 | static int pin_2_irq(int idx, int apic, int pin) | 1215 | static int pin_2_irq(int idx, int apic, int pin) |
1215 | { | 1216 | { |
1216 | int irq, i; | 1217 | int irq, i; |
1217 | int bus = mp_irqs[idx].mp_srcbus; | 1218 | int bus = mp_irqs[idx].srcbus; |
1218 | 1219 | ||
1219 | /* | 1220 | /* |
1220 | * Debugging check, we are in big trouble if this message pops up! | 1221 | * Debugging check, we are in big trouble if this message pops up! |
1221 | */ | 1222 | */ |
1222 | if (mp_irqs[idx].mp_dstirq != pin) | 1223 | if (mp_irqs[idx].dstirq != pin) |
1223 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); | 1224 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); |
1224 | 1225 | ||
1225 | if (test_bit(bus, mp_bus_not_pci)) { | 1226 | if (test_bit(bus, mp_bus_not_pci)) { |
1226 | irq = mp_irqs[idx].mp_srcbusirq; | 1227 | irq = mp_irqs[idx].srcbusirq; |
1227 | } else { | 1228 | } else { |
1228 | /* | 1229 | /* |
1229 | * PCI IRQs are mapped in order | 1230 | * PCI IRQs are mapped in order |
@@ -1566,14 +1567,14 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_de | |||
1566 | apic_printk(APIC_VERBOSE,KERN_DEBUG | 1567 | apic_printk(APIC_VERBOSE,KERN_DEBUG |
1567 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " | 1568 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " |
1568 | "IRQ %d Mode:%i Active:%i)\n", | 1569 | "IRQ %d Mode:%i Active:%i)\n", |
1569 | apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector, | 1570 | apic, mp_ioapics[apic].apicid, pin, cfg->vector, |
1570 | irq, trigger, polarity); | 1571 | irq, trigger, polarity); |
1571 | 1572 | ||
1572 | 1573 | ||
1573 | if (setup_ioapic_entry(mp_ioapics[apic].mp_apicid, irq, &entry, | 1574 | if (setup_ioapic_entry(mp_ioapics[apic].apicid, irq, &entry, |
1574 | dest, trigger, polarity, cfg->vector)) { | 1575 | dest, trigger, polarity, cfg->vector)) { |
1575 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", | 1576 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", |
1576 | mp_ioapics[apic].mp_apicid, pin); | 1577 | mp_ioapics[apic].apicid, pin); |
1577 | __clear_irq_vector(irq, cfg); | 1578 | __clear_irq_vector(irq, cfg); |
1578 | return; | 1579 | return; |
1579 | } | 1580 | } |
@@ -1604,12 +1605,10 @@ static void __init setup_IO_APIC_irqs(void) | |||
1604 | notcon = 1; | 1605 | notcon = 1; |
1605 | apic_printk(APIC_VERBOSE, | 1606 | apic_printk(APIC_VERBOSE, |
1606 | KERN_DEBUG " %d-%d", | 1607 | KERN_DEBUG " %d-%d", |
1607 | mp_ioapics[apic].mp_apicid, | 1608 | mp_ioapics[apic].apicid, pin); |
1608 | pin); | ||
1609 | } else | 1609 | } else |
1610 | apic_printk(APIC_VERBOSE, " %d-%d", | 1610 | apic_printk(APIC_VERBOSE, " %d-%d", |
1611 | mp_ioapics[apic].mp_apicid, | 1611 | mp_ioapics[apic].apicid, pin); |
1612 | pin); | ||
1613 | continue; | 1612 | continue; |
1614 | } | 1613 | } |
1615 | if (notcon) { | 1614 | if (notcon) { |
@@ -1699,7 +1698,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1699 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); | 1698 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); |
1700 | for (i = 0; i < nr_ioapics; i++) | 1699 | for (i = 0; i < nr_ioapics; i++) |
1701 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", | 1700 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", |
1702 | mp_ioapics[i].mp_apicid, nr_ioapic_registers[i]); | 1701 | mp_ioapics[i].apicid, nr_ioapic_registers[i]); |
1703 | 1702 | ||
1704 | /* | 1703 | /* |
1705 | * We are a bit conservative about what we expect. We have to | 1704 | * We are a bit conservative about what we expect. We have to |
@@ -1719,7 +1718,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1719 | spin_unlock_irqrestore(&ioapic_lock, flags); | 1718 | spin_unlock_irqrestore(&ioapic_lock, flags); |
1720 | 1719 | ||
1721 | printk("\n"); | 1720 | printk("\n"); |
1722 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mp_apicid); | 1721 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid); |
1723 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); | 1722 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); |
1724 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); | 1723 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); |
1725 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); | 1724 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); |
@@ -2121,14 +2120,14 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2121 | reg_00.raw = io_apic_read(apic, 0); | 2120 | reg_00.raw = io_apic_read(apic, 0); |
2122 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2121 | spin_unlock_irqrestore(&ioapic_lock, flags); |
2123 | 2122 | ||
2124 | old_id = mp_ioapics[apic].mp_apicid; | 2123 | old_id = mp_ioapics[apic].apicid; |
2125 | 2124 | ||
2126 | if (mp_ioapics[apic].mp_apicid >= get_physical_broadcast()) { | 2125 | if (mp_ioapics[apic].apicid >= get_physical_broadcast()) { |
2127 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", | 2126 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", |
2128 | apic, mp_ioapics[apic].mp_apicid); | 2127 | apic, mp_ioapics[apic].apicid); |
2129 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2128 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2130 | reg_00.bits.ID); | 2129 | reg_00.bits.ID); |
2131 | mp_ioapics[apic].mp_apicid = reg_00.bits.ID; | 2130 | mp_ioapics[apic].apicid = reg_00.bits.ID; |
2132 | } | 2131 | } |
2133 | 2132 | ||
2134 | /* | 2133 | /* |
@@ -2137,9 +2136,9 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2137 | * 'stuck on smp_invalidate_needed IPI wait' messages. | 2136 | * 'stuck on smp_invalidate_needed IPI wait' messages. |
2138 | */ | 2137 | */ |
2139 | if (check_apicid_used(phys_id_present_map, | 2138 | if (check_apicid_used(phys_id_present_map, |
2140 | mp_ioapics[apic].mp_apicid)) { | 2139 | mp_ioapics[apic].apicid)) { |
2141 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", | 2140 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", |
2142 | apic, mp_ioapics[apic].mp_apicid); | 2141 | apic, mp_ioapics[apic].apicid); |
2143 | for (i = 0; i < get_physical_broadcast(); i++) | 2142 | for (i = 0; i < get_physical_broadcast(); i++) |
2144 | if (!physid_isset(i, phys_id_present_map)) | 2143 | if (!physid_isset(i, phys_id_present_map)) |
2145 | break; | 2144 | break; |
@@ -2148,13 +2147,13 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2148 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2147 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2149 | i); | 2148 | i); |
2150 | physid_set(i, phys_id_present_map); | 2149 | physid_set(i, phys_id_present_map); |
2151 | mp_ioapics[apic].mp_apicid = i; | 2150 | mp_ioapics[apic].apicid = i; |
2152 | } else { | 2151 | } else { |
2153 | physid_mask_t tmp; | 2152 | physid_mask_t tmp; |
2154 | tmp = apicid_to_cpu_present(mp_ioapics[apic].mp_apicid); | 2153 | tmp = apicid_to_cpu_present(mp_ioapics[apic].apicid); |
2155 | apic_printk(APIC_VERBOSE, "Setting %d in the " | 2154 | apic_printk(APIC_VERBOSE, "Setting %d in the " |
2156 | "phys_id_present_map\n", | 2155 | "phys_id_present_map\n", |
2157 | mp_ioapics[apic].mp_apicid); | 2156 | mp_ioapics[apic].apicid); |
2158 | physids_or(phys_id_present_map, phys_id_present_map, tmp); | 2157 | physids_or(phys_id_present_map, phys_id_present_map, tmp); |
2159 | } | 2158 | } |
2160 | 2159 | ||
@@ -2163,11 +2162,11 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2163 | * We need to adjust the IRQ routing table | 2162 | * We need to adjust the IRQ routing table |
2164 | * if the ID changed. | 2163 | * if the ID changed. |
2165 | */ | 2164 | */ |
2166 | if (old_id != mp_ioapics[apic].mp_apicid) | 2165 | if (old_id != mp_ioapics[apic].apicid) |
2167 | for (i = 0; i < mp_irq_entries; i++) | 2166 | for (i = 0; i < mp_irq_entries; i++) |
2168 | if (mp_irqs[i].mp_dstapic == old_id) | 2167 | if (mp_irqs[i].dstapic == old_id) |
2169 | mp_irqs[i].mp_dstapic | 2168 | mp_irqs[i].dstapic |
2170 | = mp_ioapics[apic].mp_apicid; | 2169 | = mp_ioapics[apic].apicid; |
2171 | 2170 | ||
2172 | /* | 2171 | /* |
2173 | * Read the right value from the MPC table and | 2172 | * Read the right value from the MPC table and |
@@ -2175,9 +2174,9 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2175 | */ | 2174 | */ |
2176 | apic_printk(APIC_VERBOSE, KERN_INFO | 2175 | apic_printk(APIC_VERBOSE, KERN_INFO |
2177 | "...changing IO-APIC physical APIC ID to %d ...", | 2176 | "...changing IO-APIC physical APIC ID to %d ...", |
2178 | mp_ioapics[apic].mp_apicid); | 2177 | mp_ioapics[apic].apicid); |
2179 | 2178 | ||
2180 | reg_00.bits.ID = mp_ioapics[apic].mp_apicid; | 2179 | reg_00.bits.ID = mp_ioapics[apic].apicid; |
2181 | spin_lock_irqsave(&ioapic_lock, flags); | 2180 | spin_lock_irqsave(&ioapic_lock, flags); |
2182 | io_apic_write(apic, 0, reg_00.raw); | 2181 | io_apic_write(apic, 0, reg_00.raw); |
2183 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2182 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -2188,7 +2187,7 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2188 | spin_lock_irqsave(&ioapic_lock, flags); | 2187 | spin_lock_irqsave(&ioapic_lock, flags); |
2189 | reg_00.raw = io_apic_read(apic, 0); | 2188 | reg_00.raw = io_apic_read(apic, 0); |
2190 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2189 | spin_unlock_irqrestore(&ioapic_lock, flags); |
2191 | if (reg_00.bits.ID != mp_ioapics[apic].mp_apicid) | 2190 | if (reg_00.bits.ID != mp_ioapics[apic].apicid) |
2192 | printk("could not set ID!\n"); | 2191 | printk("could not set ID!\n"); |
2193 | else | 2192 | else |
2194 | apic_printk(APIC_VERBOSE, " ok.\n"); | 2193 | apic_printk(APIC_VERBOSE, " ok.\n"); |
@@ -2383,7 +2382,7 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
2383 | if (cfg->move_in_progress) | 2382 | if (cfg->move_in_progress) |
2384 | send_cleanup_vector(cfg); | 2383 | send_cleanup_vector(cfg); |
2385 | 2384 | ||
2386 | cpumask_copy(&desc->affinity, mask); | 2385 | cpumask_copy(desc->affinity, mask); |
2387 | } | 2386 | } |
2388 | 2387 | ||
2389 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | 2388 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) |
@@ -2405,11 +2404,11 @@ static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | |||
2405 | } | 2404 | } |
2406 | 2405 | ||
2407 | /* everthing is clear. we have right of way */ | 2406 | /* everthing is clear. we have right of way */ |
2408 | migrate_ioapic_irq_desc(desc, &desc->pending_mask); | 2407 | migrate_ioapic_irq_desc(desc, desc->pending_mask); |
2409 | 2408 | ||
2410 | ret = 0; | 2409 | ret = 0; |
2411 | desc->status &= ~IRQ_MOVE_PENDING; | 2410 | desc->status &= ~IRQ_MOVE_PENDING; |
2412 | cpumask_clear(&desc->pending_mask); | 2411 | cpumask_clear(desc->pending_mask); |
2413 | 2412 | ||
2414 | unmask: | 2413 | unmask: |
2415 | unmask_IO_APIC_irq_desc(desc); | 2414 | unmask_IO_APIC_irq_desc(desc); |
@@ -2434,7 +2433,7 @@ static void ir_irq_migration(struct work_struct *work) | |||
2434 | continue; | 2433 | continue; |
2435 | } | 2434 | } |
2436 | 2435 | ||
2437 | desc->chip->set_affinity(irq, &desc->pending_mask); | 2436 | desc->chip->set_affinity(irq, desc->pending_mask); |
2438 | spin_unlock_irqrestore(&desc->lock, flags); | 2437 | spin_unlock_irqrestore(&desc->lock, flags); |
2439 | } | 2438 | } |
2440 | } | 2439 | } |
@@ -2448,7 +2447,7 @@ static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | |||
2448 | { | 2447 | { |
2449 | if (desc->status & IRQ_LEVEL) { | 2448 | if (desc->status & IRQ_LEVEL) { |
2450 | desc->status |= IRQ_MOVE_PENDING; | 2449 | desc->status |= IRQ_MOVE_PENDING; |
2451 | cpumask_copy(&desc->pending_mask, mask); | 2450 | cpumask_copy(desc->pending_mask, mask); |
2452 | migrate_irq_remapped_level_desc(desc); | 2451 | migrate_irq_remapped_level_desc(desc); |
2453 | return; | 2452 | return; |
2454 | } | 2453 | } |
@@ -2516,7 +2515,7 @@ static void irq_complete_move(struct irq_desc **descp) | |||
2516 | 2515 | ||
2517 | /* domain has not changed, but affinity did */ | 2516 | /* domain has not changed, but affinity did */ |
2518 | me = smp_processor_id(); | 2517 | me = smp_processor_id(); |
2519 | if (cpu_isset(me, desc->affinity)) { | 2518 | if (cpumask_test_cpu(me, desc->affinity)) { |
2520 | *descp = desc = move_irq_desc(desc, me); | 2519 | *descp = desc = move_irq_desc(desc, me); |
2521 | /* get the new one */ | 2520 | /* get the new one */ |
2522 | cfg = desc->chip_data; | 2521 | cfg = desc->chip_data; |
@@ -3117,8 +3116,8 @@ static int ioapic_resume(struct sys_device *dev) | |||
3117 | 3116 | ||
3118 | spin_lock_irqsave(&ioapic_lock, flags); | 3117 | spin_lock_irqsave(&ioapic_lock, flags); |
3119 | reg_00.raw = io_apic_read(dev->id, 0); | 3118 | reg_00.raw = io_apic_read(dev->id, 0); |
3120 | if (reg_00.bits.ID != mp_ioapics[dev->id].mp_apicid) { | 3119 | if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) { |
3121 | reg_00.bits.ID = mp_ioapics[dev->id].mp_apicid; | 3120 | reg_00.bits.ID = mp_ioapics[dev->id].apicid; |
3122 | io_apic_write(dev->id, 0, reg_00.raw); | 3121 | io_apic_write(dev->id, 0, reg_00.raw); |
3123 | } | 3122 | } |
3124 | spin_unlock_irqrestore(&ioapic_lock, flags); | 3123 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -3183,7 +3182,7 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
3183 | 3182 | ||
3184 | irq = 0; | 3183 | irq = 0; |
3185 | spin_lock_irqsave(&vector_lock, flags); | 3184 | spin_lock_irqsave(&vector_lock, flags); |
3186 | for (new = irq_want; new < NR_IRQS; new++) { | 3185 | for (new = irq_want; new < nr_irqs; new++) { |
3187 | if (platform_legacy_irq(new)) | 3186 | if (platform_legacy_irq(new)) |
3188 | continue; | 3187 | continue; |
3189 | 3188 | ||
@@ -3258,6 +3257,9 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
3258 | int err; | 3257 | int err; |
3259 | unsigned dest; | 3258 | unsigned dest; |
3260 | 3259 | ||
3260 | if (disable_apic) | ||
3261 | return -ENXIO; | ||
3262 | |||
3261 | cfg = irq_cfg(irq); | 3263 | cfg = irq_cfg(irq); |
3262 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3264 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); |
3263 | if (err) | 3265 | if (err) |
@@ -3726,6 +3728,9 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
3726 | struct irq_cfg *cfg; | 3728 | struct irq_cfg *cfg; |
3727 | int err; | 3729 | int err; |
3728 | 3730 | ||
3731 | if (disable_apic) | ||
3732 | return -ENXIO; | ||
3733 | |||
3729 | cfg = irq_cfg(irq); | 3734 | cfg = irq_cfg(irq); |
3730 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3735 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); |
3731 | if (!err) { | 3736 | if (!err) { |
@@ -3850,6 +3855,22 @@ void __init probe_nr_irqs_gsi(void) | |||
3850 | nr_irqs_gsi = nr; | 3855 | nr_irqs_gsi = nr; |
3851 | } | 3856 | } |
3852 | 3857 | ||
3858 | #ifdef CONFIG_SPARSE_IRQ | ||
3859 | int __init arch_probe_nr_irqs(void) | ||
3860 | { | ||
3861 | int nr; | ||
3862 | |||
3863 | nr = ((8 * nr_cpu_ids) > (32 * nr_ioapics) ? | ||
3864 | (NR_VECTORS + (8 * nr_cpu_ids)) : | ||
3865 | (NR_VECTORS + (32 * nr_ioapics))); | ||
3866 | |||
3867 | if (nr < nr_irqs && nr > nr_irqs_gsi) | ||
3868 | nr_irqs = nr; | ||
3869 | |||
3870 | return 0; | ||
3871 | } | ||
3872 | #endif | ||
3873 | |||
3853 | /* -------------------------------------------------------------------------- | 3874 | /* -------------------------------------------------------------------------- |
3854 | ACPI-based IOAPIC Configuration | 3875 | ACPI-based IOAPIC Configuration |
3855 | -------------------------------------------------------------------------- */ | 3876 | -------------------------------------------------------------------------- */ |
@@ -3984,8 +4005,8 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
3984 | return -1; | 4005 | return -1; |
3985 | 4006 | ||
3986 | for (i = 0; i < mp_irq_entries; i++) | 4007 | for (i = 0; i < mp_irq_entries; i++) |
3987 | if (mp_irqs[i].mp_irqtype == mp_INT && | 4008 | if (mp_irqs[i].irqtype == mp_INT && |
3988 | mp_irqs[i].mp_srcbusirq == bus_irq) | 4009 | mp_irqs[i].srcbusirq == bus_irq) |
3989 | break; | 4010 | break; |
3990 | if (i >= mp_irq_entries) | 4011 | if (i >= mp_irq_entries) |
3991 | return -1; | 4012 | return -1; |
@@ -4039,7 +4060,7 @@ void __init setup_ioapic_dest(void) | |||
4039 | */ | 4060 | */ |
4040 | if (desc->status & | 4061 | if (desc->status & |
4041 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | 4062 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) |
4042 | mask = &desc->affinity; | 4063 | mask = desc->affinity; |
4043 | else | 4064 | else |
4044 | mask = TARGET_CPUS; | 4065 | mask = TARGET_CPUS; |
4045 | 4066 | ||
@@ -4100,7 +4121,7 @@ void __init ioapic_init_mappings(void) | |||
4100 | ioapic_res = ioapic_setup_resources(); | 4121 | ioapic_res = ioapic_setup_resources(); |
4101 | for (i = 0; i < nr_ioapics; i++) { | 4122 | for (i = 0; i < nr_ioapics; i++) { |
4102 | if (smp_found_config) { | 4123 | if (smp_found_config) { |
4103 | ioapic_phys = mp_ioapics[i].mp_apicaddr; | 4124 | ioapic_phys = mp_ioapics[i].apicaddr; |
4104 | #ifdef CONFIG_X86_32 | 4125 | #ifdef CONFIG_X86_32 |
4105 | if (!ioapic_phys) { | 4126 | if (!ioapic_phys) { |
4106 | printk(KERN_ERR | 4127 | printk(KERN_ERR |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 74b9ff7341e9..e0f29be8ab0b 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
@@ -248,7 +248,7 @@ void fixup_irqs(void) | |||
248 | if (irq == 2) | 248 | if (irq == 2) |
249 | continue; | 249 | continue; |
250 | 250 | ||
251 | affinity = &desc->affinity; | 251 | affinity = desc->affinity; |
252 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { | 252 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
253 | printk("Breaking affinity for irq %i\n", irq); | 253 | printk("Breaking affinity for irq %i\n", irq); |
254 | affinity = cpu_all_mask; | 254 | affinity = cpu_all_mask; |
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 63c88e6ec025..0b21cb1ea11f 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
@@ -100,7 +100,7 @@ void fixup_irqs(void) | |||
100 | /* interrupt's are disabled at this point */ | 100 | /* interrupt's are disabled at this point */ |
101 | spin_lock(&desc->lock); | 101 | spin_lock(&desc->lock); |
102 | 102 | ||
103 | affinity = &desc->affinity; | 103 | affinity = desc->affinity; |
104 | if (!irq_has_action(irq) || | 104 | if (!irq_has_action(irq) || |
105 | cpumask_equal(affinity, cpu_online_mask)) { | 105 | cpumask_equal(affinity, cpu_online_mask)) { |
106 | spin_unlock(&desc->lock); | 106 | spin_unlock(&desc->lock); |
diff --git a/arch/x86/kernel/microcode_intel.c b/arch/x86/kernel/microcode_intel.c index b7f4c929e615..5e9f4fc51385 100644 --- a/arch/x86/kernel/microcode_intel.c +++ b/arch/x86/kernel/microcode_intel.c | |||
@@ -87,9 +87,9 @@ | |||
87 | #include <linux/cpu.h> | 87 | #include <linux/cpu.h> |
88 | #include <linux/firmware.h> | 88 | #include <linux/firmware.h> |
89 | #include <linux/platform_device.h> | 89 | #include <linux/platform_device.h> |
90 | #include <linux/uaccess.h> | ||
90 | 91 | ||
91 | #include <asm/msr.h> | 92 | #include <asm/msr.h> |
92 | #include <asm/uaccess.h> | ||
93 | #include <asm/processor.h> | 93 | #include <asm/processor.h> |
94 | #include <asm/microcode.h> | 94 | #include <asm/microcode.h> |
95 | 95 | ||
@@ -196,7 +196,7 @@ static inline int update_match_cpu(struct cpu_signature *csig, int sig, int pf) | |||
196 | return (!sigmatch(sig, csig->sig, pf, csig->pf)) ? 0 : 1; | 196 | return (!sigmatch(sig, csig->sig, pf, csig->pf)) ? 0 : 1; |
197 | } | 197 | } |
198 | 198 | ||
199 | static inline int | 199 | static inline int |
200 | update_match_revision(struct microcode_header_intel *mc_header, int rev) | 200 | update_match_revision(struct microcode_header_intel *mc_header, int rev) |
201 | { | 201 | { |
202 | return (mc_header->rev <= rev) ? 0 : 1; | 202 | return (mc_header->rev <= rev) ? 0 : 1; |
@@ -442,8 +442,8 @@ static int request_microcode_fw(int cpu, struct device *device) | |||
442 | return ret; | 442 | return ret; |
443 | } | 443 | } |
444 | 444 | ||
445 | ret = generic_load_microcode(cpu, (void*)firmware->data, firmware->size, | 445 | ret = generic_load_microcode(cpu, (void *)firmware->data, |
446 | &get_ucode_fw); | 446 | firmware->size, &get_ucode_fw); |
447 | 447 | ||
448 | release_firmware(firmware); | 448 | release_firmware(firmware); |
449 | 449 | ||
@@ -460,7 +460,7 @@ static int request_microcode_user(int cpu, const void __user *buf, size_t size) | |||
460 | /* We should bind the task to the CPU */ | 460 | /* We should bind the task to the CPU */ |
461 | BUG_ON(cpu != raw_smp_processor_id()); | 461 | BUG_ON(cpu != raw_smp_processor_id()); |
462 | 462 | ||
463 | return generic_load_microcode(cpu, (void*)buf, size, &get_ucode_user); | 463 | return generic_load_microcode(cpu, (void *)buf, size, &get_ucode_user); |
464 | } | 464 | } |
465 | 465 | ||
466 | static void microcode_fini_cpu(int cpu) | 466 | static void microcode_fini_cpu(int cpu) |
diff --git a/arch/x86/kernel/module_32.c b/arch/x86/kernel/module_32.c index 3db0a5442eb1..0edd819050e7 100644 --- a/arch/x86/kernel/module_32.c +++ b/arch/x86/kernel/module_32.c | |||
@@ -42,7 +42,7 @@ void module_free(struct module *mod, void *module_region) | |||
42 | { | 42 | { |
43 | vfree(module_region); | 43 | vfree(module_region); |
44 | /* FIXME: If module_region == mod->init_region, trim exception | 44 | /* FIXME: If module_region == mod->init_region, trim exception |
45 | table entries. */ | 45 | table entries. */ |
46 | } | 46 | } |
47 | 47 | ||
48 | /* We don't need anything special. */ | 48 | /* We don't need anything special. */ |
@@ -113,13 +113,13 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
113 | *para = NULL; | 113 | *para = NULL; |
114 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 114 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
115 | 115 | ||
116 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { | 116 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { |
117 | if (!strcmp(".text", secstrings + s->sh_name)) | 117 | if (!strcmp(".text", secstrings + s->sh_name)) |
118 | text = s; | 118 | text = s; |
119 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) | 119 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) |
120 | alt = s; | 120 | alt = s; |
121 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) | 121 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) |
122 | locks= s; | 122 | locks = s; |
123 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) | 123 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) |
124 | para = s; | 124 | para = s; |
125 | } | 125 | } |
diff --git a/arch/x86/kernel/module_64.c b/arch/x86/kernel/module_64.c index 6ba87830d4b1..c23880b90b5c 100644 --- a/arch/x86/kernel/module_64.c +++ b/arch/x86/kernel/module_64.c | |||
@@ -30,14 +30,14 @@ | |||
30 | #include <asm/page.h> | 30 | #include <asm/page.h> |
31 | #include <asm/pgtable.h> | 31 | #include <asm/pgtable.h> |
32 | 32 | ||
33 | #define DEBUGP(fmt...) | 33 | #define DEBUGP(fmt...) |
34 | 34 | ||
35 | #ifndef CONFIG_UML | 35 | #ifndef CONFIG_UML |
36 | void module_free(struct module *mod, void *module_region) | 36 | void module_free(struct module *mod, void *module_region) |
37 | { | 37 | { |
38 | vfree(module_region); | 38 | vfree(module_region); |
39 | /* FIXME: If module_region == mod->init_region, trim exception | 39 | /* FIXME: If module_region == mod->init_region, trim exception |
40 | table entries. */ | 40 | table entries. */ |
41 | } | 41 | } |
42 | 42 | ||
43 | void *module_alloc(unsigned long size) | 43 | void *module_alloc(unsigned long size) |
@@ -77,7 +77,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
77 | Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr; | 77 | Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr; |
78 | Elf64_Sym *sym; | 78 | Elf64_Sym *sym; |
79 | void *loc; | 79 | void *loc; |
80 | u64 val; | 80 | u64 val; |
81 | 81 | ||
82 | DEBUGP("Applying relocate section %u to %u\n", relsec, | 82 | DEBUGP("Applying relocate section %u to %u\n", relsec, |
83 | sechdrs[relsec].sh_info); | 83 | sechdrs[relsec].sh_info); |
@@ -91,11 +91,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
91 | sym = (Elf64_Sym *)sechdrs[symindex].sh_addr | 91 | sym = (Elf64_Sym *)sechdrs[symindex].sh_addr |
92 | + ELF64_R_SYM(rel[i].r_info); | 92 | + ELF64_R_SYM(rel[i].r_info); |
93 | 93 | ||
94 | DEBUGP("type %d st_value %Lx r_addend %Lx loc %Lx\n", | 94 | DEBUGP("type %d st_value %Lx r_addend %Lx loc %Lx\n", |
95 | (int)ELF64_R_TYPE(rel[i].r_info), | 95 | (int)ELF64_R_TYPE(rel[i].r_info), |
96 | sym->st_value, rel[i].r_addend, (u64)loc); | 96 | sym->st_value, rel[i].r_addend, (u64)loc); |
97 | 97 | ||
98 | val = sym->st_value + rel[i].r_addend; | 98 | val = sym->st_value + rel[i].r_addend; |
99 | 99 | ||
100 | switch (ELF64_R_TYPE(rel[i].r_info)) { | 100 | switch (ELF64_R_TYPE(rel[i].r_info)) { |
101 | case R_X86_64_NONE: | 101 | case R_X86_64_NONE: |
@@ -113,16 +113,16 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
113 | if ((s64)val != *(s32 *)loc) | 113 | if ((s64)val != *(s32 *)loc) |
114 | goto overflow; | 114 | goto overflow; |
115 | break; | 115 | break; |
116 | case R_X86_64_PC32: | 116 | case R_X86_64_PC32: |
117 | val -= (u64)loc; | 117 | val -= (u64)loc; |
118 | *(u32 *)loc = val; | 118 | *(u32 *)loc = val; |
119 | #if 0 | 119 | #if 0 |
120 | if ((s64)val != *(s32 *)loc) | 120 | if ((s64)val != *(s32 *)loc) |
121 | goto overflow; | 121 | goto overflow; |
122 | #endif | 122 | #endif |
123 | break; | 123 | break; |
124 | default: | 124 | default: |
125 | printk(KERN_ERR "module %s: Unknown rela relocation: %Lu\n", | 125 | printk(KERN_ERR "module %s: Unknown rela relocation: %llu\n", |
126 | me->name, ELF64_R_TYPE(rel[i].r_info)); | 126 | me->name, ELF64_R_TYPE(rel[i].r_info)); |
127 | return -ENOEXEC; | 127 | return -ENOEXEC; |
128 | } | 128 | } |
@@ -130,7 +130,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
130 | return 0; | 130 | return 0; |
131 | 131 | ||
132 | overflow: | 132 | overflow: |
133 | printk(KERN_ERR "overflow in relocation type %d val %Lx\n", | 133 | printk(KERN_ERR "overflow in relocation type %d val %Lx\n", |
134 | (int)ELF64_R_TYPE(rel[i].r_info), val); | 134 | (int)ELF64_R_TYPE(rel[i].r_info), val); |
135 | printk(KERN_ERR "`%s' likely not compiled with -mcmodel=kernel\n", | 135 | printk(KERN_ERR "`%s' likely not compiled with -mcmodel=kernel\n", |
136 | me->name); | 136 | me->name); |
@@ -143,13 +143,13 @@ int apply_relocate(Elf_Shdr *sechdrs, | |||
143 | unsigned int relsec, | 143 | unsigned int relsec, |
144 | struct module *me) | 144 | struct module *me) |
145 | { | 145 | { |
146 | printk("non add relocation not supported\n"); | 146 | printk(KERN_ERR "non add relocation not supported\n"); |
147 | return -ENOSYS; | 147 | return -ENOSYS; |
148 | } | 148 | } |
149 | 149 | ||
150 | int module_finalize(const Elf_Ehdr *hdr, | 150 | int module_finalize(const Elf_Ehdr *hdr, |
151 | const Elf_Shdr *sechdrs, | 151 | const Elf_Shdr *sechdrs, |
152 | struct module *me) | 152 | struct module *me) |
153 | { | 153 | { |
154 | const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL, | 154 | const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL, |
155 | *para = NULL; | 155 | *para = NULL; |
@@ -161,7 +161,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
161 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) | 161 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) |
162 | alt = s; | 162 | alt = s; |
163 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) | 163 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) |
164 | locks= s; | 164 | locks = s; |
165 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) | 165 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) |
166 | para = s; | 166 | para = s; |
167 | } | 167 | } |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index a649a4ccad43..fa6bb263892e 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -144,11 +144,11 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m) | |||
144 | if (bad_ioapic(m->apicaddr)) | 144 | if (bad_ioapic(m->apicaddr)) |
145 | return; | 145 | return; |
146 | 146 | ||
147 | mp_ioapics[nr_ioapics].mp_apicaddr = m->apicaddr; | 147 | mp_ioapics[nr_ioapics].apicaddr = m->apicaddr; |
148 | mp_ioapics[nr_ioapics].mp_apicid = m->apicid; | 148 | mp_ioapics[nr_ioapics].apicid = m->apicid; |
149 | mp_ioapics[nr_ioapics].mp_type = m->type; | 149 | mp_ioapics[nr_ioapics].type = m->type; |
150 | mp_ioapics[nr_ioapics].mp_apicver = m->apicver; | 150 | mp_ioapics[nr_ioapics].apicver = m->apicver; |
151 | mp_ioapics[nr_ioapics].mp_flags = m->flags; | 151 | mp_ioapics[nr_ioapics].flags = m->flags; |
152 | nr_ioapics++; | 152 | nr_ioapics++; |
153 | } | 153 | } |
154 | 154 | ||
@@ -160,55 +160,55 @@ static void print_MP_intsrc_info(struct mpc_intsrc *m) | |||
160 | m->srcbusirq, m->dstapic, m->dstirq); | 160 | m->srcbusirq, m->dstapic, m->dstirq); |
161 | } | 161 | } |
162 | 162 | ||
163 | static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq) | 163 | static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) |
164 | { | 164 | { |
165 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | 165 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," |
166 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | 166 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", |
167 | mp_irq->mp_irqtype, mp_irq->mp_irqflag & 3, | 167 | mp_irq->irqtype, mp_irq->irqflag & 3, |
168 | (mp_irq->mp_irqflag >> 2) & 3, mp_irq->mp_srcbus, | 168 | (mp_irq->irqflag >> 2) & 3, mp_irq->srcbus, |
169 | mp_irq->mp_srcbusirq, mp_irq->mp_dstapic, mp_irq->mp_dstirq); | 169 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); |
170 | } | 170 | } |
171 | 171 | ||
172 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, | 172 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, |
173 | struct mp_config_intsrc *mp_irq) | 173 | struct mpc_intsrc *mp_irq) |
174 | { | 174 | { |
175 | mp_irq->mp_dstapic = m->dstapic; | 175 | mp_irq->dstapic = m->dstapic; |
176 | mp_irq->mp_type = m->type; | 176 | mp_irq->type = m->type; |
177 | mp_irq->mp_irqtype = m->irqtype; | 177 | mp_irq->irqtype = m->irqtype; |
178 | mp_irq->mp_irqflag = m->irqflag; | 178 | mp_irq->irqflag = m->irqflag; |
179 | mp_irq->mp_srcbus = m->srcbus; | 179 | mp_irq->srcbus = m->srcbus; |
180 | mp_irq->mp_srcbusirq = m->srcbusirq; | 180 | mp_irq->srcbusirq = m->srcbusirq; |
181 | mp_irq->mp_dstirq = m->dstirq; | 181 | mp_irq->dstirq = m->dstirq; |
182 | } | 182 | } |
183 | 183 | ||
184 | static void __init assign_to_mpc_intsrc(struct mp_config_intsrc *mp_irq, | 184 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, |
185 | struct mpc_intsrc *m) | 185 | struct mpc_intsrc *m) |
186 | { | 186 | { |
187 | m->dstapic = mp_irq->mp_dstapic; | 187 | m->dstapic = mp_irq->dstapic; |
188 | m->type = mp_irq->mp_type; | 188 | m->type = mp_irq->type; |
189 | m->irqtype = mp_irq->mp_irqtype; | 189 | m->irqtype = mp_irq->irqtype; |
190 | m->irqflag = mp_irq->mp_irqflag; | 190 | m->irqflag = mp_irq->irqflag; |
191 | m->srcbus = mp_irq->mp_srcbus; | 191 | m->srcbus = mp_irq->srcbus; |
192 | m->srcbusirq = mp_irq->mp_srcbusirq; | 192 | m->srcbusirq = mp_irq->srcbusirq; |
193 | m->dstirq = mp_irq->mp_dstirq; | 193 | m->dstirq = mp_irq->dstirq; |
194 | } | 194 | } |
195 | 195 | ||
196 | static int __init mp_irq_mpc_intsrc_cmp(struct mp_config_intsrc *mp_irq, | 196 | static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, |
197 | struct mpc_intsrc *m) | 197 | struct mpc_intsrc *m) |
198 | { | 198 | { |
199 | if (mp_irq->mp_dstapic != m->dstapic) | 199 | if (mp_irq->dstapic != m->dstapic) |
200 | return 1; | 200 | return 1; |
201 | if (mp_irq->mp_type != m->type) | 201 | if (mp_irq->type != m->type) |
202 | return 2; | 202 | return 2; |
203 | if (mp_irq->mp_irqtype != m->irqtype) | 203 | if (mp_irq->irqtype != m->irqtype) |
204 | return 3; | 204 | return 3; |
205 | if (mp_irq->mp_irqflag != m->irqflag) | 205 | if (mp_irq->irqflag != m->irqflag) |
206 | return 4; | 206 | return 4; |
207 | if (mp_irq->mp_srcbus != m->srcbus) | 207 | if (mp_irq->srcbus != m->srcbus) |
208 | return 5; | 208 | return 5; |
209 | if (mp_irq->mp_srcbusirq != m->srcbusirq) | 209 | if (mp_irq->srcbusirq != m->srcbusirq) |
210 | return 6; | 210 | return 6; |
211 | if (mp_irq->mp_dstirq != m->dstirq) | 211 | if (mp_irq->dstirq != m->dstirq) |
212 | return 7; | 212 | return 7; |
213 | 213 | ||
214 | return 0; | 214 | return 0; |
@@ -417,7 +417,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
417 | intsrc.type = MP_INTSRC; | 417 | intsrc.type = MP_INTSRC; |
418 | intsrc.irqflag = 0; /* conforming */ | 418 | intsrc.irqflag = 0; /* conforming */ |
419 | intsrc.srcbus = 0; | 419 | intsrc.srcbus = 0; |
420 | intsrc.dstapic = mp_ioapics[0].mp_apicid; | 420 | intsrc.dstapic = mp_ioapics[0].apicid; |
421 | 421 | ||
422 | intsrc.irqtype = mp_INT; | 422 | intsrc.irqtype = mp_INT; |
423 | 423 | ||
@@ -570,14 +570,14 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
570 | } | 570 | } |
571 | } | 571 | } |
572 | 572 | ||
573 | static struct intel_mp_floating *mpf_found; | 573 | static struct mpf_intel *mpf_found; |
574 | 574 | ||
575 | /* | 575 | /* |
576 | * Scan the memory blocks for an SMP configuration block. | 576 | * Scan the memory blocks for an SMP configuration block. |
577 | */ | 577 | */ |
578 | static void __init __get_smp_config(unsigned int early) | 578 | static void __init __get_smp_config(unsigned int early) |
579 | { | 579 | { |
580 | struct intel_mp_floating *mpf = mpf_found; | 580 | struct mpf_intel *mpf = mpf_found; |
581 | 581 | ||
582 | if (!mpf) | 582 | if (!mpf) |
583 | return; | 583 | return; |
@@ -598,9 +598,9 @@ static void __init __get_smp_config(unsigned int early) | |||
598 | } | 598 | } |
599 | 599 | ||
600 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", | 600 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", |
601 | mpf->mpf_specification); | 601 | mpf->specification); |
602 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) | 602 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) |
603 | if (mpf->mpf_feature2 & (1 << 7)) { | 603 | if (mpf->feature2 & (1 << 7)) { |
604 | printk(KERN_INFO " IMCR and PIC compatibility mode.\n"); | 604 | printk(KERN_INFO " IMCR and PIC compatibility mode.\n"); |
605 | pic_mode = 1; | 605 | pic_mode = 1; |
606 | } else { | 606 | } else { |
@@ -611,7 +611,7 @@ static void __init __get_smp_config(unsigned int early) | |||
611 | /* | 611 | /* |
612 | * Now see if we need to read further. | 612 | * Now see if we need to read further. |
613 | */ | 613 | */ |
614 | if (mpf->mpf_feature1 != 0) { | 614 | if (mpf->feature1 != 0) { |
615 | if (early) { | 615 | if (early) { |
616 | /* | 616 | /* |
617 | * local APIC has default address | 617 | * local APIC has default address |
@@ -621,16 +621,16 @@ static void __init __get_smp_config(unsigned int early) | |||
621 | } | 621 | } |
622 | 622 | ||
623 | printk(KERN_INFO "Default MP configuration #%d\n", | 623 | printk(KERN_INFO "Default MP configuration #%d\n", |
624 | mpf->mpf_feature1); | 624 | mpf->feature1); |
625 | construct_default_ISA_mptable(mpf->mpf_feature1); | 625 | construct_default_ISA_mptable(mpf->feature1); |
626 | 626 | ||
627 | } else if (mpf->mpf_physptr) { | 627 | } else if (mpf->physptr) { |
628 | 628 | ||
629 | /* | 629 | /* |
630 | * Read the physical hardware table. Anything here will | 630 | * Read the physical hardware table. Anything here will |
631 | * override the defaults. | 631 | * override the defaults. |
632 | */ | 632 | */ |
633 | if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr), early)) { | 633 | if (!smp_read_mpc(phys_to_virt(mpf->physptr), early)) { |
634 | #ifdef CONFIG_X86_LOCAL_APIC | 634 | #ifdef CONFIG_X86_LOCAL_APIC |
635 | smp_found_config = 0; | 635 | smp_found_config = 0; |
636 | #endif | 636 | #endif |
@@ -688,19 +688,19 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
688 | unsigned reserve) | 688 | unsigned reserve) |
689 | { | 689 | { |
690 | unsigned int *bp = phys_to_virt(base); | 690 | unsigned int *bp = phys_to_virt(base); |
691 | struct intel_mp_floating *mpf; | 691 | struct mpf_intel *mpf; |
692 | 692 | ||
693 | apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", | 693 | apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", |
694 | bp, length); | 694 | bp, length); |
695 | BUILD_BUG_ON(sizeof(*mpf) != 16); | 695 | BUILD_BUG_ON(sizeof(*mpf) != 16); |
696 | 696 | ||
697 | while (length > 0) { | 697 | while (length > 0) { |
698 | mpf = (struct intel_mp_floating *)bp; | 698 | mpf = (struct mpf_intel *)bp; |
699 | if ((*bp == SMP_MAGIC_IDENT) && | 699 | if ((*bp == SMP_MAGIC_IDENT) && |
700 | (mpf->mpf_length == 1) && | 700 | (mpf->length == 1) && |
701 | !mpf_checksum((unsigned char *)bp, 16) && | 701 | !mpf_checksum((unsigned char *)bp, 16) && |
702 | ((mpf->mpf_specification == 1) | 702 | ((mpf->specification == 1) |
703 | || (mpf->mpf_specification == 4))) { | 703 | || (mpf->specification == 4))) { |
704 | #ifdef CONFIG_X86_LOCAL_APIC | 704 | #ifdef CONFIG_X86_LOCAL_APIC |
705 | smp_found_config = 1; | 705 | smp_found_config = 1; |
706 | #endif | 706 | #endif |
@@ -713,7 +713,7 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
713 | return 1; | 713 | return 1; |
714 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, | 714 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, |
715 | BOOTMEM_DEFAULT); | 715 | BOOTMEM_DEFAULT); |
716 | if (mpf->mpf_physptr) { | 716 | if (mpf->physptr) { |
717 | unsigned long size = PAGE_SIZE; | 717 | unsigned long size = PAGE_SIZE; |
718 | #ifdef CONFIG_X86_32 | 718 | #ifdef CONFIG_X86_32 |
719 | /* | 719 | /* |
@@ -722,14 +722,14 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
722 | * the bottom is mapped now. | 722 | * the bottom is mapped now. |
723 | * PC-9800's MPC table places on the very last | 723 | * PC-9800's MPC table places on the very last |
724 | * of physical memory; so that simply reserving | 724 | * of physical memory; so that simply reserving |
725 | * PAGE_SIZE from mpg->mpf_physptr yields BUG() | 725 | * PAGE_SIZE from mpf->physptr yields BUG() |
726 | * in reserve_bootmem. | 726 | * in reserve_bootmem. |
727 | */ | 727 | */ |
728 | unsigned long end = max_low_pfn * PAGE_SIZE; | 728 | unsigned long end = max_low_pfn * PAGE_SIZE; |
729 | if (mpf->mpf_physptr + size > end) | 729 | if (mpf->physptr + size > end) |
730 | size = end - mpf->mpf_physptr; | 730 | size = end - mpf->physptr; |
731 | #endif | 731 | #endif |
732 | reserve_bootmem_generic(mpf->mpf_physptr, size, | 732 | reserve_bootmem_generic(mpf->physptr, size, |
733 | BOOTMEM_DEFAULT); | 733 | BOOTMEM_DEFAULT); |
734 | } | 734 | } |
735 | 735 | ||
@@ -809,15 +809,15 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) | |||
809 | /* not legacy */ | 809 | /* not legacy */ |
810 | 810 | ||
811 | for (i = 0; i < mp_irq_entries; i++) { | 811 | for (i = 0; i < mp_irq_entries; i++) { |
812 | if (mp_irqs[i].mp_irqtype != mp_INT) | 812 | if (mp_irqs[i].irqtype != mp_INT) |
813 | continue; | 813 | continue; |
814 | 814 | ||
815 | if (mp_irqs[i].mp_irqflag != 0x0f) | 815 | if (mp_irqs[i].irqflag != 0x0f) |
816 | continue; | 816 | continue; |
817 | 817 | ||
818 | if (mp_irqs[i].mp_srcbus != m->srcbus) | 818 | if (mp_irqs[i].srcbus != m->srcbus) |
819 | continue; | 819 | continue; |
820 | if (mp_irqs[i].mp_srcbusirq != m->srcbusirq) | 820 | if (mp_irqs[i].srcbusirq != m->srcbusirq) |
821 | continue; | 821 | continue; |
822 | if (irq_used[i]) { | 822 | if (irq_used[i]) { |
823 | /* already claimed */ | 823 | /* already claimed */ |
@@ -922,10 +922,10 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
922 | if (irq_used[i]) | 922 | if (irq_used[i]) |
923 | continue; | 923 | continue; |
924 | 924 | ||
925 | if (mp_irqs[i].mp_irqtype != mp_INT) | 925 | if (mp_irqs[i].irqtype != mp_INT) |
926 | continue; | 926 | continue; |
927 | 927 | ||
928 | if (mp_irqs[i].mp_irqflag != 0x0f) | 928 | if (mp_irqs[i].irqflag != 0x0f) |
929 | continue; | 929 | continue; |
930 | 930 | ||
931 | if (nr_m_spare > 0) { | 931 | if (nr_m_spare > 0) { |
@@ -1001,7 +1001,7 @@ static int __init update_mp_table(void) | |||
1001 | { | 1001 | { |
1002 | char str[16]; | 1002 | char str[16]; |
1003 | char oem[10]; | 1003 | char oem[10]; |
1004 | struct intel_mp_floating *mpf; | 1004 | struct mpf_intel *mpf; |
1005 | struct mpc_table *mpc, *mpc_new; | 1005 | struct mpc_table *mpc, *mpc_new; |
1006 | 1006 | ||
1007 | if (!enable_update_mptable) | 1007 | if (!enable_update_mptable) |
@@ -1014,19 +1014,19 @@ static int __init update_mp_table(void) | |||
1014 | /* | 1014 | /* |
1015 | * Now see if we need to go further. | 1015 | * Now see if we need to go further. |
1016 | */ | 1016 | */ |
1017 | if (mpf->mpf_feature1 != 0) | 1017 | if (mpf->feature1 != 0) |
1018 | return 0; | 1018 | return 0; |
1019 | 1019 | ||
1020 | if (!mpf->mpf_physptr) | 1020 | if (!mpf->physptr) |
1021 | return 0; | 1021 | return 0; |
1022 | 1022 | ||
1023 | mpc = phys_to_virt(mpf->mpf_physptr); | 1023 | mpc = phys_to_virt(mpf->physptr); |
1024 | 1024 | ||
1025 | if (!smp_check_mpc(mpc, oem, str)) | 1025 | if (!smp_check_mpc(mpc, oem, str)) |
1026 | return 0; | 1026 | return 0; |
1027 | 1027 | ||
1028 | printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); | 1028 | printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); |
1029 | printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr); | 1029 | printk(KERN_INFO "physptr: %x\n", mpf->physptr); |
1030 | 1030 | ||
1031 | if (mpc_new_phys && mpc->length > mpc_new_length) { | 1031 | if (mpc_new_phys && mpc->length > mpc_new_length) { |
1032 | mpc_new_phys = 0; | 1032 | mpc_new_phys = 0; |
@@ -1047,23 +1047,23 @@ static int __init update_mp_table(void) | |||
1047 | } | 1047 | } |
1048 | printk(KERN_INFO "use in-positon replacing\n"); | 1048 | printk(KERN_INFO "use in-positon replacing\n"); |
1049 | } else { | 1049 | } else { |
1050 | mpf->mpf_physptr = mpc_new_phys; | 1050 | mpf->physptr = mpc_new_phys; |
1051 | mpc_new = phys_to_virt(mpc_new_phys); | 1051 | mpc_new = phys_to_virt(mpc_new_phys); |
1052 | memcpy(mpc_new, mpc, mpc->length); | 1052 | memcpy(mpc_new, mpc, mpc->length); |
1053 | mpc = mpc_new; | 1053 | mpc = mpc_new; |
1054 | /* check if we can modify that */ | 1054 | /* check if we can modify that */ |
1055 | if (mpc_new_phys - mpf->mpf_physptr) { | 1055 | if (mpc_new_phys - mpf->physptr) { |
1056 | struct intel_mp_floating *mpf_new; | 1056 | struct mpf_intel *mpf_new; |
1057 | /* steal 16 bytes from [0, 1k) */ | 1057 | /* steal 16 bytes from [0, 1k) */ |
1058 | printk(KERN_INFO "mpf new: %x\n", 0x400 - 16); | 1058 | printk(KERN_INFO "mpf new: %x\n", 0x400 - 16); |
1059 | mpf_new = phys_to_virt(0x400 - 16); | 1059 | mpf_new = phys_to_virt(0x400 - 16); |
1060 | memcpy(mpf_new, mpf, 16); | 1060 | memcpy(mpf_new, mpf, 16); |
1061 | mpf = mpf_new; | 1061 | mpf = mpf_new; |
1062 | mpf->mpf_physptr = mpc_new_phys; | 1062 | mpf->physptr = mpc_new_phys; |
1063 | } | 1063 | } |
1064 | mpf->mpf_checksum = 0; | 1064 | mpf->checksum = 0; |
1065 | mpf->mpf_checksum -= mpf_checksum((unsigned char *)mpf, 16); | 1065 | mpf->checksum -= mpf_checksum((unsigned char *)mpf, 16); |
1066 | printk(KERN_INFO "mpf_physptr new: %x\n", mpf->mpf_physptr); | 1066 | printk(KERN_INFO "physptr new: %x\n", mpf->physptr); |
1067 | } | 1067 | } |
1068 | 1068 | ||
1069 | /* | 1069 | /* |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 726266695b2c..3cf3413ec626 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -35,10 +35,10 @@ | |||
35 | #include <linux/device.h> | 35 | #include <linux/device.h> |
36 | #include <linux/cpu.h> | 36 | #include <linux/cpu.h> |
37 | #include <linux/notifier.h> | 37 | #include <linux/notifier.h> |
38 | #include <linux/uaccess.h> | ||
38 | 39 | ||
39 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
40 | #include <asm/msr.h> | 41 | #include <asm/msr.h> |
41 | #include <asm/uaccess.h> | ||
42 | #include <asm/system.h> | 42 | #include <asm/system.h> |
43 | 43 | ||
44 | static struct class *msr_class; | 44 | static struct class *msr_class; |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 2b46eb41643b..f8536fee5c12 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <asm/reboot.h> | 14 | #include <asm/reboot.h> |
15 | #include <asm/pci_x86.h> | 15 | #include <asm/pci_x86.h> |
16 | #include <asm/virtext.h> | 16 | #include <asm/virtext.h> |
17 | #include <asm/cpu.h> | ||
17 | 18 | ||
18 | #ifdef CONFIG_X86_32 | 19 | #ifdef CONFIG_X86_32 |
19 | # include <linux/dmi.h> | 20 | # include <linux/dmi.h> |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index ae0d8042cf69..f41c4486c270 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -89,7 +89,7 @@ | |||
89 | 89 | ||
90 | #include <asm/system.h> | 90 | #include <asm/system.h> |
91 | #include <asm/vsyscall.h> | 91 | #include <asm/vsyscall.h> |
92 | #include <asm/smp.h> | 92 | #include <asm/cpu.h> |
93 | #include <asm/desc.h> | 93 | #include <asm/desc.h> |
94 | #include <asm/dma.h> | 94 | #include <asm/dma.h> |
95 | #include <asm/iommu.h> | 95 | #include <asm/iommu.h> |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 55c46074eba0..bf63de72b643 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <asm/mpspec.h> | 13 | #include <asm/mpspec.h> |
14 | #include <asm/apicdef.h> | 14 | #include <asm/apicdef.h> |
15 | #include <asm/highmem.h> | 15 | #include <asm/highmem.h> |
16 | #include <asm/cpumask.h> | ||
16 | 17 | ||
17 | #ifdef CONFIG_X86_LOCAL_APIC | 18 | #ifdef CONFIG_X86_LOCAL_APIC |
18 | unsigned int num_processors; | 19 | unsigned int num_processors; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index bb1a3b1fc87f..1a712da1dfa0 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -53,7 +53,6 @@ | |||
53 | #include <asm/nmi.h> | 53 | #include <asm/nmi.h> |
54 | #include <asm/irq.h> | 54 | #include <asm/irq.h> |
55 | #include <asm/idle.h> | 55 | #include <asm/idle.h> |
56 | #include <asm/smp.h> | ||
57 | #include <asm/trampoline.h> | 56 | #include <asm/trampoline.h> |
58 | #include <asm/cpu.h> | 57 | #include <asm/cpu.h> |
59 | #include <asm/numa.h> | 58 | #include <asm/numa.h> |
@@ -1125,6 +1124,7 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
1125 | printk(KERN_ERR "... forcing use of dummy APIC emulation." | 1124 | printk(KERN_ERR "... forcing use of dummy APIC emulation." |
1126 | "(tell your hw vendor)\n"); | 1125 | "(tell your hw vendor)\n"); |
1127 | smpboot_clear_io_apic(); | 1126 | smpboot_clear_io_apic(); |
1127 | disable_ioapic_setup(); | ||
1128 | return -1; | 1128 | return -1; |
1129 | } | 1129 | } |
1130 | 1130 | ||
diff --git a/arch/x86/kernel/tlb_32.c b/arch/x86/kernel/tlb_32.c index ce5054642247..ec53818f4e38 100644 --- a/arch/x86/kernel/tlb_32.c +++ b/arch/x86/kernel/tlb_32.c | |||
@@ -20,7 +20,7 @@ DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) | |||
20 | * Optimizations Manfred Spraul <manfred@colorfullife.com> | 20 | * Optimizations Manfred Spraul <manfred@colorfullife.com> |
21 | */ | 21 | */ |
22 | 22 | ||
23 | static cpumask_t flush_cpumask; | 23 | static cpumask_var_t flush_cpumask; |
24 | static struct mm_struct *flush_mm; | 24 | static struct mm_struct *flush_mm; |
25 | static unsigned long flush_va; | 25 | static unsigned long flush_va; |
26 | static DEFINE_SPINLOCK(tlbstate_lock); | 26 | static DEFINE_SPINLOCK(tlbstate_lock); |
@@ -92,7 +92,7 @@ void smp_invalidate_interrupt(struct pt_regs *regs) | |||
92 | 92 | ||
93 | cpu = get_cpu(); | 93 | cpu = get_cpu(); |
94 | 94 | ||
95 | if (!cpu_isset(cpu, flush_cpumask)) | 95 | if (!cpumask_test_cpu(cpu, flush_cpumask)) |
96 | goto out; | 96 | goto out; |
97 | /* | 97 | /* |
98 | * This was a BUG() but until someone can quote me the | 98 | * This was a BUG() but until someone can quote me the |
@@ -114,35 +114,22 @@ void smp_invalidate_interrupt(struct pt_regs *regs) | |||
114 | } | 114 | } |
115 | ack_APIC_irq(); | 115 | ack_APIC_irq(); |
116 | smp_mb__before_clear_bit(); | 116 | smp_mb__before_clear_bit(); |
117 | cpu_clear(cpu, flush_cpumask); | 117 | cpumask_clear_cpu(cpu, flush_cpumask); |
118 | smp_mb__after_clear_bit(); | 118 | smp_mb__after_clear_bit(); |
119 | out: | 119 | out: |
120 | put_cpu_no_resched(); | 120 | put_cpu_no_resched(); |
121 | inc_irq_stat(irq_tlb_count); | 121 | inc_irq_stat(irq_tlb_count); |
122 | } | 122 | } |
123 | 123 | ||
124 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | 124 | void native_flush_tlb_others(const struct cpumask *cpumask, |
125 | unsigned long va) | 125 | struct mm_struct *mm, unsigned long va) |
126 | { | 126 | { |
127 | cpumask_t cpumask = *cpumaskp; | ||
128 | |||
129 | /* | 127 | /* |
130 | * A couple of (to be removed) sanity checks: | ||
131 | * | ||
132 | * - current CPU must not be in mask | ||
133 | * - mask must exist :) | 128 | * - mask must exist :) |
134 | */ | 129 | */ |
135 | BUG_ON(cpus_empty(cpumask)); | 130 | BUG_ON(cpumask_empty(cpumask)); |
136 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | ||
137 | BUG_ON(!mm); | 131 | BUG_ON(!mm); |
138 | 132 | ||
139 | #ifdef CONFIG_HOTPLUG_CPU | ||
140 | /* If a CPU which we ran on has gone down, OK. */ | ||
141 | cpus_and(cpumask, cpumask, cpu_online_map); | ||
142 | if (unlikely(cpus_empty(cpumask))) | ||
143 | return; | ||
144 | #endif | ||
145 | |||
146 | /* | 133 | /* |
147 | * i'm not happy about this global shared spinlock in the | 134 | * i'm not happy about this global shared spinlock in the |
148 | * MM hot path, but we'll see how contended it is. | 135 | * MM hot path, but we'll see how contended it is. |
@@ -150,9 +137,17 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
150 | */ | 137 | */ |
151 | spin_lock(&tlbstate_lock); | 138 | spin_lock(&tlbstate_lock); |
152 | 139 | ||
140 | cpumask_andnot(flush_cpumask, cpumask, cpumask_of(smp_processor_id())); | ||
141 | #ifdef CONFIG_HOTPLUG_CPU | ||
142 | /* If a CPU which we ran on has gone down, OK. */ | ||
143 | cpumask_and(flush_cpumask, flush_cpumask, cpu_online_mask); | ||
144 | if (unlikely(cpumask_empty(flush_cpumask))) { | ||
145 | spin_unlock(&tlbstate_lock); | ||
146 | return; | ||
147 | } | ||
148 | #endif | ||
153 | flush_mm = mm; | 149 | flush_mm = mm; |
154 | flush_va = va; | 150 | flush_va = va; |
155 | cpus_or(flush_cpumask, cpumask, flush_cpumask); | ||
156 | 151 | ||
157 | /* | 152 | /* |
158 | * Make the above memory operations globally visible before | 153 | * Make the above memory operations globally visible before |
@@ -163,9 +158,9 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
163 | * We have to send the IPI only to | 158 | * We have to send the IPI only to |
164 | * CPUs affected. | 159 | * CPUs affected. |
165 | */ | 160 | */ |
166 | send_IPI_mask(&cpumask, INVALIDATE_TLB_VECTOR); | 161 | send_IPI_mask(flush_cpumask, INVALIDATE_TLB_VECTOR); |
167 | 162 | ||
168 | while (!cpus_empty(flush_cpumask)) | 163 | while (!cpumask_empty(flush_cpumask)) |
169 | /* nothing. lockup detection does not belong here */ | 164 | /* nothing. lockup detection does not belong here */ |
170 | cpu_relax(); | 165 | cpu_relax(); |
171 | 166 | ||
@@ -177,25 +172,19 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
177 | void flush_tlb_current_task(void) | 172 | void flush_tlb_current_task(void) |
178 | { | 173 | { |
179 | struct mm_struct *mm = current->mm; | 174 | struct mm_struct *mm = current->mm; |
180 | cpumask_t cpu_mask; | ||
181 | 175 | ||
182 | preempt_disable(); | 176 | preempt_disable(); |
183 | cpu_mask = mm->cpu_vm_mask; | ||
184 | cpu_clear(smp_processor_id(), cpu_mask); | ||
185 | 177 | ||
186 | local_flush_tlb(); | 178 | local_flush_tlb(); |
187 | if (!cpus_empty(cpu_mask)) | 179 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
188 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 180 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
189 | preempt_enable(); | 181 | preempt_enable(); |
190 | } | 182 | } |
191 | 183 | ||
192 | void flush_tlb_mm(struct mm_struct *mm) | 184 | void flush_tlb_mm(struct mm_struct *mm) |
193 | { | 185 | { |
194 | cpumask_t cpu_mask; | ||
195 | 186 | ||
196 | preempt_disable(); | 187 | preempt_disable(); |
197 | cpu_mask = mm->cpu_vm_mask; | ||
198 | cpu_clear(smp_processor_id(), cpu_mask); | ||
199 | 188 | ||
200 | if (current->active_mm == mm) { | 189 | if (current->active_mm == mm) { |
201 | if (current->mm) | 190 | if (current->mm) |
@@ -203,8 +192,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
203 | else | 192 | else |
204 | leave_mm(smp_processor_id()); | 193 | leave_mm(smp_processor_id()); |
205 | } | 194 | } |
206 | if (!cpus_empty(cpu_mask)) | 195 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
207 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 196 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
208 | 197 | ||
209 | preempt_enable(); | 198 | preempt_enable(); |
210 | } | 199 | } |
@@ -212,11 +201,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
212 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | 201 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) |
213 | { | 202 | { |
214 | struct mm_struct *mm = vma->vm_mm; | 203 | struct mm_struct *mm = vma->vm_mm; |
215 | cpumask_t cpu_mask; | ||
216 | 204 | ||
217 | preempt_disable(); | 205 | preempt_disable(); |
218 | cpu_mask = mm->cpu_vm_mask; | ||
219 | cpu_clear(smp_processor_id(), cpu_mask); | ||
220 | 206 | ||
221 | if (current->active_mm == mm) { | 207 | if (current->active_mm == mm) { |
222 | if (current->mm) | 208 | if (current->mm) |
@@ -225,9 +211,8 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | |||
225 | leave_mm(smp_processor_id()); | 211 | leave_mm(smp_processor_id()); |
226 | } | 212 | } |
227 | 213 | ||
228 | if (!cpus_empty(cpu_mask)) | 214 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
229 | flush_tlb_others(cpu_mask, mm, va); | 215 | flush_tlb_others(&mm->cpu_vm_mask, mm, va); |
230 | |||
231 | preempt_enable(); | 216 | preempt_enable(); |
232 | } | 217 | } |
233 | EXPORT_SYMBOL(flush_tlb_page); | 218 | EXPORT_SYMBOL(flush_tlb_page); |
@@ -254,3 +239,9 @@ void reset_lazy_tlbstate(void) | |||
254 | per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm; | 239 | per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm; |
255 | } | 240 | } |
256 | 241 | ||
242 | static int init_flush_cpumask(void) | ||
243 | { | ||
244 | alloc_cpumask_var(&flush_cpumask, GFP_KERNEL); | ||
245 | return 0; | ||
246 | } | ||
247 | early_initcall(init_flush_cpumask); | ||
diff --git a/arch/x86/kernel/tlb_64.c b/arch/x86/kernel/tlb_64.c index f8be6f1d2e48..7f4141d3b661 100644 --- a/arch/x86/kernel/tlb_64.c +++ b/arch/x86/kernel/tlb_64.c | |||
@@ -43,10 +43,10 @@ | |||
43 | 43 | ||
44 | union smp_flush_state { | 44 | union smp_flush_state { |
45 | struct { | 45 | struct { |
46 | cpumask_t flush_cpumask; | ||
47 | struct mm_struct *flush_mm; | 46 | struct mm_struct *flush_mm; |
48 | unsigned long flush_va; | 47 | unsigned long flush_va; |
49 | spinlock_t tlbstate_lock; | 48 | spinlock_t tlbstate_lock; |
49 | DECLARE_BITMAP(flush_cpumask, NR_CPUS); | ||
50 | }; | 50 | }; |
51 | char pad[SMP_CACHE_BYTES]; | 51 | char pad[SMP_CACHE_BYTES]; |
52 | } ____cacheline_aligned; | 52 | } ____cacheline_aligned; |
@@ -131,7 +131,7 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
131 | sender = ~regs->orig_ax - INVALIDATE_TLB_VECTOR_START; | 131 | sender = ~regs->orig_ax - INVALIDATE_TLB_VECTOR_START; |
132 | f = &per_cpu(flush_state, sender); | 132 | f = &per_cpu(flush_state, sender); |
133 | 133 | ||
134 | if (!cpu_isset(cpu, f->flush_cpumask)) | 134 | if (!cpumask_test_cpu(cpu, to_cpumask(f->flush_cpumask))) |
135 | goto out; | 135 | goto out; |
136 | /* | 136 | /* |
137 | * This was a BUG() but until someone can quote me the | 137 | * This was a BUG() but until someone can quote me the |
@@ -153,19 +153,15 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
153 | } | 153 | } |
154 | out: | 154 | out: |
155 | ack_APIC_irq(); | 155 | ack_APIC_irq(); |
156 | cpu_clear(cpu, f->flush_cpumask); | 156 | cpumask_clear_cpu(cpu, to_cpumask(f->flush_cpumask)); |
157 | inc_irq_stat(irq_tlb_count); | 157 | inc_irq_stat(irq_tlb_count); |
158 | } | 158 | } |
159 | 159 | ||
160 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | 160 | static void flush_tlb_others_ipi(const struct cpumask *cpumask, |
161 | unsigned long va) | 161 | struct mm_struct *mm, unsigned long va) |
162 | { | 162 | { |
163 | int sender; | 163 | int sender; |
164 | union smp_flush_state *f; | 164 | union smp_flush_state *f; |
165 | cpumask_t cpumask = *cpumaskp; | ||
166 | |||
167 | if (is_uv_system() && uv_flush_tlb_others(&cpumask, mm, va)) | ||
168 | return; | ||
169 | 165 | ||
170 | /* Caller has disabled preemption */ | 166 | /* Caller has disabled preemption */ |
171 | sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS; | 167 | sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS; |
@@ -180,7 +176,8 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
180 | 176 | ||
181 | f->flush_mm = mm; | 177 | f->flush_mm = mm; |
182 | f->flush_va = va; | 178 | f->flush_va = va; |
183 | cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask); | 179 | cpumask_andnot(to_cpumask(f->flush_cpumask), |
180 | cpumask, cpumask_of(smp_processor_id())); | ||
184 | 181 | ||
185 | /* | 182 | /* |
186 | * Make the above memory operations globally visible before | 183 | * Make the above memory operations globally visible before |
@@ -191,9 +188,10 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
191 | * We have to send the IPI only to | 188 | * We have to send the IPI only to |
192 | * CPUs affected. | 189 | * CPUs affected. |
193 | */ | 190 | */ |
194 | send_IPI_mask(&cpumask, INVALIDATE_TLB_VECTOR_START + sender); | 191 | send_IPI_mask(to_cpumask(f->flush_cpumask), |
192 | INVALIDATE_TLB_VECTOR_START + sender); | ||
195 | 193 | ||
196 | while (!cpus_empty(f->flush_cpumask)) | 194 | while (!cpumask_empty(to_cpumask(f->flush_cpumask))) |
197 | cpu_relax(); | 195 | cpu_relax(); |
198 | 196 | ||
199 | f->flush_mm = NULL; | 197 | f->flush_mm = NULL; |
@@ -201,6 +199,25 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
201 | spin_unlock(&f->tlbstate_lock); | 199 | spin_unlock(&f->tlbstate_lock); |
202 | } | 200 | } |
203 | 201 | ||
202 | void native_flush_tlb_others(const struct cpumask *cpumask, | ||
203 | struct mm_struct *mm, unsigned long va) | ||
204 | { | ||
205 | if (is_uv_system()) { | ||
206 | /* FIXME: could be an percpu_alloc'd thing */ | ||
207 | static DEFINE_PER_CPU(cpumask_t, flush_tlb_mask); | ||
208 | struct cpumask *after_uv_flush = &get_cpu_var(flush_tlb_mask); | ||
209 | |||
210 | cpumask_andnot(after_uv_flush, cpumask, | ||
211 | cpumask_of(smp_processor_id())); | ||
212 | if (!uv_flush_tlb_others(after_uv_flush, mm, va)) | ||
213 | flush_tlb_others_ipi(after_uv_flush, mm, va); | ||
214 | |||
215 | put_cpu_var(flush_tlb_uv_cpumask); | ||
216 | return; | ||
217 | } | ||
218 | flush_tlb_others_ipi(cpumask, mm, va); | ||
219 | } | ||
220 | |||
204 | static int __cpuinit init_smp_flush(void) | 221 | static int __cpuinit init_smp_flush(void) |
205 | { | 222 | { |
206 | int i; | 223 | int i; |
@@ -215,25 +232,18 @@ core_initcall(init_smp_flush); | |||
215 | void flush_tlb_current_task(void) | 232 | void flush_tlb_current_task(void) |
216 | { | 233 | { |
217 | struct mm_struct *mm = current->mm; | 234 | struct mm_struct *mm = current->mm; |
218 | cpumask_t cpu_mask; | ||
219 | 235 | ||
220 | preempt_disable(); | 236 | preempt_disable(); |
221 | cpu_mask = mm->cpu_vm_mask; | ||
222 | cpu_clear(smp_processor_id(), cpu_mask); | ||
223 | 237 | ||
224 | local_flush_tlb(); | 238 | local_flush_tlb(); |
225 | if (!cpus_empty(cpu_mask)) | 239 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
226 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 240 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
227 | preempt_enable(); | 241 | preempt_enable(); |
228 | } | 242 | } |
229 | 243 | ||
230 | void flush_tlb_mm(struct mm_struct *mm) | 244 | void flush_tlb_mm(struct mm_struct *mm) |
231 | { | 245 | { |
232 | cpumask_t cpu_mask; | ||
233 | |||
234 | preempt_disable(); | 246 | preempt_disable(); |
235 | cpu_mask = mm->cpu_vm_mask; | ||
236 | cpu_clear(smp_processor_id(), cpu_mask); | ||
237 | 247 | ||
238 | if (current->active_mm == mm) { | 248 | if (current->active_mm == mm) { |
239 | if (current->mm) | 249 | if (current->mm) |
@@ -241,8 +251,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
241 | else | 251 | else |
242 | leave_mm(smp_processor_id()); | 252 | leave_mm(smp_processor_id()); |
243 | } | 253 | } |
244 | if (!cpus_empty(cpu_mask)) | 254 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
245 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 255 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
246 | 256 | ||
247 | preempt_enable(); | 257 | preempt_enable(); |
248 | } | 258 | } |
@@ -250,11 +260,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
250 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | 260 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) |
251 | { | 261 | { |
252 | struct mm_struct *mm = vma->vm_mm; | 262 | struct mm_struct *mm = vma->vm_mm; |
253 | cpumask_t cpu_mask; | ||
254 | 263 | ||
255 | preempt_disable(); | 264 | preempt_disable(); |
256 | cpu_mask = mm->cpu_vm_mask; | ||
257 | cpu_clear(smp_processor_id(), cpu_mask); | ||
258 | 265 | ||
259 | if (current->active_mm == mm) { | 266 | if (current->active_mm == mm) { |
260 | if (current->mm) | 267 | if (current->mm) |
@@ -263,8 +270,8 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | |||
263 | leave_mm(smp_processor_id()); | 270 | leave_mm(smp_processor_id()); |
264 | } | 271 | } |
265 | 272 | ||
266 | if (!cpus_empty(cpu_mask)) | 273 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
267 | flush_tlb_others(cpu_mask, mm, va); | 274 | flush_tlb_others(&mm->cpu_vm_mask, mm, va); |
268 | 275 | ||
269 | preempt_enable(); | 276 | preempt_enable(); |
270 | } | 277 | } |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index f885023167e0..690dcf1a27d4 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
@@ -212,11 +212,11 @@ static int uv_wait_completion(struct bau_desc *bau_desc, | |||
212 | * The cpumaskp mask contains the cpus the broadcast was sent to. | 212 | * The cpumaskp mask contains the cpus the broadcast was sent to. |
213 | * | 213 | * |
214 | * Returns 1 if all remote flushing was done. The mask is zeroed. | 214 | * Returns 1 if all remote flushing was done. The mask is zeroed. |
215 | * Returns 0 if some remote flushing remains to be done. The mask is left | 215 | * Returns 0 if some remote flushing remains to be done. The mask will have |
216 | * unchanged. | 216 | * some bits still set. |
217 | */ | 217 | */ |
218 | int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, | 218 | int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, |
219 | cpumask_t *cpumaskp) | 219 | struct cpumask *cpumaskp) |
220 | { | 220 | { |
221 | int completion_status = 0; | 221 | int completion_status = 0; |
222 | int right_shift; | 222 | int right_shift; |
@@ -263,13 +263,13 @@ int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, | |||
263 | * Success, so clear the remote cpu's from the mask so we don't | 263 | * Success, so clear the remote cpu's from the mask so we don't |
264 | * use the IPI method of shootdown on them. | 264 | * use the IPI method of shootdown on them. |
265 | */ | 265 | */ |
266 | for_each_cpu_mask(bit, *cpumaskp) { | 266 | for_each_cpu(bit, cpumaskp) { |
267 | blade = uv_cpu_to_blade_id(bit); | 267 | blade = uv_cpu_to_blade_id(bit); |
268 | if (blade == this_blade) | 268 | if (blade == this_blade) |
269 | continue; | 269 | continue; |
270 | cpu_clear(bit, *cpumaskp); | 270 | cpumask_clear_cpu(bit, cpumaskp); |
271 | } | 271 | } |
272 | if (!cpus_empty(*cpumaskp)) | 272 | if (!cpumask_empty(cpumaskp)) |
273 | return 0; | 273 | return 0; |
274 | return 1; | 274 | return 1; |
275 | } | 275 | } |
@@ -296,7 +296,7 @@ int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, | |||
296 | * Returns 1 if all remote flushing was done. | 296 | * Returns 1 if all remote flushing was done. |
297 | * Returns 0 if some remote flushing remains to be done. | 297 | * Returns 0 if some remote flushing remains to be done. |
298 | */ | 298 | */ |
299 | int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm, | 299 | int uv_flush_tlb_others(struct cpumask *cpumaskp, struct mm_struct *mm, |
300 | unsigned long va) | 300 | unsigned long va) |
301 | { | 301 | { |
302 | int i; | 302 | int i; |
@@ -315,7 +315,7 @@ int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm, | |||
315 | bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); | 315 | bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); |
316 | 316 | ||
317 | i = 0; | 317 | i = 0; |
318 | for_each_cpu_mask(bit, *cpumaskp) { | 318 | for_each_cpu(bit, cpumaskp) { |
319 | blade = uv_cpu_to_blade_id(bit); | 319 | blade = uv_cpu_to_blade_id(bit); |
320 | BUG_ON(blade > (UV_DISTRIBUTION_SIZE - 1)); | 320 | BUG_ON(blade > (UV_DISTRIBUTION_SIZE - 1)); |
321 | if (blade == this_blade) { | 321 | if (blade == this_blade) { |
diff --git a/arch/x86/mach-voyager/setup.c b/arch/x86/mach-voyager/setup.c index a580b9562e76..0ade62555ff3 100644 --- a/arch/x86/mach-voyager/setup.c +++ b/arch/x86/mach-voyager/setup.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <asm/e820.h> | 9 | #include <asm/e820.h> |
10 | #include <asm/io.h> | 10 | #include <asm/io.h> |
11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
12 | #include <asm/cpu.h> | ||
12 | 13 | ||
13 | void __init pre_intr_init_hook(void) | 14 | void __init pre_intr_init_hook(void) |
14 | { | 15 | { |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 88f1b10de3be..4a6989e47a53 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -49,7 +49,6 @@ | |||
49 | #include <asm/paravirt.h> | 49 | #include <asm/paravirt.h> |
50 | #include <asm/setup.h> | 50 | #include <asm/setup.h> |
51 | #include <asm/cacheflush.h> | 51 | #include <asm/cacheflush.h> |
52 | #include <asm/smp.h> | ||
53 | 52 | ||
54 | unsigned int __VMALLOC_RESERVE = 128 << 20; | 53 | unsigned int __VMALLOC_RESERVE = 128 << 20; |
55 | 54 | ||
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 160c42d3eb8f..3be399013de6 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -333,11 +333,20 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
333 | req_type & _PAGE_CACHE_MASK); | 333 | req_type & _PAGE_CACHE_MASK); |
334 | } | 334 | } |
335 | 335 | ||
336 | is_range_ram = pagerange_is_ram(start, end); | 336 | /* |
337 | if (is_range_ram == 1) | 337 | * For legacy reasons, some parts of the physical address range in the |
338 | return reserve_ram_pages_type(start, end, req_type, new_type); | 338 | * legacy 1MB region is treated as non-RAM (even when listed as RAM in |
339 | else if (is_range_ram < 0) | 339 | * the e820 tables). So we will track the memory attributes of this |
340 | return -EINVAL; | 340 | * legacy 1MB region using the linear memtype_list always. |
341 | */ | ||
342 | if (end >= ISA_END_ADDRESS) { | ||
343 | is_range_ram = pagerange_is_ram(start, end); | ||
344 | if (is_range_ram == 1) | ||
345 | return reserve_ram_pages_type(start, end, req_type, | ||
346 | new_type); | ||
347 | else if (is_range_ram < 0) | ||
348 | return -EINVAL; | ||
349 | } | ||
341 | 350 | ||
342 | new = kmalloc(sizeof(struct memtype), GFP_KERNEL); | 351 | new = kmalloc(sizeof(struct memtype), GFP_KERNEL); |
343 | if (!new) | 352 | if (!new) |
@@ -437,11 +446,19 @@ int free_memtype(u64 start, u64 end) | |||
437 | if (is_ISA_range(start, end - 1)) | 446 | if (is_ISA_range(start, end - 1)) |
438 | return 0; | 447 | return 0; |
439 | 448 | ||
440 | is_range_ram = pagerange_is_ram(start, end); | 449 | /* |
441 | if (is_range_ram == 1) | 450 | * For legacy reasons, some parts of the physical address range in the |
442 | return free_ram_pages_type(start, end); | 451 | * legacy 1MB region is treated as non-RAM (even when listed as RAM in |
443 | else if (is_range_ram < 0) | 452 | * the e820 tables). So we will track the memory attributes of this |
444 | return -EINVAL; | 453 | * legacy 1MB region using the linear memtype_list always. |
454 | */ | ||
455 | if (end >= ISA_END_ADDRESS) { | ||
456 | is_range_ram = pagerange_is_ram(start, end); | ||
457 | if (is_range_ram == 1) | ||
458 | return free_ram_pages_type(start, end); | ||
459 | else if (is_range_ram < 0) | ||
460 | return -EINVAL; | ||
461 | } | ||
445 | 462 | ||
446 | spin_lock(&memtype_lock); | 463 | spin_lock(&memtype_lock); |
447 | list_for_each_entry(entry, &memtype_list, nd) { | 464 | list_for_each_entry(entry, &memtype_list, nd) { |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index bea215230b20..965539ec425f 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -634,35 +634,27 @@ static void xen_flush_tlb_single(unsigned long addr) | |||
634 | preempt_enable(); | 634 | preempt_enable(); |
635 | } | 635 | } |
636 | 636 | ||
637 | static void xen_flush_tlb_others(const cpumask_t *cpus, struct mm_struct *mm, | 637 | static void xen_flush_tlb_others(const struct cpumask *cpus, |
638 | unsigned long va) | 638 | struct mm_struct *mm, unsigned long va) |
639 | { | 639 | { |
640 | struct { | 640 | struct { |
641 | struct mmuext_op op; | 641 | struct mmuext_op op; |
642 | cpumask_t mask; | 642 | DECLARE_BITMAP(mask, NR_CPUS); |
643 | } *args; | 643 | } *args; |
644 | cpumask_t cpumask = *cpus; | ||
645 | struct multicall_space mcs; | 644 | struct multicall_space mcs; |
646 | 645 | ||
647 | /* | 646 | BUG_ON(cpumask_empty(cpus)); |
648 | * A couple of (to be removed) sanity checks: | ||
649 | * | ||
650 | * - current CPU must not be in mask | ||
651 | * - mask must exist :) | ||
652 | */ | ||
653 | BUG_ON(cpus_empty(cpumask)); | ||
654 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | ||
655 | BUG_ON(!mm); | 647 | BUG_ON(!mm); |
656 | 648 | ||
657 | /* If a CPU which we ran on has gone down, OK. */ | ||
658 | cpus_and(cpumask, cpumask, cpu_online_map); | ||
659 | if (cpus_empty(cpumask)) | ||
660 | return; | ||
661 | |||
662 | mcs = xen_mc_entry(sizeof(*args)); | 649 | mcs = xen_mc_entry(sizeof(*args)); |
663 | args = mcs.args; | 650 | args = mcs.args; |
664 | args->mask = cpumask; | 651 | args->op.arg2.vcpumask = to_cpumask(args->mask); |
665 | args->op.arg2.vcpumask = &args->mask; | 652 | |
653 | /* Remove us, and any offline CPUS. */ | ||
654 | cpumask_and(to_cpumask(args->mask), cpus, cpu_online_mask); | ||
655 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); | ||
656 | if (unlikely(cpumask_empty(to_cpumask(args->mask)))) | ||
657 | goto issue; | ||
666 | 658 | ||
667 | if (va == TLB_FLUSH_ALL) { | 659 | if (va == TLB_FLUSH_ALL) { |
668 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; | 660 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; |
@@ -673,6 +665,7 @@ static void xen_flush_tlb_others(const cpumask_t *cpus, struct mm_struct *mm, | |||
673 | 665 | ||
674 | MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); | 666 | MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); |
675 | 667 | ||
668 | issue: | ||
676 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 669 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
677 | } | 670 | } |
678 | 671 | ||