Module Name: src
Committed By: riastradh
Date: Sun Dec 19 11:53:33 UTC 2021
Modified Files:
src/sys/external/bsd/drm2/linux: linux_dma_resv.c
Log Message:
drm: Use atomic_store_release/load_consume in linux_dma_resv.c.
At least, for robj->fence and robj->fence_excl. Need to review
list->shared_count and list->shared[i] too.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/linux/linux_dma_resv.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/linux/linux_dma_resv.c
diff -u src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.5 src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.6
--- src/sys/external/bsd/drm2/linux/linux_dma_resv.c:1.5 Sun Dec 19 11:52:55 2021
+++ src/sys/external/bsd/drm2/linux/linux_dma_resv.c Sun Dec 19 11:53:33 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_dma_resv.c,v 1.5 2021/12/19 11:52:55 riastradh Exp $ */
+/* $NetBSD: linux_dma_resv.c,v 1.6 2021/12/19 11:53:33 riastradh Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_dma_resv.c,v 1.5 2021/12/19 11:52:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_dma_resv.c,v 1.6 2021/12/19 11:53:33 riastradh Exp $");
#include <sys/param.h>
#include <sys/poll.h>
@@ -464,7 +464,7 @@ dma_resv_add_excl_fence(struct dma_resv
dma_resv_write_begin(robj, &ticket);
/* Replace the fence and zero the shared count. */
- robj->fence_excl = fence;
+ atomic_store_release(&robj->fence_excl, fence);
if (old_list)
old_list->shared_count = 0;
@@ -573,7 +573,7 @@ dma_resv_add_shared_fence(struct dma_res
dma_resv_write_begin(robj, &ticket);
/* Replace the list. */
- robj->fence = prealloc;
+ atomic_store_release(&robj->fence, prealloc);
robj->robj_prealloc = NULL;
/* Commit the update. */
@@ -629,11 +629,7 @@ top:
dma_resv_read_begin(robj, &ticket);
/* If there is a shared list, grab it. */
- list = robj->fence;
- __insn_barrier();
- if (list) {
- /* Make sure the content of the list has been published. */
- membar_datadep_consumer();
+ if ((list = atomic_load_consume(&robj->fence)) != NULL) {
/* Check whether we have a buffer. */
if (shared == NULL) {
@@ -642,7 +638,6 @@ top:
* one without waiting.
*/
shared_alloc = list->shared_max;
- __insn_barrier();
shared = kcalloc(shared_alloc, sizeof(shared[0]),
GFP_NOWAIT);
if (shared == NULL) {
@@ -665,7 +660,6 @@ top:
* out and wait to allocate a bigger one.
*/
shared_alloc = list->shared_max;
- __insn_barrier();
rcu_read_unlock();
kfree(shared);
shared = kcalloc(shared_alloc, sizeof(shared[0]),
@@ -686,12 +680,7 @@ top:
}
/* If there is an exclusive fence, grab it. */
- fence = robj->fence_excl;
- __insn_barrier();
- if (fence) {
- /* Make sure the content of the fence has been published. */
- membar_datadep_consumer();
- }
+ fence = atomic_load_consume(&robj->fence_excl);
/*
* We are done reading from robj and list. Validate our
@@ -770,11 +759,7 @@ top:
dma_resv_read_begin(src_robj, &read_ticket);
/* Get the shared list. */
- src_list = src_robj->fence;
- __insn_barrier();
- if (src_list) {
- /* Make sure the content of the list has been published. */
- membar_datadep_consumer();
+ if ((src_list = atomic_load_consume(&src_robj->fence)) != NULL) {
/* Find out how long it is. */
shared_count = src_list->shared_count;
@@ -808,11 +793,7 @@ top:
}
/* Get the exclusive fence. */
- fence = src_robj->fence_excl;
- __insn_barrier();
- if (fence != NULL) {
- /* Make sure the content of the fence has been published. */
- membar_datadep_consumer();
+ if ((fence = atomic_load_consume(&src_robj->fence_excl)) != NULL) {
/*
* Make sure we saw a consistent snapshot of the fence.
@@ -853,8 +834,9 @@ top:
dma_resv_write_begin(dst_robj, &write_ticket);
/* Replace the fences. */
- dst_robj->fence = dst_list;
- dst_robj->fence_excl = fence;
+ membar_exit();
+ atomic_store_relaxed(&dst_robj->fence, dst_list);
+ atomic_store_relaxed(&dst_robj->fence_excl, fence);
/* Commit the update. */
dma_resv_write_commit(dst_robj, &write_ticket);
@@ -918,11 +900,7 @@ top:
/* If shared is requested and there is a shared list, test it. */
if (!shared)
goto excl;
- list = robj->fence;
- __insn_barrier();
- if (list) {
- /* Make sure the content of the list has been published. */
- membar_datadep_consumer();
+ if ((list = atomic_load_consume(&robj->fence)) != NULL) {
/* Find out how long it is. */
shared_count = list->shared_count;
@@ -953,11 +931,7 @@ top:
excl:
/* If there is an exclusive fence, test it. */
- fence = robj->fence_excl;
- __insn_barrier();
- if (fence) {
- /* Make sure the content of the fence has been published. */
- membar_datadep_consumer();
+ if ((fence = atomic_load_consume(&robj->fence_excl)) != NULL) {
/*
* Make sure we saw a consistent snapshot of the fence.
@@ -1022,11 +996,7 @@ top:
/* If shared is requested and there is a shared list, wait on it. */
if (!shared)
goto excl;
- list = robj->fence;
- __insn_barrier();
- if (list) {
- /* Make sure the content of the list has been published. */
- membar_datadep_consumer();
+ if ((list = atomic_load_consume(&robj->fence)) != NULL) {
/* Find out how long it is. */
shared_count = list->shared_count;
@@ -1056,11 +1026,7 @@ top:
excl:
/* If there is an exclusive fence, test it. */
- fence = robj->fence_excl;
- __insn_barrier();
- if (fence) {
- /* Make sure the content of the fence has been published. */
- membar_datadep_consumer();
+ if ((fence = atomic_load_consume(&robj->fence_excl)) != NULL) {
/*
* Make sure we saw a consistent snapshot of the fence.
@@ -1202,11 +1168,7 @@ top:
/* If we want to wait for all fences, get the shared list. */
if (!(events & POLLOUT))
goto excl;
- list = robj->fence;
- __insn_barrier();
- if (list) do {
- /* Make sure the content of the list has been published. */
- membar_datadep_consumer();
+ if ((list = atomic_load_consume(&robj->fence)) != NULL) do {
/* Find out how long it is. */
shared_count = list->shared_count;
@@ -1277,11 +1239,7 @@ top:
excl:
/* We always wait for at least the exclusive fence, so get it. */
- fence = robj->fence_excl;
- __insn_barrier();
- if (fence) do {
- /* Make sure the content of the fence has been published. */
- membar_datadep_consumer();
+ if ((fence = atomic_load_consume(&robj->fence_excl)) != NULL) do {
/*
* Make sure we saw a consistent snapshot of the fence.