#ifndef _LINUX_U64_STATS_SYNC_H
#define _LINUX_U64_STATS_SYNC_H
#include <linux/seqlock.h>
struct u64_stats_sync { … };
#if BITS_PER_LONG == 64
#include <asm/local64.h>
u64_stats_t ;
static inline u64 u64_stats_read(const u64_stats_t *p)
{ … }
static inline void u64_stats_set(u64_stats_t *p, u64 val)
{ … }
static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
{ … }
static inline void u64_stats_inc(u64_stats_t *p)
{ … }
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) { … }
static inline void __u64_stats_irqrestore(unsigned long flags) { … }
static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp)
{ … }
static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp,
unsigned int start)
{ … }
#else
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_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_inc(u64_stats_t *p)
{
p->v++;
}
#define u64_stats_init …
static inline void __u64_stats_update_begin(struct u64_stats_sync *syncp)
{
preempt_disable_nested();
write_seqcount_begin(&syncp->seq);
}
static inline void __u64_stats_update_end(struct u64_stats_sync *syncp)
{
write_seqcount_end(&syncp->seq);
preempt_enable_nested();
}
static inline unsigned long __u64_stats_irqsave(void)
{
unsigned long flags;
local_irq_save(flags);
return flags;
}
static inline void __u64_stats_irqrestore(unsigned long flags)
{
local_irq_restore(flags);
}
static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp)
{
return read_seqcount_begin(&syncp->seq);
}
static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp,
unsigned int start)
{
return read_seqcount_retry(&syncp->seq, start);
}
#endif
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_update_begin_irqsave(struct u64_stats_sync *syncp)
{ … }
static inline void u64_stats_update_end_irqrestore(struct u64_stats_sync *syncp,
unsigned long flags)
{ … }
static inline unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp)
{ … }
static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp,
unsigned int start)
{ … }
#endif