[OE-core] [PATCH 3/3] package_ipk: Parallelise ipk creation

Khem Raj raj.khem at gmail.com
Fri Jun 16 02:28:55 UTC 2017


On Wed, Jun 14, 2017 at 6:42 AM, Richard Purdie
<richard.purdie at linuxfoundation.org> wrote:
> Allow the creation of ipks to happen in parallel, making best use of resources
> on multiprocessor systems.
>
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
> ---
>  meta/classes/package_ipk.bbclass | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass
> index d2ce3b3..282d212 100644
> --- a/meta/classes/package_ipk.bbclass
> +++ b/meta/classes/package_ipk.bbclass
> @@ -17,6 +17,8 @@ OPKG_ARGS += "${@['', '--add-exclude ' + ' --add-exclude '.join((d.getVar('PACKA
>  OPKGLIBDIR = "${localstatedir}/lib"
>
>  python do_package_ipk () {
> +    from multiprocessing import Process
> +
>      oldcwd = os.getcwd()
>
>      workdir = d.getVar('WORKDIR')
> @@ -37,11 +39,24 @@ python do_package_ipk () {
>      if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK):
>          os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"))
>
> -    for pkg in packages.split():
> -        ipk_write_pkg(pkg, d)
> +    max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1)
> +    launched = []
> +    pkgs = packages.split()
> +    while pkgs:
> +        if len(launched) < max_process:
> +            p = Process(target=ipk_write_pkg, args=(pkgs.pop(), d))
> +            p.start()
> +            launched.append(p)
> +        for q in launched:
> +            # The finished processes are joined when calling is_alive()
> +            if not q.is_alive():
> +                launched.remove(q)
> +    for p in launched:
> +        p.join()
>
>      os.chdir(oldcwd)
>  }
> +do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS"
>
>  def ipk_write_pkg(pkg, d):
>      import re, copy

on a 44 core system, this patch bails out like below. Once I revert
this it works all fine.

ERROR: westeros-wpe-image-1.0-r0 do_rootfs: Unable to install
packages. Command
'/mnt/a/oe/build/tmp/work/raspberrypi3-bec-linux-musleabi/westeros-wpe-image/1.0-r0/recipe-sysroot-native/usr/bin/opkg
--volatile-cache -f /mnt/a/oe/build/tmp
/work/raspberrypi3-bec-linux-musleabi/westeros-wpe-image/1.0-r0/opkg.conf
-t /mnt/a/oe/build/tmp/work/raspberrypi3-bec-linux-musleabi/westeros-wpe-image/1.0-r0/temp/ipktemp/
-o /mnt/a/oe/build/tmp/work/raspberrypi3-bec-linux-musleabi/west
eros-wpe-image/1.0-r0/rootfs  --force_postinstall
--prefer-arch-to-version   install 96boards-tools kernel-modules opkg
packagegroup-core-boot packagegroup-core-ssh-openssh
packagegroup-ml-wpe packagegroup-westeros psplash-raspberrypi run
-postinsts runit runit-serialgetty' returned 255:
Collected errors:
 * opkg_prepare_url_for_install: Couldn't find anything to satisfy
'96boards-tools'.
 * rm_r: Failed to open dir
/mnt/a/oe/build/tmp/work/raspberrypi3-bec-linux-musleabi/westeros-wpe-image/1.0-r0/temp/ipktemp//opkg-J9PI7V:
No such file or directory.

ERROR: westeros-wpe-image-1.0-r0 do_rootfs: Function failed: do_rootfs



More information about the Openembedded-core mailing list