#format wiki #language nl == Your Name == Roel Kluin Email: [[MailTo(12o3l AT SPAMFREE tiscali DOT nl)]] ... ---- CategoryHomepage some scripts for configuring a kernel: To translate a module name (as listed in modprobe -l or modinfo -n ''module'') into a kernel .config option: {{{ #!/bin/bash mod="${1%.ko}"; dir="${1%/*}"; sed -e :a -e '/\\$/N; s/\\\n//; ta' "${dir#*/kernel/}/Makefile" | \ sed -n "s/^obj-\$(CONFIG_\([A-Z0-9_]*\))\W*+=\W*"${mod##*/}"\.o$/\1/p"; }}} a sed script to check ioremap/iounmap balancing (can be adapted for others) {{{ git-grep -l '[^[:alnum:]]ioremap' | while read g; do echo "--------------------------[ $g ]--------------------------" sed -n "/[^[:alnum:]]ioremap.*(\(.*\))/,/^[}{]$/{ s/\(.*return.*\)/\1\t\t-------return/ tp s/\(.*goto.*\)/\1\t\t------goto/ tp s/\(.*iounmap.*\)/\1\t\t<----/ tp s/\(.*ioremap.*\)/\1\t\t---->/ Tp = :p p }" $g done | less }}} scripts below may use these variables: {{{ # a number D="[0-9]\+" # we could also use this, to match something like 1ul, floats or hexes as well: # but the parentheses will cost one backreference for (git-)grep d="\([0-9]\+[uUlLfF]\?\|[0-9]\+[uU]\?[lL][lL]\?\|0x[a-f0-9]\+\|0x[A-F0-9]\+\|[0-9]\+[lL][lL][uU]\|[0-9]*\.[0-9]\+[fF]\?\)" # can be used for a variable/function name: V="[A-Za-z_]\+[A-Za-z0-9_]*" # capital: a config option/definition K="[A-Z]\+[A-Z0-9_]*"; # works the same as above, but also for members and arrays: one backreference W="$V\(\[$s$V$s\]\|\[$s$D$s\]\|\.$V\|->$V\)*" # seperators: s="[[:space:]]*"; S="[[:space:]]\+" # useful to delimit a variable name: Q="[^[:alnum:]_]" # match the end of the line, including comments: one backreference (but at eol) cendl="$s\(\/[\*\/].*\)\?$" # match something that is not comment, string or character: 2 backreferences ccode="\([^\/\"']*\|\/[^\*\/]\|\/\*\([^\*]*\|\**[^\/\*]\)*\*\/\|'[^']*'\|\"[^\"]*\"\)*" # resp function open and end (only works when indentation is correct. fo="^[\{]$cendl" fe="^[\}]$cendl" }}} Make sure no-one is freeing skbs with kfree instead of kfree_skb {{{ for f in $(git-grep -l "struct${s}sk_buff"); do sed -n "s/^.*struct${S}sk_buff${s}\*${s}\(${V}\)$Q.*$/\1/p" $f | sort | uniq | while read n; do sed -n "/struct${s}sk_buff${s}\*${s}${n}/,/^[{}].*$/{ /kfree(${s}${n}${s})/= }" $f | while read q; do echo -e "kfreeing sk_buff $n at line $q in $f\n$q"; sed -n "/struct${s}sk_buff${s}\*${s}${n}/,/^[{}].*$/p" $f; done done done 2>&1 | less }}} show module initializing functions, not using {{{__init}}} or similarly exit {{{ git-grep -n "\(void\|int\)$s[[:alnum:]_]*module_[ei][xn]it(void)" | grep -v "__[ie][xn]it" }}} these can be replaced with strchr {{{ E="\([^\"\\]\|\\[\\tnr\?'\"0bafv]\|\\[0-7]\{1,3\}\|\\[a-f0-9]\{1,2\}\)" git-grep -n "strstr$s($s$W$s,$s\"$E\"$s)" }}} matches if(function) BUG() {{{ cendl="$s\(\/[\*\/].*\)\?$" ccode="\([^\/\"']*\|\/[^\*\/]\|\/\*\([^\*]*\|\**[^\/\*]\)*\*\/\|'[^']*'\|\"[^\"]*\"\)*" q="${s}if$s(\($ccode$Q\)\?$L$s($ccode)$s$ccode$s)" git-grep -n -B1 "^\($q\)\?${s}BUG($s)$s;$cendl" | grep "$q$cendl" | grep -v "\(sizeof\|unlikely\|likely\)($ccode)" | less }}} Based on Linus' script to get the email address of a maintainer, I wrote this script to get the address of a list rather than a maintainers address for mailing. {{{ git log --since="1 year ago" "$@" | sed -n "s/^ .[-a-z]*by: \(.*\) <.*$/\1/p" | sort | uniq | sort -n -r | while read name; do sed -n "/^P:[ \t]*.*$name/,/^$/{ s/^L:[ \t]*\(.*\)$/\1/p }" ./MAINTAINERS done | sort | uniq -c | sort -n -r | while read nr list; do tot=`grep -c "^L:\W*.*$list.*" ./MAINTAINERS` echo "`expr $nr / \( $tot + 1 \)` $nr $tot $list" done | sort -r | cut -d " " -f2- | while read nr tot list; do echo -e "$nr/$tot Acks were commited by maintainers of list $list" done }}}