diff mbox

[i-g-t] lib: keep a list of modified connectors to reset

Message ID 1409914519-15683-1-git-send-email-thomas.wood@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thomas Wood Sept. 5, 2014, 10:55 a.m. UTC
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(-)

Comments

Chris Wilson Sept. 5, 2014, 11:06 a.m. UTC | #1
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 mbox

Patch

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);
 }