From nobody Sat Sep 26 10:02:05 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82B944A841B for ; Wed, 2 Sep 2026 15:31:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363104; cv=none; b=H9MlJ42N4s1TlgLOnxSDtTC1Ii/PImNhg/7JnplwGqPIXvGAjbNZ0rtl5nl99W6MfC4vcbB78gigNnk8sy0YrZ+z+mKRz/+4bYIrqz3f+Un5jaBFYFwKxKbOWX2lzpAiGce5EShR51YIOvLU2ytkytmw27EAH+pbvIMHEX92zbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363104; c=relaxed/simple; bh=BvFDCPax3yeDj9GiUo0hGRFjTWmgklSVoOfXHi3Mr9c=; h=Date:Mime-Version:Message-ID:Subject:From:To:Content-Type; b=J1qagkI9w3wvKoxFlNONg2V6C+tV7um9QodSRiTug1CHjF+XbNRt+dDdcBUx3UkcKAkGxL6qLF3XQGLEF14FFDZ+dar80aIAXN3z0kJZ79pFodkyOD07w0+PAbkISIdInTtWWXbx72Yo52jewBCe+le9WzSUXDJsn4aRVZMeGPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=d3Lz0hGY; arc=none smtp.client-ip=209.85.215.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="d3Lz0hGY" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cc1c62f0d60so1739043a12.1 for ; Wed, 02 Sep 2026 08:31:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1788363102; x=1788967902; darn=vger.kernel.org; h=content-type:to:from:subject:message-id:mime-version:date:from:to :cc:subject:date:message-id:reply-to:content-type; bh=JGry/fluIf0l8o3OiASIK8R7KuvirdME0/bitGdxAiw=; b=d3Lz0hGYEgAVZsJpBGrou01W5H8/F3XW7T3UhZI4BBJtH88HMmLZXqXy9eRSs/+Xkr 3544sczWHysGWUOf6SR/DEyOjtfCw3bFIBBA6YLSaxzsZMp1X5RhyE5HYJFgbMQaE07/ Og9a1NIxiAbDLQjQF4yTwHSagh+h94bqqHBsNbt1mgFSubnaNGN1qxTFc5h3WQfyTxZc b5uSm+B9yEStdu93M0eT/mXKnNG9ZpCAR9IAjToXLsLpohIAjyFHy+5zba/JNi7+qRiB wniRJSgI1nF3u8FX6OaD3X8AB1uGu1RF1H27gM+y3urlKf0zd3m0QYoGVEzmLjmE8nvV jkvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788363102; x=1788967902; h=content-type:to:from:subject:message-id:mime-version:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=JGry/fluIf0l8o3OiASIK8R7KuvirdME0/bitGdxAiw=; b=Rm56N6VqpNTRTwBuCTznIc9pGIS0P/XlhKcpC67FLPHgJL+3hzAjUkDf2NI1CuKm8e rlKd80pdx1sOcXPgS6RbaaVLOQsrr2nb/szj4XJDtPZQkSk1dOrveVad2Uhg5GdOfzlx tlczjMgs55HLKx0bvV9Mfa8G4C7DVTOTmFz+tXcx0G0U/GF1crlyOSKUayAT0y8SqKpC HJAoF3tMTa6R7x8KyDPjaGpB8VQPgMG7NnXA8wQkngr7Z1btzkNeZVF8pvEAbgzbBg8M IvxleQg1D2JpBT4SI0PZyTyGGVWx0DBvKKugkRZFfFr0Hq7Vp7dQiE+xToh4wfh0jnfv oJaA== X-Forwarded-Encrypted: i=1; AKwUvBzwYkHtwM0XcDqFO/vTWtuuz0dya8FFquUAPZLWYUPegDojLUQr19v0dHHpWH/cJr1rImdXe/m6Bp/Z+Ro=@vger.kernel.org X-Gm-Message-State: AFuF++lSGyC1PBgnU4peEgg8/vKfLtNJWVbNXO8aXFzOHzGNSahzST7S wO31PkZwNpgKx9Lab8PmsqzwWh4oUdMduQ7FKgZopEFkhqFoTmTDTwTo0rhy8qdcEB+ihVkHPGd e6pcblE8fkg== X-Received: from dlbec23.prod.google.com ([2002:a05:7022:d97:b0:141:4abc:f12d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:3a83:b0:3d3:adad:f178 with SMTP id adf61e73a8af0-3d9afd02e3emr7984151637.26.1788363101368; Wed, 02 Sep 2026 08:31:41 -0700 (PDT) Date: Wed, 2 Sep 2026 08:31:35 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.55.0.966.g6673acef38-goog Message-ID: <20260902153135.2067365-1-irogers@google.com> Subject: [PATCH v1] perf tests: Improvements to build-test performance From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , Leo Yan , Michael Jeanson , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Replace hardcoded 'make' calls with '$(MAKE)' within tests/make to ensure GNU Make jobserver file descriptors are properly inherited by nested builds. Additionally, remove the notorious 'unexport MAKEFLAGS' from tools/perf/Makefile. This hack was originally added to prevent the wrapper's internal '-j$(JOBS)' override from crashing when parent jobse= rver tokens were present. Instead, use proper GNU Make conditionals to check for '-j' or 'jobserver' strings within MAKEFLAGS. If a jobserver is already orchestrating the build, gracefully back off and let GNU Make manage parallelism natively. Finally, optimize the 'out' target (which processes 'run_O' out-of-tree bui= lds) by stripping sequential bottlenecks like $(call clean) from isolated tmp di= rectories, and wrapping the target list in a parallel sub-make call. These combined changes enable 'build-test' out-of-tree targets to build completely concurrently without severing jobserver tokens. Unscientifically measured the change lowered the build-test from around 15 minutes to 10 minutes on a 28 threaded Alderlake CPU. Fixing the jobserver issues meant the machine remained somewhat usable while running the test. Signed-off-by: Ian Rogers Assisted-by: Antigravity:gemini-3.1-pro --- tools/perf/Makefile | 28 +++++++++++++++++----------- tools/perf/tests/make | 14 +++++++------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 5b713837eede..45f641e24fb4 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -14,23 +14,29 @@ .SUFFIXES: =20 # -# We don't want to pass along options like -j: +# If no parallel build was requested, do a parallel build with multiple jo= bs, +# based on the number of CPUs online in this system: 'make -j8' on an 8-CPU +# system, etc. # -unexport MAKEFLAGS - -# -# Do a parallel build with multiple jobs, based on the number of CPUs onli= ne -# in this system: 'make -j8' on a 8-CPU system, etc. +# If MAKEFLAGS contains '-j' or 'jobserver', JOBS is intentionally left +# uninitialized so the native GNU Make jobserver can seamlessly control the +# parallel bounds of the build. # # (To override it, run 'make JOBS=3D1' and similar.) # -ifeq ($(JOBS),) - JOBS :=3D $(shell (getconf _NPROCESSORS_ONLN || grep -E -c '^processor|^= CPU[0-9]' /proc/cpuinfo) 2>/dev/null) - ifeq ($(JOBS),0) - JOBS :=3D 1 +ifeq ($(findstring -j,$(MAKEFLAGS)),) + ifeq ($(findstring jobserver,$(MAKEFLAGS)),) + ifeq ($(JOBS),) + JOBS :=3D $(shell (getconf _NPROCESSORS_ONLN || grep -E -c '^process= or|^CPU[0-9]' /proc/cpuinfo) 2>/dev/null) + ifeq ($(JOBS),0) + JOBS :=3D 1 + endif + endif + PARALLEL_OPT :=3D -j$(JOBS) endif endif =20 + # # Only pass canonical directory names as the output directory: # @@ -62,7 +68,7 @@ define print_msg endef =20 define make - @$(MAKE) -f Makefile.perf --no-print-directory -j$(JOBS) O=3D$(FULL_O) $= (SET_DEBUG) $@ + @$(MAKE) -f Makefile.perf --no-print-directory $(PARALLEL_OPT) O=3D$(FUL= L_O) $(SET_DEBUG) $@ endef =20 # diff --git a/tools/perf/tests/make b/tools/perf/tests/make index d2c2f526e1db..4f14c6b72416 100644 --- a/tools/perf/tests/make +++ b/tools/perf/tests/make @@ -339,7 +339,6 @@ make_static: rm -rf $@ $$TMP_DEST || (cat $@ ; false) =20 $(run_O): - $(call clean) @TMP_O=3D$$(mktemp -d); \ TMP_DEST=3D$$(mktemp -d); \ cmd=3D"cd $(PERF) && $(MAKE_F) $($(patsubst %_O,%,$@)) $(PARALLEL_OPT) O= =3D$$TMP_O DESTDIR=3D$$TMP_DEST"; \ @@ -363,18 +362,18 @@ endif make_kernelsrc: @echo "- make -C $(PARALLEL_OPT) $(K_O_OPT) tools/perf" $(call clean); \ - (make -C ../.. $(PARALLEL_OPT) $(K_O_OPT) tools/perf) > $@ 2>&1 && \ + ($(MAKE) -C ../.. $(PARALLEL_OPT) $(K_O_OPT) tools/perf) > $@ 2>&1 && \ test -x $(KERNEL_O)/tools/perf/perf && rm -f $@ || (cat $@ ; false) =20 make_kernelsrc_tools: @echo "- make -C /tools $(PARALLEL_OPT) $(K_O_OPT) perf" $(call clean); \ - (make -C ../../tools $(PARALLEL_OPT) $(K_O_OPT) perf) > $@ 2>&1 && \ + ($(MAKE) -C ../../tools $(PARALLEL_OPT) $(K_O_OPT) perf) > $@ 2>&1 && \ test -x $(KERNEL_O)/tools/perf/perf && rm -f $@ || (cat $@ ; false) =20 make_libperf: @echo "- make -C lib"; - make -C lib clean >$@ 2>&1; make -C lib >>$@ 2>&1 && rm $@ + $(MAKE) -C lib clean >$@ 2>&1; $(MAKE) -C lib >>$@ 2>&1 && rm $@ =20 FEATURES_DUMP_FILE :=3D $(FULL_O)/BUILD_TEST_FEATURE_DUMP FEATURES_DUMP_FILE_STATIC :=3D $(FULL_O)/BUILD_TEST_FEATURE_DUMP_STATIC @@ -383,20 +382,21 @@ all: $(run) $(run_O) tarpkg make_kernelsrc make_kerne= lsrc_tools @echo OK @rm -f $(FEATURES_DUMP_FILE) $(FEATURES_DUMP_FILE_STATIC) =20 -out: $(run_O) +out: $(FEATURES_DUMP_FILE) $(FEATURES_DUMP_FILE_STATIC) + @$(MAKE) -f tests/make $(run_O) PARALLEL_OPT=3D -j$(cores) @echo OK @rm -f $(FEATURES_DUMP_FILE) $(FEATURES_DUMP_FILE_STATIC) =20 ifeq ($(REUSE_FEATURES_DUMP),1) $(FEATURES_DUMP_FILE): $(call clean) - @cmd=3D"cd $(PERF) && make FEATURE_DUMP_COPY=3D$@ $(O_OPT) feature-dump";= \ + @cmd=3D"cd $(PERF) && $(MAKE) FEATURE_DUMP_COPY=3D$@ $(O_OPT) feature-dum= p"; \ echo "- $@: $$cmd" && echo $$cmd && \ ( eval $$cmd ) > /dev/null 2>&1 =20 $(FEATURES_DUMP_FILE_STATIC): $(call clean) - @cmd=3D"cd $(PERF) && make FEATURE_DUMP_COPY=3D$@ $(O_OPT) LDFLAGS=3D'-st= atic' feature-dump"; \ + @cmd=3D"cd $(PERF) && $(MAKE) FEATURE_DUMP_COPY=3D$@ $(O_OPT) LDFLAGS=3D'= -static' feature-dump"; \ echo "- $@: $$cmd" && echo $$cmd && \ ( eval $$cmd ) > /dev/null 2>&1 =20 --=20 2.55.0.966.g6673acef38-goog