smp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

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 doesn't 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_cacheline_t kernel_flag_cacheline = {SPIN_LOCK_UNLOCKED};
  102. struct tlb_state cpu_tlbstate[NR_CPUS] __cacheline_aligned = {[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 | INT_DEST_ADDR_MODE;
  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.  * We need to reload %cr3 since the page tables may be going
  264.  * away frm under us...
  265.  */
  266. static void inline leave_mm (unsigned long cpu)
  267. {
  268. BUG_ON(cpu_tlbstate[cpu].state == TLBSTATE_OK);
  269. clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
  270. load_cr3(swapper_pg_dir);
  271. }
  272. /*
  273.  *
  274.  * The flush IPI assumes that a thread switch happens in this order:
  275.  * [cpu0: the cpu that switches]
  276.  * 1) switch_mm() either 1a) or 1b)
  277.  * 1a) thread switch to a different mm
  278.  * 1a1) clear_bit(cpu, &old_mm->cpu_vm_mask);
  279.  *  Stop ipi delivery for the old mm. This is not synchronized with
  280.  *  the other cpus, but smp_invalidate_interrupt ignore flush ipis
  281.  *  for the wrong mm, and in the worst case we perform a superflous
  282.  *  tlb flush.
  283.  * 1a2) set cpu_tlbstate to TLBSTATE_OK
  284.  *  Now the smp_invalidate_interrupt won't call leave_mm if cpu0
  285.  * was in lazy tlb mode.
  286.  * 1a3) update cpu_tlbstate[].active_mm
  287.  *  Now cpu0 accepts tlb flushes for the new mm.
  288.  * 1a4) set_bit(cpu, &new_mm->cpu_vm_mask);
  289.  *  Now the other cpus will send tlb flush ipis.
  290.  * 1a4) change cr3.
  291.  * 1b) thread switch without mm change
  292.  * cpu_tlbstate[].active_mm is correct, cpu0 already handles
  293.  * flush ipis.
  294.  * 1b1) set cpu_tlbstate to TLBSTATE_OK
  295.  * 1b2) test_and_set the cpu bit in cpu_vm_mask.
  296.  *  Atomically set the bit [other cpus will start sending flush ipis],
  297.  *  and test the bit.
  298.  * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
  299.  * 2) switch %%esp, ie current
  300.  *
  301.  * The interrupt must handle 2 special cases:
  302.  * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
  303.  * - the cpu performs speculative tlb reads, i.e. even if the cpu only
  304.  *   runs in kernel space, the cpu could load tlb entries for user space
  305.  *   pages.
  306.  *
  307.  * The good news is that cpu_tlbstate is local to each cpu, no
  308.  * write/read ordering problems.
  309.  */
  310. /*
  311.  * TLB flush IPI:
  312.  *
  313.  * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
  314.  * 2) Leave the mm if we are in the lazy tlb mode.
  315.  */
  316. asmlinkage void smp_invalidate_interrupt (void)
  317. {
  318. unsigned long cpu = smp_processor_id();
  319. if (!test_bit(cpu, &flush_cpumask))
  320. return;
  321. /* 
  322.  * This was a BUG() but until someone can quote me the
  323.  * line from the intel manual that guarantees an IPI to
  324.  * multiple CPUs is retried _only_ on the erroring CPUs
  325.  * its staying as a return
  326.  *
  327.  * BUG();
  328.  */
  329.  
  330. if (flush_mm == cpu_tlbstate[cpu].active_mm) {
  331. if (cpu_tlbstate[cpu].state == TLBSTATE_OK) {
  332. if (flush_va == FLUSH_ALL)
  333. local_flush_tlb();
  334. else
  335. __flush_tlb_one(flush_va);
  336. } else
  337. leave_mm(cpu);
  338. }
  339. ack_APIC_irq();
  340. clear_bit(cpu, &flush_cpumask);
  341. }
  342. static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
  343. unsigned long va)
  344. {
  345. /*
  346.  * A couple of (to be removed) sanity checks:
  347.  *
  348.  * - we do not send IPIs to not-yet booted CPUs.
  349.  * - current CPU must not be in mask
  350.  * - mask must exist :)
  351.  */
  352. if (!cpumask)
  353. BUG();
  354. if ((cpumask & cpu_online_map) != cpumask)
  355. BUG();
  356. if (cpumask & (1 << smp_processor_id()))
  357. BUG();
  358. if (!mm)
  359. BUG();
  360. /*
  361.  * i'm not happy about this global shared spinlock in the
  362.  * MM hot path, but we'll see how contended it is.
  363.  * Temporarily this turns IRQs off, so that lockups are
  364.  * detected by the NMI watchdog.
  365.  */
  366. spin_lock(&tlbstate_lock);
  367. flush_mm = mm;
  368. flush_va = va;
  369. atomic_set_mask(cpumask, &flush_cpumask);
  370. /*
  371.  * We have to send the IPI only to
  372.  * CPUs affected.
  373.  */
  374. send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
  375. while (flush_cpumask)
  376. /* nothing. lockup detection does not belong here */;
  377. flush_mm = NULL;
  378. flush_va = 0;
  379. spin_unlock(&tlbstate_lock);
  380. }
  381. void flush_tlb_current_task(void)
  382. {
  383. struct mm_struct *mm = current->mm;
  384. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  385. local_flush_tlb();
  386. if (cpu_mask)
  387. flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
  388. }
  389. void flush_tlb_mm (struct mm_struct * mm)
  390. {
  391. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  392. if (current->active_mm == mm) {
  393. if (current->mm)
  394. local_flush_tlb();
  395. else
  396. leave_mm(smp_processor_id());
  397. }
  398. if (cpu_mask)
  399. flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
  400. }
  401. void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
  402. {
  403. struct mm_struct *mm = vma->vm_mm;
  404. unsigned long cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
  405. if (current->active_mm == mm) {
  406. if(current->mm)
  407. __flush_tlb_one(va);
  408.  else
  409.   leave_mm(smp_processor_id());
  410. }
  411. if (cpu_mask)
  412. flush_tlb_others(cpu_mask, mm, va);
  413. }
  414. static inline void do_flush_tlb_all_local(void)
  415. {
  416. unsigned long cpu = smp_processor_id();
  417. __flush_tlb_all();
  418. if (cpu_tlbstate[cpu].state == TLBSTATE_LAZY)
  419. leave_mm(cpu);
  420. }
  421. static void flush_tlb_all_ipi(void* info)
  422. {
  423. do_flush_tlb_all_local();
  424. }
  425. void flush_tlb_all(void)
  426. {
  427. smp_call_function (flush_tlb_all_ipi,0,1,1);
  428. do_flush_tlb_all_local();
  429. }
  430. /*
  431.  * this function sends a 'reschedule' IPI to another CPU.
  432.  * it goes straight through and wastes no time serializing
  433.  * anything. Worst case is that we lose a reschedule ...
  434.  */
  435. void smp_send_reschedule(int cpu)
  436. {
  437. send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
  438. }
  439. /*
  440.  * Structure and data for smp_call_function(). This is designed to minimise
  441.  * static memory requirements. It also looks cleaner.
  442.  */
  443. static spinlock_t call_lock = SPIN_LOCK_UNLOCKED;
  444. struct call_data_struct {
  445. void (*func) (void *info);
  446. void *info;
  447. atomic_t started;
  448. atomic_t finished;
  449. int wait;
  450. };
  451. static struct call_data_struct * call_data;
  452. /*
  453.  * this function sends a 'generic call function' IPI to all other CPUs
  454.  * in the system.
  455.  */
  456. int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
  457. int wait)
  458. /*
  459.  * [SUMMARY] Run a function on all other CPUs.
  460.  * <func> The function to run. This must be fast and non-blocking.
  461.  * <info> An arbitrary pointer to pass to the function.
  462.  * <nonatomic> currently unused.
  463.  * <wait> If true, wait (atomically) until function has completed on other CPUs.
  464.  * [RETURNS] 0 on success, else a negative status code. Does not return until
  465.  * remote CPUs are nearly ready to execute <<func>> or are or have executed.
  466.  *
  467.  * You must not call this function with disabled interrupts or from a
  468.  * hardware interrupt handler or from a bottom half handler.
  469.  */
  470. {
  471. struct call_data_struct data;
  472. int cpus = smp_num_cpus-1;
  473. if (!cpus)
  474. return 0;
  475. data.func = func;
  476. data.info = info;
  477. atomic_set(&data.started, 0);
  478. data.wait = wait;
  479. if (wait)
  480. atomic_set(&data.finished, 0);
  481. spin_lock(&call_lock);
  482. call_data = &data;
  483. wmb();
  484. /* Send a message to all other CPUs and wait for them to respond */
  485. send_IPI_allbutself(CALL_FUNCTION_VECTOR);
  486. /* Wait for response */
  487. while (atomic_read(&data.started) != cpus)
  488. barrier();
  489. if (wait)
  490. while (atomic_read(&data.finished) != cpus)
  491. barrier();
  492. spin_unlock(&call_lock);
  493. return 0;
  494. }
  495. static void stop_this_cpu (void * dummy)
  496. {
  497. /*
  498.  * Remove this CPU:
  499.  */
  500. clear_bit(smp_processor_id(), &cpu_online_map);
  501. __cli();
  502. disable_local_APIC();
  503. if (cpu_data[smp_processor_id()].hlt_works_ok)
  504. for(;;) __asm__("hlt");
  505. for (;;);
  506. }
  507. /*
  508.  * this function calls the 'stop' function on all other CPUs in the system.
  509.  */
  510. void smp_send_stop(void)
  511. {
  512. smp_call_function(stop_this_cpu, NULL, 1, 0);
  513. smp_num_cpus = 1;
  514. __cli();
  515. disable_local_APIC();
  516. __sti();
  517. }
  518. /*
  519.  * Reschedule call back. Nothing to do,
  520.  * all the work is done automatically when
  521.  * we return from the interrupt.
  522.  */
  523. asmlinkage void smp_reschedule_interrupt(void)
  524. {
  525. ack_APIC_irq();
  526. }
  527. asmlinkage void smp_call_function_interrupt(void)
  528. {
  529. void (*func) (void *info) = call_data->func;
  530. void *info = call_data->info;
  531. int wait = call_data->wait;
  532. ack_APIC_irq();
  533. /*
  534.  * Notify initiating CPU that I've grabbed the data and am
  535.  * about to execute the function
  536.  */
  537. mb();
  538. atomic_inc(&call_data->started);
  539. /*
  540.  * At this point the info structure may be out of scope unless wait==1
  541.  */
  542. (*func)(info);
  543. if (wait) {
  544. mb();
  545. atomic_inc(&call_data->finished);
  546. }
  547. }