From 493af798ee4496677d62dfddb0ab9f656f8e61a6 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sun, 10 Apr 2011 14:39:31 +0000 Subject: [PATCH] Copied r3377 of the some scripts and the nightly build config file from the trunk. git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/2.0.0.x@3378 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- nightly/conf/cellbuzz.conf | 2 +- scripts/filter-trace-entry-exit | 22 +- scripts/generate-kernel-patch | 394 ++++++++++++++++++++++++-------- scripts/run-regression-tests | 145 +++++++++--- scripts/specialize-patch | 185 +++++++++------ 5 files changed, 539 insertions(+), 209 deletions(-) diff --git a/nightly/conf/cellbuzz.conf b/nightly/conf/cellbuzz.conf index 23cca3f51..9845b1bba 100644 --- a/nightly/conf/cellbuzz.conf +++ b/nightly/conf/cellbuzz.conf @@ -3,4 +3,4 @@ ABT_DETAILS="x86_64, Fedora 10" ABT_JOBS=3 -ABT_KERNELS="2.6.35.4 2.6.34.6-nc 2.6.33.7-nc 2.6.32.21-nc 2.6.31.14-nc 2.6.31.13-u 2.6.30.10-nc 2.6.29.6-nc 2.6.28.10-nc 2.6.27.53-nc 2.6.26.8 2.6.25.20-nc 2.6.24.7-nc 2.6.23.17-nc" +ABT_KERNELS="2.6.38.2 2.6.37.6 2.6.36.4 2.6.35.12 2.6.35.12-u-nc 2.6.34.8-nc 2.6.33.9-nc 2.6.32.36-nc 2.6.31.14-nc 2.6.30.10-nc 2.6.29.6-nc 2.6.28.10-nc 2.6.27.58-nc 2.6.26.8-nc 2.6.25.20-nc 2.6.24.7-nc 2.6.23.17-nc" diff --git a/scripts/filter-trace-entry-exit b/scripts/filter-trace-entry-exit index d35611647..6d9c49dd3 100755 --- a/scripts/filter-trace-entry-exit +++ b/scripts/filter-trace-entry-exit @@ -26,27 +26,29 @@ function categorize_line(line) { if (line ~ "^+$") is_blank = 1 else if (line ~ "^+\tTRACE_ENTRY\\(\\);$") - is_trace_exit = 1 + is_trace_entry = 1 else if (line ~ "^+\tTRACE_EXIT\\(\\);$" \ || line ~ "^+\tTRACE_EXIT_RES\\(.*\\);$" \ || line ~ "^+\tTRACE_EXIT_HRES\\(.*\\);$") is_trace_exit = 1 } +# Leave out TRACE_ENTRY() and the blank line below it and also TRACE_EXIT() +# and the blank line before it. function print_conditionally() { - if (! previous_is_trace_entry \ - && ! (before_previous_is_trace_entry && previous_is_blank) \ - && ! previous_is_trace_exit \ - && ! (previous_is_blank && is_trace_exit)) - { - # printf "[%d] %s\n", lines, previous_line - line[lines++] = previous_line - } - else + if (previous_is_trace_entry \ + || (before_previous_is_trace_entry && previous_is_blank) \ + || previous_is_trace_exit \ + || (previous_is_blank && is_trace_exit)) { # print "deleted", previous_line lines_deleted++ } + else + { + # printf "[%d] %s\n", lines, previous_line + line[lines++] = previous_line + } } function shift_state_variables(line) { diff --git a/scripts/generate-kernel-patch b/scripts/generate-kernel-patch index a8565fae3..8640b0c08 100755 --- a/scripts/generate-kernel-patch +++ b/scripts/generate-kernel-patch @@ -24,12 +24,15 @@ ######################## function usage { - echo "Usage: $0 [-h] [-m] [-n] [-p ] [-u] , where: " + echo "Usage: $0 [-d] [-h] [-m] [-n] [-p ] [-s] [-u] " + echo "where: " + echo " -d - enable patch specialization debugging" echo " -h - show this text" echo " -m - add mpt target driver" echo " -n - do not delete code disabled via preprocessor statements" echo " -p - generate multiple patches instead of one big patch into"\ "the specified directory." + echo " -s - disable patch specialization." echo " -u - enables #define GENERATING_UPSTREAM_PATCH." } @@ -101,32 +104,48 @@ EOF # Run the script specialize_patch with appropriate options on the patch # passed via stdin and send the specialized patch to stdout. function specialize_patch { - "$(dirname $0)/specialize-patch" \ - ${specialize_patch_options} \ - -v kernel_version="${kernel_version}" \ - -v SCSI_EXEC_REQ_FIFO_DEFINED="${scsi_exec_req_fifo_defined}" \ - -v SCST_IO_CONTEXT="${scst_io_context}" \ - | if [ "${generating_upstream_patch}" = "true" ]; then - scripts/filter-trace-entry-exit - else - cat - fi + if [ "${enable_specialize}" = "true" ]; then + "$(dirname $0)/specialize-patch" \ + ${specialize_patch_options} \ + -v kernel_version="${kernel_version}" \ + -v SCSI_EXEC_REQ_FIFO_DEFINED="${scsi_exec_req_fifo_defined}" \ + -v SCST_IO_CONTEXT="${scst_io_context}" \ + | if [ "${generating_upstream_patch}" = "true" ]; then + scripts/filter-trace-entry-exit + else + cat + fi + else + cat + fi } # Read a patch from stdin, specialize it for kernel version ${kernel_version} # and write the output either to stdout or to the file $1 (if not empty), # depending on the value of the variable ${multiple_patches}. function process_patch { + local tmppatch if [ "${multiple_patches}" = "true" ]; then if [ "$1" != "" ]; then if [ -e "${patchdir}/$1" ]; then echo "Warning: overwriting ${patchdir}/$1" fi - ( - echo "Signed-off-by: ${SIGNED_OFF_BY}" - echo "" - specialize_patch - ) >"${patchdir}/$1" + tmppatch="$(/bin/mktemp)" + ( + specialize_patch + ) >"${tmppatch}" + touch "${tmppatch}" + { + if [ -e /usr/bin/diffstat ]; then + awk 'BEGIN{h=1}/^diff/{h=0}/^---/{h=0}h!=0{print}' < "${tmppatch}" + echo "---" + diffstat "${tmppatch}" + echo "" + awk 'BEGIN{h=1}/^diff/{h=0}/^---/{h=0}h==0{print}' < "${tmppatch}" + fi + } \ + > "${patchdir}/$(basename $1)" + rm -f "${tmppatch}" else # echo "Discarded $(wc -l) lines." true @@ -148,6 +167,7 @@ function in_separate_patch { ######################### debug_specialize="false" +enable_specialize="true" generating_upstream_patch="false" mpt_scst="false" multiple_patches="false" @@ -162,7 +182,7 @@ if [ ! -e scst -o ! -e iscsi-scst -o ! -e srpt -o ! -e scst_local ]; then exit 1 fi -set -- $(/usr/bin/getopt dhlmnp:u "$@") +set -- $(/usr/bin/getopt dhlmnp:su "$@") while [ "$1" != "${1#-}" ] do case "$1" in @@ -174,28 +194,45 @@ do shift ;; '-p') multiple_patches="true"; patchdir="$2"; shift; shift;; + '-s') enable_specialize="false"; shift;; '-u') generating_upstream_patch="true"; shift;; '--') shift;; *) usage; exit 1;; esac done -if [ "${debug_specialize}" = "true" ]; then - specialize_patch_options="${specialize_patch_options} -v debug=1" -fi -if [ "${generating_upstream_patch}" = "true" ]; then - specialize_patch_options="${specialize_patch_options} -v generating_upstream_patch_defined=1 -v config_tcp_zero_copy_transfer_completion_notification_undefined=1 -v config_scst_proc_undefined=1" -fi - if [ $# != 1 ]; then usage exit 1 fi -if [ "${multiple_patches}" = "" ]; then +# Strip patch level from the kernel version number. +if [ "${1#[0-9]*.[0-9]*.[0-9]*.[0-9]*}" != "$1" ]; then + kernel_version="${1%.[0-9]*}" + patch_level="${1#${kernel_version}.}" +else + kernel_version="$1" +fi + +# Make sure that for kernel 2.6.33 and later the line +# "#define CONFIG_SCST_PROC" is removed from scst/include/scst.h. +if grep -qw scst_sysfs scst/kernel/in-tree/Makefile.scst-${kernel_version} \ + || [ "${generating_upstream_patch}" = "true" ]; +then + specialize_patch_options="${specialize_patch_options} -v config_scst_proc_undefined=1" +fi +if [ "${debug_specialize}" = "true" ]; then + specialize_patch_options="${specialize_patch_options} -v debug=1" +fi +if [ "${generating_upstream_patch}" = "true" ]; then + specialize_patch_options="${specialize_patch_options} -v generating_upstream_patch_defined=1 -v config_tcp_zero_copy_transfer_completion_notification_undefined=1" +fi + +if [ "${multiple_patches}" = "true" ]; then if [ -e "${patchdir}" ]; then echo "Patch output directory ${patchdir} already exists." fi + mkdir -p "${patchdir}" if [ ! -d "${patchdir}" ]; then echo "Error: ${patchdir} is not a directory." fi @@ -206,14 +243,6 @@ fi # Patch Generation # #################### -# Strip patch level from the kernel version number. -if [ "${1#[0-9]*.[0-9]*.[0-9]*.[0-9]*}" != "$1" ]; then - kernel_version="${1%.[0-9]*}" - patch_level="${1#${kernel_version}.}" -else - kernel_version="$1" -fi - for f in fcst/linux-patches/series-${kernel_version}* do if [ -e "$f" ]; then @@ -221,18 +250,6 @@ do fi done -# Make sure that for kernel 2.6.33 and later the line -# "#define CONFIG_SCST_PROC" is removed from scst/include/scst.h. -if grep -qw scst_sysfs scst/kernel/in-tree/Makefile.scst-${kernel_version}; -then - specialize_patch_options="${specialize_patch_options} -v config_scst_proc_undefined=1" -fi - -if [ "${multiple_patches}" = "false" ]; then - echo "Signed-off-by: ${SIGNED_OFF_BY}" - echo "" -fi - # General kernel patches. @@ -260,24 +277,28 @@ do done -scst_debug="scst/include/scst_debug.h scst/src/scst_debug.c" +scst_03_public_headers="scst/include/scst.h scst/include/scst_const.h" +scst_04_main="scst/src/scst_main.c scst/src/scst_module.c scst/src/scst_priv.h" +scst_05_targ="scst/src/scst_targ.c" +scst_06_lib="scst/src/scst_lib.c" +scst_07_pres="scst/src/scst_pres.h scst/src/scst_pres.c" +scst_08_sysfs="scst/src/scst_sysfs.c" +scst_09_debug="scst/include/scst_debug.h scst/src/scst_debug.c" scst_proc="scst/src/scst_proc.c" -scst_sgv="scst/include/scst_sgv.h scst/src/scst_mem.h scst/src/scst_mem.c doc/sgv_cache.txt" +scst_10_sgv="scst/include/scst_sgv.h scst/src/scst_mem.h scst/src/scst_mem.c doc/sgv_cache.sgml" scst_user="scst/include/scst_user.h scst/src/dev_handlers/scst_user.c" -scst_vdisk="scst/src/dev_handlers/scst_vdisk.c" -separate_patches="scst_debug scst_proc scst_sgv scst_user scst_vdisk" -source_files_in_separate_patch="${scst_debug} ${scst_proc} ${scst_sgv} ${scst_user} ${scst_vdisk}" +scst_13_vdisk="scst/src/dev_handlers/scst_vdisk.c" +separate_patches="scst_03_public_headers scst_04_main scst_05_targ scst_06_lib scst_07_pres scst_08_sysfs scst_09_debug scst_10_sgv scst_user scst_13_vdisk" - -# Directory include/scst/ - -for f in $(ls scst/include/*h 2>/dev/null) +if [ "${generating_upstream_patch}" = "false" ]; then + separate_patches+=" scst_proc" +fi +source_files_in_separate_patch="" +for s in ${separate_patches} do - if ! in_separate_patch "${f}"; then - add_file "${f}" "include/scst/${f#scst/include/}" - fi -done \ -| process_patch "scst_public_headers.diff" + source_files_in_separate_patch+=" $(set | \ + sed -n -e "s/^$s='\(.*\)'$/\1/p" -e "s/^$s=\(.*\)$/\1/p")" +done # Directory drivers/ @@ -289,7 +310,7 @@ add_patch "scst/kernel/in-tree/Kconfig.drivers.Linux-${kernel_version}.patch" \ add_patch "scst/kernel/in-tree/Makefile.drivers.Linux-${kernel_version}.patch"\ "drivers/Makefile" ) \ -| process_patch "misc.diff" +| process_patch "scst_01_drivers_kbuild.diff" # Directory drivers/scst/ @@ -309,6 +330,11 @@ add_file "${tmp_Kconfig}" "drivers/scst/Kconfig" tmp_Makefile="${tmpdir}/Makefile.scst-${kernel_version}" cat "scst/kernel/in-tree/Makefile.scst-${kernel_version}" | \ +if [ "${generating_upstream_patch}" = "true" ]; then + grep -v 'scst_proc' +else + cat +fi | \ if [ -e "${fcst_patch_series}" ]; then cat else @@ -317,29 +343,14 @@ fi >"$tmp_Makefile" add_file "$tmp_Makefile" "drivers/scst/Makefile" rm -rf "${tmpdir}" - -for f in $(ls scst/src/*.[ch] 2>/dev/null) -do - if [ "${generating_upstream_patch}" = "true" \ - -a "${f}" = "scst/src/scst_proc.c" ]; then - continue - fi - if ! in_separate_patch "${f}"; then - add_file "${f}" "drivers/scst/${f#scst/src/}" - fi -done ) \ -| process_patch "scst_core.diff" +| process_patch "scst_02_scst_kbuild.diff" for s in ${separate_patches} do fileset=$s for f in $(set | grep "^$s=" | sed -e "s/^$s='\(.*\)'\$/\1/" -e "s/^$s=\(.*\)\$/\1/") do - if [ "${generating_upstream_patch}" = "true" \ - -a "${f}" = "scst/src/scst_proc.c" ]; then - continue - fi if [ "${f#scst/include}" != "${f}" ]; then add_file "${f}" "include/scst/${f#scst/include/}" elif [ "${f#doc}" != "${f}" ]; then @@ -352,26 +363,24 @@ do done { - add_file "scst/README_in-tree" "Documentation/scst/README.scst" - add_file "scst/SysfsRules" "Documentation/scst/SysfsRules" -} | process_patch "scst_core_doc.diff" + add_file "scst/README_in-tree" "Documentation/scst/README.scst" + add_file "scst/SysfsRules" "Documentation/scst/SysfsRules" +} | process_patch "scst_11_core_doc.diff" # Directory drivers/scst/dev_handlers/ -( add_file "scst/kernel/in-tree/Makefile.dev_handlers-${kernel_version}" \ "drivers/scst/dev_handlers/Makefile" \ -| process_patch "dev_handlers_makefile.diff" +| process_patch "scst_11_dev_handlers_makefile.diff" for f in $(ls scst/src/dev_handlers/*.[ch] 2>/dev/null) do if ! in_separate_patch "${f}"; then add_file "${f}" "drivers/scst/dev_handlers/${f#scst/src/dev_handlers/}" fi -done -) \ -| process_patch "scst_passthrough.diff" +done \ +| process_patch "scst_14_passthrough.diff" # Directory drivers/scst/fcst/ @@ -386,9 +395,9 @@ done add_file "fcst/Makefile_in-tree" \ "drivers/scst/fcst/Makefile" - + add_file "fcst/Kconfig" "drivers/scst/fcst/Kconfig" - + for f in $(ls fcst/*.[ch] 2>/dev/null) do add_file "${f}" "drivers/scst/fcst/${f#fcst/}" @@ -477,8 +486,28 @@ fi \ # Directory drivers/scst/srpt +{ + +cat < +Cc: Vu Pham +Cc: Roland Dreier +Cc: David Dillow +EOF if [ "$srpt" = "true" ]; then + add_file "srpt/README_in-tree" "Documentation/scst/README.srpt" + add_file "srpt/src/Kconfig" "drivers/scst/srpt/Kconfig" add_file "srpt/src/Makefile.in_kernel" "drivers/scst/srpt/Makefile" @@ -495,10 +524,7 @@ else add_empty_file "drivers/scst/srpt/Makefile" fi \ -| process_patch "srpt.diff" - -add_file "srpt/README_in-tree" "Documentation/scst/README.srpt" \ -| process_patch "srpt-doc.diff" +} | process_patch "scst_17_srpt.diff" # Directory drivers/message/fusion/mpt_scst @@ -527,13 +553,195 @@ fi # Directory drivers/scst/scst_local ( + add_file "scst_local/README" "Documentation/scst/README.scst_local" + add_file "scst_local/in-tree/Kconfig" "drivers/scst/scst_local/Kconfig" add_file "scst_local/in-tree/Makefile-${kernel_version}" "drivers/scst/scst_local/Makefile" add_file "scst_local/scst_local.c" "drivers/scst/scst_local/scst_local.c" ) \ -| process_patch "scst_local.diff" +| process_patch "scst_16_local.diff" -add_file "scst_local/README" "Documentation/scst/README.scst_local" \ -| process_patch "scst_local-doc.diff" + + +# Directory drivers/scsi/ibmvstgt + +{ + ( cd ibmvstgt && ./generate-in-tree-patches "${kernel_version}" ) + if [ -e "ibmvstgt/in-tree-patches/${kernel_version}" ]; then + if [ "${multiple_patches}" = "true" ]; then + cat < +Cc: Fujita Tomonori +Cc: Brian King +Cc: Robert Jennings + +EOF + fi + for f in \ + drivers/scsi/ibmvscsi/ibmvstgt.c \ + drivers/scsi/libsrp.c \ + include/scsi/libsrp.h \ + include/scsi/srp.h + do + patch="ibmvstgt/in-tree-patches/${kernel_version}/$(basename $f).patch" + if [ -e "${patch}" ]; then + add_patch "${patch}" $f + fi + done + add_file "ibmvstgt/README.sysfs" "Documentation/powerpc/ibmvstgt.txt" + fi +} \ +| process_patch "scst_18_ibmvstgt.diff" + +{ + ( cd ibmvstgt && ./generate-in-tree-patches "${kernel_version}" ) + if [ -e "ibmvstgt/in-tree-patches/${kernel_version}" ]; then + if [ "${multiple_patches}" = "true" ]; then + cat < + +EOF + fi + for f in \ + arch/arm/configs/at572d940hfek_defconfig \ + arch/arm/configs/cam60_defconfig \ + arch/arm/configs/s3c2410_defconfig \ + arch/m68k/configs/amiga_defconfig \ + arch/m68k/configs/apollo_defconfig \ + arch/m68k/configs/atari_defconfig \ + arch/m68k/configs/bvme6000_defconfig \ + arch/m68k/configs/hp300_defconfig \ + arch/m68k/configs/mac_defconfig \ + arch/m68k/configs/multi_defconfig \ + arch/m68k/configs/mvme147_defconfig \ + arch/m68k/configs/mvme16x_defconfig \ + arch/m68k/configs/q40_defconfig \ + arch/m68k/configs/sun3_defconfig \ + arch/m68k/configs/sun3x_defconfig \ + arch/mips/configs/bcm47xx_defconfig \ + arch/mips/configs/decstation_defconfig \ + arch/mips/configs/ip22_defconfig \ + arch/mips/configs/ip27_defconfig \ + arch/mips/configs/ip32_defconfig \ + arch/mips/configs/jazz_defconfig \ + arch/mips/configs/malta_defconfig \ + arch/mips/configs/markeins_defconfig \ + arch/mips/configs/pnx8550-jbs_defconfig \ + arch/mips/configs/pnx8550-stb810_defconfig \ + arch/mips/configs/rm200_defconfig \ + arch/mips/configs/tb0226_defconfig \ + arch/mips/configs/tb0287_defconfig \ + arch/powerpc/configs/52xx/motionpro_defconfig \ + arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig \ + arch/powerpc/configs/mpc5200_defconfig \ + drivers/scsi/Kconfig \ + drivers/scsi/Makefile \ + drivers/scsi/hosts.c \ + drivers/scsi/scsi_sysfs.c \ + drivers/scsi/scsi_tgt_if.c \ + drivers/scsi/scsi_tgt_lib.c \ + drivers/scsi/scsi_tgt_priv.h \ + drivers/scsi/scsi_transport_fc.c \ + drivers/scsi/scsi_transport_fc_internal.h \ + drivers/scsi/scsi_transport_srp.c \ + drivers/scsi/scsi_transport_srp_internal.h \ + include/scsi/scsi_host.h \ + include/scsi/scsi_tgt.h \ + include/scsi/scsi_tgt_if.h + do + add_patch "ibmvstgt/in-tree-patches/${kernel_version}/$(basename $f).patch" $f + done + fi +} \ +| process_patch "scst_19_scsi_tgt.diff" diff --git a/scripts/run-regression-tests b/scripts/run-regression-tests index dd54967d3..5e3c4236a 100755 --- a/scripts/run-regression-tests +++ b/scripts/run-regression-tests @@ -55,7 +55,7 @@ ######################## function usage { - echo "Usage: $0 [-c ] [-d ] [-f] [-h] [-j ] [-q] ..." + echo "Usage: $0 [-c ] [-d ] [-f] [-h] [-j ] [-p ] [-q] ..." echo " -c - cache directory for Linux kernel tarballs." echo " -d - directory for temporary regression test files." echo " -h - display this help information." @@ -152,6 +152,27 @@ See also http://lkml.org/lkml/2009/9/26/51 #define kmemcheck_annotate_variable(var) \ do { \ +EOF + fi + if [ "$1" = 2.6.32 -o "${1#2.6.32.}" != "$1" -o "$1" = "2.6.33" \ + -o "${1#2.6.33.}" != "$1" ] + then + cd "../linux-$1" || return $? + patch -f -s -p1 <<'EOF' +Get rid of sparse errors on sk_buff.protocol. + +--- linux/include/linux/skbuff-orig.h 2010-12-07 13:40:51.000000000 -0500 ++++ linux/include/linux/skbuff.h 2010-12-07 13:41:05.000000000 -0500 +@@ -349,8 +349,8 @@ struct sk_buff { + ipvs_property:1, + peeked:1, + nf_trace:1; +- __be16 protocol:16; + kmemcheck_bitfield_end(flags1); ++ __be16 protocol; + + void (*destructor)(struct sk_buff *skb); + #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) EOF fi ) @@ -271,7 +292,9 @@ function download_kernel { download_file "${kernel_mirror}/linux-$(kernel_version $1).tar.bz2" \ || return $? if [ "${plevel}" != "" ]; then - download_file "${kernel_mirror}/patch-$1.bz2" || return $? + download_file "${kernel_mirror}/patch-$1.bz2" \ + || download_file "${kernel_longterm}/v$(kernel_version $1)/patch-$1.bz2" \ + || return $? fi ) } @@ -283,21 +306,17 @@ function generate_kernel_patch { local kver="$(kernel_version $1)" local patchfile="${outputdir}/scst-$1-kernel.patch" local patchfile_m="${outputdir}/scst-$1-kernel-matching-line-numbers.patch" + local driver_options="" - SIGNED_OFF_BY="..." \ - scripts/generate-kernel-patch \ - $([ "${scst_local}" = "true" ] && echo "-l") \ - $([ "${mpt_scst}" = "true" ] && echo "-m") \ - $([ "${qla2x00t}" = "true" ] && echo "-q") \ - $2 $1 > "${patchfile}" + driver_options="$([ "${scst_local}" = "true" ] && echo "-l") \ + $([ "${mpt_scst}" = "true" ] && echo "-m") \ + $([ "${qla2x00t}" = "true" ] && echo "-q")" - SIGNED_OFF_BY="..." \ - scripts/generate-kernel-patch \ - -n \ - $([ "${scst_local}" = "true" ] && echo "-l") \ - $([ "${mpt_scst}" = "true" ] && echo "-m") \ - $([ "${qla2x00t}" = "true" ] && echo "-q") \ - $2 $1 > "${patchfile_m}" + scripts/generate-kernel-patch ${driver_options} $2 $1 > "${patchfile}" + + scripts/generate-kernel-patch ${driver_options} -n $2 $1 > "${patchfile_m}" + + scripts/generate-kernel-patch ${driver_options} -p "${outputdir}/${patchdir}" $2 $1 } # Run checkpatch on the generated kernel patch. Assumes that there is a @@ -309,11 +328,22 @@ function run_checkpatch { local outputfile="${outputdir}/checkpatch-$1-output.txt" local patchfile="${outputdir}/scst-$1-kernel.patch" - if [ -e "${outputdir}/linux-$1/scripts/checkpatch.pl" ] - then - echo "Running checkpatch on the SCST kernel patch ..." - ( cd "${outputdir}/linux-$1" \ - && scripts/checkpatch.pl - < "${patchfile}" &> "${outputfile}") + if [ -e "${outputdir}/linux-$1/scripts/checkpatch.pl" ]; then + if [ "${multiple_patches}" = "false" ]; then + echo "Running checkpatch on the SCST kernel patch ..." + ( cd "${outputdir}/linux-$1" \ + && scripts/checkpatch.pl --no-tree --no-signoff - < "${patchfile}" &> "${outputfile}") + else + echo "Running checkpatch on the SCST kernel patches ..." + rm -f "${outputfile}" + ( cd "${outputdir}/linux-$1" \ + && for p in "${outputdir}/${patchdir}"/* + do + echo "==== $p" >>"${outputfile}" + scripts/checkpatch.pl --no-tree --no-signoff - < "$p" >> "${outputfile}" 2>&1 + done + ) + fi local errors=$(grep -c '^ERROR' "${outputfile}") local warnings=$(grep -c '^WARNING' "${outputfile}") echo "${errors} errors / ${warnings} warnings." @@ -325,14 +355,33 @@ function run_checkpatch { } function patch_and_configure_kernel { + local kver="$(kernel_version $1)" local patchfile="${outputdir}/scst-$1-kernel-matching-line-numbers.patch" + local patchoutput="${outputdir}/patch-command-output-$1.txt" echo "Patching and configuring kernel ..." ( - cd "${outputdir}/linux-$1" \ - && patch -p1 -f -s <"${patchfile}" \ - >"${outputdir}/patch-command-output-$1.txt" \ - && make -s allmodconfig &>/dev/null \ + local srcdir="$PWD" + cd "${outputdir}/linux-$1" \ + && if [ "${multiple_patches}" = "false" ]; then + patch -p1 -f -s <"${patchfile}" >"${patchoutput}" + else + rm -f "${patchoutput}" + for p in "${outputdir}/${patchdir}"/* + do + echo "==== $p" >>"${patchoutput}" + patch -p1 -f -s <"${p}" >>"${patchoutput}" 2>&1 + done + fi \ + && if [ -e $srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch ]; then + echo "$srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch ..." \ + >>"${patchoutput}" + patch -p1 -f -s <$srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch \ + >>"${patchoutput}"; + else + echo "srpt/patches/kernel-${kver}-pre-cflags.patch not found."; \ + fi \ + && make -s allmodconfig &>"${outputdir}/make-config-output.txt" \ && sed -i.tmp 's/^CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y$/CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=n/' .config \ && for c in CONFIG_BINARY_PRINTF CONFIG_BLK_DEV_IO_TRACE CONFIG_BRANCH_PROFILE_NONE CONFIG_CONTEXT_SWITCH_TRACER CONFIG_DYNAMIC_FTRACE CONFIG_EVENT_TRACE_TEST_SYSCALLS CONFIG_EVENT_TRACING CONFIG_FTRACE CONFIG_FTRACE_MCOUNT_RECORD CONFIG_FTRACE_NMI_ENTER CONFIG_FTRACE_SELFTEST CONFIG_FTRACE_STARTUP_TEST CONFIG_FTRACE_SYSCALLS CONFIG_FUNCTION_GRAPH_TRACER CONFIG_FUNCTION_PROFILER CONFIG_FUNCTION_TRACER CONFIG_GENERIC_TRACER CONFIG_HAVE_FTRACE_NMI_ENTER CONFIG_IRQSOFF_TRACER CONFIG_IWLWIFI_DEVICE_TRACING CONFIG_IWM_TRACING CONFIG_KVM_MMU_AUDIT CONFIG_MAC80211_DRIVER_API_TRACER CONFIG_MMIOTRACE CONFIG_NET_DROP_MONITOR CONFIG_NOP_TRACER CONFIG_SCHED_TRACER CONFIG_STACK_TRACER CONFIG_TRACEPOINTS CONFIG_TRACER_MAX_TRACE CONFIG_TRACING; do sed -i.tmp "s/^$c=y\$/$c=n/" .config; done \ && make -s oldconfig &>/dev/null @@ -383,17 +432,21 @@ function compile_kernel { # For more information about endianness annotations, see also # http://lwn.net/Articles/205624/. function run_sparse { + local k="$1" local kver="$(kernel_version $1)" local plevel="$(patchlevel $1)" local outputfile="${outputdir}/sparse-$1-output.txt" local subdir="$2" + shift + shift - echo "Running sparse on the patched kernel ..." - ( - cd "${outputdir}/linux-$1" \ + echo "Running sparse on the patched kernel in ${subdir} $@ ..." + ( + cd "${outputdir}/linux-$k" \ && make -s prepare \ && make -s scripts \ - && LC_ALL=C make -k C=2 CF=-D__CHECK_ENDIAN__ M="${subdir}" + && if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C make -k M=arch/powerpc/lib; fi \ + && LC_ALL=C make -k C=2 CF=-D__CHECK_ENDIAN__ M="${subdir}" "$@" ) &> "${outputfile}" local errors=$(grep -c ' error:' "${outputfile}") local warnings=$(grep -c ' warning:' "${outputfile}") @@ -492,18 +545,21 @@ fi kernel_sources="$HOME/software/downloads" # URL for downloading kernel tarballs and kernel patches. kernel_mirror="ftp://ftp.eu.kernel.org/pub/linux/kernel/v2.6" +kernel_longterm="http://www.kernel.org/pub/linux/kernel/v2.6/longterm" kernel_versions="" # Directory in which the regression test output files will be stored. Must be # an absolute path. outputdir="${PWD}/regression-test-output-$(date +%Y-%m-%d_%Hh%Mm%Ss)" # Driver configuration. mpt_scst="false" +multiple_patches="false" qla2x00t="false" remove_temporary_files_at_end="false" +run_local_compilation="true" scst_local="true" quiet_download="false" -set -- $(/usr/bin/getopt "c:d:j:hkq" "$@") +set -- $(/usr/bin/getopt "c:d:j:hklpq" "$@") while [ "$1" != "${1#-}" ] do case "$1" in @@ -512,6 +568,8 @@ do '-h') usage; exit 1;; '-j') export MAKEFLAGS="-j$2"; shift; shift;; '-k') remove_temporary_files_at_end="true"; shift;; + '-l') run_local_compilation="false"; shift;; + '-p') multiple_patches="true"; shift;; '-q') quiet_download="true"; shift;; '--') shift;; *) usage; exit 1;; @@ -552,10 +610,12 @@ if ! mkdir -p "${outputdir}"; then fi test_scst_tree_patches || exit $? -compile_scst_unpatched || exit $? -compile_scst_patched debug2release || exit $? -compile_scst_patched debug2perf || exit $? -compile_scst_patched enable_proc || exit $? +if [ "${run_local_compilation}" = "true" ]; then + compile_scst_unpatched || exit $? + compile_scst_patched debug2release || exit $? + compile_scst_patched debug2perf || exit $? + compile_scst_patched enable_proc || exit $? +fi first_iteration="true" for kv in ${kernel_versions} @@ -566,8 +626,10 @@ do full_check="false" generate_kernel_patch_options="" + ibmvio="false" run_checkpatch="true" run_sparse="true" + global_multiple_patches="${multiple_patches}" while [ "${kv%-?}" != "${kv}" -o "${kv%-??}" != "${kv}" ]; do kv_without_opt="${kv%-?}" if [ "${kv_without_opt}" = "${kv}" ]; then @@ -576,13 +638,16 @@ do kopt="${kv#${kv_without_opt}}" case "${kopt}" in '-f') full_check="true";; + '-i') ibmvio="true";; '-nc') run_checkpatch="false";; '-ns') run_sparse="false";; '-u') generate_kernel_patch_options="-u";; + '-p') multiple_patches="true";; *) echo "Error: unknown option ${kopt}."; exit 1;; esac kv="${kv_without_opt}" done + patchdir="patchdir-${kv}" k="${kv}" download_kernel $k || continue @@ -594,6 +659,18 @@ do patch_and_configure_kernel $k if [ "${run_sparse}" = "true" ]; then run_sparse $k drivers/scst + mv ${outputdir}/sparse-$k-output.txt ${outputdir}/sparse-$k-scst-output.txt + if [ "${ibmvio}" = "true" ]; then + run_sparse $k drivers/scsi libsrp.ko scsi_sysfs.ko \ + scsi_transport_fc.ko scsi_transport_srp.ko + mv ${outputdir}/sparse-$k-output.txt \ + ${outputdir}/sparse-$k-scsi-output.txt + if [ $(uname -m) = "ppc32" -o $(uname -m) = "ppc64" ]; then + run_sparse $k drivers/scsi/ibmvscsi ibmvstgt.ko + mv ${outputdir}/sparse-$k-output.txt \ + ${outputdir}/sparse-$k-ibmvstgt-output.txt + fi + fi fi compile_kernel $k drivers/scst if [ "${full_check}" = "true" ]; then @@ -607,4 +684,6 @@ do rm -rf "${outputdir}" mkdir -p "${outputdir}" fi + + multiple_patches="${global_multiple_patches}" done diff --git a/scripts/specialize-patch b/scripts/specialize-patch index 2fc5f5815..f81599e7b 100755 --- a/scripts/specialize-patch +++ b/scripts/specialize-patch @@ -30,7 +30,7 @@ # Convert a kernel version in the x.y.z format into numeric form, just like # the KERNEL_VERSION() macro. -function version_code(kver) { +function version_code(kver, array) { match(kver, "([0-9]+).([0-9]+).([0-9]+)", array) return 65536*array[1] + 256*array[2] + array[3] } @@ -41,16 +41,16 @@ function version_code(kver) { # Note: the order in which the substitutions appear below is important -- # it is the same order as the order of operators in C. -function evaluate(stmnt) { +function evaluate(stmnt, pattern, arg, op, result) { if (debug) printf "/* debug specialize-patch: (a) %s */\n", stmnt # Remove C-style comments. - gsub(" *\\/\\*[^*]*\\*\\/ *", "", stmnt) + gsub("[ ]*\\/\\*[^*]*\\*\\/[ ]*", "", stmnt) # Remove the spaces before the #-sign. - gsub("^+ *# *", "+#", stmnt) + gsub("^+[ ]*#[ ]*", "+#", stmnt) if (match(stmnt, "^+#ifdef (.*)$", arg)) { @@ -105,35 +105,33 @@ function evaluate(stmnt) { if (SCSI_EXEC_REQ_FIFO_DEFINED != "") { - gsub("defined *SCSI_EXEC_REQ_FIFO_DEFINED", + gsub("defined [ ]*SCSI_EXEC_REQ_FIFO_DEFINED", SCSI_EXEC_REQ_FIFO_DEFINED, stmnt) - gsub("defined *\\( *SCSI_EXEC_REQ_FIFO_DEFINED *\\)", + gsub("defined[ ]*\\([ ]*SCSI_EXEC_REQ_FIFO_DEFINED[ ]*\\)", SCSI_EXEC_REQ_FIFO_DEFINED, stmnt) } if (SCST_IO_CONTEXT != "") { - gsub("defined *SCST_IO_CONTEXT", SCST_IO_CONTEXT, stmnt) - gsub("defined *\\( *SCST_IO_CONTEXT *\\)", SCST_IO_CONTEXT, stmnt) + gsub("defined [ ]*SCST_IO_CONTEXT", SCST_IO_CONTEXT, stmnt) + gsub("defined[ ]*\\([ ]*SCST_IO_CONTEXT[ ]*\\)", SCST_IO_CONTEXT, stmnt) } if (generating_upstream_patch_defined) { - gsub("defined *GENERATING_UPSTREAM_PATCH", 1, stmnt) - gsub("defined *\\( *GENERATING_UPSTREAM_PATCH *\\)", 1, stmnt) + gsub("defined [ ]*GENERATING_UPSTREAM_PATCH", 1, stmnt) + gsub("defined[ ]*\\([ ]*GENERATING_UPSTREAM_PATCH[ ]*\\)", 1, stmnt) } if (config_tcp_zero_copy_transfer_completion_notification_undefined) { - gsub("defined *CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION", 0, stmnt) - gsub("defined *\\( *CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION *\\)", 0, stmnt) + gsub("defined [ ]*CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION", 0, stmnt) + gsub("defined[ ]*\\([ ]*CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION[ ]*\\)", 0, stmnt) } - if (config_scst_proc_undefined) - { - gsub("defined *CONFIG_SCST_PROC", 0, stmnt) - gsub("defined *\\( *CONFIG_SCST_PROC *\\)", 0, stmnt) - } + gsub("defined [ ]*CONFIG_SCST_PROC", !config_scst_proc_undefined, stmnt) + gsub("defined[ ]*\\([ ]*CONFIG_SCST_PROC[ ]*\\)", !config_scst_proc_undefined, + stmnt) if (debug) printf "/* debug specialize-patch: (b) %s */\n", stmnt @@ -142,19 +140,19 @@ function evaluate(stmnt) { { last_stmnt = stmnt - pattern = "! *([0-9]+)" + pattern = "![ ]*([0-9]+)" while (match(stmnt, pattern, op) != 0) { sub(pattern, op[1] == 0, stmnt) } - pattern="KERNEL_VERSION\\( *([0-9]+) *, *([0-9]+) *, *([0-9]+) *\\)" + pattern="KERNEL_VERSION\\([ ]*([0-9]+)[ ]*,[ ]*([0-9]+)[ ]*,[ ]*([0-9]+)[ ]*\\)" while (match(stmnt, pattern, op) != 0) { sub(pattern, op[1] * 65536 + op[2] * 256 + op[3], stmnt) } - pattern="(-*[0-9]+) *(\\*|/) *(-*[0-9]+)" + pattern="(-*[0-9]+)[ ]*(\\*|/)[ ]*(-*[0-9]+)" while (match(stmnt, pattern, op) != 0) { result="error" @@ -163,7 +161,7 @@ function evaluate(stmnt) { sub(pattern, result, stmnt) } - pattern="(-*[0-9]+) *(\\+|-) *(-*[0-9]+)" + pattern="(-*[0-9]+)[ ]*(\\+|-)[ ]*(-*[0-9]+)" while (match(stmnt, pattern, op) != 0) { result="error" @@ -172,7 +170,7 @@ function evaluate(stmnt) { sub(pattern, result, stmnt) } - pattern="(-*[0-9]+) *(<|<=|>|>=|==|!=) *(-*[0-9]+)" + pattern="(-*[0-9]+)[ ]*(<|<=|>|>=|==|!=)[ ]*(-*[0-9]+)" while (match(stmnt, pattern, op) != 0) { result="error" @@ -185,24 +183,36 @@ function evaluate(stmnt) { sub(pattern, result, stmnt) } - pattern="(-*[0-9]+) *\\&\\& *(-*[0-9]+)" + pattern="(-*[0-9]+)[ ]*\\&\\&[ ]*(-*[0-9]+)" while (match(stmnt, pattern, op) != 0) { sub(pattern, (op[1] != 0) && (op[2] != 0), stmnt) } - pattern="([01]) *\\&\\& *(!* *defined *\\( *[A-Za-z_]* *\\))" + pattern="^+#if[ ]*([01])[ ]*\\&\\&[ ]*(!*[ ]*defined[ ]*\\([ ]*[A-Za-z_]*[ ]*\\))$" while (match(stmnt, pattern, op) != 0) { - sub(pattern, op[1] != 0 ? op[2] : op[1], stmnt) + stmnt = "+#if " (op[1] != 0 ? op[2] : op[1]) } - pattern="(-*[0-9]+) *\\|\\| *(-*[0-9]+)" + pattern="(-*[0-9]+)[ ]*\\|\\|[ ]*(-*[0-9]+)" while (match(stmnt, pattern, op) != 0) { sub(pattern, (op[1] != 0) || (op[2] != 0), stmnt) } + pattern="^+#if[ ]*([01])[ ]*\\|\\|[ ]*(!*[ ]*defined[ ]*\\([ ]*[A-Za-z_]*[ ]*\\))$" + while (match(stmnt, pattern, op) != 0) + { + stmnt = "+#if " (op[1] == 0 ? op[2] : op[1]) + } + + pattern="\\(([01])[ ]*\\|\\|[ ]*(!*[ ]*defined[ ]*\\([ ]*[A-Za-z_]*[ ]*\\))\\)" + while (match(stmnt, pattern, op) != 0) + { + sub(pattern, op[1] == 0 ? op[2] : op[1], stmnt) + } + pattern="\\((-*[0-9]+)\\)" while (match(stmnt, pattern, op) != 0) { @@ -220,14 +230,13 @@ function evaluate(stmnt) { # Evaluate ! stmnt function invert(stmnt) { - sub("^+#if ", "+#if ! ", stmnt) - return evaluate(stmnt) + return evaluate(gensub("^+#if (.*)$", "+#if ! (\\1)", "g", stmnt)) } # Handle #if or #elif -function handle_if() +function handle_if(evaluated) { # Only act on preprocessor conditional expressions with regard to the Linux # kernel version, and do not interpret other expressions. @@ -257,40 +266,52 @@ function handle_if() { if_stmnt[if_nesting_level] = evaluated any_section_output[if_nesting_level] = 0 + decision[if_nesting_level] = evaluated + inv_decision[if_nesting_level] = evaluate(sprintf("+#if ! %s", substr(evaluated, 6))) + if (debug) + printf "/* debug specialize-patch: (f) %s / %s */\n", \ + decision[if_nesting_level], inv_decision[if_nesting_level] } else { sub("^+#elif ", - sprintf("+#if ! %d \\&\\& ", decision[if_nesting_level]), + sprintf("+#if %s \\&\\& ", substr(inv_decision[if_nesting_level], 6)), evaluated) + if (debug) + printf "/* debug specialize-patch: (e) %s */\n", evaluated evaluated = evaluate(evaluated) + decision[if_nesting_level] = evaluated + inv_decision[if_nesting_level] \ + = evaluate(sprintf("+#if %s && ! %s", \ + substr(inv_decision[if_nesting_level], 6), \ + substr(evaluated, 6))) + if (debug) + printf "/* debug specialize-patch: (f) %s / %s */\n", \ + decision[if_nesting_level], inv_decision[if_nesting_level] } - decision[if_nesting_level] = evaluated matching_if = if_stmnt[if_nesting_level] + return evaluated } # Decide whether or not to print the preprocessor statement $0. -function process_preprocessor_statement() { - last_if_nesting_level = if_nesting_level - orig_stmnt = $0 +function process_preprocessor_statement(evaluated, condition) { evaluated = evaluate($0) condition = 1 - delete_next_blank_line = 0 if (evaluated ~ "^+#if") { if_nesting_level++ - handle_if() + evaluated = handle_if(evaluated) } else if (evaluated ~ "^+#elif") { - handle_if() + evaluated = handle_if(evaluated) } else if (evaluated ~ "^+#else") { matching_if = if_stmnt[if_nesting_level] - decision[if_nesting_level] = invert(decision[if_nesting_level]) + decision[if_nesting_level] = inv_decision[if_nesting_level] } else if (evaluated ~ "^+#endif") { @@ -318,13 +339,7 @@ function process_preprocessor_statement() { || (evaluated ~ "^+#define CONFIG_SCST_PROC$" \ && config_scst_proc_undefined)) { - if (blank_deleted_code) - for (i = 0; i < input_line_count; i++) - line[lines++] = "+" - else - { - lines_deleted += input_line_count - } + discard = 1 delete_next_blank_line = 1 } else if (output && (! condition || condition && matching_if !~ "^+#if [01]")) @@ -334,22 +349,20 @@ function process_preprocessor_statement() { } else { - if (blank_deleted_code) - for (i = 0; i < input_line_count; i++) - line[lines++] = "+" - else - lines_deleted += input_line_count + discard = 1 if (lines >= 1 && line[lines - 1] == "+") delete_next_blank_line = 1 } } function reset_hunk_state_variables() { - lines = 0 - lines_deleted = 0 - output = 1 - if_nesting_level = -1 - delete_next_blank_line = 0 + lines = 0 + lines_less_added = 0 + lines_less_deleted = 0 + output = 1 + if_nesting_level = -1 + delete_next_blank_line = 0 + h[0] = "" } function dump_lines() { @@ -368,9 +381,9 @@ function dump_lines() { if (first_modif >= 0) { if (h[0] != "") - printf "@@ -%d,%d +%d,%d @@%s\n",h[1],h[2],h[3],h[4]-lines_deleted,h[5] + printf "@@ -%d,%d +%d,%d @@%s\n",h[1],h[2]-lines_less_deleted,h[3],h[4]-lines_less_added,h[5] for (i = 0; i < lines; i++) - print line[i] + print line[i] } } @@ -397,15 +410,35 @@ BEGIN { config_scst_proc_undefined = 0 # Variable initialization. + is_c_source = 0 reset_hunk_state_variables() } { + if (match($0, "^diff[ \t]+[^ \t]+[ \t]+[^ \t]+[ \t]+([^ \t]+)$", filename) \ + || match($0, "^\\+\\+\\+[ \t]+([^ \t]+)[ \t]+", filename)) + { + # Start of new file. + dump_lines() + reset_hunk_state_variables() + is_c_source = match(filename[1], "\\.[ch]$") != 0 + } + + if (!is_c_source) + { + print + next + } + if (!config_scst_proc_undefined) { gsub("^+/\\* #define CONFIG_SCST_PROC \\*/$", "+#define CONFIG_SCST_PROC") } + else + { + gsub("^+/\\* #define CONFIG_SCST_PROC \\*/$", "+") + } input_line[0] = $0 input_line_count = 1 # Join continued lines before processing these. @@ -419,6 +452,7 @@ BEGIN { $0 = previous_line $0 } + discard = 0 # If the line currently being processed is a hunk header, print all lines # that were stored in the array line[] since the last hunk header was read. if (match($0, "^@@ -([0-9]*),([0-9]*) \\+([0-9]*),([0-9]*) @@(.*)$")) @@ -430,13 +464,7 @@ BEGIN { } else if (delete_next_blank_line && match($0, "^+$")) { - if (blank_deleted_code) - for (i = 0; i < input_line_count; i++) - line[lines++] = "+" - else - { - lines_deleted += input_line_count - } + discard = 1 delete_next_blank_line = 0 } else @@ -457,18 +485,31 @@ BEGIN { } else { - # Discard the last read lines. - if (blank_deleted_code) - { - for (i = 0; i < input_line_count; i++) - line[lines++] = "+" - } - else - lines_deleted += input_line_count + discard = 1 if (lines >= 1 && line[lines-1] == "+") delete_next_blank_line = 1 } } + if (discard) + { + for (i = 0; i < input_line_count; i++) + { + if (blank_deleted_code) + { + if (input_line[i] ~ "^+") + line[lines++] = "+" + else + line[lines++] = input_line[i] + } + else + { + if (input_line[i] ~ "^+") + lines_less_added++ + else if (input_line[i] ~ "^-") + lines_less_deleted++ + } + } + } } END {