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

Reply via email to