smp.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:15k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Intel SMP support routines.
  3.  *
  4.  * (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
  5.  * (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
  6.  *
  7.  * This code is released under the GNU General Public License version 2 or
  8.  * later.
  9.  */
  10. #include <linux/init.h>
  11. #include <linux/mm.h>
  12. #include <linux/irq.h>
  13. #include <linux/delay.h>
  14. #include <linux/spinlock.h>
  15. #include <linux/smp_lock.h>
  16. #include <linux/kernel_stat.h>
  17. #include <linux/mc146818rtc.h>
  18. #include <linux/cache.h>
  19. #include <asm/mtrr.h>
  20. #include <asm/pgalloc.h>
  21. #include <asm/smpboot.h>
  22. /*
  23.  * Some notes on x86 processor bugs affecting SMP operation:
  24.  *
  25.  * Pentium, Pentium Pro, II, III (and all CPUs) have bugs.
  26.  * The Linux implications for SMP are handled as follows:
  27.  *
  28.  * Pentium III / [Xeon]
  29.  * None of the E1AP-E3AP errata are visible to the user.
  30.  *
  31.  * E1AP. see PII A1AP
  32.  * E2AP. see PII A2AP
  33.  * E3AP. see PII A3AP
  34.  *
  35.  * Pentium II / [Xeon]
  36.  * None of the A1AP-A3AP errata are visible to the user.
  37.  *
  38.  * A1AP. see PPro 1AP
  39.  * A2AP. see PPro 2AP
  40.  * A3AP. see PPro 7AP
  41.  *
  42.  * Pentium Pro
  43.  * None of 1AP-9AP errata are visible to the normal user,
  44.  * except occasional delivery of 'spurious interrupt' as trap #15.
  45.  * This is very rare and a non-problem.
  46.  *
  47.  * 1AP. Linux maps APIC as non-cacheable
  48.  * 2AP. worked around in hardware
  49.  * 3AP. fixed in C0 and above steppings microcode update.
  50.  * Linux does not use excessive STARTUP_IPIs.
  51.  * 4AP. worked around in hardware
  52.  * 5AP. symmetric IO mode (normal Linux operation) not affected.
  53.  * 'noapic' mode has vector 0xf filled out properly.
  54.  * 6AP. 'noapic' mode might be affected - fixed in later steppings
  55.  * 7AP. We do not assume writes to the LVT deassering IRQs
  56.  * 8AP. We do not enable low power mode (deep sleep) during MP bootup
  57.  * 9AP. We do not use mixed mode
  58.  *
  59.  * Pentium
  60.  * There is a marginal case where REP MOVS on 100MHz SMP
  61.  * machines with B stepping processors can fail. XXX should provide
  62.  * an L1cache=Writethrough or L1cache=off option.
  63.  *
  64.  * B stepping CPUs may hang. There are hardware work arounds
  65.  * for this. We warn about it in case your board doesnt have the work
  66.  * arounds. Basically thats so I can tell anyone with a B stepping
  67.  * CPU and SMP problems "tough".
  68.  *
  69.  * Specific items [From Pentium Processor Specification Update]
  70.  *
  71.  * 1AP. Linux doesn't use remote read
  72.  * 2AP. Linux doesn't trust APIC errors
  73.  * 3AP. We work around this
  74.  * 4AP. Linux never generated 3 interrupts of the same priority
  75.  * to cause a lost local interrupt.
  76.  * 5AP. Remote read is never used
  77.  * 6AP. not affected - worked around in hardware
  78.  * 7AP. not affected - worked around in hardware
  79.  * 8AP. worked around in hardware - we get explicit CS errors if not
  80.  * 9AP. only 'noapic' mode affected. Might generate spurious
  81.  * interrupts, we log only the first one and count the
  82.  * rest silently.
  83.  * 10AP. not affected - worked around in hardware
  84.  * 11AP. Linux reads the APIC between writes to avoid this, as per
  85.  * the documentation. Make sure you preserve this as it affects
  86.  * the C stepping chips too.
  87.  * 12AP. not affected - worked around in hardware
  88.  * 13AP. not affected - worked around in hardware
  89.  * 14AP. we always deassert INIT during bootup
  90.  * 15AP. not affected - worked around in hardware
  91.  * 16AP. not affected - worked around in hardware
  92.  * 17AP. not affected - worked around in hardware
  93.  * 18AP. not affected - worked around in hardware
  94.  * 19AP. not affected - worked around in BIOS
  95.  *
  96.  * If this sounds worrying believe me these bugs are either ___RARE___,
  97.  * or are signal timing bugs worked around in hardware and there's
  98.  * about nothing of note with C stepping upwards.
  99.  */
  100. /* The 'big kernel lock' */
  101. spinlock_t kernel_flag __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
  102. struct tlb_state cpu_tlbstate[NR_CPUS] = {[0 ... NR_CPUS-1] = { &init_mm, 0 }};
  103. /*
  104.  * the following functions deal with sending IPIs between CPUs.
  105.  *
  106.  * We use 'broadcast', CPU->CPU IPIs and self-IPIs too.
  107.  */
  108. static inline int __prepare_ICR (unsigned int shortcut, int vector)
  109. {
  110. return APIC_DM_FIXED | shortcut | vector | APIC_DEST_LOGICAL;
  111. }
  112. static inline int __prepare_ICR2 (unsigned int mask)
  113. {
  114. return SET_APIC_DEST_FIELD(mask);
  115. }
  116. static inline void __send_IPI_shortcut(unsigned int shortcut, int vector)
  117. {
  118. /*
  119.  * Subtle. In the case of the 'never do double writes' workaround
  120.  * we have to lock out interrupts to be safe.  As we don't care
  121.  * of the value read we use an atomic rmw access to avoid costly
  122.  * cli/sti.  Otherwise we use an even cheaper single atomic write
  123.  * to the APIC.
  124.  */
  125. unsigned int cfg;
  126. /*
  127.  * Wait for idle.
  128.  */
  129. apic_wait_icr_idle();
  130. /*
  131.  * No need to touch the target chip field
  132.  */
  133. cfg = __prepare_ICR(shortcut, vector);
  134. /*
  135.  * Send the IPI. The write to APIC_ICR fires this off.
  136.  */
  137. apic_write_around(APIC_ICR, cfg);
  138. }
  139. void send_IPI_self(int vector)
  140. {
  141. __send_IPI_shortcut(APIC_DEST_SELF, vector);
  142. }
  143. static inline void send_IPI_mask_bitmask(int mask, int vector)
  144. {
  145. unsigned long cfg;
  146. unsigned long flags;
  147. __save_flags(flags);
  148. __cli();
  149. /*
  150.  * Wait for idle.
  151.  */
  152. apic_wait_icr_idle();
  153. /*
  154.  * prepare target chip field
  155.  */
  156. cfg = __prepare_ICR2(mask);
  157. apic_write_around(APIC_ICR2, cfg);
  158. /*
  159.  * program the ICR 
  160.  */
  161. cfg = __prepare_ICR(0, vector);
  162. /*
  163.  * Send the IPI. The write to APIC_ICR fires this off.
  164.  */
  165. apic_write_around(APIC_ICR, cfg);
  166. __restore_flags(flags);
  167. }
  168. static inline void send_IPI_mask_sequence(int mask, int vector)
  169. {
  170. unsigned long cfg, flags;
  171. unsigned int query_cpu, query_mask;
  172. /*
  173.  * Hack. The clustered APIC addressing mode doesn't allow us to send 
  174.  * to an arbitrary mask, so I do a unicasts to each CPU instead. This 
  175.  * should be modified to do 1 message per cluster ID - mbligh
  176.  */ 
  177. __save_flags(flags);
  178. __cli();
  179. for (query_cpu = 0; query_cpu < NR_CPUS; ++query_cpu) {
  180. query_mask = 1 << query_cpu;
  181. if (query_mask & mask) {
  182. /*
  183.  * Wait for idle.
  184.  */
  185. apic_wait_icr_idle();
  186. /*
  187.  * prepare target chip field
  188.  */
  189. cfg = __prepare_ICR2(cpu_to_logical_apicid(query_cpu));
  190. apic_write_around(APIC_ICR2, cfg);
  191. /*
  192.  * program the ICR 
  193.  */
  194. cfg = __prepare_ICR(0, vector);
  195. /*
  196.  * Send the IPI. The write to APIC_ICR fires this off.
  197.  */
  198. apic_write_around(APIC_ICR, cfg);
  199. }
  200. }
  201. __restore_flags(flags);
  202. }
  203. static inline void send_IPI_mask(int mask, int vector)
  204. {
  205. if (clustered_apic_mode) 
  206. send_IPI_mask_sequence(mask, vector);
  207. else
  208. send_IPI_mask_bitmask(mask, vector);
  209. }
  210. static inline void send_IPI_allbutself(int vector)
  211. {
  212. /*
  213.  * if there are no other CPUs in the system then
  214.  * we get an APIC send error if we try to broadcast.
  215.  * thus we have to avoid sending IPIs in this case.
  216.  */
  217. if (!(smp_num_cpus > 1))
  218. return;
  219. if (clustered_apic_mode) {
  220. // Pointless. Use send_IPI_mask to do this instead
  221. int cpu;
  222. if (smp_num_cpus > 1) {
  223. for (cpu = 0; cpu < smp_num_cpus; ++cpu) {
  224. if (cpu != smp_processor_id())
  225. send_IPI_mask(1 << cpu, vector);
  226. }
  227. }
  228. } else {
  229. __send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
  230. return;
  231. }
  232. }
  233. static inline void send_IPI_all(int vector)
  234. {
  235. if (clustered_apic_mode) {
  236. // Pointless. Use send_IPI_mask to do this instead
  237. int cpu;
  238. for (cpu = 0; cpu < smp_num_cpus; ++cpu) {
  239. send_IPI_mask(1 << cpu, vector);
  240. }
  241. } else {
  242. __send_IPI_shortcut(APIC_DEST_ALLINC, vector);
  243. }
  244. }
  245. /*
  246.  * Smarter SMP flushing macros. 
  247.  * c/o Linus Torvalds.
  248.  *
  249.  * These mean you can really definitely utterly forget about
  250.  * writing to user space from interrupts. (Its not allowed anyway).
  251.  *
  252.  * Optimizations Manfred Spraul <manfred@colorfullife.com>
  253.  */
  254. static volatile unsigned long flush_cpumask;
  255. static struct mm_struct * flush_mm;
  256. static unsigned long flush_va;
  257. static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED;
  258. #define FLUSH_ALL 0xffffffff
  259. /*
  260.  * We cannot call mmdrop() because we are in interrupt context, 
  261.  * instead update mm->cpu_vm_mask.
  262.  */
  263. static void inline leave_mm (unsigned long cpu)
  264. {
  265. if (cpu_tlbstate[cpu].state == TLBSTATE_OK)
  266. BUG();
  267. clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
  268. }
  269. /*
  270.  *
  271.  * The flush IPI assumes that a thread switch happens in this order:
  272.  * [cpu0: the cpu that switches]
  273.  * 1) switch_mm() either 1a) or 1b)
  274.  * 1a) thread switch to a different mm
  275.  * 1a1) clear_bit(cpu, &old_mm->cpu_vm_mask);
  276.  *  Stop ipi delivery for the old mm. This is not synchronized with
  277.  *  the other cpus, but smp_invalidate_interrupt ignore flush ipis
  278.  *  for the wrong mm, and in the worst case we perform a superflous
  279.  *  tlb flush.
  280.  * 1a2) set cpu_tlbstate to TLBSTATE_OK
  281.  *  Now the smp_invalidate_interrupt won't call leave_mm if cpu0
  282.  * was in lazy tlb mode.
  283.  * 1a3) update cpu_tlbstate[].active_mm
  284.  *  Now cpu0 accepts tlb flushes for the new mm.
  285.  * 1a4) set_bit(cpu, &new_mm->cpu_vm_mask);
  286.  *  Now the other cpus will send tlb flush ipis.
  287.  * 1a4) change cr3.
  288.  * 1b) thread switch without mm change
  289.  * cpu_tlbstate[].active_mm is correct, cpu0 already handles
  290.  * flush ipis.
  291.  * 1b1) set cpu_tlbstate to TLBSTATE_OK
  292.  * 1b2) test_and_set the cpu bit in cpu_vm_mask.
  293.  *  Atomically set the bit [other cpus will start sending flush ipis],
  294.  *  and test the bit.
  295.  * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
  296.  * 2) switch %%esp, ie current
  297.  *
  298.  * The interrupt must handle 2 special cases:
  299.  * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
  300.  * - the cpu performs speculative tlb reads, i.e. even if the cpu only
  301.  *   runs in kernel space, the cpu could load tlb entries for user space
  302.  *   pages.
  303.  *
  304.  * The good news is that cpu_tlbstate is local to each cpu, no
  305.  * write/read ordering problems.
  306.  */
  307. /*
  308.  * TLB flush IPI:
  309.  *
  310.  * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
  311.  * 2) Leave the mm if we are in the lazy tlb mode.
  312.  */
  313. asmlinkage void smp_invalidate_interrupt (void)
  314. {
  315. unsigned long cpu = smp_processor_id();
  316. if (!test_bit(cpu, &flush_cpumask))
  317. return;
  318. /* 
  319.  * This was a BUG() but until someone can quote me the
  320.  * line from the intel manual that guarantees an IPI to
  321.  * multiple CPUs is retried _only_ on the erroring CPUs
  322.  * its staying as a return
  323.  *
  324.  * BUG();
  325.  */
  326.  
  327. if (flush_mm == cpu_tlbstate[cpu].active_mm) {
  328. if (cpu_tlbstate[cpu].state == TLBSTATE_OK) {
  329. if (flush_va == FLUSH_ALL)
  330. local_flush_tlb();
  331. else
  332. __flush_tlb_one(flush_va);
  333. } else
  334. leave_mm(cpu);
  335. }
  336. ack_APIC_irq();
  337. clear_bit(cpu, &flush_cpumask);
  338. }
  339. static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
  340. unsigned long va)
  341. {
  342. /*
  343.  * A couple of (to be removed) sanity checks:
  344.  *
  345.  * - we do not send IPIs to not-yet booted CPUs.
  346.  * - current CPU must not be in mask
  347.  * - mask must exist :)
  348.  */
  349. if (!cpumask)
  350. BUG();
  351. if ((cpumask & cpu_online_map) != cpumask)
  352. BUG();
  353. if (cpumask & (1 << smp_processor_id()))
  354. BUG();
  355. if (!mm)
  356. BUG();
  357. /*
  358.  * i'm not happy about this global shared spinlock in the
  359.  * MM hot path, but we'll see how contended it is.
  360.  * Temporarily this turns IRQs off, so that lockups are
  361.  * detected by the NMI watchdog.
  362.  */
  363. spin_lock(&tlbstate_lock);
  364. flush_mm = mm;
  365. flush_va = va;
  366. atomic_set_mask(cpumask, &flush_cpumask);
  367. /*
  368.  * We have to send the IPI only to
  369.  * CPUs affected.
  370.  */
  371. send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
  372. while (flush_cpumask)
  373. /* nothing. lockup detection does not belong here */;
  374. flush_mm = NULL;
  375. flush_va = 0;
  376. spin_unlock(&tlbstate_lock);
  377. }
  378. void flush_tlb_current_task(void)
  379. {
  380. struct mm_struct *mm = current->mm;
  381. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  382. local_flush_tlb();
  383. if (cpu_mask)
  384. flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
  385. }
  386. void flush_tlb_mm (struct mm_struct * mm)
  387. {
  388. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  389. if (current->active_mm == mm) {
  390. if (current->mm)
  391. local_flush_tlb();
  392. else
  393. leave_mm(smp_processor_id());
  394. }
  395. if (cpu_mask)
  396. flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
  397. }
  398. void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
  399. {
  400. struct mm_struct *mm = vma->vm_mm;
  401. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  402. if (current->active_mm == mm) {
  403. if(current->mm)
  404. __flush_tlb_one(va);
  405.  else
  406.   leave_mm(smp_processor_id());
  407. }
  408. if (cpu_mask)
  409. flush_tlb_others(cpu_mask, mm, va);
  410. }
  411. static inline void do_flush_tlb_all_local(void)
  412. {
  413. unsigned long cpu = smp_processor_id();
  414. __flush_tlb_all();
  415. if (cpu_tlbstate[cpu].state == TLBSTATE_LAZY)
  416. leave_mm(cpu);
  417. }
  418. static void flush_tlb_all_ipi(void* info)
  419. {
  420. do_flush_tlb_all_local();
  421. }
  422. void flush_tlb_all(void)
  423. {
  424. smp_call_function (flush_tlb_all_ipi,0,1,1);
  425. do_flush_tlb_all_local();
  426. }
  427. /*
  428.  * this function sends a 'reschedule' IPI to another CPU.
  429.  * it goes straight through and wastes no time serializing
  430.  * anything. Worst case is that we lose a reschedule ...
  431.  */
  432. void smp_send_reschedule(int cpu)
  433. {
  434. send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
  435. }
  436. /*
  437.  * Structure and data for smp_call_function(). This is designed to minimise
  438.  * static memory requirements. It also looks cleaner.
  439.  */
  440. static spinlock_t call_lock = SPIN_LOCK_UNLOCKED;
  441. struct call_data_struct {
  442. void (*func) (void *info);
  443. void *info;
  444. atomic_t started;
  445. atomic_t finished;
  446. int wait;
  447. };
  448. static struct call_data_struct * call_data;
  449. /*
  450.  * this function sends a 'generic call function' IPI to all other CPUs
  451.  * in the system.
  452.  */
  453. int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
  454. int wait)
  455. /*
  456.  * [SUMMARY] Run a function on all other CPUs.
  457.  * <func> The function to run. This must be fast and non-blocking.
  458.  * <info> An arbitrary pointer to pass to the function.
  459.  * <nonatomic> currently unused.
  460.  * <wait> If true, wait (atomically) until function has completed on other CPUs.
  461.  * [RETURNS] 0 on success, else a negative status code. Does not return until
  462.  * remote CPUs are nearly ready to execute <<func>> or are or have executed.
  463.  *
  464.  * You must not call this function with disabled interrupts or from a
  465.  * hardware interrupt handler, you may call it from a bottom half handler.
  466.  */
  467. {
  468. struct call_data_struct data;
  469. int cpus = smp_num_cpus-1;
  470. if (!cpus)
  471. return 0;
  472. data.func = func;
  473. data.info = info;
  474. atomic_set(&data.started, 0);
  475. data.wait = wait;
  476. if (wait)
  477. atomic_set(&data.finished, 0);
  478. spin_lock_bh(&call_lock);
  479. call_data = &data;
  480. wmb();
  481. /* Send a message to all other CPUs and wait for them to respond */
  482. send_IPI_allbutself(CALL_FUNCTION_VECTOR);
  483. /* Wait for response */
  484. while (atomic_read(&data.started) != cpus)
  485. barrier();
  486. if (wait)
  487. while (atomic_read(&data.finished) != cpus)
  488. barrier();
  489. spin_unlock_bh(&call_lock);
  490. return 0;
  491. }
  492. static void stop_this_cpu (void * dummy)
  493. {
  494. /*
  495.  * Remove this CPU:
  496.  */
  497. clear_bit(smp_processor_id(), &cpu_online_map);
  498. __cli();
  499. disable_local_APIC();
  500. if (cpu_data[smp_processor_id()].hlt_works_ok)
  501. for(;;) __asm__("hlt");
  502. for (;;);
  503. }
  504. /*
  505.  * this function calls the 'stop' function on all other CPUs in the system.
  506.  */
  507. void smp_send_stop(void)
  508. {
  509. smp_call_function(stop_this_cpu, NULL, 1, 0);
  510. smp_num_cpus = 1;
  511. __cli();
  512. disable_local_APIC();
  513. __sti();
  514. }
  515. /*
  516.  * Reschedule call back. Nothing to do,
  517.  * all the work is done automatically when
  518.  * we return from the interrupt.
  519.  */
  520. asmlinkage void smp_reschedule_interrupt(void)
  521. {
  522. ack_APIC_irq();
  523. }
  524. asmlinkage void smp_call_function_interrupt(void)
  525. {
  526. void (*func) (void *info) = call_data->func;
  527. void *info = call_data->info;
  528. int wait = call_data->wait;
  529. ack_APIC_irq();
  530. /*
  531.  * Notify initiating CPU that I've grabbed the data and am
  532.  * about to execute the function
  533.  */
  534. mb();
  535. atomic_inc(&call_data->started);
  536. /*
  537.  * At this point the info structure may be out of scope unless wait==1
  538.  */
  539. (*func)(info);
  540. if (wait) {
  541. mb();
  542. atomic_inc(&call_data->finished);
  543. }
  544. }