From patchwork Wed Dec 4 20:41:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53683 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07D3DE7716D for ; Wed, 4 Dec 2024 20:41:47 +0000 (UTC) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by mx.groups.io with SMTP id smtpd.web10.25538.1733344899164710199 for ; Wed, 04 Dec 2024 12:41:39 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=P3rB9EnC; spf=softfail (domain: sakoman.com, ip: 209.85.214.179, mailfrom: steve@sakoman.com) Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2155312884fso1858305ad.0 for ; Wed, 04 Dec 2024 12:41:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344898; x=1733949698; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=kuhB8Ppi8qXiaTfyD1YRma1Ju7Rukir92bXRNBstZ+A=; b=P3rB9EnCEEPq1gphTOWhSK+rtk8jO0by1JoWwWzVn4HpS13kjm2GyHkgUzv131kJV6 QrPYkmy/3iYdKQulJ6uqwruKhhiYWroYQGunZAam4sqALCAOXYbZQWx10erhJrOAez/5 xhOYDeXLk/eGhLN4aIv9Jnk5ORXIYC0bLmLuC7Rbc7e6/BKgWpStTg5VQ+uwls+1d51x Ta7E10cwW98ZiQ9RXzjuLoWLjX+uFcQVeH8QNKArYjFKs8r6YS4obkGxbeMTNJCwkPso 5zFGuVkZV320IluV+Ut1E2a7x2nzvKUbKU3vfDfM3+KnG1iQThAKLn3KMFctllf+gIyh tPAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344898; x=1733949698; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kuhB8Ppi8qXiaTfyD1YRma1Ju7Rukir92bXRNBstZ+A=; b=kmLOGbrRCGkTRwAhfxbZbXf+OTBXZNHGqTJpryBPbW7HZW6GCCUMuu+9EQR/TrB9kN jX+G2oV9a3ZappoGJug8pAsHpBvZcghdxXzsGOSZpzFwra7nj7A/mXE5NzoWlhwYicnd Dkvmn6wXonZMdtuCl/xMWYtcBMEGzoY3KC2Kt5z4AGYQzFTBul6AlXg0O2m7OciThm86 210Bfk0qQQ7MbglZah3u6jEdNh7V5hiAHWU9RDzHwTJRb7ZdB6RQichbE9Wz4Zllvh7K CGEEa8xxrjsqvaIsBAxiqrKGNl4bF09/ZKkmFjzxwv1O4BzRiELBkr8U2H1+6mYYsogY XHhg== X-Gm-Message-State: AOJu0YzTWyWlfQcR7sTIT6fagmEVQDzN09rWMtlVJ38Q2JAU/8ieUqA8 m23h1knF51paiYx3Qhh8cqJaJNl7EdWi1HxFj+FPhvN+JsOFfJOgbGCL10uYCQFYBekw5qJTYTq s X-Gm-Gg: ASbGncsVfhb+9RmwDwLHIeNscH/SvnlQtdzAasOMLdabwvjCWDC9Fi2HaEaIQ3+Cx/j 8yRiUYwWDlRcxhdUJCTwARo98fguOvOY8o2HYh/zH8r0mhkUF27/gasB1Wr1OX9cN+gXqgwvaXq 6uv1cmF7bkwvcVLEqm3WQWiR0X1fvxQw2JlZXXxeN6nKhF/tnpbbqKrD9iRHUOJEFBILXnANbd8 BzlDOcWN1nuFQCyQUIEUXW3sw89Uqysl3Y7Oz4= X-Google-Smtp-Source: AGHT+IFJUXRA51sQtiaIAXAQUzzEEM87APOUhGWeATtlrjIDeI8U1FO4YxAoLiavkGFK3FggRQaZ5w== X-Received: by 2002:a17:902:c945:b0:215:a57e:88e7 with SMTP id d9443c01a7336-215bd1b46b0mr64710915ad.3.1733344898209; Wed, 04 Dec 2024 12:41:38 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2155abd92ecsm80057415ad.200.2024.12.04.12.41.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:41:37 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Date: Wed, 4 Dec 2024 12:41:25 -0800 Message-Id: <5392a2bf6d82626e11eec5578eb4de53ba09f1fe.1733344775.git.steve@sakoman.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:41:47 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16874 From: Richard Purdie 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. Signed-off-by: Richard Purdie (cherry picked from commit 9c6c506757f2b3e28c8b20513b45da6b4659c95f) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 3462ed445..9f3abff85 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -2195,6 +2195,9 @@ class RunQueueExecute: # Find the next setscene to run for nexttask in self.sorted_setscene_tids: 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: + if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete: + # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds + continue if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \ nexttask not in self.sq_needed_harddeps and \ self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \ @@ -2224,8 +2227,7 @@ class RunQueueExecute: if t in self.runq_running and t not in self.runq_complete: continue if nexttask in self.sq_deferred: - if self.sq_deferred[nexttask] not in self.runq_complete: - continue + # Deferred tasks that were still deferred were skipped above so we now need to process logger.debug("Task %s no longer deferred" % nexttask) del self.sq_deferred[nexttask] valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False) From patchwork Wed Dec 4 20:41:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53685 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0B371E77172 for ; Wed, 4 Dec 2024 20:41:47 +0000 (UTC) Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by mx.groups.io with SMTP id smtpd.web11.25256.1733344900203292811 for ; Wed, 04 Dec 2024 12:41:40 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=QpcMSBMM; spf=softfail (domain: sakoman.com, ip: 209.85.214.175, mailfrom: steve@sakoman.com) Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-215c4000c20so1779965ad.3 for ; Wed, 04 Dec 2024 12:41:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344899; x=1733949699; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=cL03ZZJzyks7UsEX8uuC05r5atyoHKqwkuocj6y14LA=; b=QpcMSBMM+deu4IzTuPkXQCMAFIKl3M+DJoHzo65Pog7M4kYdJ45SC6+DVsx9lOO6dq 7GhMZOzPwsACZrUxoAEHfp1MiLH7e5UGMR5qTNv3CobiLdHHPZplU6CBvc3DlKxB/7ty VubTm9Xpr0sfNOfUIrFG6wMAAndc+NbOHRcoY9lV8emNgK9ulken2OxkzGbGjf5Ezx6P qKET9ps0oNEewivJJqtOzyT7Zuo3nz63QXMCYmCw2IzTR23u9G0ij9vqJOeW9uOUSIMf fuZCHSPtFqIKtnD+hXodOkqcmMsho3O278D4BvLdM/f/7ogissS5ILSe9SM9v+2u1yOg JVGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344899; x=1733949699; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cL03ZZJzyks7UsEX8uuC05r5atyoHKqwkuocj6y14LA=; b=ceyhfis1uQ831bZyjOD2wHjBgly7P6e+e0pBaxio6+HQ0a2NA/kEmZr0soYvqB0DJ4 Mcy83O7w4o2ErvF53uMJFuejiLjtB5ZRX9xBv5DMVaIk3PN354IE/fj7auEXK0hYQiK3 uvG8IFV5r6rPFu8Tfy6y8WxC30ONxXOFa4Lx+K7Bsq31rivxiZw09Kw9sPbhGxWawcT4 v1vHaLl/M0yELZ9EqUnGHcSqn2yiU89osQsjPTUYv7r9PMDfOFVztvsT+id5apzVIHE+ vQzQE3jKD9ts9UgMWW+12AvTEHi/9udgjyoSFMHLsfj0W85cv7Kgbsp3nGN6Qws+I2HV zO0w== X-Gm-Message-State: AOJu0YwD8jvRUAV9Lq7lmXX1IAYmPAhuwbChtTa2ZPUW1wdCQuocBCSh R9el4TY8qgKGvC+ndWvBsOksoiHe9sB2y2ZO0PcYbROz3XltQAVuFiOKVA2Hjy9Mx3p23z//4vw 4 X-Gm-Gg: ASbGnct/Gl6urEqhpxkMog8ep920fB/eV5JsCn6N5SuH0Be5zJuKaPpekdHbDp0UlqZ QsFopqRFOqicquj5hg5i8JLEyNipEyzlHYf50KHlxEjUwKqk2ipjYC4d4gWjiTOsQ77IayxgMv9 77cEo+WCJsuiShlS+PaergkZzbi/RO/CRQfgqM0LRPWeVAIiYqoALtWm8ObU0n4iPWd3BQgc0Q9 KyR7mVeXMwG4EMW+W9L9pK9dTx8I2RbaTp5zZo= X-Google-Smtp-Source: AGHT+IH5AIx9ccSUg1WLVvgKDxY9pPmliKdKP4SHWin0Y/lSABT45PcfWjHzExhnS+8EWEsrC6VTXA== X-Received: by 2002:a17:903:98e:b0:215:5aba:7a8f with SMTP id d9443c01a7336-215bd269d60mr104148145ad.46.1733344899518; Wed, 04 Dec 2024 12:41:39 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2155abd92ecsm80057415ad.200.2024.12.04.12.41.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:41:39 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][styhead][2.10][PATCH 2/3] runqueue: Optimise setscene loop processing Date: Wed, 4 Dec 2024 12:41:26 -0800 Message-Id: <5465f9b6e3b4748e563efc53657af96f02a41c7a.1733344775.git.steve@sakoman.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:41:47 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16875 From: Richard Purdie Rather than looping through things we looped through on the previous execution, start looping where we left off for setscene processing. This gives speed improvements depending on the kind of build being executed. Signed-off-by: Richard Purdie (cherry picked from commit 00f4d932e3af0eeb333339cbe942010fc76dee0f) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index 9f3abff85..b34e2d560 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -14,6 +14,7 @@ import os import sys import stat import errno +import itertools import logging import re import bb @@ -2189,11 +2190,16 @@ class RunQueueExecute: if not hasattr(self, "sorted_setscene_tids"): # Don't want to sort this set every execution self.sorted_setscene_tids = sorted(self.rqdata.runq_setscene_tids) + # Resume looping where we left off when we returned to feed the mainloop + self.setscene_tids_generator = itertools.cycle(self.rqdata.runq_setscene_tids) task = None if not self.sqdone and self.can_start_task(): - # Find the next setscene to run - for nexttask in self.sorted_setscene_tids: + loopcount = 0 + # Find the next setscene to run, exit the loop when we've processed all tids or found something to execute + while loopcount < len(self.rqdata.runq_setscene_tids): + loopcount += 1 + nexttask = next(self.setscene_tids_generator) 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: if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete: # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds From patchwork Wed Dec 4 20:41:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Sakoman X-Patchwork-Id: 53684 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 09E42E77171 for ; Wed, 4 Dec 2024 20:41:47 +0000 (UTC) Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by mx.groups.io with SMTP id smtpd.web11.25257.1733344901637228642 for ; Wed, 04 Dec 2024 12:41:41 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@sakoman-com.20230601.gappssmtp.com header.s=20230601 header.b=yIq2avwt; spf=softfail (domain: sakoman.com, ip: 209.85.214.179, mailfrom: steve@sakoman.com) Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2156e078563so1203595ad.2 for ; Wed, 04 Dec 2024 12:41:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sakoman-com.20230601.gappssmtp.com; s=20230601; t=1733344901; x=1733949701; darn=lists.openembedded.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=P5UjxKCeqORqIFtQI/GncQ99E6vfBAFKQY2Y54aSOIM=; b=yIq2avwtGInT/GD7QGbv5i5TxnytX0gDEPoDarmVcVh7a15PTgWde8WmqL7Z6aPcux 6k7Z5FMwOt2IbI44viGt8hboTc9LoquvuEGfTJnyxDbzZ8bfULoibyOPIhEkV833fefl +w16VPTNxM9tK7SFpzoSU+I9SvLPpOW52DSLaSdOFMFmI93kEYiWCnt+ZWXfGdEjCyXt mZI2TjwQMj14xLAWdcHhnIjy65NLAmDnddnFEmG4JQWxzo5hThbV3bXnTclZzs/tfMj7 48/dQjHZzl3x5KHeEwiaD+edPpIdcvjF5AW2bE2zD9P1Z2/oteUUHxWGNINVSeqnYHn1 OywQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733344901; x=1733949701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P5UjxKCeqORqIFtQI/GncQ99E6vfBAFKQY2Y54aSOIM=; b=rZpcU9be3Ke9FCb7WSsAgixjwkZ/4XHSI5Yxnx4KUhNtyoWUcGpkFa7deeKQecQvNE q3EA1y1ADAznzr9DufrytAu4m4n2KI0ILRjCek8lQ8QyZf21Brtbn1YUj2LGRjJzrb+o ngUXSAMSY0Tg+eQsJbtdHVEYE6Wte3DX6fi/EnpdbKbqpeB9yKx1dT/WeYIVihDEl8hd 1f7ztqKjq7U/b8EFktjA4JfBKnRrf4YZbVvHsY8yfbcqjeeCHl95CuWiMiXeP84tUCQm o12b9TpUoyeLeaMsYln25qXxsQkZ6096HpFq6eySQhOeMnjkhjtSWYZcNp+EO+cOGtV4 5qpw== X-Gm-Message-State: AOJu0Yz80E3ortZ9upIbbIaKmOa9Vt2vAuON62TCTUFlzkjWfFcB2jnJ HKk2/zp/R/9pJStFrzRfeV4tfxeTsgO42C73HGqqu848hzSytt5PF66o9Up97N2r7uk6lANKwFu n X-Gm-Gg: ASbGncuTc4LsyjoSh0jo2V0WTkyD5Z3Xxzr7AWd9pr0v39LxZfHp6s6EC4pfL9woKYy 4HNSDWPFchhuHiP7vmoOVLiABcTUcFmJcJ4tGi7iU9EPhw2GaOOtXcTAkTkkdWbGLT7Vzg/2cBI eMdLuSH4SDvsQv8OgX5nRziGBXIOPM6/RHNm+pg/qLgfBIDcdzdA3iWKIzXVGyL/auJ5HFIq3ZN a++auq9+t1XulXcGf/Yu9cS0lHglW0p+1Dds20= X-Google-Smtp-Source: AGHT+IGRWEgzyTmMLBlaYh7xOZSZCsZWMCMTVpu9ZjRw/owwK1kmRUeEWxE4MeSKZ6s5JbYilgM2Aw== X-Received: by 2002:a17:902:ec8e:b0:215:7a1a:cb9b with SMTP id d9443c01a7336-215bd1cd7ebmr83075875ad.21.1733344900921; Wed, 04 Dec 2024 12:41:40 -0800 (PST) Received: from hexa.. ([98.142.47.158]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2155abd92ecsm80057415ad.200.2024.12.04.12.41.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Dec 2024 12:41:40 -0800 (PST) From: Steve Sakoman To: bitbake-devel@lists.openembedded.org Subject: [bitbake][styhead][2.10][PATCH 3/3] runqueue: Fix scenetask processing performance issue Date: Wed, 4 Dec 2024 12:41:27 -0800 Message-Id: <1452e74cc4ddfaadc6537a049877a66cec253c8d.1733344775.git.steve@sakoman.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Wed, 04 Dec 2024 20:41:47 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/16876 From: Richard Purdie Analysis shows that "bitbake core-image-ptest-all" spends a lot of time in scenequeue_updatecounters and much of it is rebuilding a set which doens't change. Reorder the code to avoid that performance glitch. Signed-off-by: Richard Purdie (cherry picked from commit 923c19b9713e398d8e66e6d4422dfd4c18a03486) Signed-off-by: Steve Sakoman --- lib/bb/runqueue.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py index b34e2d560..7f95140c4 100644 --- a/lib/bb/runqueue.py +++ b/lib/bb/runqueue.py @@ -2756,8 +2756,12 @@ class RunQueueExecute: logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep)) self.sq_task_failoutright(dep) continue + + # For performance, only compute allcovered once if needed + if self.sqdata.sq_deps[task]: + allcovered = self.scenequeue_covered | self.scenequeue_notcovered for dep in sorted(self.sqdata.sq_deps[task]): - if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered): + if self.sqdata.sq_revdeps[dep].issubset(allcovered): if dep not in self.sq_buildable: self.sq_buildable.add(dep)