U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Masahiro Yamada <yamada.m@jp.panasonic.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 7/7] tools/genboardscfg.py: improve performance
Date: Mon, 25 Aug 2014 12:39:48 +0900	[thread overview]
Message-ID: <1408937988-19923-8-git-send-email-yamada.m@jp.panasonic.com> (raw)
In-Reply-To: <1408937988-19923-1-git-send-email-yamada.m@jp.panasonic.com>

I guess some developers are already getting sick of this tool
because it generally takes a few minites to generate the boards.cfg
on a reasonable computer.

The idea popped up on my mind was to skip Makefiles and
to run script/kconfig/conf directly.
This tool should become about 4 times faster.
You might still not be satisfied, but better than doing nothing.

Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Acked-by: Simon Glass <sjg@chromium.org>
---

On my computer (Core i7 2700K + 16GB memory),

60 sec --> 14 sec

This commit does not solve the root cause at all.
We still need to find a better way to replace this patch.


Changes in v3:
  - Use "with ... as ..." instead of explicitely doing f.close()

Changes in v2:
  - A little optimization
     move configs/.tmp_defconfig to ./.tmp_defconfig

 tools/genboardscfg.py | 39 +++++++++++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 6 deletions(-)

diff --git a/tools/genboardscfg.py b/tools/genboardscfg.py
index 7142567..855c99c 100755
--- a/tools/genboardscfg.py
+++ b/tools/genboardscfg.py
@@ -30,7 +30,7 @@ CONFIG_DIR = 'configs'
 REFORMAT_CMD = [os.path.join('tools', 'reformat.py'),
                 '-i', '-d', '-', '-s', '8']
 SHOW_GNU_MAKE = 'scripts/show-gnu-make'
-SLEEP_TIME=0.03
+SLEEP_TIME=0.003
 
 COMMENT_BLOCK = '''#
 # List of boards
@@ -312,13 +312,20 @@ class Slot:
         Arguments:
           output: File object which the result is written to
           maintainers_database: An instance of class MaintainersDatabase
+          devnull: file object of 'dev/null'
+          make_cmd: the command name of Make
         """
-        self.occupied = False
         self.build_dir = tempfile.mkdtemp()
         self.devnull = devnull
-        self.make_cmd = make_cmd
+        self.ps = subprocess.Popen([make_cmd, 'O=' + self.build_dir,
+                                    'allnoconfig'], stdout=devnull)
+        self.occupied = True
         self.parser = DotConfigParser(self.build_dir, output,
                                       maintainers_database)
+        self.env = os.environ.copy()
+        self.env['srctree'] = os.getcwd()
+        self.env['UBOOTVERSION'] = 'dummy'
+        self.env['KCONFIG_OBJDIR'] = ''
 
     def __del__(self):
         """Delete the working directory"""
@@ -341,13 +348,31 @@ class Slot:
         """
         if self.occupied:
             return False
-        o = 'O=' + self.build_dir
-        self.ps = subprocess.Popen([self.make_cmd, o, defconfig],
-                                   stdout=self.devnull)
+
+        with open(os.path.join(self.build_dir, '.tmp_defconfig'), 'w') as f:
+            for line in open(os.path.join(CONFIG_DIR, defconfig)):
+                colon = line.find(':CONFIG_')
+                if colon == -1:
+                    f.write(line)
+                else:
+                    f.write(line[colon + 1:])
+
+        self.ps = subprocess.Popen([os.path.join('scripts', 'kconfig', 'conf'),
+                                    '--defconfig=.tmp_defconfig', 'Kconfig'],
+                                   stdout=self.devnull,
+                                   cwd=self.build_dir,
+                                   env=self.env)
+
         self.defconfig = defconfig
         self.occupied = True
         return True
 
+    def wait(self):
+        """Wait until the current subprocess finishes."""
+        while self.occupied and self.ps.poll() == None:
+            time.sleep(SLEEP_TIME)
+        self.occupied = False
+
     def poll(self):
         """Check if the subprocess is running and invoke the .config
         parser if the subprocess is terminated.
@@ -385,6 +410,8 @@ class Slots:
         for i in range(jobs):
             self.slots.append(Slot(output, maintainers_database,
                                    devnull, make_cmd))
+        for slot in self.slots:
+            slot.wait()
 
     def add(self, defconfig):
         """Add a new subprocess if a vacant slot is available.
-- 
1.9.1

  parent reply	other threads:[~2014-08-25  3:39 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-25  3:39 [U-Boot] [PATCH v3 0/7] tools/genboardscfg.py: various fixes and performance improvement Masahiro Yamada
2014-08-25  3:39 ` [U-Boot] [PATCH v3 1/7] tools/genboardscfg.py: ignore defconfigs starting with a dot Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` [U-Boot] [PATCH v3 2/7] tools/genboardscfg.py: be tolerant of missing MAINTAINERS Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` [U-Boot] [PATCH v3 3/7] tools/genboardscfg.py: be tolerant of insane Kconfig Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` [U-Boot] [PATCH v3 4/7] tools/genboardscfg.py: wait for unfinished subprocesses before error-out Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` [U-Boot] [PATCH v3 5/7] tools/genboardscfg.py: fix minor problems on termination Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` [U-Boot] [PATCH v3 6/7] tools/genboardscfg.py: check if the boards.cfg is up to date Masahiro Yamada
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, " Tom Rini
2014-08-25  3:39 ` Masahiro Yamada [this message]
2014-08-29 14:41   ` [U-Boot] [U-Boot, v3, 7/7] tools/genboardscfg.py: improve performance Tom Rini

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=1408937988-19923-8-git-send-email-yamada.m@jp.panasonic.com \
    --to=yamada.m@jp.panasonic.com \
    --cc=u-boot@lists.denx.de \
    /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