[Piglit] [PATCH 3/6] dmesg: setup dmesg to be able to mark a test warn or fail

Daniel Vetter daniel at ffwll.ch
Thu Nov 14 05:52:41 PST 2013


On Tue, Nov 12, 2013 at 07:54:01AM -0800, Dylan Baker wrote:
> This gives the dmesg class lists of statuses that will make a test a
> warn or a fail, it includes a few basic checks, namely i915 errors and
> that tests have not segfaulted.
> 
> Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
> ---
>  framework/dmesg.py    | 36 ++++++++++++++++++++++++++++++++----
>  framework/exectest.py | 22 +++++++++++++++-------
>  2 files changed, 47 insertions(+), 11 deletions(-)
> 
> diff --git a/framework/dmesg.py b/framework/dmesg.py
> index 9a23c14..edbea88 100644
> --- a/framework/dmesg.py
> +++ b/framework/dmesg.py
> @@ -22,6 +22,7 @@
>  """ Module implementing classes for reading posix dmesg """
>  
>  import os
> +import re
>  import subprocess
>  from threads import synchronized_self
>  
> @@ -29,8 +30,10 @@ __all__ = ['Dmesg']
>  
>  # plain text list of statuses to be considered either a warn or a fail, any
>  # statuses not on this list will simply be ignored.
> -WARN_STATUSES = []
> -FAIL_STATUSES = []
> +WARN_STATUSES = ['segfault']
> +FAIL_STATUSES = ['\[drm:.*\] \*ERROR\*',
> +                 '\[drm\] stuck on [a-zA-Z]* ring',
> +                 '\[drm\] GPU crash dump saved']

I think now that we filter out all the info/debug noise maybe we could go
the other direction and blacklist a few of the remaining things from the
core kernel we don't care about. E.g.

[ 3867.022895] gem_evict_every (2671) used greatest stack depth: 2216 bytes left

is a warn level message, but I don't care one bit about it (as long as it
doesn't approach 0). But there's other warn level stuff which is fairly
interesting.

Just something to throw out there, I'm not sure what the best way would be
to integrate dmesg reporting for piglit in general.
-Daniel

>  
>  
>  class PosixDmesg(object):
> @@ -45,6 +48,9 @@ class PosixDmesg(object):
>      only be considered authoratative when running non-concurrently.
>      
>      """
> +    _warns = [re.compile(r) for r in WARN_STATUSES]
> +    _fails = [re.compile(r) for r in FAIL_STATUSES]
> +
>      def __init__(self):
>          """ Create a dmesg instance """
>          self.dmesg = []
> @@ -57,10 +63,32 @@ class PosixDmesg(object):
>          
>      @synchronized_self
>      def update_dmesg(self):
> -        """ Call dmesg and look for changes. """
> +        """ Call dmesg and look for changes
> +
> +        This class calls a helper that checks dmesg for changes, and then
> +        processes those changes looking for warns and fails according to the
> +        WARN_STATUSES and FAIL_STATUSES variables.
> +
> +        If there are no warns or fails it will return None. Otherwise it will
> +        return a tuple containing a list of warns and a list of fails
> +        respectively
> +
> +        """
> +        def is_error(type, error):
> +            """ Filter statuses that are warns or fails """
> +            for pattern in type:
> +                if pattern.search(error):
> +                    return True
> +            return False
> +
>          self._call_dmesg()
> +        warns = [s for s in self._new_messages if is_error(self._warns, s)]
> +        fails = [s for s in self._new_messages if is_error(self._fails, s)]
>  
> -        return self._new_messages
> +        if warns or fails:
> +            return (warns, fails)
> +        else:
> +            return None
>          
>      def _call_dmesg(self):
>          """ Call dmesg using subproces.check_output 
> diff --git a/framework/exectest.py b/framework/exectest.py
> index a6c7719..827840b 100644
> --- a/framework/exectest.py
> +++ b/framework/exectest.py
> @@ -86,7 +86,7 @@ class ExecTest(Test):
>                  else:
>                      (out, err, returncode) = \
>                          self.get_command_result(command, fullenv)
> -                    dmesg_diff = dmesg.update_dmesg()
> +                    dmesg_status = dmesg.update_dmesg()
>  
>                  # https://bugzilla.gnome.org/show_bug.cgi?id=680214 is
>                  # affecting many developers.  If we catch it
> @@ -121,7 +121,8 @@ class ExecTest(Test):
>                  results['result'] = 'skip'
>              else:
>                  results['result'] = 'fail'
> -                out = self.interpretResult(out, returncode, results, dmesg_diff)
> +                out = self.interpretResult(out, returncode, results,
> +                                           dmesg_status)
>  
>              crash_codes = [
>                  # Unix: terminated by a signal
> @@ -165,7 +166,10 @@ class ExecTest(Test):
>                                                               err, out)
>              results['returncode'] = returncode
>              results['command'] = ' '.join(self.command)
> -            results['dmesg'] = dmesg_diff
> +            if dmesg_status:
> +                results['dmesg'] = {}
> +                results['dmesg']['warns'] = dmesg_status[0]
> +                results['dmesg']['fails'] = dmesg_status[1]
>  
>              self.handleErr(results, err)
>  
> @@ -227,10 +231,14 @@ class PlainExecTest(ExecTest):
>          outpiglit = map(lambda s: s[7:],
>                          filter(lambda s: s.startswith('PIGLIT:'), outlines))
>  
> -        if dmesg:
> -            outpiglit = map(lambda s: s.replace("'pass'", "'dmesg-warn'"), outpiglit)
> -            outpiglit = map(lambda s: s.replace("'warn'", "'dmesg-warn'"), outpiglit)
> -            outpiglit = map(lambda s: s.replace("'fail'", "'dmesg-fail'"), outpiglit)
> +        try:
> +            if dmesg[1]:
> +                outpiglit = map(lambda s: s.replace("pass", "fail"), outpiglit)
> +                outpiglit = map(lambda s: s.replace("warn", "fail"), outpiglit)
> +            elif dmesg[0]:
> +                outpiglit = map(lambda s: s.replace("pass", "warn"), outpiglit)
> +        except TypeError:
> +            pass
>  
>          if len(outpiglit) > 0:
>              try:
> -- 
> 1.8.1.5
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the Piglit mailing list