home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / smp.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.2 KB  |  129 lines

  1. #ifndef __LINUX_SMP_H
  2. #define __LINUX_SMP_H
  3.  
  4. /*
  5.  *    Generic SMP support
  6.  *        Alan Cox. <alan@redhat.com>
  7.  */
  8.  
  9.  
  10. extern void cpu_idle(void);
  11.  
  12. #ifdef CONFIG_SMP
  13.  
  14. #include <linux/preempt.h>
  15. #include <linux/kernel.h>
  16. #include <linux/compiler.h>
  17. #include <linux/thread_info.h>
  18. #include <asm/smp.h>
  19.  
  20. /*
  21.  * main cross-CPU interfaces, handles INIT, TLB flush, STOP, etc.
  22.  * (defined in asm header):
  23.  */ 
  24.  
  25. /*
  26.  * stops all CPUs but the current one:
  27.  */
  28. extern void smp_send_stop(void);
  29.  
  30. /*
  31.  * sends a 'reschedule' event to another CPU:
  32.  */
  33. extern void smp_send_reschedule(int cpu);
  34.  
  35.  
  36. /*
  37.  * Prepare machine for booting other CPUs.
  38.  */
  39. extern void smp_prepare_cpus(unsigned int max_cpus);
  40.  
  41. /*
  42.  * Bring a CPU up
  43.  */
  44. extern int __cpu_up(unsigned int cpunum);
  45.  
  46. /*
  47.  * Final polishing of CPUs
  48.  */
  49. extern void smp_cpus_done(unsigned int max_cpus);
  50.  
  51. /*
  52.  * Call a function on all other processors
  53.  */
  54. int smp_call_function(void(*func)(void *info), void *info, int retry, int wait);
  55.  
  56. /*
  57.  * Call a function on all processors
  58.  */
  59. int on_each_cpu(void (*func) (void *info), void *info, int retry, int wait);
  60.  
  61. #define MSG_ALL_BUT_SELF    0x8000    /* Assume <32768 CPU's */
  62. #define MSG_ALL            0x8001
  63.  
  64. #define MSG_INVALIDATE_TLB    0x0001    /* Remote processor TLB invalidate */
  65. #define MSG_STOP_CPU        0x0002    /* Sent to shut down slave CPU's
  66.                      * when rebooting
  67.                      */
  68. #define MSG_RESCHEDULE        0x0003    /* Reschedule request from master CPU*/
  69. #define MSG_CALL_FUNCTION       0x0004  /* Call function on all other CPUs */
  70.  
  71. /*
  72.  * Mark the boot cpu "online" so that it can call console drivers in
  73.  * printk() and can access its per-cpu storage.
  74.  */
  75. void smp_prepare_boot_cpu(void);
  76.  
  77. #else /* !SMP */
  78.  
  79. /*
  80.  *    These macros fold the SMP functionality into a single CPU system
  81.  */
  82. #define raw_smp_processor_id()            0
  83. #define hard_smp_processor_id()            0
  84. static inline int up_smp_call_function(void)
  85. {
  86.     return 0;
  87. }
  88. #define smp_call_function(func,info,retry,wait)    (up_smp_call_function())
  89. #define on_each_cpu(func,info,retry,wait)    \
  90.     ({                    \
  91.         local_irq_disable();        \
  92.         func(info);            \
  93.         local_irq_enable();        \
  94.         0;                \
  95.     })
  96. static inline void smp_send_reschedule(int cpu) { }
  97. #define num_booting_cpus()            1
  98. #define smp_prepare_boot_cpu()            do {} while (0)
  99.  
  100. #endif /* !SMP */
  101.  
  102. /*
  103.  * smp_processor_id(): get the current CPU ID.
  104.  *
  105.  * if DEBUG_PREEMPT is enabled the we check whether it is
  106.  * used in a preemption-safe way. (smp_processor_id() is safe
  107.  * if it's used in a preemption-off critical section, or in
  108.  * a thread that is bound to the current CPU.)
  109.  *
  110.  * NOTE: raw_smp_processor_id() is for internal use only
  111.  * (smp_processor_id() is the preferred variant), but in rare
  112.  * instances it might also be used to turn off false positives
  113.  * (i.e. smp_processor_id() use that the debugging code reports but
  114.  * which use for some reason is legal). Don't use this to hack around
  115.  * the warning message, as your code might not work under PREEMPT.
  116.  */
  117. #ifdef CONFIG_DEBUG_PREEMPT
  118.   extern unsigned int debug_smp_processor_id(void);
  119. # define smp_processor_id() debug_smp_processor_id()
  120. #else
  121. # define smp_processor_id() raw_smp_processor_id()
  122. #endif
  123.  
  124. #define get_cpu()        ({ preempt_disable(); smp_processor_id(); })
  125. #define put_cpu()        preempt_enable()
  126. #define put_cpu_no_resched()    preempt_enable_no_resched()
  127.  
  128. #endif /* __LINUX_SMP_H */
  129.