#!/bin/sh # Sergey Senozhatsky, 2015 # sergey.senozhatsky.work@gmail.com # # This software is licensed under the terms of the GNU General Public # License version 2, as published by the Free Software Foundation, and # may be copied, distributed, and modified under those terms. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # This program is intended to plot a `slabinfo -X' stats, collected, # for example, using the following command: # while [ 1 ]; do slabinfo -X >> stats; sleep 1; done # # Use `slabinfo-gnuplot.sh stats' to pre-process collected records # and generate graphs (totals, slabs sorted by size, slabs sorted # by size). # # Graphs can be [individually] regenerate with different ranges and # size (-r %d,%d and -s %d,%d options). # # To visually compare N `totals' graphs, do # slabinfo-gnuplot.sh -t FILE1-totals FILE2-totals ... FILEN-totals # min_slab_name_size=11 xmin=0 xmax=0 width=1500 height=700 mode=preprocess usage() { echo "Usage: [-s W,H] [-r MIN,MAX] [-t|-l] FILE1 [FILE2 ..]" echo "FILEs must contain 'slabinfo -X' samples" echo "-t - plot totals for FILE(s)" echo "-l - plot slabs stats for FILE(s)" echo "-s %d,%d - set image width and height" echo "-r %d,%d - use data samples from a given range" } check_file_exist() { if [ ! -f "$1" ]; then echo "File '$1' does not exist" exit 1 fi } do_slabs_plotting() { local file=$1 local out_file local range="every ::$xmin" local xtic="" local xtic_rotate="norotate" local lines=2000000 local wc_lines check_file_exist "$file" out_file=`basename "$file"` if [ $xmax -ne 0 ]; then range="$range::$xmax" lines=$((xmax-xmin)) fi wc_lines=`cat "$file" | wc -l` if [ $? -ne 0 ] || [ "$wc_lines" -eq 0 ] ; then wc_lines=$lines fi if [ "$wc_lines" -lt "$lines" ]; then lines=$wc_lines fi if [ $((width / lines)) -gt $min_slab_name_size ]; then xtic=":xtic(1)" xtic_rotate=90 fi gnuplot -p << EOF #!/usr/bin/env gnuplot set terminal png enhanced size $width,$height large set output '$out_file.png' set autoscale xy set xlabel 'samples' set ylabel 'bytes' set style histogram columnstacked title textcolor lt -1 set style fill solid 0.15 set xtics rotate $xtic_rotate set key left above Left title reverse plot "$file" $range u 2$xtic title 'SIZE' with boxes,\ '' $range u 3 title 'LOSS' with boxes EOF if [ $? -eq 0 ]; then echo "$out_file.png" fi } do_totals_plotting() { local gnuplot_cmd="" local range="every ::$xmin" local file="" if [ $xmax -ne 0 ]; then range="$range::$xmax" fi for i in "${t_files[@]}"; do check_file_exist "$i" file="$file"`basename "$i"` gnuplot_cmd="$gnuplot_cmd '$i' $range using 1 title\ '$i Memory usage' with lines," gnuplot_cmd="$gnuplot_cmd '' $range using 2 title \ '$i Loss' with lines," done gnuplot -p << EOF #!/usr/bin/env gnuplot set terminal png enhanced size $width,$height large set autoscale xy set output '$file.png' set xlabel 'samples' set ylabel 'bytes' set key left above Left title reverse plot $gnuplot_cmd EOF if [ $? -eq 0 ]; then echo "$file.png" fi } do_preprocess() { local out local lines local in=$1 check_file_exist "$in" # use only 'TOP' slab (biggest memory usage or loss) let lines=3 out=`basename "$in"`"-slabs-by-loss" `cat "$in" | grep -A "$lines" 'Slabs sorted by loss' |\ egrep -iv '\-\-|Name|Slabs'\ | awk '{print $1" "$4+$2*$3" "$4}' > "$out"` if [ $? -eq 0 ]; then do_slabs_plotting "$out" fi let lines=3 out=`basename "$in"`"-slabs-by-size" `cat "$in" | grep -A "$lines" 'Slabs sorted by size' |\ egrep -iv '\-\-|Name|Slabs'\ | awk '{print $1" "$4" "$4-$2*$3}' > "$out"` if [ $? -eq 0 ]; then do_slabs_plotting "$out" fi out=`basename "$in"`"-totals" `cat "$in" | grep "Memory used" |\ awk '{print $3" "$7}' > "$out"` if [ $? -eq 0 ]; then t_files[0]=$out do_totals_plotting fi } parse_opts() { local opt while getopts "tlr::s::h" opt; do case $opt in t) mode=totals ;; l) mode=slabs ;; s) array=(${OPTARG//,/ }) width=${array[0]} height=${array[1]} ;; r) array=(${OPTARG//,/ }) xmin=${array[0]} xmax=${array[1]} ;; h) usage exit 0 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "-$OPTARG requires an argument." >&2 exit 1 ;; esac done return $OPTIND } parse_args() { local idx=0 local p for p in "$@"; do case $mode in preprocess) files[$idx]=$p idx=$idx+1 ;; totals) t_files[$idx]=$p idx=$idx+1 ;; slabs) files[$idx]=$p idx=$idx+1 ;; esac done } parse_opts "$@" argstart=$? parse_args "${@:$argstart}" if [ ${#files[@]} -eq 0 ] && [ ${#t_files[@]} -eq 0 ]; then usage exit 1 fi case $mode in preprocess) for i in "${files[@]}"; do do_preprocess "$i" done ;; totals) do_totals_plotting ;; slabs) for i in "${files[@]}"; do do_slabs_plotting "$i" done ;; *) echo "Unknown mode $mode" >&2 usage exit 1 ;; esac x/net-next.git/patch/drivers/usb/c67x00/c67x00-sched.c?id=dd86e373e09fb16b83e8adf5c48c421a4ca76468'>patch) tree55703c2ea8584e303e342090614e0aab3509ab21 /drivers/usb/c67x00/c67x00-sched.c parent0b3589be9b98994ce3d5aeca52445d1f5627c4ba (diff)
perf/x86/intel/rapl: Make package handling more robust
The package management code in RAPL relies on package mapping being available before a CPU is started. This changed with: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") because the ACPI/BIOS information turned out to be unreliable, but that left RAPL in broken state. This was not noticed because on a regular boot all CPUs are online before RAPL is initialized. A possible fix would be to reintroduce the mess which allocates a package data structure in CPU prepare and when it turns out to already exist in starting throw it away later in the CPU online callback. But that's a horrible hack and not required at all because RAPL becomes functional for perf only in the CPU online callback. That's correct because user space is not yet informed about the CPU being onlined, so nothing caan rely on RAPL being available on that particular CPU. Move the allocation to the CPU online callback and simplify the hotplug handling. At this point the package mapping is established and correct. This also adds a missing check for available package data in the event_init() function. Reported-by: Yasuaki Ishimatsu <yasu.isimatu@gmail.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Stephane Eranian <eranian@google.com> Cc: Vince Weaver <vincent.weaver@maine.edu> Fixes: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") Link: http://lkml.kernel.org/r/20170131230141.212593966@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/usb/c67x00/c67x00-sched.c')