include/linux/percpu_counter.h
Source file repositories/reference/linux-study-clean/include/linux/percpu_counter.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/percpu_counter.h- Extension
.h- Size
- 6977 bytes
- Lines
- 287
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/spinlock.hlinux/smp.hlinux/list.hlinux/threads.hlinux/percpu.hlinux/types.h
Detected Declarations
struct percpu_counterstruct percpu_counterfunction percpu_counter_destroyfunction percpu_counter_comparefunction percpu_counter_addfunction percpu_counter_limited_addfunction percpu_counter_add_localfunction percpu_counter_sum_positivefunction percpu_counter_sumfunction percpu_counter_readfunction percpu_counter_readfunction percpu_counter_initializedfunction percpu_counter_init_manyfunction percpu_counter_initfunction percpu_counter_destroy_manyfunction percpu_counter_comparefunction __percpu_counter_comparefunction percpu_counter_addfunction percpu_counter_limited_addfunction percpu_counter_add_localfunction percpu_counter_add_batchfunction percpu_counter_readfunction percpu_counter_read_positivefunction percpu_counter_sum_positivefunction percpu_counter_sumfunction percpu_counter_initializedfunction percpu_counter_syncfunction percpu_counter_decfunction percpu_counter_subfunction percpu_counter_sub_local
Annotated Snippet
struct percpu_counter {
raw_spinlock_t lock;
s64 count;
#ifdef CONFIG_HOTPLUG_CPU
struct list_head list; /* All percpu_counters are on a list */
#endif
s32 __percpu *counters;
};
extern int percpu_counter_batch;
int __percpu_counter_init_many(struct percpu_counter *fbc, s64 amount,
gfp_t gfp, u32 nr_counters,
struct lock_class_key *key);
#define percpu_counter_init_many(fbc, value, gfp, nr_counters) \
({ \
static struct lock_class_key __key; \
\
__percpu_counter_init_many(fbc, value, gfp, nr_counters,\
&__key); \
})
#define percpu_counter_init(fbc, value, gfp) \
percpu_counter_init_many(fbc, value, gfp, 1)
void percpu_counter_destroy_many(struct percpu_counter *fbc, u32 nr_counters);
static inline void percpu_counter_destroy(struct percpu_counter *fbc)
{
percpu_counter_destroy_many(fbc, 1);
}
void percpu_counter_set(struct percpu_counter *fbc, s64 amount);
void percpu_counter_add_batch(struct percpu_counter *fbc, s64 amount,
s32 batch);
s64 __percpu_counter_sum(struct percpu_counter *fbc);
int __percpu_counter_compare(struct percpu_counter *fbc, s64 rhs, s32 batch);
bool __percpu_counter_limited_add(struct percpu_counter *fbc, s64 limit,
s64 amount, s32 batch);
void percpu_counter_sync(struct percpu_counter *fbc);
static inline int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs)
{
return __percpu_counter_compare(fbc, rhs, percpu_counter_batch);
}
static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount)
{
percpu_counter_add_batch(fbc, amount, percpu_counter_batch);
}
static inline bool
percpu_counter_limited_add(struct percpu_counter *fbc, s64 limit, s64 amount)
{
return __percpu_counter_limited_add(fbc, limit, amount,
percpu_counter_batch);
}
/*
* With percpu_counter_add_local() and percpu_counter_sub_local(), counts
* are accumulated in local per cpu counter and not in fbc->count until
* local count overflows PERCPU_COUNTER_LOCAL_BATCH. This makes counter
* write efficient.
* But percpu_counter_sum(), instead of percpu_counter_read(), needs to be
* used to add up the counts from each CPU to account for all the local
* counts. So percpu_counter_add_local() and percpu_counter_sub_local()
* should be used when a counter is updated frequently and read rarely.
*/
static inline void
percpu_counter_add_local(struct percpu_counter *fbc, s64 amount)
{
percpu_counter_add_batch(fbc, amount, PERCPU_COUNTER_LOCAL_BATCH);
}
static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc)
{
s64 ret = __percpu_counter_sum(fbc);
return ret < 0 ? 0 : ret;
}
static inline s64 percpu_counter_sum(struct percpu_counter *fbc)
{
return __percpu_counter_sum(fbc);
}
static inline s64 percpu_counter_read(struct percpu_counter *fbc)
{
return fbc->count;
}
Annotation
- Immediate include surface: `linux/spinlock.h`, `linux/smp.h`, `linux/list.h`, `linux/threads.h`, `linux/percpu.h`, `linux/types.h`.
- Detected declarations: `struct percpu_counter`, `struct percpu_counter`, `function percpu_counter_destroy`, `function percpu_counter_compare`, `function percpu_counter_add`, `function percpu_counter_limited_add`, `function percpu_counter_add_local`, `function percpu_counter_sum_positive`, `function percpu_counter_sum`, `function percpu_counter_read`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.