[Intel-gfx] [PATCH i-g-t 1/5] lib: print recent log output if a test fails
Chris Wilson
chris at chris-wilson.co.uk
Wed Dec 17 10:17:12 PST 2014
On Wed, Dec 17, 2014 at 06:10:46PM +0000, Thomas Wood wrote:
> On 17 December 2014 at 17:19, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> > On Wed, Dec 17, 2014 at 04:45:43PM +0000, Thomas Wood wrote:
> >> Print recent log entries if a test or subtest fails and the current log
> >> level is set to info.
> >>
> >> v2: Write log to stderr after test or subtest failure and make log
> >> buffering thread safe.
> >>
> >> Signed-off-by: Thomas Wood <thomas.wood at intel.com>
> >> ---
> >> lib/igt_core.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
> >> 1 file changed, 96 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/lib/igt_core.c b/lib/igt_core.c
> >> index 08e0c47..457b3b1 100644
> >> --- a/lib/igt_core.c
> >> +++ b/lib/igt_core.c
> >> @@ -50,6 +50,8 @@
> >> #include <termios.h>
> >> #include <errno.h>
> >> #include <time.h>
> >> +#include <limits.h>
> >> +#include <pthread.h>
> >>
> >> #include "drmtest.h"
> >> #include "intel_chipset.h"
> >> @@ -228,8 +230,18 @@ enum {
> >> OPT_HELP = 'h'
> >> };
> >>
> >> +static const char *command_str;
> >> +static int igt_exitcode = IGT_EXIT_SUCCESS;
> >> +
> >> static char* igt_log_domain_filter;
> >>
> >> +static struct {
> >> + char *entries[256];
> >> + uint8_t start, end;
> >> +} log_buffer;
> >> +static pthread_mutex_t log_buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
> >> +
> >> +
> >> __attribute__((format(printf, 1, 2)))
> >> static void kmsg(const char *format, ...)
> >> #define KERN_EMER "<0>"
> >> @@ -353,6 +365,52 @@ static void low_mem_killer_disable(bool disable)
> >> chmod(adj_fname, buf.st_mode);
> >> }
> >>
> >> +#define write_log_msg(x) write(STDERR_FILENO, x, strlen(x))
> >> +
> >> +/* this function must be safe to be called inside a signal handler */
> >> +static void write_log(void)
> >> +{
> >> + uint8_t i;
> >> + char *last_line;
> >> +
> >> + pthread_mutex_lock(&log_buffer_mutex);
> >> +
> >> + /* don't write an empty log */
> >> + if (log_buffer.start == log_buffer.end) {
> >> + pthread_mutex_unlock(&log_buffer_mutex);
> >> + return;
> >> + }
> >> +
> >> + if (in_subtest) {
> >> + write_log_msg("--- Subtest ");
> >> + write_log_msg(in_subtest);
> >> + } else {
> >> + write_log_msg("--- Test ");
> >> + write_log_msg(command_str);
> >> + }
> >> + write_log_msg(" failed.\n");
> >> + write_log_msg("--- Log Start\n");
> >> +
> >> + i = log_buffer.start;
> >> + do {
> >> + last_line = log_buffer.entries[i];
> >> + write_log_msg(last_line);
> >
> > What happens if nothing is in the log:
> > log_buffer.start == log_buffer.end == 0
> >
> > last_line[pos] is a *NULL, as may strlen(NULL).
> >
> > When something is in the log, start != end, so this can just be a simple
> >
> > if (log_buffer.start == log_buffer.end)
> > return;
>
> Yes, this check is done at the start of the function.
But then won't you get different output if a subtest fails without
actually adding a log message? Is that desirable? (At least my primary
concern that there isn't a *NULL is addressed. And the looping logic is
correct, but I think we aren't using as many entries as possible...)
Maybe give an example of how the extra logging works in practice?
(Some before/after output of a failing igt test.)
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list