<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1117335418;
        mso-list-type:hybrid;
        mso-list-template-ids:542951380 67698693 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText">Hmm.. my initial intent is to implement the actual dmesg triage separately from Piglit and it works more or less like an utility to triage the dmesg log derived from piglit dmesg output, you know, the dmesg desn't belong to Piglit itself,
 it's independent and can come from different sources. <o:p></o:p></p>
<p class="MsoPlainText">As an independent utility:<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1">
<![if !supportLists]><span style="font-family:Wingdings"><span style="mso-list:Ignore">§<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]>It can be employed anywhere as long as the dmesg log is ready to avoid it's fully glued within Piglit<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1">
<![if !supportLists]><span style="font-family:Wingdings"><span style="mso-list:Ignore">§<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]>It's flexible to change according to its corresponding scenarios, the core of it is implemented by ruby and why there is shell script there is because I add some common shell interfaces to rollback dmesg detail to adapt our application
 which is mainly implemented in shell script. If it's not the best for someone else, they can change or rewrite it to bypass the modification in Piglit each time.<o:p></o:p></p>
<p class="MsoPlainText">So if we view it within piglit, there is multi-language compliance concern, but it's not so serious if we just view it independent of piglit as an complementary utility !<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">a) extend or rewrite the LinuxDmesg or BaseDmesg class to do this<o:p></o:p></p>
<p class="MsoPlainText">b) subclass the LinuxDmesg class in IGT to support the features you need<o:p></o:p></p>
<p class="MsoPlainText">A: yes, I have to agree that what you pointed out is really make sense,  now there are DummyDmesg and LinuxDmesg in Piglit and both of them extend from BaseDmesg, but actually only unix-like dmesg(LinuxDmesg) are supported in current
 Piglit. So maybe the best way is to extend the BaseDmesg by provide an abstract in it and implement it in LinuxDmesg. Regarding b), I think this may be messy with the log consuming and profile at the same slot !<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Best Regards<o:p></o:p></p>
<p class="MsoPlainText">Ethan, Gao<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">-----Original Message-----<br>
From: Dylan Baker [mailto:baker.dylan.c@gmail.com] <br>
Sent: Thursday, March 19, 2015 2:23 AM<br>
To: Gao, Ethan<br>
Cc: piglit@lists.freedesktop.org; OTC GFX QA<br>
Subject: Re: [Piglit] [PATCH] Add Dmesg Triage Feature: further triage i-g-t kmsg log to reduce result noise resulted from piglit dmesg defect</p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Please justify the use of adding shell scripts and Ruby to a project already containing C, C++, and python. In particular, please justify using shell and Ruby to extend the functionality of a python class.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Please also explain why one of the following doesn't work:<o:p></o:p></p>
<p class="MsoPlainText">a) extend or rewrite the LinuxDmesg or BaseDmesg class to do this<o:p></o:p></p>
<p class="MsoPlainText">b) subclass the LinuxDmesg class in IGT to support the features you need<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Dylan<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">On Wed, Mar 18, 2015 at 01:59:50PM +0800, ethan gao wrote:<o:p></o:p></p>
<p class="MsoPlainText">> tests/igt.py: add igt env to enable or disable dmesg triage<o:p></o:p></p>
<p class="MsoPlainText">> framework/test/base.py: trigger dmesg triage depending on dmesg log
<o:p></o:p></p>
<p class="MsoPlainText">> occurrence<o:p></o:p></p>
<p class="MsoPlainText">> framework/dmesg.py: employ dmesg triage simply for Linux dmesg<o:p></o:p></p>
<p class="MsoPlainText">> dmesg_triage/*: deal with kmsg log with pre-defined dmesg oops pattern<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> In general, if dmesg triage is enabled and there is new dmesg along
<o:p></o:p></p>
<p class="MsoPlainText">> with i-g-t testcases running, the new dmesg will be captured and
<o:p></o:p></p>
<p class="MsoPlainText">> worked out a tag and head to rollback the detail when necessary, in
<o:p></o:p></p>
<p class="MsoPlainText">> addition, on the basis of different dmesg tag or head, the final result noise of a testcase can be reduced with defined rules or strategy.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Signed-off-by: ethan gao <<a href="mailto:ethan.gao@intel.com"><span style="color:windowtext;text-decoration:none">ethan.gao@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> ---<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/debug.sh             |  67 ++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/dmesg.rb             | 117 ++++++++++++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/kmsg_triage          | 182 ++++++++++++++++++++++++++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/libdmesg.sh          | 156 ++++++++++++++++++++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/oops-context-pattern |  37 ++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  dmesg_triage/oops-pattern         |  59 ++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  framework/dmesg.py                |  60 +++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">>  framework/test/base.py            |   4 +<o:p></o:p></p>
<p class="MsoPlainText">>  tests/igt.py                      |   7 ++<o:p></o:p></p>
<p class="MsoPlainText">>  9 files changed, 689 insertions(+)<o:p></o:p></p>
<p class="MsoPlainText">>  create mode 100644 dmesg_triage/debug.sh  create mode 100644
<o:p></o:p></p>
<p class="MsoPlainText">> dmesg_triage/dmesg.rb  create mode 100755 dmesg_triage/kmsg_triage 
<o:p></o:p></p>
<p class="MsoPlainText">> create mode 100644 dmesg_triage/libdmesg.sh  create mode 100644
<o:p></o:p></p>
<p class="MsoPlainText">> dmesg_triage/oops-context-pattern  create mode 100644 <o:p>
</o:p></p>
<p class="MsoPlainText">> dmesg_triage/oops-pattern<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/debug.sh b/dmesg_triage/debug.sh new file
<o:p></o:p></p>
<p class="MsoPlainText">> mode 100644 index 0000000..ec8280e<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/debug.sh<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,67 @@<o:p></o:p></p>
<p class="MsoPlainText">> +#!/bin/bash<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Copyright (c) 2015 Intel Corporation<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a copy # of this software and associated documentation
<o:p></o:p></p>
<p class="MsoPlainText">> +files (the "Software"), to deal # in the Software without
<o:p></o:p></p>
<p class="MsoPlainText">> +restriction, including without limitation the rights # to use, copy,
<o:p></o:p></p>
<p class="MsoPlainText">> +modify, merge, publish, distribute, sublicense, and/or sell # copies
<o:p></o:p></p>
<p class="MsoPlainText">> +of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# The above copyright notice and this permission notice shall be
<o:p></o:p></p>
<p class="MsoPlainText">> +included in # all copies or substantial portions of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND
<o:p></o:p></p>
<p class="MsoPlainText">> +NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS
<o:p></o:p></p>
<p class="MsoPlainText">> +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN
<o:p></o:p></p>
<p class="MsoPlainText">> +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN
<o:p></o:p></p>
<p class="MsoPlainText">> +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +[[ "$BASHPID" ]] || echo "======= Run me with bash ======="<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +dump_shell_vars()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          (<o:p></o:p></p>
<p class="MsoPlainText">> +                          set -o posix<o:p></o:p></p>
<p class="MsoPlainText">> +                          local branch_commit_files=()<o:p></o:p></p>
<p class="MsoPlainText">> +                          local sparse_lines=()<o:p></o:p></p>
<p class="MsoPlainText">> +                          local remote_url=()<o:p></o:p></p>
<p class="MsoPlainText">> +                          set >&2<o:p></o:p></p>
<p class="MsoPlainText">> +          )<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +dump_call_stack()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          local stack_depth=${#FUNCNAME[@]}<o:p></o:p></p>
<p class="MsoPlainText">> +          local i<o:p></o:p></p>
<p class="MsoPlainText">> +          for ((i = 0; i < $((stack_depth-1)); i++)); do<o:p></o:p></p>
<p class="MsoPlainText">> +                          echo "  ${BASH_SOURCE[i+1]}:${BASH_LINENO[i]}: ${FUNCNAME[i+1]}" >&2<o:p></o:p></p>
<p class="MsoPlainText">> +          done<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# nr_stack_dumps=0<o:p></o:p></p>
<p class="MsoPlainText">> +dump_stack()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          # echo "Stack dump: $BASH_COMMAND"<o:p></o:p></p>
<p class="MsoPlainText">> +          dump_call_stack<o:p></o:p></p>
<p class="MsoPlainText">> +          echo<o:p></o:p></p>
<p class="MsoPlainText">> +          dump_shell_vars<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +notice()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          local time_str="$(date +'%F %H:%M:%S') "<o:p></o:p></p>
<p class="MsoPlainText">> +          echo -e ${color[MAGENTA]}"${time_str}$*"$reset_color<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +die()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          notice "$*"<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          dump_stack<o:p></o:p></p>
<p class="MsoPlainText">> +          email "$*"<o:p></o:p></p>
<p class="MsoPlainText">> +          exit<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/dmesg.rb b/dmesg_triage/dmesg.rb new file
<o:p></o:p></p>
<p class="MsoPlainText">> mode 100644 index 0000000..d7aecae<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/dmesg.rb<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,117 @@<o:p></o:p></p>
<p class="MsoPlainText">> +#!/usr/bin/ruby<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Copyright (c) 2015 Intel Corporation<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a copy # of this software and associated documentation
<o:p></o:p></p>
<p class="MsoPlainText">> +files (the "Software"), to deal # in the Software without
<o:p></o:p></p>
<p class="MsoPlainText">> +restriction, including without limitation the rights # to use, copy,
<o:p></o:p></p>
<p class="MsoPlainText">> +modify, merge, publish, distribute, sublicense, and/or sell # copies
<o:p></o:p></p>
<p class="MsoPlainText">> +of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# The above copyright notice and this permission notice shall be
<o:p></o:p></p>
<p class="MsoPlainText">> +included in # all copies or substantial portions of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND
<o:p></o:p></p>
<p class="MsoPlainText">> +NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS
<o:p></o:p></p>
<p class="MsoPlainText">> +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN
<o:p></o:p></p>
<p class="MsoPlainText">> +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN
<o:p></o:p></p>
<p class="MsoPlainText">> +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> +#<o:p></o:p></p>
<p class="MsoPlainText">> +# [Description]: Find out all crash dmesg clauses with tailored
<o:p></o:p></p>
<p class="MsoPlainText">> +pattern # [Author]: <a href="mailto:ethan.gao@intel.com">
<span style="color:windowtext;text-decoration:none">ethan.gao@intel.com</span></a><o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +require "fileutils"<o:p></o:p></p>
<p class="MsoPlainText">> +require "tempfile"<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def fixup_dmesg(line)<o:p></o:p></p>
<p class="MsoPlainText">> +          line.chomp!<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          # remove absolute path names<o:p></o:p></p>
<p class="MsoPlainText">> +          line.sub!(%r{/kbuild/src/[^/]+/}, '')<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          line.sub!(/\.(isra|constprop|part)\.[0-9]+\+0x/, '+0x')<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          # break up mixed messages<o:p></o:p></p>
<p class="MsoPlainText">> +          case line<o:p></o:p></p>
<p class="MsoPlainText">> +          when /^<[0-9]>/<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(.+)(\[ *[0-9]{1,6}\.[0-9]{6}\] .*)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1 + "\n" + $2<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          return line<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def fixup_dmesg_file(dmesg_file)<o:p></o:p></p>
<p class="MsoPlainText">> +          tmpfile = Tempfile.new '.fixup-dmesg-', File.dirname(dmesg_file)<o:p></o:p></p>
<p class="MsoPlainText">> +          dmesg_lines = []<o:p></o:p></p>
<p class="MsoPlainText">> +          File.open(dmesg_file, 'rb') do |f|<o:p></o:p></p>
<p class="MsoPlainText">> +                          f.each_line { |line|<o:p></o:p></p>
<p class="MsoPlainText">> +                                          line = fixup_dmesg(line)<o:p></o:p></p>
<p class="MsoPlainText">> +                                          dmesg_lines << line<o:p></o:p></p>
<p class="MsoPlainText">> +                                          tmpfile.puts line<o:p></o:p></p>
<p class="MsoPlainText">> +                          }<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +          tmpfile.chmod 0664<o:p></o:p></p>
<p class="MsoPlainText">> +          tmpfile.close<o:p></o:p></p>
<p class="MsoPlainText">> +          FileUtils.mv tmpfile.path, dmesg_file, :force => true<o:p></o:p></p>
<p class="MsoPlainText">> +          return dmesg_lines<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def grep_crash_head(dmesg, grep_options = '')<o:p></o:p></p>
<p class="MsoPlainText">> +          oops = %x[ grep -a -f #{DMESG_ROOT}/oops-pattern #{grep_options} #{dmesg} |<o:p></o:p></p>
<p class="MsoPlainText">> +                             grep -v -e 'INFO: NMI handler .* took too long to run' |<o:p></o:p></p>
<p class="MsoPlainText">> +                             awk '{line = $0; sub(/^(<[0-9]>)?\[[ 0-9.]+\] /, "", line); if (!x[line]++) print;}'<o:p></o:p></p>
<p class="MsoPlainText">> +          ]<o:p></o:p></p>
<p class="MsoPlainText">> +          return oops unless oops.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          if system "grep -q -F 'EXT4-fs ('  #{dmesg}"<o:p></o:p></p>
<p class="MsoPlainText">> +                          oops = `grep -a -f #{DMESG_ROOT}/ext4-crit-pattern     #{grep_options} #{dmesg}`<o:p></o:p></p>
<p class="MsoPlainText">> +                          return oops unless oops.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          if system "grep -q -F 'XFS ('          #{dmesg}"<o:p></o:p></p>
<p class="MsoPlainText">> +                          oops = `grep -a -f #{DMESG_ROOT}/xfs-alert-pattern     #{grep_options} #{dmesg}`<o:p></o:p></p>
<p class="MsoPlainText">> +                          return oops unless oops.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          if system "grep -q -F 'btrfs: '        #{dmesg}"<o:p></o:p></p>
<p class="MsoPlainText">> +                          oops = `grep -a -f #{DMESG_ROOT}/btrfs-crit-pattern    #{grep_options} #{dmesg}`<o:p></o:p></p>
<p class="MsoPlainText">> +                          return oops unless oops.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          return ''<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def grep_printk_errors(dmesg_file, dmesg_lines)<o:p></o:p></p>
<p class="MsoPlainText">> +          oops = `grep -a -f #{DMESG_ROOT}/oops-pattern #{dmesg_file}`<o:p></o:p></p>
<p class="MsoPlainText">> +          dmesg = dmesg_lines.join "\n"<o:p></o:p></p>
<p class="MsoPlainText">> +          oops += `grep -a -f #{DMESG_ROOT}/ext4-crit-pattern  #{dmesg_file}` if dmesg.index 'EXT4-fs ('<o:p></o:p></p>
<p class="MsoPlainText">> +          oops += `grep -a -f #{DMESG_ROOT}/xfs-alert-pattern  #{dmesg_file}` if dmesg.index 'XFS ('<o:p></o:p></p>
<p class="MsoPlainText">> +          oops += `grep -a -f #{DMESG_ROOT}/btrfs-crit-pattern #{dmesg_file}` if dmesg.index 'btrfs: '<o:p></o:p></p>
<p class="MsoPlainText">> +          return oops<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def common_error_id(line)<o:p></o:p></p>
<p class="MsoPlainText">> +          line = line.chomp<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\b3\.[0-9]+[-a-z0-9.]+/, '#'                                    # linux version: 3.17.0-next-20141008-g099669ed<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\b[1-9][0-9]-[A-Z][a-z]+-[0-9]{4}\b/, '#'                          # Date: 28-Dec-2013<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\b0x[0-9a-f]+\b/, '#'                                                                # hex number<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\b[a-f0-9]{40}\b/, '#'                                                               # SHA-1<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\b[0-9][0-9.]*/, '#'                                                    # number<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /#x\b/, '0x'<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /[ \t]/, ' '<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\ \ +/, ' '<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /([^a-zA-Z0-9])\ /, '\1'<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\ ([^a-zA-Z])/, '\1'<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /^\ /, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\  _/, '_'<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /\ /, '_'<o:p></o:p></p>
<p class="MsoPlainText">> +          line.gsub! /[-_.,;:#!\[\(]+$/, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          line<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/kmsg_triage b/dmesg_triage/kmsg_triage new
<o:p></o:p></p>
<p class="MsoPlainText">> file mode 100755 index 0000000..5832871<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/kmsg_triage<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,182 @@<o:p></o:p></p>
<p class="MsoPlainText">> +#!/usr/bin/ruby<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Copyright (c) 2015 Intel Corporation<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a copy # of this software and associated documentation
<o:p></o:p></p>
<p class="MsoPlainText">> +files (the "Software"), to deal # in the Software without
<o:p></o:p></p>
<p class="MsoPlainText">> +restriction, including without limitation the rights # to use, copy,
<o:p></o:p></p>
<p class="MsoPlainText">> +modify, merge, publish, distribute, sublicense, and/or sell # copies
<o:p></o:p></p>
<p class="MsoPlainText">> +of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# The above copyright notice and this permission notice shall be
<o:p></o:p></p>
<p class="MsoPlainText">> +included in # all copies or substantial portions of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND
<o:p></o:p></p>
<p class="MsoPlainText">> +NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS
<o:p></o:p></p>
<p class="MsoPlainText">> +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN
<o:p></o:p></p>
<p class="MsoPlainText">> +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN
<o:p></o:p></p>
<p class="MsoPlainText">> +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> +#<o:p></o:p></p>
<p class="MsoPlainText">> +# [Description]: Triage various dmesg trace log for an unique tag #
<o:p></o:p></p>
<p class="MsoPlainText">> +[Author]: <a href="mailto:ethan.gao@intel.com"><span style="color:windowtext;text-decoration:none">ethan.gao@intel.com</span></a><o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +DMESG_ROOT = ENV['DMESG_TRIAGE_ROOT'] || <o:p></o:p></p>
<p class="MsoPlainText">> +File.dirname(File.dirname(File.realpath($0)))<o:p></o:p></p>
<p class="MsoPlainText">> +require "#{DMESG_ROOT}/dmesg.rb"<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +if ENV['KMSG_TRIAGE_LOG']<o:p></o:p></p>
<p class="MsoPlainText">> +          KMSG = ENV['KMSG_TRIAGE_LOG']<o:p></o:p></p>
<p class="MsoPlainText">> +          kmsg_file = "#{KMSG}/.dmesg"<o:p></o:p></p>
<p class="MsoPlainText">> +          <o:p></o:p></p>
<p class="MsoPlainText">> +          if File.exist? kmsg_file<o:p></o:p></p>
<p class="MsoPlainText">> +                          dmesg_file = kmsg_file<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +elsif ARGV[0]<o:p></o:p></p>
<p class="MsoPlainText">> +          dmesg_file = ARGV[0]<o:p></o:p></p>
<p class="MsoPlainText">> +else<o:p></o:p></p>
<p class="MsoPlainText">> +          exit<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +if not File.exist?(dmesg_file) or File.size(dmesg_file) == 0<o:p></o:p></p>
<p class="MsoPlainText">> +          puts "No required dmesg file found !"<o:p></o:p></p>
<p class="MsoPlainText">> +          exit<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +def oops_to_bisect_pattern(line)<o:p></o:p></p>
<p class="MsoPlainText">> +                          words = line.split<o:p></o:p></p>
<p class="MsoPlainText">> +                          return '' if words.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +                          patterns = []<o:p></o:p></p>
<p class="MsoPlainText">> +                          words.each { |w|<o:p></o:p></p>
<p class="MsoPlainText">> +                                          case w<o:p></o:p></p>
<p class="MsoPlainText">> +                                          when /([a-zA-Z0-9_]+)\.(isra|constprop|part)\.[0-9]+\+0x/<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          patterns << $1<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          break<o:p></o:p></p>
<p class="MsoPlainText">> +                                          when /([a-zA-Z0-9_]+\+0x)/, /([a-zA-Z0-9_]+=)/<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          patterns << $1<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          break<o:p></o:p></p>
<p class="MsoPlainText">> +                                          when /[^a-zA-Z\/:._-]/<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          patterns << '.*' if patterns[-1] != '.*'<o:p></o:p></p>
<p class="MsoPlainText">> +                                          else<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          patterns << w<o:p></o:p></p>
<p class="MsoPlainText">> +                                          end<o:p></o:p></p>
<p class="MsoPlainText">> +                          }<o:p></o:p></p>
<p class="MsoPlainText">> +                          patterns.shift while patterns[0] == '.*'<o:p></o:p></p>
<p class="MsoPlainText">> +                          patterns.pop   if patterns[-1] == '.*'<o:p></o:p></p>
<p class="MsoPlainText">> +                          patterns.join(' ')<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +error_ids = {}<o:p></o:p></p>
<p class="MsoPlainText">> +if $PROGRAM_NAME =~ /kmsg_triage/<o:p></o:p></p>
<p class="MsoPlainText">> +          output = grep_crash_head dmesg_file, '-o'<o:p></o:p></p>
<p class="MsoPlainText">> +end<o:p></o:p></p>
<p class="MsoPlainText">> +exit if output.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +output.each_line { |line|<o:p></o:p></p>
<p class="MsoPlainText">> +          line.chomp!<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /INFO: Stall ended before state dump start/<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /INFO: NMI handler .* took too long to run:/<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /Killed process \d+ \(/                                                                       # duplicated with "Out of memory: Kill process "<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          # print_hex_dump<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /(\s[0-9a-f]{2}){16}/<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /(\s[0-9a-f]{4}){8}/<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /(\s[0-9a-f]{8}){4}/<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          next if line =~ /[^\t\n\0[:print:]]/<o:p></o:p></p>
<p class="MsoPlainText">> +          line.tr! "\0", ''<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          case line<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(INFO: rcu[_a-z]* self-detected stall on CPU)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(INFO: rcu[_a-z]* detected stalls on CPUs\/tasks:)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(BUG: unable to handle kernel)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: unable to handle kernel) NULL pointer dereference/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: unable to handle kernel) paging request/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(BUG: scheduling while atomic:)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: Bad page map in process)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: Bad page state in process)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: soft lockup - CPU#\d+ stuck for \d+s!)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(BUG: spinlock .* on CPU#\d+)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(BUG: ).* (still has locks held)/,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(INFO: task ).* (blocked for more than \d+ seconds)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1 + $2<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $2<o:p></o:p></p>
<p class="MsoPlainText">> +          when /WARNING:.* at .* ([a-zA-Z.0-9_]+\+0x)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = 'WARNING:.* at .* ' + $1.sub(/\.(isra|constprop|part)\.[0-9]+\+0x/, '')<o:p></o:p></p>
<p class="MsoPlainText">> +                          line =~ /(at .*)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = "WARNING: " + $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(Kernel panic - not syncing: No working init found.)  Try passing init= option to kernel. /,<o:p></o:p></p>
<p class="MsoPlainText">> +               /(Kernel panic - not syncing: No init found.)  Try passing init= option to kernel. /<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = line<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(Out of memory: Kill process) \d+ \(/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(Writer stall state) \d+ g\d+ c\d+ f/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /(used greatest stack depth:)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          # printk(KERN_ERR "BUG: Dentry %p{i=%lx,n=%pd} still in use (%d) [unmount of %s %s]\n"<o:p></o:p></p>
<p class="MsoPlainText">> +          when  /(BUG: Dentry ).* (still in use) .* \[unmount of /<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1 + $2<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1 + '.* ' + $2<o:p></o:p></p>
<p class="MsoPlainText">> +          when /([a-zA-Z]+[ a-zA-Z]*: [a-f0-9]{4}) \[#[0-9]+\] [A-Z_ ]*$/<o:p></o:p></p>
<p class="MsoPlainText">> +                          line = $1<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1<o:p></o:p></p>
<p class="MsoPlainText">> +          when /^backtrace:([a-zA-Z0-9_]+)/<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = $1 + '+0x'<o:p></o:p></p>
<p class="MsoPlainText">> +          else<o:p></o:p></p>
<p class="MsoPlainText">> +                          bug_to_bisect = oops_to_bisect_pattern line<o:p></o:p></p>
<p class="MsoPlainText">> +          end<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id = line.sub(/^[^a-zA-Z]+/, "")<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /\ \]$/, ""                                                                              # [ INFO: possible recursive locking detected ]<o:p></o:p></p>
<p class="MsoPlainText">> +          #error_id.gsub! /\/c\/kernel-tests\/src\/[^\/]+\//, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          #error_id.gsub! /\/c\/(wfg|yliu)\/[^\/]+\//, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          #error_id.gsub! /\/lkp\/[^\/]+\/linux[0-9]*\//, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          #error_id.gsub! /\/kernel-tests\/linux[0-9]*\//, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /\.(isra|constprop|part)\.[0-9]+/, ''<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /\b[0-9a-f]{8}\b/, "#"<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /\b[0-9a-f]{16}\b/, "#"<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /(=)[0-9a-f]+\b/, '\1#'<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /[+\/]0x[0-9a-f]+\b/, ''<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /[+\/][0-9a-f]+\b/, ''<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          #error_id = common_error_id(error_id) + ': 1'<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id = common_error_id(error_id)<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /([a-z]:)[0-9]+\b/, '\1'                                                      # WARNING: at arch/x86/kernel/cpu/perf_event.c:1077 x86_pmu_start+0xaa/0x110()<o:p></o:p></p>
<p class="MsoPlainText">> +          error_id.gsub! /#:\[<#>\]\[<#>\]/, ''                                                       # RIP: 0010:[<ffffffff91906d8d>]  [<ffffffff91906d8d>] validate_chain+0xed/0xe80<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          next if error_id.size <= 3<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          error_ids[error_id] ||= bug_to_bisect }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +exit if error_ids.empty?<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +puts "Found necessary kmsg error ids" if $PROGRAM_NAME =~
<o:p></o:p></p>
<p class="MsoPlainText">> +/kmsg_triage/<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +KMSG_ERROR_ID = ENV['KMSG_TRIAGE_LOG'] || "#{DMESG_ROOT}"<o:p></o:p></p>
<p class="MsoPlainText">> +# This stores each error id<o:p></o:p></p>
<p class="MsoPlainText">> +f = File.new(File.join("#{KMSG_ERROR_ID}", ".dmesg_error_ids"), "w")
<o:p></o:p></p>
<p class="MsoPlainText">> +error_ids.each { |error_id, head|<o:p></o:p></p>
<p class="MsoPlainText">> +          f.write("#{error_id}@#{head}\n")<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +f.close<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/libdmesg.sh b/dmesg_triage/libdmesg.sh new
<o:p></o:p></p>
<p class="MsoPlainText">> file mode 100644 index 0000000..7a53fcf<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/libdmesg.sh<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,156 @@<o:p></o:p></p>
<p class="MsoPlainText">> +# !/bin/bash<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Copyright (c) 2015 Intel Corporation<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# Permission is hereby granted, free of charge, to any person
<o:p></o:p></p>
<p class="MsoPlainText">> +obtaining a copy # of this software and associated documentation
<o:p></o:p></p>
<p class="MsoPlainText">> +files (the "Software"), to deal # in the Software without
<o:p></o:p></p>
<p class="MsoPlainText">> +restriction, including without limitation the rights # to use, copy,
<o:p></o:p></p>
<p class="MsoPlainText">> +modify, merge, publish, distribute, sublicense, and/or sell # copies
<o:p></o:p></p>
<p class="MsoPlainText">> +of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions:<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# The above copyright notice and this permission notice shall be
<o:p></o:p></p>
<p class="MsoPlainText">> +included in # all copies or substantial portions of the Software.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
<o:p></o:p></p>
<p class="MsoPlainText">> +EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
<o:p></o:p></p>
<p class="MsoPlainText">> +MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND
<o:p></o:p></p>
<p class="MsoPlainText">> +NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS
<o:p></o:p></p>
<p class="MsoPlainText">> +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN
<o:p></o:p></p>
<p class="MsoPlainText">> +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN
<o:p></o:p></p>
<p class="MsoPlainText">> +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.<o:p></o:p></p>
<p class="MsoPlainText">> +#<o:p></o:p></p>
<p class="MsoPlainText">> +# [Description]: Defined utilities to check out specified dmesg
<o:p></o:p></p>
<p class="MsoPlainText">> +segment # [Author]: <a href="mailto:ethan.gao@intel.com">
<span style="color:windowtext;text-decoration:none">ethan.gao@intel.com</span></a><o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +if [[ -z "${DMESG_ROOT}" ]]; then<o:p></o:p></p>
<p class="MsoPlainText">> +          DMESG_ROOT=`pwd`<o:p></o:p></p>
<p class="MsoPlainText">> +fi<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +source $DMESG_ROOT/debug.sh<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +ERR=1<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: capture all the heads of various kmsg exceptional log #
<o:p></o:p></p>
<p class="MsoPlainText">> +param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the dmesg log which you'll employ<o:p></o:p></p>
<p class="MsoPlainText">> +grep_crash_head()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          [[ ! "$*" || "$*" =~ ^-[a-z]+$ ]] && {<o:p></o:p></p>
<p class="MsoPlainText">> +                          echo "input of grep_crash_head is empty" >&2<o:p></o:p></p>
<p class="MsoPlainText">> +                          dump_stack<o:p></o:p></p>
<p class="MsoPlainText">> +                          return 1<o:p></o:p></p>
<p class="MsoPlainText">> +          }<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -a -f $DMESG_ROOT/oops-pattern "$@" && return<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -B8 'Call Trace:$' "$@" |<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -B1 -e 'Pid: [0-9]+, comm: ' \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -e 'CPU: [0-9]+ PID: [0-9]+ Comm: ' |<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -v -e ' [cC]omm: ' \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -e '^--$' \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -e '^$' \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -e '^\[[ 0-9.]*\] $' \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -e 'The following trace is a kernel self test and not a bug'<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: filter the kmsg exceptional log messages # param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the dmesg log which you'll engage<o:p></o:p></p>
<p class="MsoPlainText">> +grep_crash_dmesg()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          [[ "$@" ]] || {<o:p></o:p></p>
<p class="MsoPlainText">> +                          echo "input of grep_crash_dmesg is empty" >&2<o:p></o:p></p>
<p class="MsoPlainText">> +                          dump_stack<o:p></o:p></p>
<p class="MsoPlainText">> +                          return 1<o:p></o:p></p>
<p class="MsoPlainText">> +          }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -a -f $DMESG_ROOT/oops-pattern \<o:p></o:p></p>
<p class="MsoPlainText">> +                          -f $DMESG_ROOT/oops-context-pattern "$@"<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: filter the first kmsg exceptional log # param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the dmesg source you'll use<o:p></o:p></p>
<p class="MsoPlainText">> +first_crash_dmesg()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          grep_crash_dmesg -C3 "$@" | awk 'BEGIN { nr_first_head=0; };<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                          /^--$/ { exit };<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                          /---\[ end trace .*\]---/ { print; getline; print; exit };<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                          /(kernel BUG at |Kernel panic -|\<BUG: |WARNING: |INFO: )/ { if (nr_first_head > NR + 1) exit; nr_first_head = NR; };<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                          { print };<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                          NR > 200 { exit };'<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: retrieve dmesg trace info based on dmesg tag # param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [tag]: a dmesg tag or head<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the file which contains your full dmesg log<o:p></o:p></p>
<p class="MsoPlainText">> +head_to_dmesg()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          [[ $# -eq 2 ]] || {<o:p></o:p></p>
<p class="MsoPlainText">> +                          echo "ERROR:input of head_to_dmesg is empty !" >&2<o:p></o:p></p>
<p class="MsoPlainText">> +                          echo "Usage: head_to_dmesg <dmesg_head> <dmesg_log_file>"<o:p></o:p></p>
<p class="MsoPlainText">> +                          return $ERR<o:p></o:p></p>
<p class="MsoPlainText">> +          }<o:p></o:p></p>
<p class="MsoPlainText">> +          <o:p></o:p></p>
<p class="MsoPlainText">> +          dmesg_head=$1<o:p></o:p></p>
<p class="MsoPlainText">> +          dmesg_file=$2<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +          awk -v pattern="${dmesg_head}" '<o:p></o:p></p>
<p class="MsoPlainText">> +          BEGIN { nr_dmesg_target = 0; }<o:p></o:p></p>
<p class="MsoPlainText">> +          {<o:p></o:p></p>
<p class="MsoPlainText">> +                          if ( $0 !~ pattern){<o:p></o:p></p>
<p class="MsoPlainText">> +                                          next;<o:p></o:p></p>
<p class="MsoPlainText">> +                          } <o:p></o:p></p>
<p class="MsoPlainText">> +                          else { <o:p></o:p></p>
<p class="MsoPlainText">> +                                          nr_dmesg_target = FNR; print;<o:p></o:p></p>
<p class="MsoPlainText">> +                          }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                          do<o:p></o:p></p>
<p class="MsoPlainText">> +                          {<o:p></o:p></p>
<p class="MsoPlainText">> +                                          if (getline > 0)
<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          print;
<o:p></o:p></p>
<p class="MsoPlainText">> +                                          else<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          break;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                                          if ($0 ~ /---\[ end trace .*\]/){<o:p></o:p></p>
<p class="MsoPlainText">> +                                                          break;<o:p></o:p></p>
<p class="MsoPlainText">> +                                          }<o:p></o:p></p>
<p class="MsoPlainText">> +                          } while (NR - nr_dmesg_target < 60)<o:p></o:p></p>
<p class="MsoPlainText">> +          }              <o:p></o:p></p>
<p class="MsoPlainText">> +          END { <o:p></o:p></p>
<p class="MsoPlainText">> +                          if (nr_dmesg_target > 0) {<o:p></o:p></p>
<p class="MsoPlainText">> +                                          print "---[kernel msg end]---";<o:p></o:p></p>
<p class="MsoPlainText">> +                          }<o:p></o:p></p>
<p class="MsoPlainText">> +                          else {<o:p></o:p></p>
<p class="MsoPlainText">> +                                          print "Not Found";<o:p></o:p></p>
<p class="MsoPlainText">> +                          }<o:p></o:p></p>
<p class="MsoPlainText">> +          }' "${dmesg_file}"<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: sort out the call trace funcs from the given dmesg log #
<o:p></o:p></p>
<p class="MsoPlainText">> +param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the dmesg source you'll use, if a file <o:p>
</o:p></p>
<p class="MsoPlainText">> +CALL_TRACE_FUNCS='[a-zA-Z0-9._]+\+0x[0-9a-f]+\/0x[0-9a-f]+'<o:p></o:p></p>
<p class="MsoPlainText">> +call_trace_funcs()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          local dmesg=$1<o:p></o:p></p>
<p class="MsoPlainText">> +          grep -Eo "$CALL_TRACE_FUNCS" $1 | cut -f1 -d+ | uniq }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +# desc: sort out funcs from the first call trace stack of dmesg #
<o:p></o:p></p>
<p class="MsoPlainText">> +param:<o:p></o:p></p>
<p class="MsoPlainText">> +#   [dmesg]: the dmesg call trace log<o:p></o:p></p>
<p class="MsoPlainText">> +first_call_trace()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +          local dmesg=$1<o:p></o:p></p>
<p class="MsoPlainText">> +          awk 'BEGIN { in_trace=0; };<o:p></o:p></p>
<p class="MsoPlainText">> +                          /(Call Trace:|state was registered at:)/ { in_trace++; nr=0; next; };<o:p></o:p></p>
<p class="MsoPlainText">> +                          /'"$CALL_TRACE_FUNCS"'/{ if (match($0, />\] (?\s)?(_)?[a-zA-Z_][a-zA-Z0-9._]+\+0x/))<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                                          { print substr($0, RSTART+3, RLENGTH-6); nr++; }; next; };<o:p></o:p></p>
<p class="MsoPlainText">> +                          // {if (in_trace > 0 && nr > 1) exit;};' $dmesg |<o:p></o:p></p>
<p class="MsoPlainText">> +                          sed -r -e 's/\.(isra|constprop|part)\.[0-9]+//g' \<o:p></o:p></p>
<p class="MsoPlainText">> +                                          | uniq<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/oops-context-pattern <o:p></o:p></p>
<p class="MsoPlainText">> b/dmesg_triage/oops-context-pattern<o:p></o:p></p>
<p class="MsoPlainText">> new file mode 100644<o:p></o:p></p>
<p class="MsoPlainText">> index 0000000..f7dc209<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/oops-context-pattern<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,37 @@<o:p></o:p></p>
<p class="MsoPlainText">> +invoked oom-killer:<o:p></o:p></p>
<p class="MsoPlainText">> +INFO: possible recursive locking detected  is trying to acquire lock:<o:p></o:p></p>
<p class="MsoPlainText">> + state was registered at:<o:p></o:p></p>
<p class="MsoPlainText">> +Possible unsafe locking scenario:<o:p></o:p></p>
<p class="MsoPlainText">> +       CPU0$<o:p></o:p></p>
<p class="MsoPlainText">> +       ----$<o:p></o:p></p>
<p class="MsoPlainText">> +  lock(.*);<o:p></o:p></p>
<p class="MsoPlainText">> +\*\*\* DEADLOCK \*\*\*<o:p></o:p></p>
<p class="MsoPlainText">> +May be due to missing lock nesting notation<o:p></o:p></p>
<p class="MsoPlainText">> +  <Interrupt><o:p></o:p></p>
<p class="MsoPlainText">> +but task is already holding lock:<o:p></o:p></p>
<p class="MsoPlainText">> +which lock already depends on the new lock.<o:p></o:p></p>
<p class="MsoPlainText">> +other info that might help us debug this:<o:p></o:p></p>
<p class="MsoPlainText">> +stack backtrace:<o:p></o:p></p>
<p class="MsoPlainText">> + EFLAGS: <o:p></o:p></p>
<p class="MsoPlainText">> +RBP: <o:p></o:p></p>
<p class="MsoPlainText">> + knlGS:<o:p></o:p></p>
<p class="MsoPlainText">> + CR3: <o:p></o:p></p>
<p class="MsoPlainText">> +Stack:<o:p></o:p></p>
<p class="MsoPlainText">> +Code: <o:p></o:p></p>
<p class="MsoPlainText">> +sending NMI to all CPUs:<o:p></o:p></p>
<p class="MsoPlainText">> +Modules linked in:<o:p></o:p></p>
<p class="MsoPlainText">> +Hardware name: <o:p></o:p></p>
<p class="MsoPlainText">> +Call Trace:<o:p></o:p></p>
<p class="MsoPlainText">> +\[<[a-f0-9]\+>\] [a-z0-9._]\++0x[0-9a-f]\+/0x[0-9a-f]\+<o:p></o:p></p>
<p class="MsoPlainText">> +\[<[a-f0-9]\+>\] ? [a-z0-9._]\++0x[0-9a-f]\+/0x[0-9a-f]\+<o:p></o:p></p>
<p class="MsoPlainText">> +\( [0-9a-f]\{16\}\)\{7\}<o:p></o:p></p>
<p class="MsoPlainText">> +slab_unreclaimable:<o:p></o:p></p>
<p class="MsoPlainText">> +Swap cache stats:<o:p></o:p></p>
<p class="MsoPlainText">> +pages RAM<o:p></o:p></p>
<p class="MsoPlainText">> + locks held by<o:p></o:p></p>
<p class="MsoPlainText">> + lock held by<o:p></o:p></p>
<p class="MsoPlainText">> +RCU used illegally from<o:p></o:p></p>
<p class="MsoPlainText">> + =========================$<o:p></o:p></p>
<p class="MsoPlainText">> +Object [0-9a-f]\+: [0-9a-f ]\+  \.\.\.<o:p></o:p></p>
<p class="MsoPlainText">> +Redzone [0-9a-f]\+: [0-9a-f ]\+<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/dmesg_triage/oops-pattern b/dmesg_triage/oops-pattern new
<o:p></o:p></p>
<p class="MsoPlainText">> file mode 100644 index 0000000..9ce4148<o:p></o:p></p>
<p class="MsoPlainText">> --- /dev/null<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/dmesg_triage/oops-pattern<o:p></o:p></p>
<p class="MsoPlainText">> @@ -0,0 +1,59 @@<o:p></o:p></p>
<p class="MsoPlainText">> +[a-zA-Z ]\+: [a-f0-9]\{4\} \[#[0-9]\+\] [A-Z_ ]*$ kernel BUG at .*
<o:p></o:p></p>
<p class="MsoPlainText">> +Kernel panic - not syncing: .*<o:p></o:p></p>
<p class="MsoPlainText">> +^BUG: .*<o:p></o:p></p>
<p class="MsoPlainText">> +\[ *[0-9.]\+\] BUG: .*<o:p></o:p></p>
<p class="MsoPlainText">> +BUG .* (.*): .*<o:p></o:p></p>
<p class="MsoPlainText">> +Oops: .*<o:p></o:p></p>
<p class="MsoPlainText">> +WARNING: at .*<o:p></o:p></p>
<p class="MsoPlainText">> +WARNING: CPU: [0-9]\+ PID: [0-9]\+ at .*<o:p></o:p></p>
<p class="MsoPlainText">> +^INFO: .*detected stall.*<o:p></o:p></p>
<p class="MsoPlainText">> +^INFO: .* cpu=.*<o:p></o:p></p>
<p class="MsoPlainText">> +^INFO: Slab 0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +^INFO: Object 0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +^INFO: 0x.*. First byte 0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +\[ *[0-9.]\+\] INFO: .*<o:p></o:p></p>
<p class="MsoPlainText">> +\[ INFO: [^i].* \]<o:p></o:p></p>
<p class="MsoPlainText">> +RCU used illegally from offline CPU!<o:p></o:p></p>
<p class="MsoPlainText">> +RCU used illegally from idle CPU!<o:p></o:p></p>
<p class="MsoPlainText">> +RCU used illegally from extended quiescent state!<o:p></o:p></p>
<p class="MsoPlainText">> +inconsistent {.*} -> {.*} usage\.<o:p></o:p></p>
<p class="MsoPlainText">> +initcall .* returned with .*<o:p></o:p></p>
<p class="MsoPlainText">> +\[ BUG: [^b].*! \]<o:p></o:p></p>
<p class="MsoPlainText">> + is trying to release lock (.*) at<o:p></o:p></p>
<p class="MsoPlainText">> + is trying to contend lock (.*) at<o:p></o:p></p>
<p class="MsoPlainText">> + is trying to lock: .*<o:p></o:p></p>
<p class="MsoPlainText">> + but this task is not holding: .*<o:p></o:p></p>
<p class="MsoPlainText">> + is leaving the kernel with locks still held!<o:p></o:p></p>
<p class="MsoPlainText">> + is exiting with locks still held!<o:p></o:p></p>
<p class="MsoPlainText">> + is freeing memory .*, with a lock still held there!<o:p></o:p></p>
<p class="MsoPlainText">> +genirq: Flags mismatch irq .*<o:p></o:p></p>
<p class="MsoPlainText">> +Out of memory: Kill process<o:p></o:p></p>
<p class="MsoPlainText">> +page allocation failure: order:[0-9]\+, mode:0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +pagealloc: single bit error<o:p></o:p></p>
<p class="MsoPlainText">> +pagealloc: memory corruption<o:p></o:p></p>
<p class="MsoPlainText">> +audit: (.*) error: .*<o:p></o:p></p>
<p class="MsoPlainText">> +getblk(): invalid block size [0-9]\+ requested<o:p></o:p></p>
<p class="MsoPlainText">> +KGDB: re-enter exception: ALL breakpoints killed<o:p></o:p></p>
<p class="MsoPlainText">> +IP-Config: Auto-configuration of network failed EIP is at
<o:p></o:p></p>
<p class="MsoPlainText">> +[a-zA-Z0-9._]\++0x.*/0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +RIP: [0-9a-f]\{4\}:\[.*\] [a-zA-Z0-9._]\++0x.*/0x.*<o:p></o:p></p>
<p class="MsoPlainText">> +PANIC: early exception<o:p></o:p></p>
<p class="MsoPlainText">> +PANIC: double fault,<o:p></o:p></p>
<p class="MsoPlainText">> +Unknown interrupt or fault at:<o:p></o:p></p>
<p class="MsoPlainText">> +End of test: FAILURE<o:p></o:p></p>
<p class="MsoPlainText">> +End of test: RCU_HOTPLUG<o:p></o:p></p>
<p class="MsoPlainText">> +S0Box: more than 5 loops in s0box_interrupt Initramfs unpacking
<o:p></o:p></p>
<p class="MsoPlainText">> +failed:<o:p></o:p></p>
<p class="MsoPlainText">> +assertion failed<o:p></o:p></p>
<p class="MsoPlainText">> +Assertion failed<o:p></o:p></p>
<p class="MsoPlainText">> +assertion failure<o:p></o:p></p>
<p class="MsoPlainText">> +Assertion failure<o:p></o:p></p>
<p class="MsoPlainText">> +32-bit relocation outside of kernel!<o:p></o:p></p>
<p class="MsoPlainText">> +64-bit relocation outside of kernel!<o:p></o:p></p>
<p class="MsoPlainText">> +Kernel is not a valid ELF file<o:p></o:p></p>
<p class="MsoPlainText">> +Failed to allocate space for phdrs<o:p></o:p></p>
<p class="MsoPlainText">> +Destination address inappropriately aligned Destination address too
<o:p></o:p></p>
<p class="MsoPlainText">> +large Wrong destination address<o:p></o:p></p>
<p class="MsoPlainText">> + -- System halted<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/framework/dmesg.py b/framework/dmesg.py index
<o:p></o:p></p>
<p class="MsoPlainText">> 1a5f629..d23ba23 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/framework/dmesg.py<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/framework/dmesg.py<o:p></o:p></p>
<p class="MsoPlainText">> @@ -41,6 +41,7 @@ import sys<o:p></o:p></p>
<p class="MsoPlainText">>  import subprocess<o:p></o:p></p>
<p class="MsoPlainText">>  import warnings<o:p></o:p></p>
<p class="MsoPlainText">>  import abc<o:p></o:p></p>
<p class="MsoPlainText">> +import os, errno<o:p></o:p></p>
<p class="MsoPlainText">>  <o:p></o:p></p>
<p class="MsoPlainText">>  __all__ = [<o:p></o:p></p>
<p class="MsoPlainText">>      'BaseDmesg',<o:p></o:p></p>
<p class="MsoPlainText">> @@ -201,6 +202,65 @@ class LinuxDmesg(BaseDmesg):<o:p></o:p></p>
<p class="MsoPlainText">>          # Attempt to store the last element of dmesg, unless there was no dmesg<o:p></o:p></p>
<p class="MsoPlainText">>          self._last_message = dmesg[-1] if dmesg else None<o:p></o:p></p>
<p class="MsoPlainText">>  <o:p></o:p></p>
<p class="MsoPlainText">> +    def dmesg_triage(self, result, config):<o:p></o:p></p>
<p class="MsoPlainText">> +        """ Triage dmesg log to sort out different tag and head<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        Retrieve the contents of dmesg log, then work out a tag and a head, which<o:p></o:p></p>
<p class="MsoPlainText">> +        can be used to rollback the original dmesg trace details.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        """<o:p></o:p></p>
<p class="MsoPlainText">> +        try:<o:p></o:p></p>
<p class="MsoPlainText">> +            os.stat(config["DMESG_TRIAGE_SRC"])<o:p></o:p></p>
<p class="MsoPlainText">> +        except OSError as e:<o:p></o:p></p>
<p class="MsoPlainText">> +            if e.errno == errno.ENOENT or e.errno == errno.ENODIR:<o:p></o:p></p>
<p class="MsoPlainText">> +                sys.stderr.write("[Dmesg Triage Err]: %s" % str(e))<o:p></o:p></p>
<p class="MsoPlainText">> +                return result<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        if not os.path.exists(config["DMESG_TRIAGE_TMP"]):<o:p></o:p></p>
<p class="MsoPlainText">> +            try:<o:p></o:p></p>
<p class="MsoPlainText">> +                os.makedirs(config["DMESG_TRIAGE_TMP"])<o:p></o:p></p>
<p class="MsoPlainText">> +            except OSError as e:<o:p></o:p></p>
<p class="MsoPlainText">> +                sys.stderr.write("[Dmesg Triage Warn]: %s" % str(e))<o:p></o:p></p>
<p class="MsoPlainText">> +                config["DMESG_TRIAGE_TMP"] = "/tmp"     
<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        os.environ["DMESG_TRIAGE_ROOT"] = config["DMESG_TRIAGE_SRC"]<o:p></o:p></p>
<p class="MsoPlainText">> +        os.environ["KMSG_TRIAGE_LOG"] = config["DMESG_TRIAGE_TMP"]<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        fd = open("%s" % os.path.join(config["DMESG_TRIAGE_TMP"], ".dmesg"), 'wb')<o:p></o:p></p>
<p class="MsoPlainText">> +        try:<o:p></o:p></p>
<p class="MsoPlainText">> +            fd.write(result["dmesg"])<o:p></o:p></p>
<p class="MsoPlainText">> +            fd.flush()<o:p></o:p></p>
<p class="MsoPlainText">> +        finally:<o:p></o:p></p>
<p class="MsoPlainText">> +            fd.close()<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        try:<o:p></o:p></p>
<p class="MsoPlainText">> +            os.chdir(config["DMESG_TRIAGE_SRC"])<o:p></o:p></p>
<p class="MsoPlainText">> +            ret = subprocess.call("which ruby > /dev/null", shell=True)<o:p></o:p></p>
<p class="MsoPlainText">> +            if ret != 0:<o:p></o:p></p>
<p class="MsoPlainText">> +                sys.stderr.write("[Dmesg Triage Err]: No ruby binary found, please install and try again !\n")<o:p></o:p></p>
<p class="MsoPlainText">> +                return result<o:p></o:p></p>
<p class="MsoPlainText">> +            subprocess.check_call("ruby kmsg_triage", shell=True)<o:p></o:p></p>
<p class="MsoPlainText">> +        except subprocess.CalledProcessError as e:<o:p></o:p></p>
<p class="MsoPlainText">> +            sys.stderr.write("[Dmesg Triage Err]: %s" % str(e))<o:p></o:p></p>
<p class="MsoPlainText">> +            return result<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        if not os.path.exists("%s" % os.path.join(config["DMESG_TRIAGE_TMP"], ".dmesg_error_ids")):<o:p></o:p></p>
<p class="MsoPlainText">> +            return result<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        error_ids = dict()<o:p></o:p></p>
<p class="MsoPlainText">> +        with open(os.path.join(config["DMESG_TRIAGE_TMP"], ".dmesg_error_ids")) as f:<o:p></o:p></p>
<p class="MsoPlainText">> +            for err in iter(f.readline, ''):<o:p></o:p></p>
<p class="MsoPlainText">> +                if re.search(r'@', err) is None:<o:p></o:p></p>
<p class="MsoPlainText">> +                    f.close()<o:p></o:p></p>
<p class="MsoPlainText">> +                    return result<o:p></o:p></p>
<p class="MsoPlainText">> +                err_id = re.split(r'@', err)<o:p></o:p></p>
<p class="MsoPlainText">> +                error_ids[err_id[0]] = <o:p></o:p></p>
<p class="MsoPlainText">> + err_id[1].strip("\n").replace("0x", "*")<o:p></o:p></p>
<p class="MsoPlainText">> +             <o:p></o:p></p>
<p class="MsoPlainText">> +            f.close()<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        result["dmesg_triage_info"] = error_ids<o:p></o:p></p>
<p class="MsoPlainText">> +        return result<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">>  <o:p></o:p></p>
<p class="MsoPlainText">>  class DummyDmesg(BaseDmesg):<o:p></o:p></p>
<p class="MsoPlainText">>      """ An dummy class for dmesg on non unix-like systems diff --git
<o:p></o:p></p>
<p class="MsoPlainText">> a/framework/test/base.py b/framework/test/base.py index
<o:p></o:p></p>
<p class="MsoPlainText">> efc20cb..a57c7ea 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/framework/test/base.py<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/framework/test/base.py<o:p></o:p></p>
<p class="MsoPlainText">> @@ -157,6 +157,10 @@ class Test(object):<o:p></o:p></p>
<p class="MsoPlainText">>                  self.run()<o:p></o:p></p>
<p class="MsoPlainText">>                  self.result['time'] = time.time() - time_start<o:p></o:p></p>
<p class="MsoPlainText">>                  self.result = dmesg.update_result(self.result)<o:p></o:p></p>
<p class="MsoPlainText">> +                if self.result.has_key("dmesg") and self.env["ENABLE_DMESG_TRIAGE"]:<o:p></o:p></p>
<p class="MsoPlainText">> +                    self.env["DMESG_TRIAGE_SRC"] = os.path.join(self.OPTS.env["PIGLIT_SOURCE_DIR"], self.env["DMESG_TRIAGE_SRC"])<o:p></o:p></p>
<p class="MsoPlainText">> +                    self.result = dmesg.dmesg_triage(self.result,
<o:p></o:p></p>
<p class="MsoPlainText">> + self.env)<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>              # This is a rare case where a bare exception is okay, since we're<o:p></o:p></p>
<p class="MsoPlainText">>              # using it to log exceptions<o:p></o:p></p>
<p class="MsoPlainText">>              except:<o:p></o:p></p>
<p class="MsoPlainText">> diff --git a/tests/igt.py b/tests/igt.py index 2047781..704ee75 100644<o:p></o:p></p>
<p class="MsoPlainText">> --- a/tests/igt.py<o:p></o:p></p>
<p class="MsoPlainText">> +++ b/tests/igt.py<o:p></o:p></p>
<p class="MsoPlainText">> @@ -104,6 +104,13 @@ class IGTTest(Test):<o:p></o:p></p>
<p class="MsoPlainText">>              [os.path.join(IGT_TEST_ROOT, binary)] + arguments)<o:p></o:p></p>
<p class="MsoPlainText">>          self.timeout = 600<o:p></o:p></p>
<p class="MsoPlainText">>  <o:p></o:p></p>
<p class="MsoPlainText">> +        # enable or disable dmesg triage feature here<o:p></o:p></p>
<p class="MsoPlainText">> +        self.env["ENABLE_DMESG_TRIAGE"] = True<o:p></o:p></p>
<p class="MsoPlainText">> +        if self.env["ENABLE_DMESG_TRIAGE"]:<o:p></o:p></p>
<p class="MsoPlainText">> +            # Initialize dmesg triage resources<o:p></o:p></p>
<p class="MsoPlainText">> +            self.env["DMESG_TRIAGE_TMP"] = "/tmp/dmesg"<o:p></o:p></p>
<p class="MsoPlainText">> +            self.env["DMESG_TRIAGE_SRC"] = "dmesg_triage"<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>      def interpret_result(self):<o:p></o:p></p>
<p class="MsoPlainText">>          if self.result['returncode'] == 0:<o:p></o:p></p>
<p class="MsoPlainText">>              self.result['result'] = 'pass'<o:p></o:p></p>
<p class="MsoPlainText">> --<o:p></o:p></p>
<p class="MsoPlainText">> 1.9.1<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> _______________________________________________<o:p></o:p></p>
<p class="MsoPlainText">> Piglit mailing list<o:p></o:p></p>
<p class="MsoPlainText">> <a href="mailto:Piglit@lists.freedesktop.org"><span style="color:windowtext;text-decoration:none">Piglit@lists.freedesktop.org</span></a><o:p></o:p></p>
<p class="MsoPlainText">> <a href="http://lists.freedesktop.org/mailman/listinfo/piglit">
<span style="color:windowtext;text-decoration:none">http://lists.freedesktop.org/mailman/listinfo/piglit</span></a><o:p></o:p></p>
</div>
</body>
</html>