Commit 7363d6be authored by John Ogness's avatar John Ogness Committed by Karol Herbst
Browse files

drm/nouveau: fix incorrect conversion to dma_resv_wait_timeout()



Commit 41d351f2 ("drm/nouveau: stop using ttm_bo_wait")
converted from ttm_bo_wait_ctx() to dma_resv_wait_timeout().
However, dma_resv_wait_timeout() returns greater than zero on
success as opposed to ttm_bo_wait_ctx(). As a result, relocs
will fail and log errors even when it was a success.

Change the return code handling to match that of
nouveau_gem_ioctl_cpu_prep(), which was already using
dma_resv_wait_timeout() correctly.

Fixes: 41d351f2 ("drm/nouveau: stop using ttm_bo_wait")
Reported-by: default avatarTanmay Bhushan <007047221b@gmail.com>
Link: https://lore.kernel.org/lkml/20230119225351.71657-1-007047221b@gmail.com


Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarKarol Herbst <kherbst@redhat.com>
Signed-off-by: default avatarKarol Herbst <kherbst@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87edolaomt.fsf@jogness.linutronix.de
parent afa965a4
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -645,7 +645,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
				struct drm_nouveau_gem_pushbuf_reloc *reloc,
				struct drm_nouveau_gem_pushbuf_bo *bo)
{
	long ret = 0;
	int ret = 0;
	unsigned i;

	for (i = 0; i < req->nr_relocs; i++) {
@@ -653,6 +653,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
		struct drm_nouveau_gem_pushbuf_bo *b;
		struct nouveau_bo *nvbo;
		uint32_t data;
		long lret;

		if (unlikely(r->bo_index >= req->nr_buffers)) {
			NV_PRINTK(err, cli, "reloc bo index invalid\n");
@@ -703,13 +704,18 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
				data |= r->vor;
		}

		ret = dma_resv_wait_timeout(nvbo->bo.base.resv,
		lret = dma_resv_wait_timeout(nvbo->bo.base.resv,
					     DMA_RESV_USAGE_BOOKKEEP,
					     false, 15 * HZ);
		if (ret == 0)
		if (!lret)
			ret = -EBUSY;
		else if (lret > 0)
			ret = 0;
		else
			ret = lret;

		if (ret) {
			NV_PRINTK(err, cli, "reloc wait_idle failed: %ld\n",
			NV_PRINTK(err, cli, "reloc wait_idle failed: %d\n",
				  ret);
			break;
		}