Skip to content

Commit 91e32a8

Browse files
rpurdieleimaohui
authored andcommitted
bitbake: runqueue: Fix performance of multiconfigs with large overlap
There have been complaints about the performance of large multiconfig builds for a while. The key missing data point was that the builds needed to have large overlaps in sstate objects. This can be simulated by building the same things with just different TMPDIRs. In runqueue/bitbake terms this equates to large numbers of deferred tasks. The issue is that the expensive checks in the setscene loop were hit every time through runqueue's execute function before the check on deferred tasks. This leads to task execution starvation as that only happens once per iteration. Move the skip check earlier in the function which speeds things up enormously and should improve performance of such builds for users. (Bitbake rev: 9c6c506757f2b3e28c8b20513b45da6b4659c95f) Signed-off-by: Richard Purdie <[email protected]>
1 parent 6b3f2de commit 91e32a8

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

bitbake/lib/bb/runqueue.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2210,6 +2210,9 @@ def execute(self):
22102210
# Find the next setscene to run
22112211
for nexttask in self.sorted_setscene_tids:
22122212
if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred:
2213+
if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete:
2214+
# Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds
2215+
continue
22132216
if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \
22142217
nexttask not in self.sq_needed_harddeps and \
22152218
self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \
@@ -2239,8 +2242,7 @@ def execute(self):
22392242
if t in self.runq_running and t not in self.runq_complete:
22402243
continue
22412244
if nexttask in self.sq_deferred:
2242-
if self.sq_deferred[nexttask] not in self.runq_complete:
2243-
continue
2245+
# Deferred tasks that were still deferred were skipped above so we now need to process
22442246
logger.debug("Task %s no longer deferred" % nexttask)
22452247
del self.sq_deferred[nexttask]
22462248
valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False)

0 commit comments

Comments
 (0)