[PATCH i-g-t v2 1/4] runner/resultgen: Added dynamically ignored dmesg messages
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Wed Aug 7 14:33:56 UTC 2024
On Tue, Aug 06, 2024 at 04:43:29PM +0200, Kamil Konieczny wrote:
> Some messages generated by driver are triggered by test itself
> and are not meant to rise error nor warn within runner, yet
> they should be catched in other circumstances so they are not
> suitable to be ignored permanently.
>
> Instead of hard-coding such situations check dmesg for info from
> a test and add such regex on a fly and then ignore next dmesg
> errors or warns which match it.
>
> Ignored regex will be removed after end of current subtest, just
> before a new subtest or dynamic subtest starts.
>
> v2: removed local copy for regex string (Zbigniew), clarify
> description, free regex before creating new (Kamil)
>
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
> runner/output_strings.h | 8 ++++++
> runner/resultgen.c | 60 +++++++++++++++++++++++++++++++++++------
> 2 files changed, 60 insertions(+), 8 deletions(-)
>
> diff --git a/runner/output_strings.h b/runner/output_strings.h
> index 892895ead..91ef5f2c3 100644
> --- a/runner/output_strings.h
> +++ b/runner/output_strings.h
> @@ -54,6 +54,14 @@ static const char STARTING_SUBTEST_DMESG[] = ": starting subtest ";
> */
> static const char STARTING_DYNAMIC_SUBTEST_DMESG[] = ": starting dynamic subtest ";
>
> +/*
> + * Output in dmesg when a test wants runner to dynamically ignore error or warn.
> + *
> + * Example:
> + * [IGT] add ignored dmesg regex: CRITICAL: Xe has declared device [0-9:.]* as wedged
> + */
> +static const char IGT_ADD_IGNORED_REGEX_DMESG[] = "add ignored dmesg regex: ";
> +
> /*
> * Output when a test process is executed.
> *
> diff --git a/runner/resultgen.c b/runner/resultgen.c
> index 63f5b26d7..ce7433b65 100644
> --- a/runner/resultgen.c
> +++ b/runner/resultgen.c
> @@ -829,16 +829,13 @@ static const char igt_dmesg_whitelist[] =
> static const char igt_piglit_style_dmesg_blacklist[] =
> "(\\[drm:|drm_|intel_|i915_|\\[drm\\])";
>
> -static bool init_regex_whitelist(struct settings* settings, GRegex **re)
> +static bool init_dmesg_regex(GRegex **re, const char *regex, const char *msg)
> {
> GError *err = NULL;
> - const char *regex = settings->piglit_style_dmesg ?
> - igt_piglit_style_dmesg_blacklist :
> - igt_dmesg_whitelist;
>
> *re = g_regex_new(regex, G_REGEX_OPTIMIZE, 0, &err);
> if (err) {
> - fprintf(stderr, "Cannot compile dmesg regexp\n");
> + fprintf(stderr, "Cannot compile dmesg regexp for %s\n", msg);
I've missed this on last review. I would bet to display error message
from GError when regex compilation fails.
Rest looks correct imo.
--
Zbigniew
> g_error_free(err);
> return false;
> }
> @@ -846,6 +843,43 @@ static bool init_regex_whitelist(struct settings* settings, GRegex **re)
> return true;
> }
>
> +static bool init_regex_whitelist(struct settings *settings, GRegex **re)
> +{
> + const char *regex = settings->piglit_style_dmesg ?
> + igt_piglit_style_dmesg_blacklist :
> + igt_dmesg_whitelist;
> + const char *what = settings->piglit_style_dmesg ?
> + "piglit style dmesg blocklist" :
> + "igt dmesg whitelist";
> +
> + return init_dmesg_regex(re, regex, what);
> +}
> +
> +static bool not_ignored(GRegex *re, const char *msg)
> +{
> + if (!re)
> + return true;
> +
> + return !g_regex_match(re, msg, 0, NULL);
> +}
> +
> +static void clean_regex(GRegex **re)
> +{
> + if (*re)
> + g_regex_unref(*re);
> +
> + *re = NULL;
> +}
> +
> +static void add_ignored_regex(GRegex **re, char *src)
> +{
> + if (*re)
> + g_regex_unref(*re);
> +
> + init_dmesg_regex(re, src, "ignore match");
> + fprintf(stderr, "igt_resultgen: Added ignore regex '%s'\n", src);
> +}
> +
> static bool parse_dmesg_line(char* line,
> unsigned *flags, unsigned long long *ts_usec,
> char *continuation, char **message)
> @@ -979,6 +1013,7 @@ static bool fill_from_dmesg(int fd,
> char dynamic_piglit_name[256];
> size_t i;
> GRegex *re;
> + GRegex *re_ignore; /* regex for dynamically ignored dmesg line */
>
> if (!f) {
> return false;
> @@ -989,12 +1024,13 @@ static bool fill_from_dmesg(int fd,
> return false;
> }
>
> + re_ignore = NULL;
> while (getline(&line, &linelen, f) > 0) {
> char *formatted;
> unsigned flags;
> unsigned long long ts_usec;
> char continuation;
> - char *message, *subtest, *dynamic_subtest;
> + char *message, *subtest, *dynamic_subtest, *ignore;
>
> if (!parse_dmesg_line(line, &flags, &ts_usec, &continuation, &message))
> continue;
> @@ -1024,6 +1060,7 @@ static bool fill_from_dmesg(int fd,
> subtest += strlen(STARTING_SUBTEST_DMESG);
> generate_piglit_name(binary, subtest, piglit_name, sizeof(piglit_name));
> current_test = get_or_create_json_object(tests, piglit_name);
> + clean_regex(&re_ignore);
> }
>
> if (current_test != NULL &&
> @@ -1041,18 +1078,24 @@ static bool fill_from_dmesg(int fd,
> dynamic_subtest += strlen(STARTING_DYNAMIC_SUBTEST_DMESG);
> generate_piglit_name_for_dynamic(piglit_name, dynamic_subtest, dynamic_piglit_name, sizeof(dynamic_piglit_name));
> current_dynamic_test = get_or_create_json_object(tests, dynamic_piglit_name);
> + clean_regex(&re_ignore);
> }
>
> + if ((ignore = strstr(message, IGT_ADD_IGNORED_REGEX_DMESG)) != NULL)
> + add_ignored_regex(&re_ignore, ignore + strlen(IGT_ADD_IGNORED_REGEX_DMESG));
> +
> if (settings->piglit_style_dmesg) {
> if ((flags & 0x07) <= settings->dmesg_warn_level && continuation != 'c' &&
> - g_regex_match(re, message, 0, NULL)) {
> + g_regex_match(re, message, 0, NULL) &&
> + not_ignored(re_ignore, message)) {
> append_line(&warnings, &warningslen, formatted);
> if (current_test != NULL)
> append_line(&dynamic_warnings, &dynamic_warnings_len, formatted);
> }
> } else {
> if ((flags & 0x07) <= settings->dmesg_warn_level && continuation != 'c' &&
> - !g_regex_match(re, message, 0, NULL)) {
> + !g_regex_match(re, message, 0, NULL) &&
> + not_ignored(re_ignore, message)) {
> append_line(&warnings, &warningslen, formatted);
> if (current_test != NULL)
> append_line(&dynamic_warnings, &dynamic_warnings_len, formatted);
> @@ -1099,6 +1142,7 @@ static bool fill_from_dmesg(int fd,
> free(dynamic_dmesg);
> free(warnings);
> free(dynamic_warnings);
> + clean_regex(&re_ignore);
> g_regex_unref(re);
> fclose(f);
> return true;
> --
> 2.43.0
>
More information about the igt-dev
mailing list