Message ID | 1409914519-15683-1-git-send-email-thomas.wood@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Sep 05, 2014 at 11:55:19AM +0100, Thomas Wood wrote: > Avoid calling functions in igt_reset_connectors that are not safe to use > in signal handlers by keeping a list of connectors that have been > modified, instead of enumerating all connectors. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83498 > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> > Signed-off-by: Thomas Wood <thomas.wood@intel.com> > --- > lib/igt_kms.c | 50 +++++++++++++++++++++++++++++++++----------------- > 1 file changed, 33 insertions(+), 17 deletions(-) > > diff --git a/lib/igt_kms.c b/lib/igt_kms.c > index f483e2d..933e6fb 100644 > --- a/lib/igt_kms.c > +++ b/lib/igt_kms.c > @@ -54,6 +54,9 @@ > #define DRM_PLANE_TYPE_PRIMARY 1 > #define DRM_PLANE_TYPE_CURSOR 2 > > +/* list of connectors that need resetting on exit */ > +#define MAX_CONNECTORS 32 > +static char *forced_connectors[MAX_CONNECTORS]; Need to leave space for the sentinel NULL value. static char *forced_connectors[MAX_CONNECTORS + 1]; > /** > @@ -341,9 +344,9 @@ static char* get_debugfs_connector_path(int drm_fd, drmModeConnector *connector, > bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, > enum kmstest_force_connector_state state) > { > - char *path; > + char *path, **tmp; > const char *value; > - int debugfs_fd, ret; > + int debugfs_fd, ret, len; > > switch (state) { > case FORCE_CONNECTOR_ON: > @@ -364,7 +367,6 @@ bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, > > path = get_debugfs_connector_path(drm_fd, connector, "force"); > debugfs_fd = open(path, O_WRONLY | O_TRUNC); > - free(path); > > if (debugfs_fd == -1) { > return false; > @@ -373,6 +375,27 @@ bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, > ret = write(debugfs_fd, value, strlen(value)); > close(debugfs_fd); > > + for (len = 0, tmp = forced_connectors; *tmp; tmp++) { > + /* check the connector is not already present */ > + if (strcmp(*tmp, path) == 0) { > + len = -1; > + break; > + } > + len++; > + } if (len >= MAX_CONNECTORS) len = -1; -Chris
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index f483e2d..933e6fb 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -54,6 +54,9 @@ #define DRM_PLANE_TYPE_PRIMARY 1 #define DRM_PLANE_TYPE_CURSOR 2 +/* list of connectors that need resetting on exit */ +#define MAX_CONNECTORS 32 +static char *forced_connectors[MAX_CONNECTORS]; /** @@ -341,9 +344,9 @@ static char* get_debugfs_connector_path(int drm_fd, drmModeConnector *connector, bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, enum kmstest_force_connector_state state) { - char *path; + char *path, **tmp; const char *value; - int debugfs_fd, ret; + int debugfs_fd, ret, len; switch (state) { case FORCE_CONNECTOR_ON: @@ -364,7 +367,6 @@ bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, path = get_debugfs_connector_path(drm_fd, connector, "force"); debugfs_fd = open(path, O_WRONLY | O_TRUNC); - free(path); if (debugfs_fd == -1) { return false; @@ -373,6 +375,27 @@ bool kmstest_force_connector(int drm_fd, drmModeConnector *connector, ret = write(debugfs_fd, value, strlen(value)); close(debugfs_fd); + for (len = 0, tmp = forced_connectors; *tmp; tmp++) { + /* check the connector is not already present */ + if (strcmp(*tmp, path) == 0) { + len = -1; + break; + } + len++; + } + + if (len != -1) + forced_connectors[len] = path; + + igt_debug("Connector %s is now forced %s\n", path, value); + igt_debug("Current forced connectors:\n"); + tmp = forced_connectors; + while (*tmp) { + igt_debug("\t%s\n", *tmp); + tmp++; + } + + igt_assert(ret != -1); return (ret == -1) ? false : true; } @@ -1643,21 +1666,14 @@ void igt_enable_connectors(void) */ void igt_reset_connectors(void) { - drmModeRes *res; - drmModeConnector *c; - int drm_fd; - - drm_fd = drm_open_any(); - res = drmModeGetResources(drm_fd); - - for (int i = 0; i < res->count_connectors; i++) { - - c = drmModeGetConnector(drm_fd, res->connectors[i]); + char **tmp; - kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_UNSPECIFIED); + /* reset the connectors stored in forced_connectors, avoiding any + * functions that are not safe to call in signal handlers */ - drmModeFreeConnector(c); + for (tmp = forced_connectors; *tmp; tmp++) { + int fd = open(*tmp, O_WRONLY | O_TRUNC); + write(fd, "unspecified", 11); + close(fd); } - - close(drm_fd); }
Avoid calling functions in igt_reset_connectors that are not safe to use in signal handlers by keeping a list of connectors that have been modified, instead of enumerating all connectors. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83498 Cc: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Thomas Wood <thomas.wood@intel.com> --- lib/igt_kms.c | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-)