Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96692b09 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fence/g84-: protect against concurrent access to semaphore buffers



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 566cf877
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ struct nv84_fence_priv {
	struct nouveau_bo *bo;
	struct nouveau_bo *bo_gart;
	u32 *suspend;
	struct mutex mutex;
};

int  nv84_fence_context_new(struct nouveau_channel *);
+6 −0
Original line number Diff line number Diff line
@@ -107,8 +107,10 @@ nv84_fence_context_del(struct nouveau_channel *chan)
	struct nv84_fence_chan *fctx = chan->fence;

	nouveau_bo_wr32(priv->bo, chan->chid * 16 / 4, fctx->base.sequence);
	mutex_lock(&priv->mutex);
	nouveau_bo_vma_del(priv->bo, &fctx->vma_gart);
	nouveau_bo_vma_del(priv->bo, &fctx->vma);
	mutex_unlock(&priv->mutex);
	nouveau_fence_context_del(&fctx->base);
	chan->fence = NULL;
	nouveau_fence_context_free(&fctx->base);
@@ -134,11 +136,13 @@ nv84_fence_context_new(struct nouveau_channel *chan)
	fctx->base.sync32 = nv84_fence_sync32;
	fctx->base.sequence = nv84_fence_read(chan);

	mutex_lock(&priv->mutex);
	ret = nouveau_bo_vma_add(priv->bo, cli->vm, &fctx->vma);
	if (ret == 0) {
		ret = nouveau_bo_vma_add(priv->bo_gart, cli->vm,
					&fctx->vma_gart);
	}
	mutex_unlock(&priv->mutex);

	if (ret)
		nv84_fence_context_del(chan);
@@ -212,6 +216,8 @@ nv84_fence_create(struct nouveau_drm *drm)
	priv->base.context_base = dma_fence_context_alloc(priv->base.contexts);
	priv->base.uevent = true;

	mutex_init(&priv->mutex);

	/* Use VRAM if there is any ; otherwise fallback to system memory */
	domain = drm->device.info.ram_size != 0 ? TTM_PL_FLAG_VRAM :
			 /*