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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __CRIS_SMPLOCK_H
  2. #define __CRIS_SMPLOCK_H
  3. #include <linux/config.h>
  4. #ifdef CONFIG_SMP
  5. #error "SMP is not supported for CRIS"
  6. /*
  7.  * Locking the kernel 
  8.  */
  9.  
  10. extern __inline void lock_kernel(void)
  11. {
  12. unsigned long flags;
  13. int proc = smp_processor_id();
  14. save_flags(flags);
  15. cli();
  16. /* set_bit works atomic in SMP machines */
  17. while(set_bit(0, (void *)&kernel_flag)) 
  18. {
  19. /*
  20.  * We just start another level if we have the lock 
  21.  */
  22. if (proc == active_kernel_processor)
  23. break;
  24. do 
  25. {
  26. #ifdef __SMP_PROF__
  27. smp_spins[smp_processor_id()]++;
  28. #endif
  29. /*
  30.  * Doing test_bit here doesn't lock the bus 
  31.  */
  32. if (test_bit(proc, (void *)&smp_invalidate_needed))
  33. if (clear_bit(proc, (void *)&smp_invalidate_needed))
  34. local_flush_tlb();
  35. }
  36. while(test_bit(0, (void *)&kernel_flag));
  37. }
  38. /* 
  39.  * We got the lock, so tell the world we are here and increment
  40.  * the level counter 
  41.  */
  42. active_kernel_processor = proc;
  43. kernel_counter++;
  44. restore_flags(flags);
  45. }
  46. extern __inline void unlock_kernel(void)
  47. {
  48. unsigned long flags;
  49. save_flags(flags);
  50. cli();
  51. /*
  52.  * If it's the last level we have in the kernel, then
  53.  * free the lock 
  54.  */
  55. if (kernel_counter == 0)
  56. panic("Kernel counter wrong.n"); /* FIXME: Why is kernel_counter sometimes 0 here? */
  57. if(! --kernel_counter) 
  58. {
  59. active_kernel_processor = NO_PROC_ID;
  60. clear_bit(0, (void *)&kernel_flag);
  61. }
  62. restore_flags(flags);
  63. }
  64. #endif
  65. #endif