Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3284468pxk; Mon, 7 Sep 2020 08:27:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyJgtN+P7hE5GxUYkLd9wqb7Ppl4EMMrMTl/l4I+uUdAhA0SMNfLaCSlL2+pzUYp64RsBv7 X-Received: by 2002:a17:906:158a:: with SMTP id k10mr21133201ejd.174.1599492477277; Mon, 07 Sep 2020 08:27:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599492477; cv=none; d=google.com; s=arc-20160816; b=rgPiA0nBHJRL6AuOnMFrcBf/ODnNWYk3cUJUMgdBsPOuwrvEOEAm4y24OTm7p11tOb iuZxodc9kdaNxNXSpEHCw8qrGZOPHHmn0aoeCCzEkvk/YkejbByiS5mCQPgejyCQee0H ba2uyldgtEq9qlIlioINa9OF+EGz8bqBjdpDKlZ5kBBbjmyOBPBGH72MO6YTNYoEnsGk WoKm9tBN/WOS7S66G9rp+W8NRBOVaBD9qMn1CHhqgGHRonc+eUteahqp3ETPRVLntFVk KtXE1R8DfgzbaFu7b6/mIq1Im2AnUnZeyI7Dsl0HfpR0xqBxwsipqWvh3XetXiclcRm+ HS6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:mime-version:user-agent:date:message-id:subject :from:cc:to:dkim-signature; bh=dDm50BpVZuQLGYSLkY4kWAnKOu+NYX3j/JL82/yvZsw=; b=HRKbcO8fWghw983eENX9AhXkG9cimpvOOvTgPKXIO6Zqdf45De7PJnUrt9RdNBhmT3 TVB+B9KVdFkaHJFkFzKlNadAL8J175YwR3APfRGtiMpDQp4Zfs8HyHegsOyEAfmtqbvv fJCem3PfygS9cnCvFhOEbAr1PyAF5rb90Sy/27Kxwv0OPuotWlus/eqwPFf027XpdfG8 WUVl3O5qHuhECjEE3yLYd8LTYNeUNOQ2JJRXkfNqTODu9L6+ayBQCbr07gRMLxJT5V3x /hvCE+OAvrEUG57TgTMgllQxolxYV/5Ce4EK86SN2dmjusQ7T7dlAMmTnoX7L0ZRb8V5 KW8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=RJ5s9Maq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y2si6424940ejc.669.2020.09.07.08.27.34; Mon, 07 Sep 2020 08:27:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=RJ5s9Maq; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730131AbgIGP0c (ORCPT + 99 others); Mon, 7 Sep 2020 11:26:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730072AbgIGPVT (ORCPT ); Mon, 7 Sep 2020 11:21:19 -0400 Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC66AC061574 for ; Mon, 7 Sep 2020 08:21:06 -0700 (PDT) Received: by mail-pj1-x1044.google.com with SMTP id q4so696970pjh.5 for ; Mon, 07 Sep 2020 08:21:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=to:cc:from:subject:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=dDm50BpVZuQLGYSLkY4kWAnKOu+NYX3j/JL82/yvZsw=; b=RJ5s9MaqhEHO5V2IfABHfKScBVvIYJl1uOESsM7TA208JtB/i5pnrUk2euFVdZxGtL SCLkhk/eIrtAkx1cLJKi22+NOfrmPt8QkuNR46/J1HRaTDtu9vJfUADlOkWbjk++iTYE bSkFWGf+ueXnY2ceeXi2ZlMTUPg4CCwa+AoxfIqrtJv7WGlvtpdjBdUxsiVe4N94hREX Jf+nv+PpTodpJOgDl6Y593FKFbDcoNzI15eNc2927OzNd0UzoaHGxt1n44c6sbh4zpg9 6BSJ5eKGkCwCFAbSPTM4gECqlw7yqcIm53BmXklX/vWRaWdjxmxLGv1jRvE213dVfdOn BVKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=dDm50BpVZuQLGYSLkY4kWAnKOu+NYX3j/JL82/yvZsw=; b=f3v/gW11o8t7t/wiu08Dfl3ksANUsqpzLuWRd9peS8X8HOT1SnYdPFgiXe5bIUh3UY ctuVGNPT9WQMH8bvqBM0e30baICZ+LLDz9Z5q0ysN59WyvDUxEA+NC2W/snJGDOtnsEr AKWw3BLupWxrHn35YMnqD+j8V1+PD/C/UVFuCO/e1tq0boeUI29rJgfGIDd1q+5PvpXG FsbSygjZw0A84OZW3VvO3/hcoD6U7+a/HEph/Uf3cStnQGihKXg3mLsjWQ+hvT87ObeM 6nBv1W72+A4pkMnar3qoIsxCvivvBxI2zkT7hszjVzhVOLPrZ2pVS9cwV8EnLhoo/g0n E5/A== X-Gm-Message-State: AOAM533RpmnUkG7bhn4THTJpqMWz+PXRyrqQRCwbPigGBQO7J62ncFam 8Cy9ixiMP4l4JDr4FDdlyuTNBLQ2EJ+E4q/T X-Received: by 2002:a17:90a:de17:: with SMTP id m23mr21430575pjv.51.1599492065082; Mon, 07 Sep 2020 08:21:05 -0700 (PDT) Received: from [192.168.1.182] ([66.219.217.173]) by smtp.gmail.com with ESMTPSA id f9sm2399964pjq.26.2020.09.07.08.21.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 07 Sep 2020 08:21:04 -0700 (PDT) To: Alexander Viro Cc: linux-fsdevel , "linux-kernel@vger.kernel.org" From: Jens Axboe Subject: [PATCH] pipe: honor IOCB_NOWAIT Message-ID: Date: Mon, 7 Sep 2020 09:21:02 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Pipe only looks at O_NONBLOCK for non-blocking operation, which means that io_uring can't easily poll for it or attempt non-blocking issues. Check for IOCB_NOWAIT in locking the pipe for reads and writes, and ditto when we decide on whether or not to block or return -EAGAIN. Signed-off-by: Jens Axboe --- If this is acceptable, then I can add S_ISFIFO to the whitelist on file descriptors we can IOCB_NOWAIT try for, then poll if we get -EAGAIN instead of using thread offload. diff --git a/fs/pipe.c b/fs/pipe.c index 60dbee457143..3cee28e35985 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -82,6 +82,13 @@ void pipe_unlock(struct pipe_inode_info *pipe) } EXPORT_SYMBOL(pipe_unlock); +static inline bool __pipe_lock_nonblock(struct pipe_inode_info *pipe) +{ + if (mutex_trylock(&pipe->mutex)) + return true; + return false; +} + static inline void __pipe_lock(struct pipe_inode_info *pipe) { mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT); @@ -244,7 +251,12 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) return 0; ret = 0; - __pipe_lock(pipe); + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!__pipe_lock_nonblock(pipe)) + return -EAGAIN; + } else { + __pipe_lock(pipe); + } /* * We only wake up writers if the pipe was full when we started @@ -344,7 +356,8 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) break; if (ret) break; - if (filp->f_flags & O_NONBLOCK) { + if ((filp->f_flags & O_NONBLOCK) || + (iocb->ki_flags & IOCB_NOWAIT)) { ret = -EAGAIN; break; } @@ -432,7 +445,12 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) if (unlikely(total_len == 0)) return 0; - __pipe_lock(pipe); + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!__pipe_lock_nonblock(pipe)) + return -EAGAIN; + } else { + __pipe_lock(pipe); + } if (!pipe->readers) { send_sig(SIGPIPE, current, 0); @@ -554,7 +572,8 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) continue; /* Wait for buffer space to become available. */ - if (filp->f_flags & O_NONBLOCK) { + if ((filp->f_flags & O_NONBLOCK) || + (iocb->ki_flags & IOCB_NOWAIT)) { if (!ret) ret = -EAGAIN; break; -- Jens Axboe