kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Masami Hiramatsu <mhiramat@redhat.com>
To: Ingo Molnar <mingo@elte.hu>, Steven Rostedt <rostedt@goodmis.org>,
	        lkml <linux-kernel@vger.kernel.org>
Cc: "Ananth N Mavinakayanahalli" <ananth@in.ibm.com>,
	"Avi Kivity" <avi@redhat.com>, "Andi Kleen" <ak@linux.intel.com>,
	"Christoph Hellwig" <hch@infradead.org>,
	"Frank Ch. Eigler" <fche@redhat.com>,
	"Frederic Weisbecker" <fweisbec@gmail.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"Jason Baron" <jbaron@redhat.com>,
	"Jim Keniston" <jkenisto@us.ibm.com>,
	"K.Prasad" <prasad@linux.vnet.ibm.com>,
	"Lai Jiangshan" <laijs@cn.fujitsu.com>,
	"Li Zefan" <lizf@cn.fujitsu.com>,
	PrzemysławPawełczyk <przemyslaw@pawelczyk.it>,
	"Roland McGrath" <roland@redhat.com>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	"Srikar Dronamraju" <srikar@linux.vnet.ibm.com>,
	"Tom Zanussi" <tzanussi@gmail.com>,
	"Vegard Nossum" <vegard.nossum@gma>
Subject: [TOOL] kprobestest : Kprobe stress test tool
Date: Thu, 13 Aug 2009 16:57:20 -0400	[thread overview]
Message-ID: <4A847E30.9050903@redhat.com> (raw)
In-Reply-To: <20090813203403.31965.20973.stgit@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 1476 bytes --]

This script tests kprobes to probe on all symbols in the kernel and finds
symbols which must be blacklisted.


Usage
-----
   kprobestest [-s SYMLIST] [-b BLACKLIST] [-w WHITELIST]
      Run stress test. If SYMLIST file is specified, use it as
      an initial symbol list (This is useful for verifying white list
      after diagnosing all symbols).

   kprobestest cleanup
      Cleanup all lists


How to Work
-----------
This tool list up all symbols in the kernel via /proc/kallsyms, and sorts
it into groups (each of them including 64 symbols in default). And then,
it tests each group by using kprobe-tracer. If a kernel crash occurred,
that group is moved into 'failed' dir. If the group passed the test, this
script moves it into 'passed' dir and saves kprobe_profile into
'passed/profiles/'.
After testing all groups, all 'failed' groups are merged and sorted into
smaller groups (divided by 4, in default). And those are tested again.
This loop will be repeated until all group has just 1 symbol.

Finally, the script sorts all 'passed' symbols into 'tested', 'untested',
and 'missed' based on profiles.


Note
----
  - This script just gives us some clues to the blacklisted functions.
    In some cases, a combination of probe points will cause a problem, but
    each of them doesn't cause the problem alone.

Thank you,

-- 
Masami Hiramatsu

Software Engineer
Hitachi Computer Products (America), Inc.
Software Solutions Division

e-mail: mhiramat@redhat.com


[-- Attachment #2: kprobestest --]
[-- Type: text/plain, Size: 4945 bytes --]

#!/bin/bash
#
#  kprobestest: Kprobes stress test tool
#  Written by Masami Hiramatsu <mhiramat@redhat.com>
#
#  Usage:
#     $ kprobestest [-s SYMLIST] [-b BLACKLIST] [-w WHITELIST]
#        Run stress test. If SYMLIST file is specified, use it as 
#        an initial symbol list (This is useful for verifying white list
#        after diagnosing all symbols).
#
#     $ kprobestest cleanup
#        Cleanup all lists

# Configurations 
DEBUGFS=/sys/kernel/debug
INITNR=64
DIV=4
SYMFILE=syms.list
FAILFILE=black.list

function do_test () {
  # Do some benchmark
  for i in {1..4} ; do
  sleep 0.5
  echo -n "."
  done
}

function usage () {
  echo "Usage: kprobestest [cleanup] [-s SYMLIST] [-b BLACKLIST] [-w WHITELIST]"
  exit 0
}

function cleanup_test () {
  echo "Cleanup all files"
  rm -rf $SYMFILE failed passed testing unset
  exit 0
}


# Parse arguments
WHITELIST=
BLACKLIST=
SYMLIST=

while [ "$1" ]; do
  case $1 in
    cleanup)
      cleanup_test
      ;;
    -s)
      SYMLIST=$2
      shift 1
      ;;
    -b)
      BLACKLIST=$2
      shift 1
      ;;
    -w)
      WHITELIST=$2
      shift 1
      ;;
    *)
      usage
      ;;
  esac
  shift 1
done

# Show configurations
echo "Kprobe stress test starting."
[ -f "$BLACKLIST" ] && echo "Blacklist: $BLACKLIST" || BLACKLIST=""
[ -f "$WHITELIST" ] && echo "Whitelist: $WHITELIST" || WHITELIST=""
[ -f "$SYMLIST" ] && echo "Symlist: $SYMLIST" || SYMLIST=""

function make_filter () {
  local EXP=""
  if [ -z "$WHITELIST" -a -z "$BLACKLIST" ]; then
    echo "s/^$//g"
  else
    for i in `cat $WHITELIST $BLACKLIST` ;do
      [ -z "$EXP" ] && EXP="^$i\$" || EXP="$EXP\\|^$i\$"
    done ; EXP="s/$EXP//g"
    echo $EXP
  fi
}

function list_allsyms () {
  local sym
  local out=1
  for sym in `sort /proc/kallsyms | egrep '[0-9a-f]+ [Tt] [^[]*$' | cut -d\  -f 3`;do
    [ $sym  = "__kprobes_text_start" ] && out=0 && continue
    [ $sym  = "__kprobes_text_end" ] && out=1 && continue
    [ $sym  = "_etext" ] && break
    [ $out -eq 1 ] && echo $sym
  done
}

function prep_testing () {
  local i=0
  local n=0
  local NR=$1
  local fname=

  echo "Grouping symbols: $NR"

  fname=`printf "list-%03d.%d" $i $NR`
  cat $SYMFILE | while read ln; do
    [ -z "$ln" ] && continue
    echo "$ln" >> testing/$fname
    n=$((n+1))
    if [ $n -eq $NR ]; then
      n=0
      i=$((i+1))
      fname=`printf "list-%03d.%d" $i $NR`
    fi
  done
  sync
}

function init_first () {
  local EXP
  EXP=`make_filter`
  if [ -f "$SYMLIST" ]; then
    cat $SYMLIST | sed $EXP > $SYMFILE
  else
    echo -n "Generating symbol list from /proc/kallsyms..."
    list_allsyms | sed $EXP > $SYMFILE
    echo "done. " `wc -l $SYMFILE | cut -f1 -d\  ` "symbols listed."
  fi
  mkdir -p testing failed unset passed passed/profiles
  prep_testing $INITNR
}

function get_max_nr () {
  wc -l failed/list-* unset/list-* 2>/dev/null |\
  awk '/^ *[0-9]+ .*list.*$/{ if (nr < $1) nr=$1 } BEGIN { nr=0 } END { print nr}'
}

function init_next () {
  local NR
  NR=`get_max_nr`
  [ $NR -eq 0 ] && return 1
  [ $NR -eq 1 ] && return 2
  [ $NR -le $DIV ] && NR=1 || NR=`expr $NR / $DIV`

  cat failed/* unset/* > $SYMFILE
  rm failed/* unset/*

  prep_testing $NR
  return 0
}


# Initialize symbols
if [ ! -d testing ]; then
  init_first
elif [ -z "`ls testing/`" ]; then
  init_next
fi

function set_probes () {
  local s
  for s in `cat $1`; do
    echo "p:$s" $s >> $DEBUGFS/tracing/kprobe_events
    [ $? -ne 0 ] && return -1
  done
  return 0
}

function clear_probes () {
  echo > $DEBUGFS/tracing/kprobe_events
}

function save_profile () {
  cat $DEBUGFS/tracing/kprobe_profile > passed/profiles/$1.prof
}

clear_probes

echo "Starting tests.."

RET=0

# Main loop
while [ $RET -eq 0 ]; do

  for list in `cd testing/; ls`; do
    echo -n $list
    # Temporary moving list into failed.
    mv testing/$list failed/
    sync;sync
    echo -n "sync.."
    set_probes failed/$list
    if [ $? -ne 0 ]; then
      clear_probes
      sync;sync
      echo "can not set"
      mv failed/$list unset/
      sync;sync
    else
      do_test
      save_profile $list
      clear_probes
      sync;sync
      echo "done"
      mv failed/$list passed/
      sync;sync
    fi
  done

  init_next
  RET=$?
done

if [ $RET -eq 1 ];then
  # No failed symbols
  echo "no failed symbols found."
else
  echo "found failed symbols:"
  cat failed/* | tee $FAILFILE
  rm failed/*
fi

function profile_symbols () {
  local s h m
  rm -f tested.list missed.list untested.list
  cat passed/profiles/*.prof | while read s h m ;do
    if [ $h -ne 0 ]; then 
      echo $s >> tested.list
    elif [ $m -ne 0 ]; then
      echo $s >> missed.list
    else
      echo $s >> untested.list
    fi
  done
}

echo -n "Profiling symbols..."
profile_symbols
echo done
echo tested: `wc -l tested.list | cut -d\  -f1` symbols
echo missed: `wc -l missed.list | cut -d\  -f1` symbols
echo untested: `wc -l untested.list | cut -d\  -f1` symbols

  parent reply	other threads:[~2009-08-13 20:57 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-13 20:34 [PATCH -tip v14 00/12] tracing: kprobe-based event tracer and x86 instruction decoder Masami Hiramatsu
2009-08-13 20:34 ` [PATCH -tip v14 01/12] x86: instruction decoder API Masami Hiramatsu
2009-08-19 23:42   ` Frederic Weisbecker
2009-08-20  0:21     ` Frederic Weisbecker
2009-08-20 15:03       ` Masami Hiramatsu
2009-08-20 15:25         ` Frederic Weisbecker
2009-08-20 16:16           ` Masami Hiramatsu
2009-08-20 18:07             ` Frederic Weisbecker
2009-08-20 19:01               ` Masami Hiramatsu
2009-08-20 20:14                 ` Frederic Weisbecker
2009-08-20 14:42     ` Masami Hiramatsu
2009-08-20 14:46       ` Frederic Weisbecker
2009-08-13 20:34 ` [PATCH -tip v14 02/12] x86: x86 instruction decoder build-time selftest Masami Hiramatsu
2009-08-13 20:34 ` [PATCH -tip v14 03/12] kprobes: checks probe address is instruction boudary on x86 Masami Hiramatsu
2009-08-18 23:03   ` Frederic Weisbecker
2009-08-18 23:17     ` Masami Hiramatsu
2009-08-18 23:43       ` Frederic Weisbecker
2009-08-19  0:19         ` Masami Hiramatsu
2009-08-19  0:46           ` Frederic Weisbecker
2009-08-13 20:34 ` [PATCH -tip v14 04/12] kprobes: cleanup fix_riprel() using insn decoder " Masami Hiramatsu
2009-08-13 20:34 ` [PATCH -tip v14 05/12] x86: add pt_regs register and stack access APIs Masami Hiramatsu
2009-08-13 20:34 ` [PATCH -tip v14 06/12] tracing: ftrace dynamic ftrace_event_call support Masami Hiramatsu
2009-08-13 20:35 ` [PATCH -tip v14 07/12] tracing: Introduce TRACE_FIELD_ZERO() macro Masami Hiramatsu
2009-08-19  1:09   ` Frederic Weisbecker
2009-08-19  2:20     ` Masami Hiramatsu
2009-08-19 13:58       ` Frederic Weisbecker
2009-08-13 20:35 ` [PATCH -tip v14 08/12] tracing: add kprobe-based event tracer Masami Hiramatsu
2009-08-19  1:23   ` Frederic Weisbecker
2009-08-13 20:35 ` [PATCH -tip v14 09/12] tracing: Kprobe-tracer supports more than 6 arguments Masami Hiramatsu
2009-08-13 20:35 ` [PATCH -tip v14 10/12] tracing: Generate names for each kprobe event automatically Masami Hiramatsu
2009-08-13 20:35 ` [PATCH -tip v14 11/12] tracing: Kprobe tracer assigns new event ids for each event Masami Hiramatsu
2009-08-13 20:35 ` [PATCH -tip v14 12/12] tracing: Add kprobes event profiling interface Masami Hiramatsu
2009-08-13 20:57 ` Masami Hiramatsu [this message]
2009-08-20 18:43   ` [TOOL] kprobestest : Kprobe stress test tool Frederic Weisbecker
2009-08-20 19:45     ` Masami Hiramatsu
2009-08-21  0:01       ` Frederic Weisbecker
2009-08-21  1:00         ` Masami Hiramatsu
2009-08-21 19:43         ` [PATCH tracing/kprobes 1/4] x86: Fix x86 instruction decoder selftest to check only .text Masami Hiramatsu
2009-08-23 19:34           ` Frederic Weisbecker
2009-08-21 19:43         ` [PATCH tracing/kprobes 2/4] x86: Check awk features before generating inat-tables.c Masami Hiramatsu
2009-08-21 19:43         ` [PATCH tracing/kprobes 3/4] tracing/kprobes: Fix format typo in trace_kprobes Masami Hiramatsu
2009-08-21 19:43         ` [PATCH tracing/kprobes 4/4] tracing/kprobes: Change trace_arg to probe_arg Masami Hiramatsu
2009-08-13 20:59 ` [TOOL] c2kpe: C expression to kprobe event format converter Masami Hiramatsu
2009-08-13 21:05   ` Christoph Hellwig
2009-08-30 19:50   ` Frederic Weisbecker
2009-08-31  4:14     ` Masami Hiramatsu
2009-08-31 22:14       ` Frederic Weisbecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A847E30.9050903@redhat.com \
    --to=mhiramat@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=ananth@in.ibm.com \
    --cc=avi@redhat.com \
    --cc=fche@redhat.com \
    --cc=fweisbec@gmail.com \
    --cc=hch@infradead.org \
    --cc=hpa@zytor.com \
    --cc=jbaron@redhat.com \
    --cc=jkenisto@us.ibm.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=mingo@elte.hu \
    --cc=prasad@linux.vnet.ibm.com \
    --cc=przemyslaw@pawelczyk.it \
    --cc=roland@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=sam@ravnborg.org \
    --cc=srikar@linux.vnet.ibm.com \
    --cc=tzanussi@gmail.com \
    --cc=vegard.nossum@gma \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).