Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3655334ybt; Tue, 23 Jun 2020 07:42:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzVoEKTY6KERm4b63+A4X9TBZA+yYRpAkzWtUI+XiHu1BIQ/pwEtLYaMa0FrbCF3TPjAi3F X-Received: by 2002:a17:906:1149:: with SMTP id i9mr21579281eja.100.1592923321669; Tue, 23 Jun 2020 07:42:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592923321; cv=none; d=google.com; s=arc-20160816; b=VZqO4FGLv7mRjLOYoqCU51VF+KkF4hN96L5YT9gvyV1ilJloxwpsXBq8aL53DPOCri beWmDC2i3T4HDvMhSJJRYZKMqJFw/vZysTvBslziMvd2G62o3XGkcEqysfhvBYoOHI1+ 5eRtZqhWskTJMesnXTEQSIaBJUNtFQEJNaZB/lHIqJ4SgN/BIqT6PLYM8z852glTzY1g sMTj2UzFuZ4xqYqRZlQJVInMb7AczSy0cuuAqMFOWlT8TOqO5wA+ibL9+meAz5up765Q gLi5WRTHUvwSg5l8Qe3NDMA9MvP+WZeWpMF4KbCu4ChZqDdfxzJM3GFO67RdK8+BH2cw zOnQ== 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:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=GO6VqQ1k5DfT8B3Hft14D4L5hj9uXyjCb94sDmddrkY=; b=ffTUJ3o/sTn2cJ9yiSqngXt74BAnOP2Lrht7afBav2bM6Lnb+5alqpV9Y+KzFSea3c yI9IQvgf+kie95pYAp5po9UfQgws+eWgZn5iTpewEHCldWdcCtriVwwOR1ZKcyIQ5sF1 CpGyLrlLoUhhwiohv+D9rNnNMZXOw3unRCwH8//VyY+pHYcb3tOTEmwEjqJxlb7DnHVB uMVv3whbROx3+ZNEx1W7ZbBWMkK8SZeB3pCJa3JJMZdlab/IZUCBcLB8WSSlC7qMpIf0 EmMO67E9fpqhrVOkAXGhzwty+58DMBU6zcALP4Psp/YLAb3zvNzSMfoerxQji9buMhgf lhiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=i8Xvf0dO; 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 gg13si10434855ejb.266.2020.06.23.07.41.37; Tue, 23 Jun 2020 07:42:01 -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=i8Xvf0dO; 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 S1732910AbgFWOif (ORCPT + 99 others); Tue, 23 Jun 2020 10:38:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732798AbgFWOif (ORCPT ); Tue, 23 Jun 2020 10:38:35 -0400 Received: from mail-io1-xd41.google.com (mail-io1-xd41.google.com [IPv6:2607:f8b0:4864:20::d41]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C683AC061755 for ; Tue, 23 Jun 2020 07:38:33 -0700 (PDT) Received: by mail-io1-xd41.google.com with SMTP id k23so1884362iom.10 for ; Tue, 23 Jun 2020 07:38:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=GO6VqQ1k5DfT8B3Hft14D4L5hj9uXyjCb94sDmddrkY=; b=i8Xvf0dO3HlBgVkDMm2UdFWATb6q5c49Gp1uR5t24gxH4xjYC+5ei4BkAqzDM2KSv/ 2gx/lezU+C8XyNWRfTI2XMPTKj6pxrB0XjEi8ZEynRWETcpvFmmMuGNdUvh/OrI+i/w5 vwWn6nfaeBN2WmpS8aNmJKRPO4tUJvKILSS4Hvp003kdC/j3G3kbQiCz9bHiXZCSdqLh wIuxpVhhkSZ4J9U47uB+OkiyAa7fBy0f0ZDAIFve5z+1F2Hhm0G1n/FAMOS6UM/N4x95 PT9eFcXR5AxlX0ghw/EevRefdUSRw1vMHUuPnw5mrl2JdpHHK03FgT984eqxkUrvctEj 1eGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=GO6VqQ1k5DfT8B3Hft14D4L5hj9uXyjCb94sDmddrkY=; b=qbuGoiD4KOD8MgmLQHXECsVWwUznwZg367PLBSUux/0t+5Rwvqfx8/1FLsu/PZDYgF 8P28CUlzPSO7XaIV36y0Jr65+6IMJnd8chGoE5HcCRgvTs68a0mPWHipbGnbSSFPR8H+ UkXPMKiYt7pCCScGIB3OH0JSAPvjAjyl/q/cTEtmez720aaFQNOIV37mrRKudufFW8GL GDleZIss8UFkWHvac7JFYcZ+/r/iS/TbD84Qkjv3OsJhAn5Euhepf0L90MY3yYt/0REM zvNsvCxe1HydUDeEnvNkxcjVE74VY8QCtyTaCndeUlF07kWBhbn+BlPf00s+svXrdZQf p0fA== X-Gm-Message-State: AOAM5300GG+jwtoyRPyPkirbtCUR3R2NUfNgzP0rlEXP83ZAa9HvEH5m GfFr8P33JaUBGkaC3OtFSv6mGw== X-Received: by 2002:a02:2417:: with SMTP id f23mr25134322jaa.28.1592923113020; Tue, 23 Jun 2020 07:38:33 -0700 (PDT) Received: from [192.168.1.56] ([65.144.74.34]) by smtp.gmail.com with ESMTPSA id a20sm6546352ila.5.2020.06.23.07.38.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 23 Jun 2020 07:38:31 -0700 (PDT) Subject: Re: [PATCH 15/15] io_uring: support true async buffered reads, if file provides it To: Pavel Begunkov , io-uring@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org References: <20200618144355.17324-1-axboe@kernel.dk> <20200618144355.17324-16-axboe@kernel.dk> <029947e3-7615-e446-3194-d48827730e1d@gmail.com> From: Jens Axboe Message-ID: <9c368ff8-b867-d40e-cd3b-6dacbecc0515@kernel.dk> Date: Tue, 23 Jun 2020 08:38:30 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <029947e3-7615-e446-3194-d48827730e1d@gmail.com> 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 On 6/23/20 6:39 AM, Pavel Begunkov wrote: > On 18/06/2020 17:43, Jens Axboe wrote: >> If the file is flagged with FMODE_BUF_RASYNC, then we don't have to punt >> the buffered read to an io-wq worker. Instead we can rely on page >> unlocking callbacks to support retry based async IO. This is a lot more >> efficient than doing async thread offload. >> >> The retry is done similarly to how we handle poll based retry. From >> the unlock callback, we simply queue the retry to a task_work based >> handler. >> >> Signed-off-by: Jens Axboe >> --- >> fs/io_uring.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++--- >> 1 file changed, 137 insertions(+), 8 deletions(-) >> > ... >> static int io_read(struct io_kiocb *req, bool force_nonblock) >> { >> struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; >> @@ -2784,10 +2907,7 @@ static int io_read(struct io_kiocb *req, bool force_nonblock) >> unsigned long nr_segs = iter.nr_segs; >> ssize_t ret2 = 0; >> >> - if (req->file->f_op->read_iter) >> - ret2 = call_read_iter(req->file, kiocb, &iter); >> - else >> - ret2 = loop_rw_iter(READ, req->file, kiocb, &iter); >> + ret2 = io_iter_do_read(req, &iter); >> >> /* Catch -EAGAIN return for forced non-blocking submission */ >> if (!force_nonblock || (ret2 != -EAGAIN && ret2 != -EIO)) { >> @@ -2799,17 +2919,26 @@ static int io_read(struct io_kiocb *req, bool force_nonblock) >> ret = io_setup_async_rw(req, io_size, iovec, >> inline_vecs, &iter); >> if (ret) >> - goto out_free; >> + goto out; >> /* any defer here is final, must blocking retry */ >> if (!(req->flags & REQ_F_NOWAIT) && >> !file_can_poll(req->file)) >> req->flags |= REQ_F_MUST_PUNT; >> + /* if we can retry, do so with the callbacks armed */ >> + if (io_rw_should_retry(req)) { >> + ret2 = io_iter_do_read(req, &iter); >> + if (ret2 == -EIOCBQUEUED) { >> + goto out; >> + } else if (ret2 != -EAGAIN) { >> + kiocb_done(kiocb, ret2); >> + goto out; >> + } >> + } >> + kiocb->ki_flags &= ~IOCB_WAITQ; >> return -EAGAIN; >> } >> } >> -out_free: >> - kfree(iovec); >> - req->flags &= ~REQ_F_NEED_CLEANUP; > > This looks fishy. For instance, if it fails early on rw_verify_area(), how would > it free yet on-stack iovec? Is it handled somehow? This was tweaked and rebased on top of the REQ_F_NEED_CLEANUP change, it should be correct in the tree: https://git.kernel.dk/cgit/linux-block/tree/fs/io_uring.c?h=for-5.9/io_uring#n2908 -- Jens Axboe