Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 27 15:11:17 UTC 2018

Modified Files:
        src/sys/external/bsd/drm2/include/linux: atomic.h
        src/sys/external/bsd/drm2/linux: linux_atomic64.c

Log Message:
Implement atomic64_add_return and atomic64_inc_return.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/external/bsd/drm2/include/linux/atomic.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/linux/linux_atomic64.c

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/atomic.h
diff -u src/sys/external/bsd/drm2/include/linux/atomic.h:1.18 src/sys/external/bsd/drm2/include/linux/atomic.h:1.19
--- src/sys/external/bsd/drm2/include/linux/atomic.h:1.18	Mon Aug 27 15:11:04 2018
+++ src/sys/external/bsd/drm2/include/linux/atomic.h	Mon Aug 27 15:11:17 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic.h,v 1.18 2018/08/27 15:11:04 riastradh Exp $	*/
+/*	$NetBSD: atomic.h,v 1.19 2018/08/27 15:11:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -264,6 +264,18 @@ atomic64_sub(int64_t d, struct atomic64 
 	atomic_add_64(&a->a_v, -d);
 }
 
+static inline int64_t
+atomic64_add_return(int64_t d, struct atomic64 *a)
+{
+	int64_t v;
+
+	smp_mb__before_atomic();
+	v = (int64_t)atomic_add_64_nv(&a->a_v, d);
+	smp_mb__after_atomic();
+
+	return v;
+}
+
 static inline uint64_t
 atomic64_xchg(struct atomic64 *a, uint64_t new)
 {
@@ -296,6 +308,7 @@ atomic64_cmpxchg(struct atomic64 *atomic
 #else  /* !defined(__HAVE_ATOMIC64_OPS) */
 
 #define	atomic64_add		linux_atomic64_add
+#define	atomic64_add_return	linux_atomic64_add_return
 #define	atomic64_cmpxchg	linux_atomic64_cmpxchg
 #define	atomic64_read		linux_atomic64_read
 #define	atomic64_set		linux_atomic64_set
@@ -306,11 +319,18 @@ uint64_t	atomic64_read(const struct atom
 void		atomic64_set(struct atomic64 *, uint64_t);
 void		atomic64_add(int64_t, struct atomic64 *);
 void		atomic64_sub(int64_t, struct atomic64 *);
+int64_t		atomic64_add_return(int64_t, struct atomic64 *);
 uint64_t	atomic64_xchg(struct atomic64 *, uint64_t);
 uint64_t	atomic64_cmpxchg(struct atomic64 *, uint64_t, uint64_t);
 
 #endif
 
+static inline int64_t
+atomic64_inc_return(struct atomic64 *a)
+{
+	return atomic64_add_return(1, a);
+}
+
 struct atomic_long {
 	volatile unsigned long	al_v;
 };

Index: src/sys/external/bsd/drm2/linux/linux_atomic64.c
diff -u src/sys/external/bsd/drm2/linux/linux_atomic64.c:1.2 src/sys/external/bsd/drm2/linux/linux_atomic64.c:1.3
--- src/sys/external/bsd/drm2/linux/linux_atomic64.c:1.2	Mon Aug 27 15:10:53 2018
+++ src/sys/external/bsd/drm2/linux/linux_atomic64.c	Mon Aug 27 15:11:17 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_atomic64.c,v 1.2 2018/08/27 15:10:53 riastradh Exp $	*/
+/*	$NetBSD: linux_atomic64.c,v 1.3 2018/08/27 15:11:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_atomic64.c,v 1.2 2018/08/27 15:10:53 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_atomic64.c,v 1.3 2018/08/27 15:11:17 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/bitops.h>
@@ -164,6 +164,18 @@ atomic64_sub(int64_t delta, struct atomi
 	atomic64_unlock(a);
 }
 
+int64_t
+atomic64_add_return(int64_t delta, struct atomic64 *a)
+{
+	int64_t v;
+
+	atomic64_lock(a);
+	v = (int64_t)(a->a_v += delta);
+	atomic64_unlock(a);
+
+	return v;
+}
+
 uint64_t
 atomic64_xchg(struct atomic64 *a, uint64_t new)
 {

Reply via email to