From nobody Wed Aug 17 15:34:22 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4M7Brw3NY8z4ZkLF; Wed, 17 Aug 2022 15:34:24 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (glebi.us [162.251.186.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "cell.glebi.us", Issuer "cell.glebi.us" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4M7Brv4XPYz3bjD; Wed, 17 Aug 2022 15:34:23 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (localhost [127.0.0.1]) by cell.glebi.us (8.16.1/8.16.1) with ESMTPS id 27HFYMXW031323 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Wed, 17 Aug 2022 08:34:22 -0700 (PDT) (envelope-from glebius@freebsd.org) Received: (from glebius@localhost) by cell.glebi.us (8.16.1/8.16.1/Submit) id 27HFYM18031322; Wed, 17 Aug 2022 08:34:22 -0700 (PDT) (envelope-from glebius@freebsd.org) X-Authentication-Warning: cell.glebi.us: glebius set sender to glebius@freebsd.org using -f Date: Wed, 17 Aug 2022 08:34:22 -0700 From: Gleb Smirnoff To: Mateusz Guzik Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: 9ac6eda6c6a3 - main - pipe: try to skip locking the pipe if a non-blocking fd is used Message-ID: References: <202208171423.27HENpvp024623@gitrepo.freebsd.org> List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <202208171423.27HENpvp024623@gitrepo.freebsd.org> X-Rspamd-Queue-Id: 4M7Brv4XPYz3bjD X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=softfail (mx1.freebsd.org: 162.251.186.162 is neither permitted nor denied by domain of glebius@freebsd.org) smtp.mailfrom=glebius@freebsd.org X-Spamd-Result: default: False [-3.10 / 15.00]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; NEURAL_HAM_SHORT(-1.00)[-0.999]; MIME_GOOD(-0.10)[text/plain]; MLMMJ_DEST(0.00)[dev-commits-src-all@freebsd.org,dev-commits-src-main@freebsd.org]; RCVD_COUNT_THREE(0.00)[3]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; R_DKIM_NA(0.00)[]; ASN(0.00)[asn:27348, ipnet:162.251.186.0/24, country:US]; ARC_NA(0.00)[]; R_SPF_SOFTFAIL(0.00)[~all:c]; DMARC_NA(0.00)[freebsd.org]; FROM_HAS_DN(0.00)[]; FREEFALL_USER(0.00)[glebius]; RCVD_TLS_LAST(0.00)[]; RCPT_COUNT_THREE(0.00)[4]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_SOME(0.00)[]; HAS_XAW(0.00)[]; MID_RHS_MATCH_FROM(0.00)[] X-ThisMailContainsUnwantedMimeParts: N Mateusz, On Wed, Aug 17, 2022 at 02:23:51PM +0000, Mateusz Guzik wrote: M> + * Try to avoid locking the pipe if we have nothing to do. M> + * M> + * There are programs which share one pipe amongst multiple processes M> + * and perform non-blocking reads in parallel, even if the pipe is M> + * empty. This in particular is the case with BSD make, which when M> + * spawned with a high -j number can find itself with over half of the M> + * calls failing to find anything. M> + */ M> + if ((fp->f_flag & FNONBLOCK) != 0 && !mac_pipe_check_read_enabled()) { M> + if (__predict_false(uio->uio_resid == 0)) M> + return (0); M> + if ((atomic_load_short(&rpipe->pipe_state) & PIPE_EOF) != 0) M> + return (0); M> + if (atomic_load_int(&rpipe->pipe_buffer.cnt) == 0 && M> + atomic_load_int(&rpipe->pipe_pages.cnt) == 0) M> + return (EAGAIN); M> + } While this change definitely can optimize some programs it also can heavily pessimize others. An application can share pipes and actually expect that kernel will do proper serialization of writes by different threads. With this change, the threads that previously were sleeping on the pipe would enter a busy loop consisting write + kevent/poll syscalls. This also breaks API. Although not explicitly narrated by POSIX or our documentation, but there is a strong contract that, if application had received a non-blocking fd from event dispatcher (kevent, poll, select) as writable, then it is possible to write thre non-zero bytes with next syscall. This is a useful behavior, but by no means should be the default. It should be explicitly enabled by a new fcntl() and make(1) can do that. -- Gleb Smirnoff