[mutter] monitor-manager-kms: Don't try to wait for EDID on hot plug
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-manager-kms: Don't try to wait for EDID on hot plug
- Date: Sat, 11 Mar 2017 01:18:59 +0000 (UTC)
commit eb3ff3f44ac4daf06279c6e566e4fcb99ff1988d
Author: Jonas Ådahl <jadahl gmail com>
Date: Fri Mar 10 16:55:53 2017 +0800
monitor-manager-kms: Don't try to wait for EDID on hot plug
The mitigation to avoid missing EDID blob was incorrect; the reason it
sometimes failed to read was a race between different applications all
trying to read the EDID at the same time. E.g. gnome-shell as GDM would
at the same time as the session gnome-shell try to read the EDID of the
same connector at the same time, triggering a race in the kernel,
making the blob reading ioctl occationally fail with ENOENT.
Remove this mitigation, as it didn't really mitigate anything; the race
could just as well happen when doing the actual read later.
https://bugzilla.gnome.org/show_bug.cgi?id=779837
src/backends/native/meta-monitor-manager-kms.c | 130 ------------------------
1 files changed, 0 insertions(+), 130 deletions(-)
---
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 5256b47..2025676 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -52,10 +52,6 @@
#define ALL_TRANSFORMS_MASK ((1 << ALL_TRANSFORMS) - 1)
#define SYNC_TOLERANCE 0.01 /* 1 percent */
-/* Try each 50 milleseconds up to half a second to get a proper EDID read */
-#define EDID_RETRY_TIMEOUT_MS 50
-#define EDID_MAX_NUM_RETRIES 10
-
typedef struct
{
drmModeConnector *connector;
@@ -117,9 +113,6 @@ struct _MetaMonitorManagerKms
GSettings *desktop_settings;
gboolean page_flips_not_supported;
-
- guint handle_hotplug_timeout;
- int read_edid_tries;
};
struct _MetaMonitorManagerKmsClass
@@ -1595,76 +1588,6 @@ meta_monitor_manager_kms_set_crtc_gamma (MetaMonitorManager *manager,
drmModeCrtcSetGamma (manager_kms->fd, crtc->crtc_id, size, red, green, blue);
}
-static gboolean
-has_pending_edid_blob (MetaMonitorManagerKms *manager_kms)
-{
- drmModeRes *resources;
- int n_connectors;
- int i, j;
- gboolean edid_blob_pending;
-
- resources = drmModeGetResources (manager_kms->fd);
- n_connectors = resources->count_connectors;
-
- edid_blob_pending = FALSE;
- for (i = 0; i < n_connectors; i++)
- {
- drmModeConnector *drm_connector;
- uint32_t edid_blob_id;
-
- drm_connector = drmModeGetConnector (manager_kms->fd,
- resources->connectors[i]);
-
- edid_blob_id = 0;
- for (j = 0; j < drm_connector->count_props; j++)
- {
- drmModePropertyPtr prop;
-
- prop = drmModeGetProperty (manager_kms->fd, drm_connector->props[j]);
-
- if (prop->flags & DRM_MODE_PROP_BLOB &&
- g_str_equal (prop->name, "EDID"))
- edid_blob_id = drm_connector->prop_values[j];
-
- drmModeFreeProperty (prop);
-
- if (edid_blob_id)
- break;
- }
-
- drmModeFreeConnector (drm_connector);
-
- if (edid_blob_id)
- {
- GError *error = NULL;
- drmModePropertyBlobPtr edid_blob;
-
- edid_blob = read_edid_blob (manager_kms, edid_blob_id, &error);
- if (!edid_blob &&
- g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
- {
- edid_blob_pending = TRUE;
- g_error_free (error);
- }
- else if (!edid_blob)
- {
- g_error_free (error);
- }
- else
- {
- drmModeFreePropertyBlob (edid_blob);
- }
- }
-
- if (edid_blob_pending)
- break;
- }
-
- drmModeFreeResources (resources);
-
- return edid_blob_pending;
-}
-
static void
handle_hotplug_event (MetaMonitorManager *manager)
{
@@ -1672,37 +1595,6 @@ handle_hotplug_event (MetaMonitorManager *manager)
meta_monitor_manager_on_hotplug (manager);
}
-static gboolean
-handle_hotplug_event_timeout (gpointer user_data)
-{
- MetaMonitorManager *manager = user_data;
- MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (user_data);
-
- if (!has_pending_edid_blob (manager_kms))
- {
- handle_hotplug_event (manager);
-
- manager_kms->handle_hotplug_timeout = 0;
- return G_SOURCE_REMOVE;
- }
-
- manager_kms->read_edid_tries++;
-
- if (manager_kms->read_edid_tries > EDID_MAX_NUM_RETRIES)
- {
- g_warning ("Tried to read the EDID %d times, "
- "but one or more are still missing, continuing without",
- manager_kms->read_edid_tries);
-
- handle_hotplug_event (manager);
-
- manager_kms->handle_hotplug_timeout = 0;
- return G_SOURCE_REMOVE;
- }
-
- return G_SOURCE_CONTINUE;
-}
-
static void
on_uevent (GUdevClient *client,
const char *action,
@@ -1715,28 +1607,6 @@ on_uevent (GUdevClient *client,
if (!g_udev_device_get_property_as_boolean (device, "HOTPLUG"))
return;
- if (manager_kms->handle_hotplug_timeout)
- {
- g_source_remove (manager_kms->handle_hotplug_timeout);
- manager_kms->handle_hotplug_timeout = 0;
- }
-
- /*
- * On a hot-plug event, the EDID of one or more connectors might not yet be
- * ready at this point, resulting in invalid configuration potentially being
- * applied. Avoid this by first checking whether the EDID is ready at this
- * point, or otherwise wait a bit and try again.
- */
- manager_kms->read_edid_tries = 0;
- if (has_pending_edid_blob (manager_kms))
- {
- manager_kms->handle_hotplug_timeout =
- g_timeout_add (EDID_RETRY_TIMEOUT_MS,
- handle_hotplug_event_timeout,
- manager);
- return;
- }
-
handle_hotplug_event (manager);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]