Module Name: src Committed By: riastradh Date: Sun Dec 19 00:47:41 UTC 2021
Modified Files: src/sys/external/bsd/drm2/include/linux: seqlock.h Log Message: Implement <linux/seqlock.h>. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/include/linux/seqlock.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/include/linux/seqlock.h diff -u src/sys/external/bsd/drm2/include/linux/seqlock.h:1.1 src/sys/external/bsd/drm2/include/linux/seqlock.h:1.2 --- src/sys/external/bsd/drm2/include/linux/seqlock.h:1.1 Sun Dec 19 00:28:12 2021 +++ src/sys/external/bsd/drm2/include/linux/seqlock.h Sun Dec 19 00:47:40 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: seqlock.h,v 1.1 2021/12/19 00:28:12 riastradh Exp $ */ +/* $NetBSD: seqlock.h,v 1.2 2021/12/19 00:47:40 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -32,4 +32,71 @@ #ifndef _LINUX_SEQLOCK_H_ #define _LINUX_SEQLOCK_H_ +#include <sys/types.h> +#include <sys/atomic.h> +#include <sys/lock.h> + +#include <lib/libkern/libkern.h> + +struct seqlock { + uint64_t sql_gen; +}; + +typedef struct seqlock seqlock_t; + +static inline void +seqlock_init(struct seqlock *seqlock) +{ + + seqlock->sql_gen = 0; +} + +static inline void +write_seqlock(struct seqlock *seqlock) +{ + + KASSERT((seqlock->sql_gen & 1) == 0); + seqlock->sql_gen |= 1; + membar_producer(); +} + +static inline void +write_sequnlock(struct seqlock *seqlock) +{ + + KASSERT((seqlock->sql_gen & 1) == 1); + membar_producer(); + seqlock->sql_gen |= 1; /* paraonia */ + seqlock->sql_gen++; +} + +#define write_seqlock_irqsave(SEQLOCK, FLAGS) do { \ + (FLAGS) = (unsigned long)splvm(); \ + write_seqlock(SEQLOCK); \ +} while (0) + +#define write_sequnlock_irqrestore(SEQLOCK, FLAGS) do { \ + write_seqlock(SEQLOCK); \ + splx((int)(FLAGS)); \ +} while (0) + +static inline uint64_t +read_seqbegin(struct seqlock *seqlock) +{ + uint64_t gen; + + while ((gen = seqlock->sql_gen) & 1) + SPINLOCK_BACKOFF_HOOK; + membar_consumer(); + + return gen; +} + +static inline bool +read_seqretry(struct seqlock *seqlock, uint64_t gen) +{ + + return gen != seqlock->sql_gen; +} + #endif /* _LINUX_SEQLOCK_H_ */