Module Name:    src
Committed By:   riastradh
Date:           Tue Oct 25 23:33:44 UTC 2022

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/vmwgfx: vmwgfx_cmdbuf.c

Log Message:
vmwgfx(4): Convert cmdbuf to drm_waitqueue_t.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.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/dist/drm/vmwgfx/vmwgfx_cmdbuf.c
diff -u src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.5 src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c:1.5	Tue Oct 25 23:32:04 2022
+++ src/sys/external/bsd/drm2/dist/drm/vmwgfx/vmwgfx_cmdbuf.c	Tue Oct 25 23:33:44 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfx_cmdbuf.c,v 1.5 2022/10/25 23:32:04 riastradh Exp $	*/
+/*	$NetBSD: vmwgfx_cmdbuf.c,v 1.6 2022/10/25 23:33:44 riastradh Exp $	*/
 
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /**************************************************************************
@@ -28,7 +28,7 @@
  **************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfx_cmdbuf.c,v 1.5 2022/10/25 23:32:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfx_cmdbuf.c,v 1.6 2022/10/25 23:33:44 riastradh Exp $");
 
 #include <linux/dmapool.h>
 #include <linux/pci.h>
@@ -132,8 +132,8 @@ struct vmw_cmdbuf_man {
 	spinlock_t lock;
 	struct dma_pool *headers;
 	struct dma_pool *dheaders;
-	wait_queue_head_t alloc_queue;
-	wait_queue_head_t idle_queue;
+	drm_waitqueue_t alloc_queue;
+	drm_waitqueue_t idle_queue;
 	bool irq_on;
 	bool using_mob;
 	bool has_pool;
@@ -276,7 +276,7 @@ static void __vmw_cmdbuf_header_free(str
 	}
 
 	drm_mm_remove_node(&header->node);
-	wake_up_all(&man->alloc_queue);
+	DRM_SPIN_WAKEUP_ALL(&man->alloc_queue, &man->lock); /* XXX */
 	if (header->cb_header)
 		dma_pool_free(man->headers, header->cb_header,
 			      header->handle);
@@ -391,6 +391,8 @@ static void vmw_cmdbuf_ctx_process(struc
 {
 	struct vmw_cmdbuf_header *entry, *next;
 
+	assert_spin_locked(&man->lock);
+
 	vmw_cmdbuf_ctx_submit(man, ctx);
 
 	list_for_each_entry_safe(entry, next, &ctx->hw_submitted, list) {
@@ -400,7 +402,7 @@ static void vmw_cmdbuf_ctx_process(struc
 			break;
 
 		list_del(&entry->list);
-		wake_up_all(&man->idle_queue);
+		DRM_SPIN_WAKEUP_ONE(&man->idle_queue, &man->lock);
 		ctx->num_hw_submitted--;
 		switch (status) {
 		case SVGA_CB_STATUS_COMPLETED:
@@ -448,6 +450,8 @@ static void vmw_cmdbuf_man_process(struc
 	struct vmw_cmdbuf_context *ctx;
 	int i;
 
+	assert_spin_locked(&man->lock);
+
 retry:
 	notempty = 0;
 	for_each_cmdbuf_ctx(man, i, ctx)
@@ -622,7 +626,9 @@ static void vmw_cmdbuf_work_func(struct 
 	/* Send a new fence in case one was removed */
 	if (send_fence) {
 		vmw_fifo_send_fence(man->dev_priv, &dummy);
-		wake_up_all(&man->idle_queue);
+		spin_lock(&man->lock);
+		DRM_SPIN_WAKEUP_ALL(&man->idle_queue, &man->lock);
+		spin_unlock(&man->lock);
 	}
 
 	mutex_unlock(&man->error_mutex);
@@ -642,20 +648,19 @@ static bool vmw_cmdbuf_man_idle(struct v
 	bool idle = false;
 	int i;
 
-	spin_lock(&man->lock);
+	assert_spin_locked(&man->lock);
+
 	vmw_cmdbuf_man_process(man);
 	for_each_cmdbuf_ctx(man, i, ctx) {
 		if (!list_empty(&ctx->submitted) ||
 		    !list_empty(&ctx->hw_submitted) ||
 		    (check_preempted && !list_empty(&ctx->preempted)))
-			goto out_unlock;
+			goto out;
 	}
 
 	idle = list_empty(&man->error);
 
-out_unlock:
-	spin_unlock(&man->lock);
-
+out:
 	return idle;
 }
 
@@ -732,18 +737,17 @@ int vmw_cmdbuf_idle(struct vmw_cmdbuf_ma
 	int ret;
 
 	ret = vmw_cmdbuf_cur_flush(man, interruptible);
+	spin_lock(&man->lock);
 	vmw_generic_waiter_add(man->dev_priv,
 			       SVGA_IRQFLAG_COMMAND_BUFFER,
 			       &man->dev_priv->cmdbuf_waiters);
-
 	if (interruptible) {
-		ret = wait_event_interruptible_timeout
-			(man->idle_queue, vmw_cmdbuf_man_idle(man, true),
-			 timeout);
+		DRM_SPIN_TIMED_WAIT_UNTIL(ret, &man->idle_queue, &man->lock,
+		    timeout, vmw_cmdbuf_man_idle(man, true));
 	} else {
-		ret = wait_event_timeout
-			(man->idle_queue, vmw_cmdbuf_man_idle(man, true),
-			 timeout);
+		DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, &man->idle_queue,
+		    &man->lock,
+		    timeout, vmw_cmdbuf_man_idle(man, true));
 	}
 	vmw_generic_waiter_remove(man->dev_priv,
 				  SVGA_IRQFLAG_COMMAND_BUFFER,
@@ -754,6 +758,7 @@ int vmw_cmdbuf_idle(struct vmw_cmdbuf_ma
 		else
 			ret = 0;
 	}
+	spin_unlock(&man->lock);
 	if (ret > 0)
 		ret = 0;
 
@@ -825,6 +830,7 @@ static int vmw_cmdbuf_alloc_space(struct
 	} else {
 		mutex_lock(&man->space_mutex);
 	}
+	spin_lock(&man->lock);
 
 	/* Try to allocate space without waiting. */
 	if (vmw_cmdbuf_try_alloc(man, &info))
@@ -837,23 +843,29 @@ static int vmw_cmdbuf_alloc_space(struct
 	if (interruptible) {
 		int ret;
 
-		ret = wait_event_interruptible
-			(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info));
+		DRM_SPIN_WAIT_UNTIL(ret, &man->alloc_queue, &man->lock,
+		    vmw_cmdbuf_try_alloc(man, &info));
 		if (ret) {
 			vmw_generic_waiter_remove
 				(man->dev_priv, SVGA_IRQFLAG_COMMAND_BUFFER,
 				 &man->dev_priv->cmdbuf_waiters);
+			spin_unlock(&man->lock);
 			mutex_unlock(&man->space_mutex);
 			return ret;
 		}
 	} else {
-		wait_event(man->alloc_queue, vmw_cmdbuf_try_alloc(man, &info));
+		int ret;
+
+		DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &man->alloc_queue, &man->lock,
+		    vmw_cmdbuf_try_alloc(man, &info));
+		BUG_ON(ret);
 	}
 	vmw_generic_waiter_remove(man->dev_priv,
 				  SVGA_IRQFLAG_COMMAND_BUFFER,
 				  &man->dev_priv->cmdbuf_waiters);
 
 out_unlock:
+	spin_unlock(&man->lock);
 	mutex_unlock(&man->space_mutex);
 
 	return 0;
@@ -1387,8 +1399,8 @@ struct vmw_cmdbuf_man *vmw_cmdbuf_man_cr
 	mutex_init(&man->space_mutex);
 	mutex_init(&man->error_mutex);
 	man->default_size = VMW_CMDBUF_INLINE_SIZE;
-	init_waitqueue_head(&man->alloc_queue);
-	init_waitqueue_head(&man->idle_queue);
+	DRM_INIT_WAITQUEUE(&man->alloc_queue, "vmwgfxaq");
+	DRM_INIT_WAITQUEUE(&man->idle_queue, "vmwgfxiq");
 	man->dev_priv = dev_priv;
 	man->max_hw_submitted = SVGA_CB_MAX_QUEUED_PER_CONTEXT - 1;
 	INIT_WORK(&man->work, &vmw_cmdbuf_work_func);
@@ -1468,8 +1480,11 @@ void vmw_cmdbuf_man_destroy(struct vmw_c
 	(void) cancel_work_sync(&man->work);
 	dma_pool_destroy(man->dheaders);
 	dma_pool_destroy(man->headers);
+	DRM_DESTROY_WAITQUEUE(&man->idle_queue);
+	DRM_DESTROY_WAITQUEUE(&man->alloc_queue);
 	mutex_destroy(&man->cur_mutex);
 	mutex_destroy(&man->space_mutex);
 	mutex_destroy(&man->error_mutex);
+	spin_lock_destroy(&man->lock);
 	kfree(man);
 }

Reply via email to