From 84998320162a74a0861b7be1fcc230e50f08424a Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Mon, 25 Mar 2013 13:55:37 +0100 Subject: Clean up some errors on closing. If forced close happens, all ioctl's will fail. Some of the handlers also need to be unregistered before the module is unloaded entirely. --- src/drmmode_display.c | 16 ++++++++++++++++ src/nv_driver.c | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 9eca60f..6033a6d 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -627,6 +627,9 @@ drmmode_output_detect(xf86OutputPtr output) drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id); + if (!drmmode_output->mode_output) + return XF86OutputStatusDisconnected; + switch (drmmode_output->mode_output->connection) { case DRM_MODE_CONNECTED: status = XF86OutputStatusConnected; @@ -663,6 +666,9 @@ drmmode_output_get_modes(xf86OutputPtr output) drmModePropertyPtr props; xf86MonPtr ddc_mon = NULL; + if (!koutput) + return NULL; + /* look for an EDID property */ for (i = 0; i < koutput->count_props; i++) { props = drmModeGetProperty(drmmode->fd, koutput->props[i]); @@ -927,6 +933,9 @@ drmmode_output_get_property(xf86OutputPtr output, Atom property) drmModeGetConnector(drmmode->fd, drmmode_output->output_id); } + if (!drmmode_output->mode_output) + return FALSE; + for (i = 0; i < drmmode_output->num_props; i++) { drmmode_prop_ptr p = &drmmode_output->props[i]; if (p->atoms[0] != property) @@ -1437,6 +1446,7 @@ drmmode_uevent_fini(ScrnInfoPtr scrn) if (drmmode->uevent_monitor) { struct udev *u = udev_monitor_get_udev(drmmode->uevent_monitor); + RemoveGeneralSocket(udev_monitor_get_fd(drmmode->uevent_monitor)); udev_monitor_unref(drmmode->uevent_monitor); udev_unref(u); } @@ -1524,6 +1534,12 @@ void drmmode_screen_fini(ScreenPtr pScreen) { ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); + drmmode_ptr drmmode = drmmode_from_scrn(scrn); drmmode_uevent_fini(scrn); + + /* Register a wakeup handler to get informed on DRM events */ + RemoveBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, + drmmode_wakeup_handler, scrn); + RemoveGeneralSocket(drmmode->fd); } diff --git a/src/nv_driver.c b/src/nv_driver.c index 9f62fe2..2b74fc6 100644 --- a/src/nv_driver.c +++ b/src/nv_driver.c @@ -432,8 +432,8 @@ NVLeaveVT(VT_FUNC_ARGS_DECL) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVLeaveVT is called.\n"); ret = drmDropMaster(pNv->dev->fd); - if (ret) - ErrorF("Error dropping master: %d\n", ret); + if (ret && errno != EIO && errno != ENODEV) + ErrorF("Error dropping master: %i(%m)\n", -errno); } static void @@ -624,8 +624,9 @@ NVCloseDRM(ScrnInfoPtr pScrn) { NVPtr pNv = NVPTR(pScrn); - nouveau_device_del(&pNv->dev); drmFree(pNv->drm_device_name); + nouveau_client_del(&pNv->client); + nouveau_device_del(&pNv->dev); } static Bool -- cgit v1.2.3