Marcin Slusarz
2011-Dec-11 20:02 UTC
[Nouveau] [PATCH] drm/nouveau: cleanup after display init failure
Depending on exact point of failure, not cleaning would lead to
BUG_ONs/oopses in various distant places.
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
drivers/gpu/drm/nouveau/nouveau_display.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c
b/drivers/gpu/drm/nouveau/nouveau_display.c
index 05f1692..bea7a41 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -304,14 +304,21 @@ nouveau_display_create(struct drm_device *dev)
ret = disp->create(dev);
if (ret)
- return ret;
+ goto disp_create_err;
if (dev->mode_config.num_crtc) {
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
if (ret)
- return ret;
+ goto vblank_err;
}
+ return 0;
+
+vblank_err:
+ disp->destroy(dev);
+disp_create_err:
+ drm_kms_helper_poll_fini(dev);
+ drm_mode_config_cleanup(dev);
return ret;
}
--
1.7.8.rc3
Marcin Slusarz
2011-Dec-22 16:55 UTC
[Nouveau] [PATCH] drm/nouveau: cleanup after display init failure
On Sun, Dec 11, 2011 at 09:02:05PM +0100, Marcin Slusarz wrote:> Depending on exact point of failure, not cleaning would lead to > BUG_ONs/oopses in various distant places. > > Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com> > --- > drivers/gpu/drm/nouveau/nouveau_display.c | 11 +++++++++-- > 1 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c > index 05f1692..bea7a41 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_display.c > +++ b/drivers/gpu/drm/nouveau/nouveau_display.c > @@ -304,14 +304,21 @@ nouveau_display_create(struct drm_device *dev) > > ret = disp->create(dev); > if (ret) > - return ret; > + goto disp_create_err; > > if (dev->mode_config.num_crtc) { > ret = drm_vblank_init(dev, dev->mode_config.num_crtc); > if (ret) > - return ret; > + goto vblank_err; > } > > + return 0; > + > +vblank_err: > + disp->destroy(dev); > +disp_create_err: > + drm_kms_helper_poll_fini(dev); > + drm_mode_config_cleanup(dev); > return ret; > } > > --ping