xf86-video-intel: src/intel_device.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Aug 8 23:17:50 PDT 2014
src/intel_device.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
New commits:
commit dea65e8be73b79c50f7ee59c54c4c75cbcff67fb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Aug 9 07:12:23 2014 +0100
intel: Log open clients on master takeover fail
If we fail to claim the DRM device as master, dump /debugfs/.../clients
so that we can check to see who failed to drop master for us.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/intel_device.c b/src/intel_device.c
index 8be38c1..11d95be 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -74,6 +74,80 @@ struct intel_device {
static int intel_device_key = -1;
+static int dump_file(ScrnInfoPtr scrn, const char *path)
+{
+ FILE *file;
+ size_t len = 0;
+ char *line = NULL;
+
+ file = fopen(path, "r");
+ if (file == NULL)
+ return 0;
+
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "[drm] Contents of '%s':\n", path);
+ while (getline(&line, &len, file) != -1)
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "[drm] %s", line);
+
+ free(line);
+ fclose(file);
+ return 1;
+}
+
+static int __find_debugfs(void)
+{
+ int i;
+
+ for (i = 0; i < DRM_MAX_MINOR; i++) {
+ char path[80];
+
+ sprintf(path, "/sys/kernel/debug/dri/%d/i915_wedged", i);
+ if (access(path, R_OK) == 0)
+ return i;
+
+ sprintf(path, "/debug/dri/%d/i915_wedged", i);
+ if (access(path, R_OK) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+static int drm_get_minor(int fd)
+{
+ struct stat st;
+
+ if (fstat(fd, &st))
+ return __find_debugfs();
+
+ if (!S_ISCHR(st.st_mode))
+ return __find_debugfs();
+
+ return st.st_rdev & 0x63;
+}
+
+static void dump_debugfs(ScrnInfoPtr scrn, int fd, const char *name)
+{
+ char path[80];
+ int minor;
+
+ minor = drm_get_minor(fd);
+ if (minor < 0)
+ return;
+
+ sprintf(path, "/sys/kernel/debug/dri/%d/%s", minor, name);
+ if (dump_file(scrn, path))
+ return;
+
+ sprintf(path, "/debug/dri/%d/%s", minor, name);
+ if (dump_file(scrn, path))
+ return;
+}
+
+static void dump_clients_info(ScrnInfoPtr scrn, int fd)
+{
+ dump_debugfs(scrn, fd, "clients");
+}
+
static int __intel_get_device_id(int fd)
{
struct drm_i915_getparam gp;
@@ -572,6 +646,7 @@ int intel_get_device(ScrnInfoPtr scrn)
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
"[drm] failed to set drm interface version: %s [%d].\n",
strerror(errno), errno);
+ dump_clients_info(scrn, dev->fd);
dev->open_count--;
return -1;
}
More information about the xorg-commit
mailing list