mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: John Cherry <cherry@osdl.org>
To: "Justin T. Gibbs" <gibbs@scsiguy.com>
Cc: trivial@rustcorp.com.au,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [TRIVIAL][PATCH] fix parallel builds for aic7xxx]
Date: 05 Sep 2003 09:36:25 -0700	[thread overview]
Message-ID: <1062779785.12723.41.camel@cherrytest.pdx.osdl.net> (raw)
In-Reply-To: <59600000.1062714135@aslan.btc.adaptec.com>

[-- Attachment #1: Type: text/plain, Size: 2357 bytes --]

Short story: 

The makefile changes separate targets with identical dependencies.  In
the current Makefiles, things like "running the assembler" and "changing
file names" happen multiple times in parallel when building with
anything other than -j1.  Consider the following example Makefile:

targ: a b
a b: x
        touch a b
x:
        touch x
clean:
        rm a b x

Running the build with "make targ" yields:
touch x
touch a b

Running the build with "make -j2 targ" yields:
touch x
touch a b
touch a b

Notice that the "touch a b" output is not only executed twice, but on an
SMP machine, it could be run in parallel (with races).  These two
patches separate the targets with the same dependencies and prevent
these races.  I would actually consider this to be a bug in make, but
that is another story.

Long story:

Based on the explanation above, I have attached the output of the
aic7xxx build running it with -j1 and with -j2.  You can clearly see the
problems with parallel race conditions.

In the simplistic example above, this how I would change the Makefile to
avoid the parallel race.

targ: a b
a: x
        touch a
b: x
	touch b
x:
        touch x
clean:
        rm a b x

Please apply the patch.  It prevents broken builds when running with
anything other than -j1 and it does just what I have shown above.  BTW,
sometimes you get lucky and the build succeeds with a parallel build.

John


On Thu, 2003-09-04 at 15:22, Justin T. Gibbs wrote:
> > 
> > My compile regression scripts were getting random build failures for
> > aic7xxx.  The two makefiles could not handle parallel build. 
> > Occasionally they would succeed...timing dependent.  The following two
> > patches fix this.
> > 
> > Part 1 - drivers/scsi/aic7xxx/Makefile
> 
> I don't understand this patch.  It places the .seq file as a target
> that is rebuilt by invoking the assembler.  The .seq file is not
> a generated file.
> 
> Can you explain the nature of the failure and why you believe this
> fixes the problem (other than - "it seems to work with my testing").
> The previous Makefile appears to be perfectly valid.
> 
> > Part 2 - drivers/scsi/aic7xxx/aicasm/Makefile
> 
> This also doesn't make a lot of sense to me.  Is gmake so
> dumb as to not be able to understand that the invocation of
> a single target may satisfy multiple dependencies?
> 
> --
> Justin

[-- Attachment #2: output.j1 --]
[-- Type: text/plain, Size: 1930 bytes --]

make -C drivers/scsi/aic7xxx/aicasm
yacc -d -b aicasm_gram aicasm_gram.y
mv aicasm_gram.tab.c aicasm_gram.c
mv aicasm_gram.tab.h aicasm_gram.h
yacc -d -b aicasm_macro_gram -p mm aicasm_macro_gram.y
mv aicasm_macro_gram.tab.c aicasm_macro_gram.c
mv aicasm_macro_gram.tab.h aicasm_macro_gram.h
lex  -oaicasm_scan.c aicasm_scan.l
lex  -Pmm -oaicasm_macro_scan.c aicasm_macro_scan.l
gcc -I/usr/include -I. aicasm.c aicasm_symbol.c aicasm_gram.c aicasm_macro_gram.c aicasm_scan.c aicasm_macro_scan.c -o aicasm -ldb
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic79xx_reg.h \
		      -p drivers/scsi/aic7xxx/aic79xx_reg_print.c -i aic79xx_osm.h -o drivers/scsi/aic7xxx/aic79xx_seq.h \
		      drivers/scsi/aic7xxx/aic79xx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 785 instructions used
  CC [M]  drivers/scsi/aic7xxx/aic79xx_core.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_pci.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_reg_print.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_proc.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_osm_pci.o
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic7xxx_reg.h \
		      -p drivers/scsi/aic7xxx/aic7xxx_reg_print.c -i aic7xxx_osm.h -o drivers/scsi/aic7xxx/aic7xxx_seq.h \
		      drivers/scsi/aic7xxx/aic7xxx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 879 instructions used
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_core.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_93cx6.o
  CC [M]  drivers/scsi/aic7xxx/aic7770.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_pci.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_reg_print.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_proc.o
  CC [M]  drivers/scsi/aic7xxx/aic7770_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_osm_pci.o
  LD [M]  drivers/scsi/aic7xxx/aic7xxx.o
  LD [M]  drivers/scsi/aic7xxx/aic79xx.o
  Building modules, stage 2.

[-- Attachment #3: output.j2 --]
[-- Type: text/plain, Size: 3427 bytes --]

make -C drivers/scsi/aic7xxx/aicasm
yacc -d -b aicasm_gram aicasm_gram.y
yacc -d -b aicasm_macro_gram -p mm aicasm_macro_gram.y
mv aicasm_macro_gram.tab.c aicasm_macro_gram.c
mv aicasm_macro_gram.tab.h aicasm_macro_gram.h
yacc -d -b aicasm_gram aicasm_gram.y
mv aicasm_gram.tab.c aicasm_gram.c
mv aicasm_gram.tab.h aicasm_gram.h
lex  -oaicasm_scan.c aicasm_scan.l
mv aicasm_gram.tab.c aicasm_gram.c
lex  -Pmm -oaicasm_macro_scan.c aicasm_macro_scan.l
mv: can't stat source aicasm_gram.tab.c
make[2]: [aicasm_gram.c] Error 1 (ignored)
mv aicasm_gram.tab.h aicasm_gram.h
mv: can't stat source aicasm_gram.tab.h
make[2]: [aicasm_gram.c] Error 1 (ignored)
gcc -I/usr/include -I. aicasm.c aicasm_symbol.c aicasm_gram.c aicasm_macro_gram.c aicasm_scan.c aicasm_macro_scan.c -o aicasm -ldb
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic79xx_reg.h \
		      -p drivers/scsi/aic7xxx/aic79xx_reg_print.c -i aic79xx_osm.h -o drivers/scsi/aic7xxx/aic79xx_seq.h \
		      drivers/scsi/aic7xxx/aic79xx.seq
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic79xx_reg.h \
		      -p drivers/scsi/aic7xxx/aic79xx_reg_print.c -i aic79xx_osm.h -o drivers/scsi/aic7xxx/aic79xx_seq.h \
		      drivers/scsi/aic7xxx/aic79xx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 785 instructions used
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic79xx_reg.h \
		      -p drivers/scsi/aic7xxx/aic79xx_reg_print.c -i aic79xx_osm.h -o drivers/scsi/aic7xxx/aic79xx_seq.h \
		      drivers/scsi/aic7xxx/aic79xx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 785 instructions used
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic7xxx_reg.h \
		      -p drivers/scsi/aic7xxx/aic7xxx_reg_print.c -i aic7xxx_osm.h -o drivers/scsi/aic7xxx/aic7xxx_seq.h \
		      drivers/scsi/aic7xxx/aic7xxx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 879 instructions used
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic7xxx_reg.h \
		      -p drivers/scsi/aic7xxx/aic7xxx_reg_print.c -i aic7xxx_osm.h -o drivers/scsi/aic7xxx/aic7xxx_seq.h \
		      drivers/scsi/aic7xxx/aic7xxx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 785 instructions used
drivers/scsi/aic7xxx/aicasm/aicasm -Idrivers/scsi/aic7xxx -r drivers/scsi/aic7xxx/aic7xxx_reg.h \
		      -p drivers/scsi/aic7xxx/aic7xxx_reg_print.c -i aic7xxx_osm.h -o drivers/scsi/aic7xxx/aic7xxx_seq.h \
		      drivers/scsi/aic7xxx/aic7xxx.seq
drivers/scsi/aic7xxx/aicasm/aicasm: 879 instructions used
  CC [M]  drivers/scsi/aic7xxx/aic79xx_core.o
drivers/scsi/aic7xxx/aicasm/aicasm: 879 instructions used
  CC [M]  drivers/scsi/aic7xxx/aic79xx_pci.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_reg_print.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_proc.o
  CC [M]  drivers/scsi/aic7xxx/aic79xx_osm_pci.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_core.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_93cx6.o
  CC [M]  drivers/scsi/aic7xxx/aic7770.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_pci.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_reg_print.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_proc.o
  CC [M]  drivers/scsi/aic7xxx/aic7770_osm.o
  CC [M]  drivers/scsi/aic7xxx/aic7xxx_osm_pci.o
  LD [M]  drivers/scsi/aic7xxx/aic7xxx.o
  LD [M]  drivers/scsi/aic7xxx/aic79xx.o
  Building modules, stage 2.

  reply	other threads:[~2003-09-05 16:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-04 17:59 John Cherry
2003-09-04 22:22 ` Justin T. Gibbs
2003-09-05 16:36   ` John Cherry [this message]
2003-09-05 19:21     ` Sam Ravnborg
2003-09-05 23:47       ` John Cherry

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1062779785.12723.41.camel@cherrytest.pdx.osdl.net \
    --to=cherry@osdl.org \
    --cc=gibbs@scsiguy.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=trivial@rustcorp.com.au \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®