lib/atomic64.c
Source file repositories/reference/linux-study-clean/lib/atomic64.c
File Facts
- System
- Linux kernel
- Corpus path
lib/atomic64.c- Extension
.c- Size
- 4875 bytes
- Lines
- 208
- Domain
- Kernel Services
- Bucket
- lib
- Inferred role
- Kernel Services: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
Dependency Surface
linux/types.hlinux/cache.hlinux/spinlock.hlinux/init.hlinux/export.hlinux/atomic.h
Detected Declarations
function generic_atomic64_readfunction generic_atomic64_setfunction generic_atomic64_dec_if_positivefunction generic_atomic64_cmpxchgfunction generic_atomic64_xchgfunction generic_atomic64_fetch_add_unlessexport generic_atomic64_readexport generic_atomic64_setexport generic_atomic64_dec_if_positiveexport generic_atomic64_cmpxchgexport generic_atomic64_xchgexport generic_atomic64_fetch_add_unless
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Generic implementation of 64-bit atomics using spinlocks,
* useful on processors that don't have 64-bit atomic instructions.
*
* Copyright © 2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
*/
#include <linux/types.h>
#include <linux/cache.h>
#include <linux/spinlock.h>
#include <linux/init.h>
#include <linux/export.h>
#include <linux/atomic.h>
/*
* We use a hashed array of spinlocks to provide exclusive access
* to each atomic64_t variable. Since this is expected to used on
* systems with small numbers of CPUs (<= 4 or so), we use a
* relatively small array of 16 spinlocks to avoid wasting too much
* memory on the spinlock array.
*/
#define NR_LOCKS 16
/*
* Ensure each lock is in a separate cacheline.
*/
static union {
arch_spinlock_t lock;
char pad[L1_CACHE_BYTES];
} atomic64_lock[NR_LOCKS] __cacheline_aligned_in_smp = {
[0 ... (NR_LOCKS - 1)] = {
.lock = __ARCH_SPIN_LOCK_UNLOCKED,
},
};
static inline arch_spinlock_t *lock_addr(const atomic64_t *v)
{
unsigned long addr = (unsigned long) v;
addr >>= L1_CACHE_SHIFT;
addr ^= (addr >> 8) ^ (addr >> 16);
return &atomic64_lock[addr & (NR_LOCKS - 1)].lock;
}
s64 generic_atomic64_read(const atomic64_t *v)
{
unsigned long flags;
arch_spinlock_t *lock = lock_addr(v);
s64 val;
local_irq_save(flags);
arch_spin_lock(lock);
val = v->counter;
arch_spin_unlock(lock);
local_irq_restore(flags);
return val;
}
EXPORT_SYMBOL(generic_atomic64_read);
void generic_atomic64_set(atomic64_t *v, s64 i)
{
unsigned long flags;
arch_spinlock_t *lock = lock_addr(v);
local_irq_save(flags);
arch_spin_lock(lock);
v->counter = i;
arch_spin_unlock(lock);
local_irq_restore(flags);
}
EXPORT_SYMBOL(generic_atomic64_set);
#define ATOMIC64_OP(op, c_op) \
void generic_atomic64_##op(s64 a, atomic64_t *v) \
{ \
unsigned long flags; \
arch_spinlock_t *lock = lock_addr(v); \
\
local_irq_save(flags); \
arch_spin_lock(lock); \
v->counter c_op a; \
arch_spin_unlock(lock); \
local_irq_restore(flags); \
} \
EXPORT_SYMBOL(generic_atomic64_##op);
#define ATOMIC64_OP_RETURN(op, c_op) \
s64 generic_atomic64_##op##_return(s64 a, atomic64_t *v) \
{ \
unsigned long flags; \
Annotation
- Immediate include surface: `linux/types.h`, `linux/cache.h`, `linux/spinlock.h`, `linux/init.h`, `linux/export.h`, `linux/atomic.h`.
- Detected declarations: `function generic_atomic64_read`, `function generic_atomic64_set`, `function generic_atomic64_dec_if_positive`, `function generic_atomic64_cmpxchg`, `function generic_atomic64_xchg`, `function generic_atomic64_fetch_add_unless`, `export generic_atomic64_read`, `export generic_atomic64_set`, `export generic_atomic64_dec_if_positive`, `export generic_atomic64_cmpxchg`.
- Atlas domain: Kernel Services / lib.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.