percpu_counter.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_PERCPU_COUNTER_H
  2. #define _LINUX_PERCPU_COUNTER_H
  3. /*
  4.  * A simple "approximate counter" for use in ext2 and ext3 superblocks.
  5.  *
  6.  * WARNING: these things are HUGE.  4 kbytes per counter on 32-way P4.
  7.  */
  8. #include <linux/config.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/smp.h>
  11. #include <linux/threads.h>
  12. #include <linux/percpu.h>
  13. #ifdef CONFIG_SMP
  14. struct percpu_counter {
  15. spinlock_t lock;
  16. long count;
  17. long *counters;
  18. };
  19. #if NR_CPUS >= 16
  20. #define FBC_BATCH (NR_CPUS*2)
  21. #else
  22. #define FBC_BATCH (NR_CPUS*4)
  23. #endif
  24. static inline void percpu_counter_init(struct percpu_counter *fbc)
  25. {
  26. spin_lock_init(&fbc->lock);
  27. fbc->count = 0;
  28. fbc->counters = alloc_percpu(long);
  29. }
  30. static inline void percpu_counter_destroy(struct percpu_counter *fbc)
  31. {
  32. free_percpu(fbc->counters);
  33. }
  34. void percpu_counter_mod(struct percpu_counter *fbc, long amount);
  35. static inline long percpu_counter_read(struct percpu_counter *fbc)
  36. {
  37. return fbc->count;
  38. }
  39. /*
  40.  * It is possible for the percpu_counter_read() to return a small negative
  41.  * number for some counter which should never be negative.
  42.  */
  43. static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
  44. {
  45. long ret = fbc->count;
  46. barrier(); /* Prevent reloads of fbc->count */
  47. if (ret > 0)
  48. return ret;
  49. return 1;
  50. }
  51. #else
  52. struct percpu_counter {
  53. long count;
  54. };
  55. static inline void percpu_counter_init(struct percpu_counter *fbc)
  56. {
  57. fbc->count = 0;
  58. }
  59. static inline void percpu_counter_destroy(struct percpu_counter *fbc)
  60. {
  61. }
  62. static inline void
  63. percpu_counter_mod(struct percpu_counter *fbc, long amount)
  64. {
  65. preempt_disable();
  66. fbc->count += amount;
  67. preempt_enable();
  68. }
  69. static inline long percpu_counter_read(struct percpu_counter *fbc)
  70. {
  71. return fbc->count;
  72. }
  73. static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
  74. {
  75. return fbc->count;
  76. }
  77. #endif /* CONFIG_SMP */
  78. static inline void percpu_counter_inc(struct percpu_counter *fbc)
  79. {
  80. percpu_counter_mod(fbc, 1);
  81. }
  82. static inline void percpu_counter_dec(struct percpu_counter *fbc)
  83. {
  84. percpu_counter_mod(fbc, -1);
  85. }
  86. #endif /* _LINUX_PERCPU_COUNTER_H */