Skip to content

Commit

Permalink
lib: percpu_counter variable batch
Browse files Browse the repository at this point in the history
Because the current batch setup has an quadric error bound on the counter,
allow for an alternative setup.

Signed-off-by: Peter Zijlstra <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Peter Zijlstra authored and Linus Torvalds committed Oct 17, 2007
1 parent 3cb4f9f commit 252e0ba
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
10 changes: 9 additions & 1 deletion include/linux/percpu_counter.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,14 @@ struct percpu_counter {

void percpu_counter_init(struct percpu_counter *fbc, s64 amount);
void percpu_counter_destroy(struct percpu_counter *fbc);
void percpu_counter_add(struct percpu_counter *fbc, s32 amount);
void __percpu_counter_add(struct percpu_counter *fbc, s32 amount, s32 batch);
s64 percpu_counter_sum(struct percpu_counter *fbc);

static inline void percpu_counter_add(struct percpu_counter *fbc, s32 amount)
{
__percpu_counter_add(fbc, amount, FBC_BATCH);
}

static inline s64 percpu_counter_read(struct percpu_counter *fbc)
{
return fbc->count;
Expand Down Expand Up @@ -70,6 +75,9 @@ static inline void percpu_counter_destroy(struct percpu_counter *fbc)
{
}

#define __percpu_counter_add(fbc, amount, batch) \
percpu_counter_add(fbc, amount)

static inline void
percpu_counter_add(struct percpu_counter *fbc, s32 amount)
{
Expand Down
6 changes: 3 additions & 3 deletions lib/percpu_counter.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ static LIST_HEAD(percpu_counters);
static DEFINE_MUTEX(percpu_counters_lock);
#endif

void percpu_counter_add(struct percpu_counter *fbc, s32 amount)
void __percpu_counter_add(struct percpu_counter *fbc, s32 amount, s32 batch)
{
long count;
s32 *pcount;
int cpu = get_cpu();

pcount = per_cpu_ptr(fbc->counters, cpu);
count = *pcount + amount;
if (count >= FBC_BATCH || count <= -FBC_BATCH) {
if (count >= batch || count <= -batch) {
spin_lock(&fbc->lock);
fbc->count += count;
*pcount = 0;
Expand All @@ -32,7 +32,7 @@ void percpu_counter_add(struct percpu_counter *fbc, s32 amount)
}
put_cpu();
}
EXPORT_SYMBOL(percpu_counter_add);
EXPORT_SYMBOL(__percpu_counter_add);

/*
* Add up all the per-cpu counts, return the result. This is a more accurate
Expand Down

0 comments on commit 252e0ba

Please sign in to comment.