include/linux/u64_stats_sync.h

Source file repositories/reference/linux-study-clean/include/linux/u64_stats_sync.h

File Facts

System
Linux kernel
Corpus path
include/linux/u64_stats_sync.h
Extension
.h
Size
6175 bytes
Lines
243
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct u64_stats_sync {
#if BITS_PER_LONG == 32
	seqcount_t	seq;
#endif
};

#if BITS_PER_LONG == 64
#include <asm/local64.h>

typedef struct {
	local64_t	v;
} u64_stats_t ;

static inline u64 u64_stats_read(const u64_stats_t *p)
{
	return local64_read(&p->v);
}

static inline void *u64_stats_copy(void *dst, const void *src, size_t len)
{
	BUILD_BUG_ON(len % sizeof(u64_stats_t));
	for (size_t i = 0; i < len / sizeof(u64_stats_t); i++)
		((u64 *)dst)[i] = local64_read(&((local64_t *)src)[i]);
	return dst;
}

static inline void u64_stats_set(u64_stats_t *p, u64 val)
{
	local64_set(&p->v, val);
}

static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
{
	local64_add(val, &p->v);
}

static inline void u64_stats_sub(u64_stats_t *p, s64 val)
{
	local64_sub(val, &p->v);
}

static inline void u64_stats_inc(u64_stats_t *p)
{
	local64_inc(&p->v);
}

static inline void u64_stats_init(struct u64_stats_sync *syncp) { }
static inline void __u64_stats_update_begin(struct u64_stats_sync *syncp) { }
static inline void __u64_stats_update_end(struct u64_stats_sync *syncp) { }
static inline unsigned long __u64_stats_irqsave(void) { return 0; }
static inline void __u64_stats_irqrestore(unsigned long flags) { }
static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp)
{
	return 0;
}
static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp,
					   unsigned int start)
{
	return false;
}

#else /* 64 bit */
#include <linux/string.h>

typedef struct {
	u64		v;
} u64_stats_t;

static inline u64 u64_stats_read(const u64_stats_t *p)
{
	return p->v;
}

static inline void *u64_stats_copy(void *dst, const void *src, size_t len)
{
	BUILD_BUG_ON(len % sizeof(u64_stats_t));
	return memcpy(dst, src, len);
}

static inline void u64_stats_set(u64_stats_t *p, u64 val)
{
	p->v = val;
}

static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
{
	p->v += val;
}

static inline void u64_stats_sub(u64_stats_t *p, s64 val)

Annotation

Implementation Notes