[PATCH i-g-t v2 1/4] runner/resultgen: Added dynamically ignored dmesg messages
Kamil Konieczny
kamil.konieczny at linux.intel.com
Thu Aug 8 13:21:20 UTC 2024
Hi Zbigniew,
On 2024-08-07 at 16:33:56 +0200, Zbigniew Kempczyński wrote:
> 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
>
I will add these (in runner and core) and resend.
Regards,
Kamil
> > 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