mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 06:49:29 -04:00
drm/nouveau/disp: use private spinlock to control exclusive access to disp
nvkm_subdev.mutex is going away. Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Lyude Paul <lyude@redhat.com>
This commit is contained in:
@@ -17,7 +17,10 @@ struct nvkm_disp {
|
||||
struct nvkm_event hpd;
|
||||
struct nvkm_event vblank;
|
||||
|
||||
struct nvkm_oproxy *client;
|
||||
struct {
|
||||
spinlock_t lock;
|
||||
struct nvkm_oproxy *object;
|
||||
} client;
|
||||
};
|
||||
|
||||
int nv04_disp_new(struct nvkm_device *, int, struct nvkm_disp **);
|
||||
|
||||
@@ -149,10 +149,10 @@ static void
|
||||
nvkm_disp_class_del(struct nvkm_oproxy *oproxy)
|
||||
{
|
||||
struct nvkm_disp *disp = nvkm_disp(oproxy->base.engine);
|
||||
mutex_lock(&disp->engine.subdev.mutex);
|
||||
if (disp->client == oproxy)
|
||||
disp->client = NULL;
|
||||
mutex_unlock(&disp->engine.subdev.mutex);
|
||||
spin_lock(&disp->client.lock);
|
||||
if (disp->client.object == oproxy)
|
||||
disp->client.object = NULL;
|
||||
spin_unlock(&disp->client.lock);
|
||||
}
|
||||
|
||||
static const struct nvkm_oproxy_func
|
||||
@@ -175,13 +175,13 @@ nvkm_disp_class_new(struct nvkm_device *device,
|
||||
return ret;
|
||||
*pobject = &oproxy->base;
|
||||
|
||||
mutex_lock(&disp->engine.subdev.mutex);
|
||||
if (disp->client) {
|
||||
mutex_unlock(&disp->engine.subdev.mutex);
|
||||
spin_lock(&disp->client.lock);
|
||||
if (disp->client.object) {
|
||||
spin_unlock(&disp->client.lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
disp->client = oproxy;
|
||||
mutex_unlock(&disp->engine.subdev.mutex);
|
||||
disp->client.object = oproxy;
|
||||
spin_unlock(&disp->client.lock);
|
||||
|
||||
return sclass->ctor(disp, oclass, data, size, &oproxy->object);
|
||||
}
|
||||
@@ -480,6 +480,7 @@ nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device,
|
||||
INIT_LIST_HEAD(&disp->ior);
|
||||
INIT_LIST_HEAD(&disp->outp);
|
||||
INIT_LIST_HEAD(&disp->conn);
|
||||
spin_lock_init(&disp->client.lock);
|
||||
return nvkm_engine_ctor(&nvkm_disp, device, index, true, &disp->engine);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user