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)
{