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_ */