diff options
Diffstat (limited to 'lib/percpu_counter.c')
-rw-r--r-- | lib/percpu_counter.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/percpu_counter.c b/lib/percpu_counter.c index aeaa6d734447..ec9048e74f44 100644 --- a/lib/percpu_counter.c +++ b/lib/percpu_counter.c | |||
@@ -137,6 +137,33 @@ static int __cpuinit percpu_counter_hotcpu_callback(struct notifier_block *nb, | |||
137 | return NOTIFY_OK; | 137 | return NOTIFY_OK; |
138 | } | 138 | } |
139 | 139 | ||
140 | /* | ||
141 | * Compare counter against given value. | ||
142 | * Return 1 if greater, 0 if equal and -1 if less | ||
143 | */ | ||
144 | int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs) | ||
145 | { | ||
146 | s64 count; | ||
147 | |||
148 | count = percpu_counter_read(fbc); | ||
149 | /* Check to see if rough count will be sufficient for comparison */ | ||
150 | if (abs(count - rhs) > (percpu_counter_batch*num_online_cpus())) { | ||
151 | if (count > rhs) | ||
152 | return 1; | ||
153 | else | ||
154 | return -1; | ||
155 | } | ||
156 | /* Need to use precise count */ | ||
157 | count = percpu_counter_sum(fbc); | ||
158 | if (count > rhs) | ||
159 | return 1; | ||
160 | else if (count < rhs) | ||
161 | return -1; | ||
162 | else | ||
163 | return 0; | ||
164 | } | ||
165 | EXPORT_SYMBOL(percpu_counter_compare); | ||
166 | |||
140 | static int __init percpu_counter_startup(void) | 167 | static int __init percpu_counter_startup(void) |
141 | { | 168 | { |
142 | compute_batch_value(); | 169 | compute_batch_value(); |