Skip to contentSkip to conversation

MAKEALL: Fix kill_children

PATCH New Joe Hershberger 7 participants 14 messages Oct 31, 2012 – Dec 7, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

---
 MAKEALL | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)
MAKEALL +24 -2
index 84a5c92..1f88dc5 100755
@@ -610,6 +610,13 @@ list_target() {
 donep="${LOG_DIR}/._done_"
 skipp="${LOG_DIR}/._skip_"
 
+build_target_killed() {
+	echo "Aborted $target build."
+	# Remove the logs for this board since it was aborted
+	rm -f ${LOG_DIR}/$target.MAKELOG ${LOG_DIR}/$target.ERR
+	exit
+}
+
 build_target() {
 	target=$1
 	build_idx=$2
@@ -622,6 +629,7 @@ build_target() {
 	if [ $BUILD_MANY == 1 ] ; then
 		output_dir="${OUTPUT_PREFIX}/${target}"
 		mkdir -p "${output_dir}"
+		trap build_target_killed TERM
 	else
 		output_dir="${OUTPUT_PREFIX}"
 	fi
@@ -640,6 +648,8 @@ build_target() {
 	fi
 
 	if [ $BUILD_MANY == 1 ] ; then
+		trap - TERM
+
 		${MAKE} -s tidy
 
 		if [ -s ${LOG_DIR}/${target}.ERR ] ; then
@@ -721,7 +731,9 @@ build_targets() {
 			if [ $BUILD_MANY == 1 ] ; then
 				build_target ${t} ${TOTAL_CNT} &
 			else
+				CUR_TGT="${t}"
 				build_target ${t} ${TOTAL_CNT}
+				CUR_TGT=''
 			fi
 		fi
 
@@ -745,7 +757,11 @@ build_targets() {
 #-----------------------------------------------------------------------
 
 kill_children() {
-	kill -- "-$1"
+	local pgid=`ps -p $$ --no-headers -o "%r" | tr -d ' '`
+	local children=`pgrep -g $pgid | grep -v $$ | grep -v $pgid`
+
+	kill $children 2> /dev/null
+	wait $children 2> /dev/null
 
 	exit
 }
@@ -753,6 +769,9 @@ kill_children() {
 print_stats() {
 	if [ "$ONLY_LIST" == 'y' ] ; then return ; fi
 
+	# Only count boards that completed
+	: $((TOTAL_CNT = `find ${skipp}* 2> /dev/null | wc -l`))
+
 	rm -f ${donep}* ${skipp}*
 
 	if [ $BUILD_MANY == 1 ] && [ -e "${OUTPUT_PREFIX}/ERR" ] ; then
@@ -762,6 +781,9 @@ print_stats() {
 		WRN_LIST=`grep -riwL error ${OUTPUT_PREFIX}/ERR/`
 		WRN_LIST=`for f in $WRN_LIST ; do echo -n " $(basename $f)" ; done`
 		WRN_CNT=`echo $WRN_LIST | wc -w | awk '{print $1}'`
+	else
+		# Remove the logs for any board that was interrupted
+		rm -f ${LOG_DIR}/${CUR_TGT}.MAKELOG ${LOG_DIR}/${CUR_TGT}.ERR
 	fi
 
 	echo ""
@@ -776,7 +798,7 @@ print_stats() {
 	echo "----------------------------------------------------------"
 
 	if [ $BUILD_MANY == 1 ] ; then
-		kill_children $$ &
+		kill_children
 	fi
 
 	exit $RC
Signature · 1 line
1.7.11.5
#1 lore raw

PATCH 2/2 MAKEALL: Add options for incremental building

--continue will allow you to <ctrl-c> the MAKEALL and pick up where you left off.

--rebuild-errors will allow you to rebuild only those boards which had trouble on the last run of MAKEALL, allowing you to quickly test a simple fix on just those boards.

---
 MAKEALL | 41 +++++++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 8 deletions(-)
MAKEALL +33 -8
index 1f88dc5..c7ae27d 100755
@@ -20,6 +20,8 @@ usage()
 	  -m,        --maintainers     List all targets and maintainer email
 	  -M,        --mails           List all targets and all affilated emails
 	  -C,        --check           Enable build checking
+	  -n,        --continue        Continue (skip boards already built)
+	  -r,        --rebuild-errors  Rebuild any boards that errored
 	  -h,        --help            This help output
 
 	Selections by these options are logically ANDed; if the same option
@@ -52,8 +54,8 @@ usage()
 	exit ${ret}
 }
 
-SHORT_OPTS="ha:c:v:s:lmMC"
-LONG_OPTS="help,arch:,cpu:,vendor:,soc:,list,maintainers,mails,check"
+SHORT_OPTS="ha:c:v:s:lmMCnr"
+LONG_OPTS="help,arch:,cpu:,vendor:,soc:,list,maintainers,mails,check,continue,rebuild-errors"
 
 # Option processing based on util-linux-2.13/getopt-parse.bash
 
@@ -73,6 +75,8 @@ SELECTED=''
 ONLY_LIST=''
 PRINT_MAINTS=''
 MAINTAINERS_ONLY=''
+CONTINUE=''
+REBUILD_ERRORS=''
 
 while true ; do
 	case "$1" in
@@ -115,6 +119,12 @@ while true ; do
 	-C|--check)
 		CHECK='C=1'
 		shift ;;
+	-n|--continue)
+		CONTINUE='y'
+		shift ;;
+	-r|--rebuild-errors)
+		REBUILD_ERRORS='y'
+		shift ;;
 	-l|--list)
 		ONLY_LIST='y'
 		shift ;;
@@ -198,7 +208,9 @@ fi
 OUTPUT_PREFIX="${BUILD_DIR}"
 
 [ -d ${LOG_DIR} ] || mkdir "${LOG_DIR}" || exit 1
-find "${LOG_DIR}/" -type f -exec rm -f {} +
+if [ "$CONTINUE" != 'y' -a "$REBUILD_ERRORS" != 'y' ] ; then
+	find "${LOG_DIR}/" -type f -exec rm -f {} +
+fi
 
 LIST=""
 
@@ -208,6 +220,7 @@ ERR_LIST=""
 WRN_CNT=0
 WRN_LIST=""
 TOTAL_CNT=0
+SKIP_CNT=0
 CURRENT_CNT=0
 OLDEST_IDX=1
 RC=0
@@ -728,12 +741,20 @@ build_targets() {
 			: $((CURRENT_CNT += 1))
 			rm -f "${donep}${TOTAL_CNT}"
 			rm -f "${skipp}${TOTAL_CNT}"
-			if [ $BUILD_MANY == 1 ] ; then
-				build_target ${t} ${TOTAL_CNT} &
+			if [ "$CONTINUE" = 'y' -a -e ${LOG_DIR}/$t.MAKELOG ] ; then
+				: $((SKIP_CNT += 1))
+				touch "${donep}${TOTAL_CNT}"
+			elif [ "$REBUILD_ERRORS" = 'y' -a ! -e ${LOG_DIR}/$t.ERR ] ; then
+				: $((SKIP_CNT += 1))
+				touch "${donep}${TOTAL_CNT}"
 			else
-				CUR_TGT="${t}"
-				build_target ${t} ${TOTAL_CNT}
-				CUR_TGT=''
+				if [ $BUILD_MANY == 1 ] ; then
+					build_target ${t} ${TOTAL_CNT} &
+				else
+					CUR_TGT="${t}"
+					build_target ${t} ${TOTAL_CNT}
+					CUR_TGT=''
+				fi
 			fi
 		fi
 
@@ -786,8 +807,12 @@ print_stats() {
 		rm -f ${LOG_DIR}/${CUR_TGT}.MAKELOG ${LOG_DIR}/${CUR_TGT}.ERR
 	fi
 
+	: $((TOTAL_CNT -= ${SKIP_CNT}))
 	echo ""
 	echo "--------------------- SUMMARY ----------------------------"
+	if [ "$CONTINUE" = 'y' -o "$REBUILD_ERRORS" = 'y' ] ; then
+		echo "Boards skipped: ${SKIP_CNT}"
+	fi
 	echo "Boards compiled: ${TOTAL_CNT}"
 	if [ ${ERR_CNT} -gt 0 ] ; then
 		echo "Boards with errors: ${ERR_CNT} (${ERR_LIST} )"
Signature · 1 line
1.7.11.5
#2 lore raw

PATCH 2/2 MAKEALL: Add options for incremental building

Quoted 8 lines · Joe Hershberger

--continue will allow you to <ctrl-c> the MAKEALL and pick up where you left off.

--rebuild-errors will allow you to rebuild only those boards which had trouble on the last run of MAKEALL, allowing you to quickly test a simple fix on just those boards.

Quoted 4 lines
---
 MAKEALL | 41 +++++++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 8 deletions(-)
#3 lore raw

PATCH 2/2 MAKEALL: Add options for incremental building

In reply to Joe Hershberger
Quoted 8 lines · Joe Hershberger

--continue will allow you to <ctrl-c> the MAKEALL and pick up where you left off.

--rebuild-errors will allow you to rebuild only those boards which had trouble on the last run of MAKEALL, allowing you to quickly test a simple fix on just those boards.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121207/096e6355/attachment.pgp>
#4 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

In reply to Joe Hershberger
Quoted 8 lines · Joe Hershberger

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Quoted 94 lines
---
 MAKEALL | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)
MAKEALL +24 -3
index 84a5c92..1f88dc5 100755
@@ -610,6 +610,13 @@ list_target() {
 donep="${LOG_DIR}/._done_"
 skipp="${LOG_DIR}/._skip_"
 
+build_target_killed() {
+       echo "Aborted $target build."
+       # Remove the logs for this board since it was aborted
+       rm -f ${LOG_DIR}/$target.MAKELOG ${LOG_DIR}/$target.ERR
+       exit
+}
+
 build_target() {
        target=$1
        build_idx=$2
@@ -622,6 +629,7 @@ build_target() {
        if [ $BUILD_MANY == 1 ] ; then
                output_dir="${OUTPUT_PREFIX}/${target}"
                mkdir -p "${output_dir}"
+               trap build_target_killed TERM
        else
                output_dir="${OUTPUT_PREFIX}"
        fi
@@ -640,6 +648,8 @@ build_target() {
        fi
 
        if [ $BUILD_MANY == 1 ] ; then
+               trap - TERM
+
                ${MAKE} -s tidy
 
                if [ -s ${LOG_DIR}/${target}.ERR ] ; then
@@ -721,7 +731,9 @@ build_targets() {
                        if [ $BUILD_MANY == 1 ] ; then
                                build_target ${t} ${TOTAL_CNT} &
                        else
+                               CUR_TGT="${t}"
                                build_target ${t} ${TOTAL_CNT}
+                               CUR_TGT=''
                        fi
                fi
 
@@ -745,7 +757,11 @@ build_targets() {
 #-----------------------------------------------------------------------
 
 kill_children() {
-       kill -- "-$1"
+       local pgid=`ps -p $$ --no-headers -o "%r" | tr -d ' '`
+       local children=`pgrep -g $pgid | grep -v $$ | grep -v $pgid`
+
+       kill $children 2> /dev/null
+       wait $children 2> /dev/null
 
        exit
 }
@@ -753,6 +769,9 @@ kill_children() {
 print_stats() {
        if [ "$ONLY_LIST" == 'y' ] ; then return ; fi
 
+       # Only count boards that completed
+       : $((TOTAL_CNT = `find ${skipp}* 2> /dev/null | wc -l`))
+
        rm -f ${donep}* ${skipp}*
 
        if [ $BUILD_MANY == 1 ] && [ -e "${OUTPUT_PREFIX}/ERR" ] ; then
@@ -762,6 +781,9 @@ print_stats() {
                WRN_LIST=`grep -riwL error ${OUTPUT_PREFIX}/ERR/`
                WRN_LIST=`for f in $WRN_LIST ; do echo -n " $(basename $f)" ; done`
                WRN_CNT=`echo $WRN_LIST | wc -w | awk '{print $1}'`
+       else
+               # Remove the logs for any board that was interrupted
+               rm -f ${LOG_DIR}/${CUR_TGT}.MAKELOG ${LOG_DIR}/${CUR_TGT}.ERR
        fi
 
        echo ""
@@ -776,7 +798,7 @@ print_stats() {
        echo "----------------------------------------------------------"
 
        if [ $BUILD_MANY == 1 ] ; then
-               kill_children $$ &
+               kill_children
        fi
 
        exit $RC
--

1.7.11.5

#5 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

In reply to Joe Hershberger

Dear Joe Hershberger,

Quoted 8 lines

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

[...]

Nice $subject.

btw. is it possible to improve the u-boot build process parallelization?

Best regards,
Marek Vasut

#6 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

Quoted 9 lines · Marek Vasut

Dear Joe Hershberger,

Quoted 7 lines

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Quoted 6 lines
Quoted 1 line

[...]

Nice $subject.

btw. is it possible to improve the u-boot build process parallelization?

Probably a little, but not a lot? It's be interesting to profile and see where a single machine build has bottlenecks, if any.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121031/4bf34f00/attachment.pgp>
#7 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

In reply to Marek Vasut
Quoted 9 lines · Marek Vasut

Dear Joe Hershberger,

Quoted 7 lines

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Quoted 6 lines
Quoted 1 line

[...]

Nice $subject.

btw. is it possible to improve the u-boot build process parallelization?

In what way?

#8 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

Dear Andy Fleming,

Quoted 12 lines · Marek Vasut
Quoted 11 lines

Dear Joe Hershberger,

Quoted 8 lines

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Quoted 7 lines
Quoted 5 lines

[...]

Nice $subject.

btw. is it possible to improve the u-boot build process parallelization?

In what way?

I recall someone complained the build process wasn't parallelizable enough and thus we need this stuff to run multiple builds at once in MAKEALL.

Best regards,
Marek Vasut

#9 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 4 lines · Marek Vasut

Dear Andy Fleming,

Quoted 2 lines

On Wed, Oct 31, 2012 at 9:32 PM, Marek Vasut
<[email protected]> wrote:

[snip]

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

btw. is it possible to improve the u-boot build process parallelization?

In what way?

I recall someone complained the build process wasn't parallelizable enough and thus we need this stuff to run multiple builds at once in MAKEALL.

I don't know if the first half of that statement is strictly true. It'd be interesting to profile a build on one of the very large boxes but I think the issue is we only have ~300 objects being built. It's hard to run up a load of 32 when you only have that many things to build. But multiplying that by the number of boards in a arch or some cpu or soc combinations is easier to run up the load, except around the tails. But, profiling, please!

- --
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/

iQIcBAEBAgAGBQJQkpP3AAoJENk4IS6UOR1WkQgP/0oih/weogNgs7Ql9Iv4Ct06 pNlaYJiDEOlKxhdwG80zXnyWSqIKkLIYN09N5NPyYQ3qgeM+uRYRiReDiwudYY+P pkOBWudj4X8SWUOucbRVWgx89DU4VrxCzY7sqqhDsQ+5ZTz8UjwG4wZaZOdewdLr ktxe90NQGVsl6ozQtJoSoJ57y727e07piGuBISRDwYZPwmpCl8d9dNd6liRf7zdv EXLIbO9aLROD67pkpO9OY392CVAU7cO4p5ir0dTGVZfYdPpadM+/Jsay5KsPhCf0 rM4eAFG1BvqhMBCc2NyPH2P71YU6rEsPdH6DyNh10aDRwUd7eep6/pU0tKbYpUR4 z0nsE1QOVLD5DY43/N0fEMN2G62LMiwnPuEQWT89N9uyDaFP7SS8lLRp/Sj7EhQF NLEMtMKvN8bVIBiVFXW8WOVRJqlc5uVpoeRqfbOctl50x9zGNHhypJlH65qtEeg/ UlroM1tw3p0j6Xk9zrNioGFy5/mpkF1hw2pirUAKF06yomg0FM9oAOwp/tfjyjgU uU2myW+lgWk0VfW/H00fyEBBs3vPnLo1PSL2WUKg43WRiEdY5C0/+E+lSIN7ph/z eeWKelSu6BUWPkuqBnxhUkMFRYtPCNqE5x6BdVv5p8TPxacD842qDP930Vg3YhqQ 1KG0rtSB69QqzAtVYDmO
=4XRP
-----END PGP SIGNATURE-----

#10 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

In reply to Joe Hershberger
Quoted 8 lines · Joe Hershberger

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Now I see:
/home/trini/bin/uboot-build.sh: line 110: 2024 Terminated /usr/bin/time -o $TIMEFILE -f %e ./MAKEALL $SOC $MACHINE > $LOG 2>&1

With my MAKEALL wrapper. Anything we can do about that?

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121103/1b7ad819/attachment.pgp>
#11 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

Hi Tom,

Quoted 9 lines · Tom Rini
Quoted 7 lines · Joe Hershberger

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Quoted 7 lines
Quoted 1 line

Now I see:
/home/trini/bin/uboot-build.sh: line 110: 2024 Terminated /usr/bin/time -o $TIMEFILE -f %e ./MAKEALL $SOC $MACHINE > $LOG 2>&1

With my MAKEALL wrapper. Anything we can do about that?

I see that as well... I did a little research and it seems like you have to jump through some pretty serious hoops to get rid of that message. I don't think it's worth the effort.

Does it have an impact on something in your wrapper?

-Joe

#12 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

Quoted 18 lines · Joe Hershberger

Hi Tom,

Quoted 15 lines · Tom Rini
Quoted 8 lines · Joe Hershberger

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Now I see:
/home/trini/bin/uboot-build.sh: line 110: 2024 Terminated /usr/bin/time -o $TIMEFILE -f %e ./MAKEALL $SOC $MACHINE > $LOG 2>&1

Quoted 7 lines
Quoted 1 line

With my MAKEALL wrapper. Anything we can do about that?

I see that as well... I did a little research and it seems like you have to jump through some pretty serious hoops to get rid of that message. I don't think it's worth the effort.

Does it have an impact on something in your wrapper?

Purely cosemetic so I can live with the bugfixes as-is, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121104/90f40ffe/attachment.pgp>
#13 lore raw

PATCH 1/2 MAKEALL: Fix kill_children

In reply to Joe Hershberger
Quoted 8 lines · Joe Hershberger

When building in parallel, make sure that we look up the children based on the the actual process group id instead of just assuming that the MAKEALL pid is the process group id.

Also ensure that logs from incomplete builds are deleted in the process.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121207/c57aa6f9/attachment.pgp>