[igt-dev] [PATCH i-g-t] RFC: runner/resultgen: compress dmesg if size limit hit

Mauro Carvalho Chehab mauro.chehab at linux.intel.com
Wed Jun 21 08:00:26 UTC 2023


On Tue, 20 Jun 2023 20:31:06 +0200
Kamil Konieczny <kamil.konieczny at linux.intel.com> wrote:

> Create possibility for compressing dmesg kernel output in case
> when disk limit option is used and file size actually exceed it.
> Instead of cutting down file, which may later limit search for
> problem solution, copy a few lines from beginning and end of it
> into results.json and then compresses it with the help of
> external program.
> 
> Bug: https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/issues/129

It makes sense to me, but:

- IGT should check if bzip2 tool is installed;
- it probably makes sense to have an option to select the compress
  tool;
- it probably makes sense to add an option to always or never
  compress.

> 
> Cc: Petri Latvala <adrinael at adrinael.net>
> Cc: Mauro Carvalho Chehab <mauro.chehab at linux.intel.com>
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
>  runner/resultgen.c | 38 +++++++++++++++++++++++++-------------
>  1 file changed, 25 insertions(+), 13 deletions(-)
> 
> diff --git a/runner/resultgen.c b/runner/resultgen.c
> index 26883ff9f..7291396ed 100644
> --- a/runner/resultgen.c
> +++ b/runner/resultgen.c
> @@ -27,6 +27,8 @@ _Static_assert(INCOMPLETE_EXITCODE != IGT_EXIT_SUCCESS, "exit code clash");
>  _Static_assert(INCOMPLETE_EXITCODE != IGT_EXIT_INVALID, "exit code clash");
>  _Static_assert(INCOMPLETE_EXITCODE != GRACEFUL_EXITCODE, "exit code clash");
>  
> +#define compressor_name "bzip2"
> +
>  struct subtest
>  {
>  	char *name;
> @@ -949,9 +951,9 @@ static void add_dmesg_limited(struct json_object *obj, const char *dname,
>  {
>  	char *small_buf;
>  	size_t small_len = 0;
> -	char *smsg, *stmp;
> +	const char *smsg, *stmp;
>  	int line;
> -	size_t len, delta;
> +	size_t len;
>  
>  	small_buf = malloc(DMESG_LIMIT_MAX_SIZE);
>  	if (!small_buf) {
> @@ -973,7 +975,7 @@ static void add_dmesg_limited(struct json_object *obj, const char *dname,
>  		smsg = stmp;
>  	}
>  
> -	small_len = dmesg_limit_append(DMESG_LIMIT_MAX_SIZE, small_buf, small_len, dmesg, sdmsg - dmesg);
> +	small_len = dmesg_limit_append(DMESG_LIMIT_MAX_SIZE, small_buf, small_len, dmesg, smsg - dmesg);
>  
>  	len = dmesglen - 1;
>  	smsg = dmesg + len;
> @@ -994,7 +996,9 @@ static void add_dmesg_limited(struct json_object *obj, const char *dname,
>  		small_len = dmesg_limit_append(DMESG_LIMIT_MAX_SIZE, small_buf, small_len, dmesg + len, dmesglen - len);
>  
>  	json_object_object_add(obj, dname,
> -			       new_escaped_json_string(dmsg_small, small_len));
> +			       new_escaped_json_string(small_buf, small_len));
> +
> +	free(small_buf);
>  }
>  
>  static void add_dmesg(struct json_object *obj,
> @@ -1003,14 +1007,14 @@ static void add_dmesg(struct json_object *obj,
>  		      size_t limit)
>  {
>  	if (limit)
> -		add_dmesg_limited(obj, "dmesg", dmesg, dmesglen);
> +		add_dmesg_limited(obj, "dmesg", dmesg, dmesglen, limit);
>  	else
>  		json_object_object_add(obj, "dmesg",
>  				       new_escaped_json_string(dmesg, dmesglen));
>  
>  	if (warnings) {
>  		if (limit)
> -			add_dmesg_limited(obj, "dmesg-warnings", warnings, warningslen);
> +			add_dmesg_limited(obj, "dmesg-warnings", warnings, warningslen, limit);
>  		else
>  			json_object_object_add(obj, "dmesg-warnings",
>  					       new_escaped_json_string(warnings, warningslen));
> @@ -1030,7 +1034,7 @@ static void add_empty_dmesgs_where_missing(struct json_object *tests,
>  		generate_piglit_name(binary, subtests->subs[i].name, piglit_name, sizeof(piglit_name));
>  		current_test = get_or_create_json_object(tests, piglit_name);
>  		if (!json_object_object_get_ex(current_test, "dmesg", NULL)) {
> -			add_dmesg(current_test, "", 0, NULL, 0);
> +			add_dmesg(current_test, "", 0, NULL, 0, 0);
>  		}
>  
>  		for (k = 0; k < subtests->subs[i].dynamic_size; k++) {
> @@ -1038,14 +1042,14 @@ static void add_empty_dmesgs_where_missing(struct json_object *tests,
>  							 dynamic_piglit_name, sizeof(dynamic_piglit_name));
>  			current_test = get_or_create_json_object(tests, dynamic_piglit_name);
>  			if (!json_object_object_get_ex(current_test, "dmesg", NULL)) {
> -				add_dmesg(current_test, "", 0, NULL, 0);
> +				add_dmesg(current_test, "", 0, NULL, 0, 0);
>  			}
>  		}
>  	}
>  
>  }
>  
> -static bool fill_from_dmesg(int fd,
> +static bool fill_from_dmesg(int fd, char *dirname,
>  			    struct settings *settings,
>  			    char *binary,
>  			    struct subtest_list *subtests,
> @@ -1076,7 +1080,7 @@ static bool fill_from_dmesg(int fd,
>  		return false;
>  	}
>  
> -	if (!fstat(f, &st)) {
> +	if (!fstat(fd, &st)) {
>  		fprintf(stderr, "Cannot stat file, errno: %d\n", errno);
>  		fclose(f);
>  		return false;
> @@ -1201,6 +1205,14 @@ static bool fill_from_dmesg(int fd,
>  	free(dynamic_warnings);
>  	g_regex_unref(re);
>  	fclose(f);
> +
> +	if (limit) {
> +		char comp[PATH_MAX + 256];
> +
> +		snprintf(comp, sizeof(comp), "%s %s/%s/%s", compressor_name, settings->results_path, dirname, "dmesg.txt");
> +		system(comp);
> +	}
> +
>  	return true;
>  }
>  
> @@ -2210,7 +2222,7 @@ static void add_to_totals(const char *binary,
>  	}
>  }
>  
> -static bool parse_test_directory(int dirfd,
> +static bool parse_test_directory(int dirfd, char *dirname,
>  				 struct job_list_entry *entry,
>  				 struct settings *settings,
>  				 struct results *results)
> @@ -2251,7 +2263,7 @@ static bool parse_test_directory(int dirfd,
>  		}
>  	}
>  
> -	if (!fill_from_dmesg(fds[_F_DMESG], settings, entry->binary, &subtests, results->tests)) {
> +	if (!fill_from_dmesg(fds[_F_DMESG], dirname, settings, entry->binary, &subtests, results->tests)) {
>  		fprintf(stderr, "Error parsing output files (dmesg.txt)\n");
>  		status = false;
>  		goto parse_output_end;
> @@ -2400,7 +2412,7 @@ struct json_object *generate_results_json(int dirfd)
>  			continue;
>  		}
>  
> -		if (!parse_test_directory(testdirfd, &job_list.entries[i], &settings, &results)) {
> +		if (!parse_test_directory(testdirfd, name, &job_list.entries[i], &settings, &results)) {
>  			close(testdirfd);
>  			return NULL;
>  		}


More information about the igt-dev mailing list