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

Commit 6ff8c76a authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mc: fix race condition between constructor and request_irq()



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0ff42c5a
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ nouveau_mc(void *obj)
	return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC];
}

#define nouveau_mc_create(p,e,o,d)                                             \
	nouveau_mc_create_((p), (e), (o), sizeof(**d), (void **)d)
#define nouveau_mc_create(p,e,o,m,d)                                           \
	nouveau_mc_create_((p), (e), (o), (m), sizeof(**d), (void **)d)
#define nouveau_mc_destroy(p) ({                                               \
	struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc));        \
})
@@ -33,7 +33,8 @@ nouveau_mc(void *obj)
})

int  nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *,
			struct nouveau_oclass *, int, void **);
			struct nouveau_oclass *, const struct nouveau_mc_intr *,
			int, void **);
void _nouveau_mc_dtor(struct nouveau_object *);
int  _nouveau_mc_init(struct nouveau_object *);
int  _nouveau_mc_fini(struct nouveau_object *, bool);
+5 −1
Original line number Diff line number Diff line
@@ -80,7 +80,9 @@ _nouveau_mc_dtor(struct nouveau_object *object)

int
nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
		   struct nouveau_oclass *oclass, int length, void **pobject)
		   struct nouveau_oclass *oclass,
		   const struct nouveau_mc_intr *intr_map,
		   int length, void **pobject)
{
	struct nouveau_device *device = nv_device(parent);
	struct nouveau_mc *pmc;
@@ -92,6 +94,8 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
	if (ret)
		return ret;

	pmc->intr_map = intr_map;

	ret = request_irq(device->pdev->irq, nouveau_mc_intr,
			  IRQF_SHARED, "nouveau", pmc);
	if (ret < 0)
+1 −2
Original line number Diff line number Diff line
@@ -50,12 +50,11 @@ nv04_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	struct nv04_mc_priv *priv;
	int ret;

	ret = nouveau_mc_create(parent, engine, oclass, &priv);
	ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;

	priv->base.intr_map = nv04_mc_intr;
	return 0;
}

+1 −2
Original line number Diff line number Diff line
@@ -36,12 +36,11 @@ nv44_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	struct nv44_mc_priv *priv;
	int ret;

	ret = nouveau_mc_create(parent, engine, oclass, &priv);
	ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;

	priv->base.intr_map = nv04_mc_intr;
	return 0;
}

+1 −2
Original line number Diff line number Diff line
@@ -53,12 +53,11 @@ nv50_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	struct nv50_mc_priv *priv;
	int ret;

	ret = nouveau_mc_create(parent, engine, oclass, &priv);
	ret = nouveau_mc_create(parent, engine, oclass, nv50_mc_intr, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;

	priv->base.intr_map = nv50_mc_intr;
	return 0;
}

Loading