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

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