Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:21:38 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/include/linux: reservation.h
        src/sys/external/bsd/drm2/linux: linux_reservation.c

Log Message:
Linux API wants seqcount exposed in reservation object, so do that.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 \
    src/sys/external/bsd/drm2/include/linux/reservation.h
cvs rdiff -u -r1.17 -r1.18 \
    src/sys/external/bsd/drm2/linux/linux_reservation.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/reservation.h
diff -u src/sys/external/bsd/drm2/include/linux/reservation.h:1.12 src/sys/external/bsd/drm2/include/linux/reservation.h:1.13
--- src/sys/external/bsd/drm2/include/linux/reservation.h:1.12	Sun Dec 19 01:20:53 2021
+++ src/sys/external/bsd/drm2/include/linux/reservation.h	Sun Dec 19 01:21:37 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: reservation.h,v 1.12 2021/12/19 01:20:53 riastradh Exp $	*/
+/*	$NetBSD: reservation.h,v 1.13 2021/12/19 01:21:37 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -34,12 +34,13 @@
 
 #include <linux/dma-fence.h>
 #include <linux/rcupdate.h>
+#include <linux/seqlock.h>
 #include <linux/ww_mutex.h>
 
 struct reservation_object {
 	struct ww_mutex		lock;
+	struct seqcount		count;
 
-	unsigned				robj_version;
 	struct dma_fence __rcu			*robj_fence;
 	struct reservation_object_list __rcu	*robj_list;
 	struct reservation_object_list __rcu	*robj_prealloc;

Index: src/sys/external/bsd/drm2/linux/linux_reservation.c
diff -u src/sys/external/bsd/drm2/linux/linux_reservation.c:1.17 src/sys/external/bsd/drm2/linux/linux_reservation.c:1.18
--- src/sys/external/bsd/drm2/linux/linux_reservation.c:1.17	Sun Dec 19 01:20:30 2021
+++ src/sys/external/bsd/drm2/linux/linux_reservation.c	Sun Dec 19 01:21:38 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_reservation.c,v 1.17 2021/12/19 01:20:30 riastradh Exp $	*/
+/*	$NetBSD: linux_reservation.c,v 1.18 2021/12/19 01:21:38 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_reservation.c,v 1.17 2021/12/19 01:20:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_reservation.c,v 1.18 2021/12/19 01:21:38 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/poll.h>
@@ -38,6 +38,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_reserv
 
 #include <linux/dma-fence.h>
 #include <linux/reservation.h>
+#include <linux/seqlock.h>
 #include <linux/ww_mutex.h>
 
 DEFINE_WW_CLASS(reservation_ww_class __cacheline_aligned);
@@ -90,7 +91,7 @@ reservation_object_init(struct reservati
 {
 
 	ww_mutex_init(&robj->lock, &reservation_ww_class);
-	robj->robj_version = 0;
+	seqcount_init(&robj->count);
 	robj->robj_fence = NULL;
 	robj->robj_list = NULL;
 	robj->robj_prealloc = NULL;
@@ -289,7 +290,6 @@ reservation_object_reserve_shared(struct
 }
 
 struct reservation_object_write_ticket {
-	unsigned version;
 };
 
 /*
@@ -308,8 +308,7 @@ reservation_object_write_begin(struct re
 
 	KASSERT(reservation_object_held(robj));
 
-	ticket->version = robj->robj_version |= 1;
-	membar_producer();
+	write_seqcount_begin(&robj->count);
 }
 
 /*
@@ -326,11 +325,8 @@ reservation_object_write_commit(struct r
 {
 
 	KASSERT(reservation_object_held(robj));
-	KASSERT(ticket->version == robj->robj_version);
-	KASSERT((ticket->version & 1) == 1);
 
-	membar_producer();
-	robj->robj_version = ticket->version + 1;
+	write_seqcount_end(&robj->count);
 }
 
 struct reservation_object_read_ticket {
@@ -349,9 +345,7 @@ reservation_object_read_begin(struct res
     struct reservation_object_read_ticket *ticket)
 {
 
-	while ((ticket->version = robj->robj_version) & 1)
-		SPINLOCK_BACKOFF_HOOK;
-	membar_consumer();
+	ticket->version = read_seqcount_begin(&robj->count);
 }
 
 /*
@@ -366,8 +360,7 @@ reservation_object_read_valid(struct res
     struct reservation_object_read_ticket *ticket)
 {
 
-	membar_consumer();
-	return ticket->version == robj->robj_version;
+	return !read_seqcount_retry(&robj->count, ticket->version);
 }
 
 /*

Reply via email to