1*53ee8cc1Swenshuai.xi#!/bin/bash 2*53ee8cc1Swenshuai.xi# Translate the bits making up a GFP mask 3*53ee8cc1Swenshuai.xi# (c) 2009, Mel Gorman <mel@csn.ul.ie> 4*53ee8cc1Swenshuai.xi# Licensed under the terms of the GNU GPL License version 2 5*53ee8cc1Swenshuai.xiSOURCE= 6*53ee8cc1Swenshuai.xiGFPMASK=none 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi# Helper function to report failures and exit 9*53ee8cc1Swenshuai.xidie() { 10*53ee8cc1Swenshuai.xi echo ERROR: $@ 11*53ee8cc1Swenshuai.xi if [ "$TMPFILE" != "" ]; then 12*53ee8cc1Swenshuai.xi rm -f $TMPFILE 13*53ee8cc1Swenshuai.xi fi 14*53ee8cc1Swenshuai.xi exit -1 15*53ee8cc1Swenshuai.xi} 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xiusage() { 18*53ee8cc1Swenshuai.xi echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask" 19*53ee8cc1Swenshuai.xi exit 0 20*53ee8cc1Swenshuai.xi} 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xi# Parse command-line arguments 23*53ee8cc1Swenshuai.xiwhile [ $# -gt 0 ]; do 24*53ee8cc1Swenshuai.xi case $1 in 25*53ee8cc1Swenshuai.xi --source) 26*53ee8cc1Swenshuai.xi SOURCE=$2 27*53ee8cc1Swenshuai.xi shift 2 28*53ee8cc1Swenshuai.xi ;; 29*53ee8cc1Swenshuai.xi -h) 30*53ee8cc1Swenshuai.xi usage 31*53ee8cc1Swenshuai.xi ;; 32*53ee8cc1Swenshuai.xi --help) 33*53ee8cc1Swenshuai.xi usage 34*53ee8cc1Swenshuai.xi ;; 35*53ee8cc1Swenshuai.xi *) 36*53ee8cc1Swenshuai.xi GFPMASK=$1 37*53ee8cc1Swenshuai.xi shift 38*53ee8cc1Swenshuai.xi ;; 39*53ee8cc1Swenshuai.xi esac 40*53ee8cc1Swenshuai.xidone 41*53ee8cc1Swenshuai.xi 42*53ee8cc1Swenshuai.xi# Guess the kernel source directory if it's not set. Preference is in order of 43*53ee8cc1Swenshuai.xi# o current directory 44*53ee8cc1Swenshuai.xi# o /usr/src/linux 45*53ee8cc1Swenshuai.xiif [ "$SOURCE" = "" ]; then 46*53ee8cc1Swenshuai.xi if [ -r "/usr/src/linux/Makefile" ]; then 47*53ee8cc1Swenshuai.xi SOURCE=/usr/src/linux 48*53ee8cc1Swenshuai.xi fi 49*53ee8cc1Swenshuai.xi if [ -r "`pwd`/Makefile" ]; then 50*53ee8cc1Swenshuai.xi SOURCE=`pwd` 51*53ee8cc1Swenshuai.xi fi 52*53ee8cc1Swenshuai.xifi 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi# Confirm that a source directory exists 55*53ee8cc1Swenshuai.xiif [ ! -r "$SOURCE/Makefile" ]; then 56*53ee8cc1Swenshuai.xi die "Could not locate kernel source directory or it is invalid" 57*53ee8cc1Swenshuai.xifi 58*53ee8cc1Swenshuai.xi 59*53ee8cc1Swenshuai.xi# Confirm that a GFP mask has been specified 60*53ee8cc1Swenshuai.xiif [ "$GFPMASK" = "none" ]; then 61*53ee8cc1Swenshuai.xi usage 62*53ee8cc1Swenshuai.xifi 63*53ee8cc1Swenshuai.xi 64*53ee8cc1Swenshuai.xi# Extract GFP flags from the kernel source 65*53ee8cc1Swenshuai.xiTMPFILE=`mktemp -t gfptranslate-XXXXXX` || exit 1 66*53ee8cc1Swenshuai.xigrep -q ___GFP $SOURCE/include/linux/gfp.h 67*53ee8cc1Swenshuai.xiif [ $? -eq 0 ]; then 68*53ee8cc1Swenshuai.xi grep "^#define ___GFP" $SOURCE/include/linux/gfp.h | sed -e 's/u$//' | grep -v GFP_BITS > $TMPFILE 69*53ee8cc1Swenshuai.xielse 70*53ee8cc1Swenshuai.xi grep "^#define __GFP" $SOURCE/include/linux/gfp.h | sed -e 's/(__force gfp_t)//' | sed -e 's/u)/)/' | grep -v GFP_BITS | sed -e 's/)\//) \//' > $TMPFILE 71*53ee8cc1Swenshuai.xifi 72*53ee8cc1Swenshuai.xi 73*53ee8cc1Swenshuai.xi# Parse the flags 74*53ee8cc1Swenshuai.xiIFS=" 75*53ee8cc1Swenshuai.xi" 76*53ee8cc1Swenshuai.xiecho Source: $SOURCE 77*53ee8cc1Swenshuai.xiecho Parsing: $GFPMASK 78*53ee8cc1Swenshuai.xifor LINE in `cat $TMPFILE`; do 79*53ee8cc1Swenshuai.xi MASK=`echo $LINE | awk '{print $3}'` 80*53ee8cc1Swenshuai.xi if [ $(($GFPMASK&$MASK)) -ne 0 ]; then 81*53ee8cc1Swenshuai.xi echo $LINE 82*53ee8cc1Swenshuai.xi fi 83*53ee8cc1Swenshuai.xidone 84*53ee8cc1Swenshuai.xi 85*53ee8cc1Swenshuai.xirm -f $TMPFILE 86*53ee8cc1Swenshuai.xiexit 0 87