Received: by 2002:a25:b323:0:0:0:0:0 with SMTP id l35csp339858ybj; Thu, 19 Sep 2019 15:21:59 -0700 (PDT) X-Google-Smtp-Source: APXvYqwMFtDnYF+Q2A44lKA8nyMW244OaefPqKtkCY7Ewcm0xj9wE+O62U22wgLOWL2vNiYuVoF/ X-Received: by 2002:aa7:c749:: with SMTP id c9mr18780802eds.232.1568931718915; Thu, 19 Sep 2019 15:21:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568931718; cv=none; d=google.com; s=arc-20160816; b=nAJ6dXxpNvxGuoyjzP7bADuQirEBc80rSIm22iMiE1ZYo1kGZRUHL6oDJXAjdnYJhC jWMX4SNFYDDscepI1h+W3QZj9u7d50EYtOK1c8RQXwMK38gugwM2y0PEEeOpo1mkE8Jh urBaR0krBOAPzq9Fma3BnacfscRvN0nod93Hlxid2PbBXWZ8Q6Sstq1z0NWNtTRg0E2K 5UYmC/K2P67CSBRn1Zn/wFamcdyO/ABDWZLF3o3cHXJkYrRZpt96fuqUGcHcDBxpr4Xm e4iWHFVsdaYloLXDrY/RfmwpvZd6gMmTa/oP8cOwY8ha0zzcPaUnpdmZn1JXFIbN+N/T Pp1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition:mime-version :message-id:subject:cc:to:from:date:dkim-signature; bh=lwqOPnc+Hjspz39B1KdPwekwTjVU9dAcHcFGUbS/esU=; b=aTHKia0GyRaEQ40klcSNs8oqoajUdbBhMR2p0iL+wWs1CGX9YaDKlLODTMRuaVnPD3 k3bpGokoXt+O1JYudq/W+tLqDqLpIXpSMvgbeF7poq1JapiToCV5j4NeMfPFce3WW+eR wl395XZdJ0RyFtYBg7AiJdkNNt7Loj52X5mTzh5AKYWRPqI7znXYGUB3R4U8iyV/a+Bb 6WEav4syDDjdtJJGypshLiG7Zei691KPcVbbrj3Uk4RItf9/bOfCaWQsJa7eVDczmzGn bYrZsMoDpvwmCzDcEHc1AGbe0eO6LeVgssUKuoBzuO6Fn5cgit/ZzKxDQfyF8ScQrms/ eZLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=HlZ1OQE3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y2si5166551ejo.82.2019.09.19.15.21.35; Thu, 19 Sep 2019 15:21:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=HlZ1OQE3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2393088AbfISVom (ORCPT + 99 others); Thu, 19 Sep 2019 17:44:42 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:34745 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2393049AbfISVol (ORCPT ); Thu, 19 Sep 2019 17:44:41 -0400 Received: by mail-pl1-f195.google.com with SMTP id d3so2224987plr.1 for ; Thu, 19 Sep 2019 14:44:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:mime-version:content-disposition; bh=lwqOPnc+Hjspz39B1KdPwekwTjVU9dAcHcFGUbS/esU=; b=HlZ1OQE3iymgQ80SUY3b+Fuk//VK9KTazuInlcYoRmR20coGXrKV9oRmqxpUkyja9S uC87fqyMVhaBi37taW9UIp5BTh/OgTP/dfs3vTzL7NbY6rF2IZdUXiRGrjNHNSCwQ2n8 GTJkvUfDHt2fpxT02DnGs4LARmG4fhNSwsnPY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition; bh=lwqOPnc+Hjspz39B1KdPwekwTjVU9dAcHcFGUbS/esU=; b=WVtBeK+2lqCDeYC54U+O9Kdmc/WrvhOwAp4QqKJWQYYSkZ+3nQdzYTal8g9zOoItH/ r4Uqoohy1yhRrywWJ5Xb7JyBu6lexwIPjr4XuJx3mUnKWO2NnwvrZEw2aFrhO8KWLBjC P/HdXCv0IsdkOPHhP9BLP8ciV9xXUdEj6Tg5Zg69suMn6y8wwHNjjx8SzHbmbKSA8x5x MN4maigFCaXoOYjnf7pJFQ65nvb3FqLb3jQr1Vw+Zl5I6tY0mNGCKgSARbzlLokELwgp OulmTWJgTu8Uc+c9INWUnRmtpvitfi6pY4SH1yICG6F/36nQrjX6SkKX9vxe4cXKkiQT mZOg== X-Gm-Message-State: APjAAAXXeeFFaFYwf5mlmSLKKTW6Eq3TWaOk3+Mm5z8U9oazl9izwLEc yBOa9sRX3XbFpY/FxjPwqaoeiQ== X-Received: by 2002:a17:902:7895:: with SMTP id q21mr11565977pll.94.1568929479404; Thu, 19 Sep 2019 14:44:39 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id b185sm11082438pfg.14.2019.09.19.14.44.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Sep 2019 14:44:38 -0700 (PDT) Date: Thu, 19 Sep 2019 14:44:37 -0700 From: Kees Cook To: Jonathan Corbet Cc: Mauro Carvalho Chehab , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] docs: Use make invocation's -j argument for parallelism Message-ID: <201909191438.C00E6DB@keescook> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org While sphinx 1.7 and later supports "-jauto" for parallelism, this effectively ignores the "-j" flag used in the "make" invocation, which may cause confusion for build systems. Instead, extract the available parallelism from "make"'s job server (since it is not exposed in any special variables) and use that for the "sphinx-build" run. Now things work correctly for builds where -j is specified at the top-level: make -j16 htmldocs If -j is not specified, continue to fallback to "-jauto" if available. Signed-off-by: Kees Cook --- v2: retain "-jauto" default behavior with top-level -j is missing. --- Documentation/Makefile | 3 ++- scripts/jobserver-count | 53 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100755 scripts/jobserver-count diff --git a/Documentation/Makefile b/Documentation/Makefile index e145e4db508b..8bfd38a865ff 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -33,7 +33,7 @@ ifeq ($(HAVE_SPHINX),0) else # HAVE_SPHINX -export SPHINXOPTS = $(shell perl -e 'open IN,"sphinx-build --version 2>&1 |"; while () { if (m/([\d\.]+)/) { print "-jauto" if ($$1 >= "1.7") } ;} close IN') +export SPHINX_PARALLEL = $(shell perl -e 'open IN,"sphinx-build --version 2>&1 |"; while () { if (m/([\d\.]+)/) { print "auto" if ($$1 >= "1.7") } ;} close IN') # User-friendly check for pdflatex and latexmk HAVE_PDFLATEX := $(shell if which $(PDFLATEX) >/dev/null 2>&1; then echo 1; else echo 0; fi) @@ -68,6 +68,7 @@ quiet_cmd_sphinx = SPHINX $@ --> file://$(abspath $(BUILDDIR)/$3/$4) PYTHONDONTWRITEBYTECODE=1 \ BUILDDIR=$(abspath $(BUILDDIR)) SPHINX_CONF=$(abspath $(srctree)/$(src)/$5/$(SPHINX_CONF)) \ $(SPHINXBUILD) \ + -j $(shell python3 $(srctree)/scripts/jobserver-count $(SPHINX_PARALLEL)) \ -b $2 \ -c $(abspath $(srctree)/$(src)) \ -d $(abspath $(BUILDDIR)/.doctrees/$3) \ diff --git a/scripts/jobserver-count b/scripts/jobserver-count new file mode 100755 index 000000000000..ff6ebe6b0194 --- /dev/null +++ b/scripts/jobserver-count @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later +# +# This determines how many parallel tasks "make" is expecting, as it is +# not exposed via an special variables. +# https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html#POSIX-Jobserver +import os, sys, fcntl + +# Default parallelism is "1" unless overridden on the command-line. +default="1" +if len(sys.argv) > 1: + default=sys.argv[1] + +# Set non-blocking for a given file descriptor. +def nonblock(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) + return fd + +# Extract and prepare jobserver file descriptors from envirnoment. +try: + # Fetch the make environment options. + flags = os.environ['MAKEFLAGS'] + + # Look for "--jobserver=R,W" + opts = [x for x in flags.split(" ") if x.startswith("--jobserver")] + + # Parse out R,W file descriptor numbers and set them nonblocking. + fds = opts[0].split("=", 1)[1] + reader, writer = [nonblock(int(x)) for x in fds.split(",", 1)] +except: + # Any failures here should result in just using the default + # specified parallelism. + print(default) + sys.exit(0) + +# Read out as many jobserver slots as possible. +jobs = b"" +while True: + try: + slot = os.read(reader, 1) + jobs += slot + except: + break +# Return all the reserved slots. +os.write(writer, jobs) + +# If the jobserver was (impossibly) full or communication failed, use default. +if len(jobs) < 1: + print(default) + +# Report available slots (with a bump for our caller's reserveration). +print(len(jobs) + 1) -- 2.17.1 -- Kees Cook