public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Steven Shi" <steven.shi@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"lersek@redhat.com" <lersek@redhat.com>,
	"Feng, Bob C" <bob.c.feng@intel.com>
Cc: "Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: Re: [edk2-devel] [Patch 0/9] Enable multiple process AutoGen
Date: Sun, 21 Jul 2019 15:55:17 +0000	[thread overview]
Message-ID: <06C8AB66E78EE34A949939824ABE2B314006E088@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <fb27fbd7-df15-872e-e02c-2fbf8aca28a0@redhat.com>

>          This is the problem: the checksum does not match the one from
>          (3c). And, the binary from (3f) is in fact mis-built, it
>          crashes immediately when launched on QEMU/KVM, with "emulation
>          failure".

It looks an incremental build error. This multi-process build tool fails to re-generate the new autogen code (CreateCodeFile) and makefile (CreateMakeFile). The new build tool wrongly skip these steps in incremental build.



Thanks
Steven Shi


> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Laszlo Ersek
> Sent: Sunday, July 21, 2019 8:26 PM
> To: Feng, Bob C <bob.c.feng@intel.com>
> Cc: devel@edk2.groups.io; Philippe Mathieu-Daudé <philmd@redhat.com>
> Subject: Re: [edk2-devel] [Patch 0/9] Enable multiple process AutoGen
> 
> Hi Bob,
> 
> On 07/18/19 08:14, Bob Feng wrote:
> > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875
> >
> > In order to improve the build performance, we implemented
> > multiple-processes AutoGen. This change will reduce 20% time
> > for AutoGen phase.
> >
> > The design document can be got from:
> > https://edk2.groups.io/g/devel/files/Designs/2019/0627/Multiple-thread-
> AutoGen.pdf
> >
> > This patch serial pass the build of Ovmf, MinKabylake, MinPurley,
> > packages under Edk2 repository and intel client and server platforms.
> 
> I've done some basic regression-testing with this set, applied on top of
> current master (= commit 8ff68cd5e4c9, "ShellPkg: acpiview: DBG2: Remove
> redundant forward declarations", 2019-07-19).
> 
> (1) The build process now seems to produce files called
> 
>       GlobalVar_37d7e986-f7e9-45c2-8067-e371421a626c_AARCH64.bin
>       GlobalVar_37d7e986-f7e9-45c2-8067-e371421a626c_ARM.bin
>       GlobalVar_5a9e7754-d81b-49ea-85ad-69eaa7b1539b_IA32.bin
>       GlobalVar_5a9e7754-d81b-49ea-85ad-69eaa7b1539b_X64.bin
> 
>     in the project root directory. (The GUIDs match the PLATFORM_GUID
>     values from ArmVirtQemu.dsc and OvmfPkg*.dsc.)
> 
>     They seem to come from patch "BaseTools: Enable Multiple Process
>     AutoGen".
> 
>     Can we place these files under the Build/ directory somewhere,
>     instead?
> 
> (2) The QEMU project now bundles edk2 (as a git submodule for the edk2
>     tree, and some firmware binaries built from that). The build scripts
>     carried by QEMU set PYTHON_COMMAND to python2, in order to work
>     around TianoCore BZ#1607.
> 
>     For regression-testing this set, I ran
> 
>     $ make -C roms efi
> 
>     with QEMU's edk2 submodule advanced to commit 8ff68cd5e4c9, plus
>     this set applied (see above), and with QEMU itself being at
>     e2b47666fe15.
> 
>     The build itself passes fine, so that's good.
> 
>     But, some (not all) of the firmware binaries are *misbuilt*. I'll
>     elaborate below (independently of QEMU).
> 
> (3) Consider the following test. (Note that this is independent of the
>     QEMU project entirely.)
> 
>     (3a) Set up a pristine build environment:
> 
>          # Open a new shell, then:
>          $ git clean -ffdx
>          $ git reset --hard
>          $ git submodule deinit --force --all
>          $ git checkout master
>          $ git submodule update --init
>          $ export PYTHON_COMMAND=python2
>          $ source edksetup.sh
>          $ nice make -C "$EDK_TOOLS_PATH" \
>              -j $(getconf _NPROCESSORS_ONLN)
> 
>     (3b) Build OvmfPkgIA32 with one set of features, and capture a
>          checksum of the resultant firmware binary:
> 
>          $ nice build -a IA32 -b NOOPT -p OvmfPkg/OvmfPkgIA32.dsc \
>              -t GCC48
>          $ md5sum Build/OvmfIa32/NOOPT_GCC48/FV/OVMF_CODE.fd
>          8d56575dd3b5c89ac6f1829ae4f41b55
> 
>     (3c) *Re*build the same platform with a different set of features,
>          and capture a checksum again:
> 
>          $ nice build -a IA32 -b NOOPT -p OvmfPkg/OvmfPkgIA32.dsc \
>              -t GCC48 -D SECURE_BOOT_ENABLE -D SMM_REQUIRE
>          $ md5sum Build/OvmfIa32/NOOPT_GCC48/FV/OVMF_CODE.fd
>          ed79052e9add242174ccefc78a5bddb3
> 
>     Okay, now repeat all three steps from zero, but with the present
>     feature patch set applied:
> 
>     (3d) Repeat (3a), but rather than checking out the master branch
>          with "git checkout", check out the topic branch that is the
>          same "master" commit, *plus* the present series applied on top.
> 
>          Don't forget to start a new shell first!
> 
>     (3e) Repeat (3b):
> 
>          $ nice build -a IA32 -b NOOPT -p OvmfPkg/OvmfPkgIA32.dsc \
>              -t GCC48
>          $ md5sum Build/OvmfIa32/NOOPT_GCC48/FV/OVMF_CODE.fd
>          8d56575dd3b5c89ac6f1829ae4f41b55
> 
>          Notice that the checksum is identical to that from (3b), so
>          all's good.
> 
>     (3f) Repeat (3c):
> 
>          $ nice build -a IA32 -b NOOPT -p OvmfPkg/OvmfPkgIA32.dsc \
>              -t GCC48 -D SECURE_BOOT_ENABLE -D SMM_REQUIRE
>          $ md5sum Build/OvmfIa32/NOOPT_GCC48/FV/OVMF_CODE.fd
>          baf08c5a9ecb0adc754f5b48410b6476
> 
>          This is the problem: the checksum does not match the one from
>          (3c). And, the binary from (3f) is in fact mis-built, it
>          crashes immediately when launched on QEMU/KVM, with "emulation
>          failure".
> 
>     Thus:
> 
>     - Without the patch set, if I build a platform, then *rebuild* it
>       with different -D flags, then both builds produce proper outputs.
> 
>     - With the patch series applied however, only the initial build
>       produces good results. The *rebuild*, with different -D flags, is
>       "poisoned" by the artifacts still laying around from the first
>       build.
> 
>     In other words, this is a "stale cache" problem.
> 
> (4) Not a show stopper, but a divergence from previous behavior:
> 
>     When one presses Ctrl-S (the "stop" character) in a terminal, the
>     terminal output / autoscrolling is suspended, until Ctrl-Q (the
>     "start" character) is pressed. This is generally used for two
>     things: scrolling back the terminal history manually, for reading
>     something that scrolled off the screen, and for briefly pausing
>     whatever processing the program is doing.
> 
>     The idea being, if the program is blocked in a terminal write
>     operation, it cannot do anything else.
> 
>     The present patch set changes the lastly mentioned behavior, because
>     the logging is now decoupled to a separate thread ("BaseTools: Add
>     LogAgent to support multiple process Autogen"). As a result, if the
>     *output* of LogAgent is blocked, that does not block the *input* of
>     LogAgent, and so the queue / buffer in LogAgent grows without bound,
>     and the build continues even though the terminal output is stopped.
> 
>     This is a common initial symptom of programs with internal queues --
>     it's usually good to implement internal flow control, under which
>     any given queue has a limit, and if that limit is reached, the queue
>     blocks the producer threads feeding it.
> 
>     Again, this is not a show stopper, just a divergence from previous
>     behavior which we should be aware of, and possibly document
>     somewhere.
> 
>     Importantly, Ctrl-Z (the "suspend" character) works just fine, for
>     *both* purposes described above. (And then people can resume the
>     build with "fg", like always.)
> 
> (5) Two questions out of interest:
> 
>     - Has this series been tested for restarting builds that were
>       interrupted with Ctrl-C? Can the new build "pick up" where the
>       previous build was interrupted?
> 
>     - Do we intend to offer a flag for disabling this feature? I'm not
>       implying that the old code should be preserved as an alternative,
>       but perhaps some internal constants related to parallelization can
>       be tweaked such that the ultimate behavior becomes serial. Is the
>       "-n 1" option supposed to have that effect?
> 
>     The second question is relevant because people might want to disable
>     the new feature until it stabilizes (see issue (3) for example).
> 
> Thanks,
> Laszlo
> 
> 


  reply	other threads:[~2019-07-21 15:55 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-18  6:14 [Patch 0/9] Enable multiple process AutoGen Bob Feng
2019-07-18  6:14 ` [Patch 1/9] BaseTools: Singleton the object to handle build conf file Bob Feng
2019-07-18  6:14 ` [Patch 2/9] BaseTools: Split WorkspaceAutoGen._InitWorker into multiple functions Bob Feng
2019-07-18  6:14 ` [Patch 3/9] BaseTools: Add functions to get platform scope build options Bob Feng
2019-07-18  6:14 ` [Patch 4/9] BaseTools: Decouple AutoGen Objects Bob Feng
2019-07-18  6:14 ` [Patch 5/9] BaseTools: Enable Multiple Process AutoGen Bob Feng
2019-07-18  6:14 ` [Patch 6/9] BaseTools: Add shared data for processes Bob Feng
2019-07-18  6:14 ` [Patch 7/9] BaseTools: Add LogAgent to support multiple process Autogen Bob Feng
2019-07-18  6:14 ` [Patch 8/9] BaseTools: Move BuildOption parser out of build.py Bob Feng
2019-07-18  6:14 ` [Patch 9/9] BaseTools: Add the support for python 2 Bob Feng
2019-07-21 12:26 ` [edk2-devel] [Patch 0/9] Enable multiple process AutoGen Laszlo Ersek
2019-07-21 15:55   ` Steven Shi [this message]
2019-07-22  9:11   ` Bob Feng
2019-07-22 19:50     ` Laszlo Ersek

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-list 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=06C8AB66E78EE34A949939824ABE2B314006E088@shsmsx102.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /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