[ewg] [PATCH] ofed_scripts: Add location code fix for older ppc64 kernels

Vladimir Sokolovsky vlad at dev.mellanox.co.il
Thu Nov 1 05:23:03 PDT 2007


Joachim Fenkes wrote:
> Kernels prior to 2.6.24 have problems with multiple devices sharing the same
> location code on ppc64 systems -- only one of these devices would be usable
> by ibmebus. This will be a problem on systems with multiple eHCA chips on a
> single hardware location.
> 
> For older kernels, this problem can be circumvented by, prior to loading the
> eHCA driver, changing the location codes of the offending devices so that
> they're not the same anymore.
> 
> This patch adds an openibd patch file which, if applied, will make openibd
> change the location codes of eHCA adapters with the same location code.
> ofed_patch.sh is changed so that it applies that patch if, and only if, it
> is run on a ppc64 architecture and the kernel version implies that the
> kernel has the ibmebus bug.
> 
> Signed-off-by: Joachim Fenkes <fenkes at de.ibm.com>
> ---
>  ofed_scripts/ofed_patch.sh          |   49 +++++++++++++++++++++++++++++++++++
>  ofed_scripts/openibd-loc_code.patch |   43 ++++++++++++++++++++++++++++++
>  2 files changed, 92 insertions(+), 0 deletions(-)
>  create mode 100644 ofed_scripts/openibd-loc_code.patch
> 
> diff --git a/ofed_scripts/ofed_patch.sh b/ofed_scripts/ofed_patch.sh
> index e1f039d..b254000 100755
> --- a/ofed_scripts/ofed_patch.sh
> +++ b/ofed_scripts/ofed_patch.sh
> @@ -200,6 +200,44 @@ get_backport_dir()
>  
>  }
>  
> +need_openibd_loc_code_patch()
> +{
> +	local sub
> +
> +	if [ "$ARCH" != "ppc64" ]; then
> +		return 1;
> +	fi
> +
> +	case $KVERSION in
> +	2.6.9-*.EL*)
> +		sub=$(echo $KVERSION | cut -d"-" -f2 | cut -d"." -f1)
> +		if [ $sub -lt 62 ]; then
> +			return 0;
> +		fi
> +	;;
> +	2.6.16.*-*-*)
> +		sub=$(echo $KVERSION | cut -d"." -f4 | cut -d"-" -f1)
> +		if [ $sub -lt 53 ]; then
> +			return 0;
> +		fi
> +	;;
> +	2.6.18-*.el5*)
> +		sub=$(echo $KVERSION | cut -d"-" -f2 | cut -d"." -f1)
> +		if [ $sub -lt 52 ]; then
> +			return 0;
> +		fi
> +	;;
> +	2.6.*)
> +		sub=$(echo $KVERSION | cut -d"." -f3 | cut -d"-" -f1 | tr -d [:alpha:][:punct:])
> +		if [ $sub -lt 24 ]; then
> +			return 0;
> +		fi
> +	;;
> +	esac
> +
> +	return 1;
> +}
> +
>  # Apply patch
>  apply_patch()
>  {
> @@ -253,6 +291,13 @@ apply_backport_patches()
>          fi
>  }
>  
> +apply_openibd_patches()
> +{
> +	if need_openibd_loc_code_patch; then
> +		apply_patch ${CWD}/ofed_scripts/openibd-loc_code.patch
> +	fi
> +}
> +
>  # Apply patches
>  patches_handle()
>  {
> @@ -288,6 +333,9 @@ EOF
>                          fi
>                          BACKPORT_INCLUDES='-I${CWD}/kernel_addons/backport/'${BACKPORT_DIR}/include/
>                  fi
> +                
> +                # Apply openibd patches
> +                apply_openibd_patches $KVERSION
>  
>  
>  #FIXME: why are these applied here? Move them to before backports?
> @@ -399,6 +447,7 @@ main()
>  
>  #Set default values
>  KVERSION=${KVERSION:-$(uname -r)}
> +ARCH=${ARCH:-$(uname -m)}
>  WITH_QUILT=${WITH_QUILT:-"yes"}
>  WITH_PATCH=${WITH_PATCH:-"yes"}
>  WITH_KERNEL_FIXES=${WITH_KERNEL_FIXES:-"yes"}
> diff --git a/ofed_scripts/openibd-loc_code.patch b/ofed_scripts/openibd-loc_code.patch
> new file mode 100644
> index 0000000..43d70b4
> --- /dev/null
> +++ b/ofed_scripts/openibd-loc_code.patch
> @@ -0,0 +1,43 @@
> +--- a/ofed_scripts/openibd	2007-10-25 08:01:51.000000000 -0500
> ++++ b/ofed_scripts/openibd	2007-10-27 09:58:56.000000000 -0500
> +@@ -538,6 +538,32 @@ if test -x /sbin/lspci && test -x /sbin/
> + fi
> + }
> + 
> ++fix_location_codes()
> ++{
> ++	# ppc64 only:
> ++	# Fix duplicate location codes on kernels where ibmebus can't handle them
> ++	if [ -d /proc/device-tree -a -f /proc/ppc64/ofdt ]; then
> ++		local i=1 phandle lcode len
> ++		# output all duplicate location codes and their devices
> ++		for attr in $(find /proc/device-tree -wholename "*lhca\@*/ibm,loc-code"); do
> ++			echo -e $(dirname $attr)"\t"$(cat $attr)
> ++		done | sort -k2 | uniq -f1 --all-repeated=separate | cut -f1 | while read dev; do
> ++			if [ -n "$dev" ]; then
> ++				# append an instance counter to the location code
> ++				phandle=$(hexdump -e '8 "%u"' $dev/ibm,phandle)
> ++				lcode=$(cat $dev/ibm,loc-code)-I$i
> ++				len=$(echo -n "$lcode" | wc -c)
> ++				# echo "$dev -> $lcode"
> ++				echo -n "update_property $phandle ibm,loc-code $len $lcode" > /proc/ppc64/ofdt
> ++				i=$(($i + 1))
> ++			else
> ++				# empty line means new group -- reset i
> ++				i=1
> ++			fi
> ++		done
> ++	fi
> ++}
> ++
> + rotate_log()
> + {
> +         local log=$1
> +@@ -694,6 +720,7 @@ start()
> + 
> +     # Load eHCA driver
> +     if [ "X${EHCA_LOAD}" == "Xyes" ]; then
> ++        fix_location_codes
> +         /sbin/modprobe ib_ehca > /dev/null 2>&1
> +         my_rc=$?
> +         if [ $my_rc -ne 0 ]; then


Hi Joachim,
I think that it will be easier to maintain the openibd script if you will change it directly (not via patch applied by ofed_patch.sh).

You can add 'need_openibd_loc_code_patch' function to the openibd with:

KVERSION=`uname -r`
if need_openibd_loc_code_patch; then
	fix_location_codes	
fi


Regards,
Vladimir





More information about the ewg mailing list