From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-251411-1516218501-2-9122967298825771168 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='de', MailFrom='org' X-Spam-charsets: X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: linux-api-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1516218501; b=vPHDWfuCEcIrbS2YCAuAUurhMWJthWufpkdvgZdqVbwMgjb DYHxOqJQV+NtHMucE8u4PHN46jH0LGZ7/SKCpZrhzCUQUaKIFQX8LE02S6deKzkY Hw+cyalLhP+3pm4dlrzNFPUMvRui1wLg/6Fu8UXACCebd5uGCAVfl3Z8DZiqdVSf BOdlH7+WJIqwzaINif3NGWExcO6zZC6oXKSjTKHZCNXfnU8MqqVxMIFkwg3DFBDE fVw+IyD8UmPBimCIn2Jcvc0luQtwYMX5JUXL9Bc1gwtRjduIrWCCVnyHS5fCewMJ NBpScmAH1YldUIlCADakKDDijzf69Cc5suTf/VA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=from:to:cc:subject:date:message-id :in-reply-to:references:sender:list-id; s=arctest; t=1516218501; bh=JI3lQLD9RCLBId7H5ebvhkobmYq503q5DDPBziOWE98=; b=e5zWzhsTRwqk WubAq6+/JJ6k+IKiwfKY2ji+P9jqU+fa6J7lI4BEPp1GDJxGCPyczQvSxX/JJb3i GLO3c1KAeqQiOuRBUuvsae2jpjclJ0M6sAVaBb1HJU3t50o9ayksymbMpqJfEFce TjyVXIujPuLL7RpnIv07L2SBkGQ/fmnGy7lUdbqgIXuuhoT+C8SuviY0uY0SglS9 3j2HCxEg43lUXEatJVH4gzixO5TVSIIexu5oB6WoE0Y0WKdui5guvUprP58HIbAh VuPbTLHAfcuJBfRoOHnI1mQ/a5338aXMqDe+Gj4fm8eNaNHRNVkBAj0EZfxH4g8d oH4NVz5swg== ARC-Authentication-Results: i=1; mx5.messagingengine.com; arc=none (no signatures found); dkim=fail (message has been altered; 2048-bit rsa key sha256) header.d=infradead.org header.i=@infradead.org header.b=fOhdr0JO x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=bombadil.20170209; dmarc=none (p=none,has-list-id=yes,d=none) header.from=lst.de; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-api-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=lst.de header.result=pass header_is_org_domain=yes Authentication-Results: mx5.messagingengine.com; arc=none (no signatures found); dkim=fail (message has been altered; 2048-bit rsa key sha256) header.d=infradead.org header.i=@infradead.org header.b=fOhdr0JO x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=bombadil.20170209; dmarc=none (p=none,has-list-id=yes,d=none) header.from=lst.de; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-api-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=lst.de header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752667AbeAQTr7 (ORCPT ); Wed, 17 Jan 2018 14:47:59 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:57901 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750861AbeAQTr4 (ORCPT ); Wed, 17 Jan 2018 14:47:56 -0500 From: Christoph Hellwig To: viro@zeniv.linux.org.uk Cc: Avi Kivity , linux-aio@kvack.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] aio: resurrect IOCB_CMD_FSYNC and IOCB_CMD_FDSYNC support Date: Wed, 17 Jan 2018 20:47:47 +0100 Message-Id: <20180117194747.1631-2-hch@lst.de> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180117194747.1631-1-hch@lst.de> References: <20180117194747.1631-1-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-api-owner@vger.kernel.org X-Mailing-List: linux-api@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: These and the ->aio_fsync method had been merged together with the initial aio support, but no ->aio_fsync method had ever been implemented in mainline, so it got removed a while ago. This patch wires up the iocb commands to a simple workqueue based offload that already shows great performance. In the future an aio_fsync method could be added if we grow more elaborate implementations, but for now an 6 to 8 fold improvement in the fsync rate in fs_mark should be good enough to go with this simple version. Note that this does not wire up the offset and length fields and thus does not provide a ranged fsync. The reasons for that are that in all current file system ranges only matter for writing back page cache, which doesn't mix with AIO anyway (as AIO only does direct I/O), and also because these fields would bloat the aio_kiocb over the size of the normal read/write and poll iocbs, which is worth it given the condition above. But the offset and length fields are checked for being zero, so such a support could be added later if needed. Based on an earlier patch from Dave Chinner. Signed-off-by: Christoph Hellwig --- fs/aio.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/fs/aio.c b/fs/aio.c index 0cddd24e7316..e1df7e8408ea 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -164,10 +164,17 @@ struct poll_iocb { struct wait_queue_entry wait; }; +struct fsync_iocb { + struct work_struct work; + struct file *file; + bool datasync; +}; + struct aio_kiocb { union { struct kiocb rw; struct poll_iocb poll; + struct fsync_iocb fsync; }; struct kioctx *ki_ctx; @@ -1660,6 +1667,61 @@ static ssize_t aio_poll(struct aio_kiocb *aiocb, struct iocb *iocb) return -EIOCBQUEUED; } +static void aio_fsync_work(struct work_struct *work) +{ + struct fsync_iocb *req = container_of(work, struct fsync_iocb, work); + int ret; + + ret = vfs_fsync(req->file, req->datasync); + fput(req->file); + aio_complete(container_of(req, struct aio_kiocb, fsync), ret, 0); +} + +static int generic_aio_fsync(struct fsync_iocb *req) +{ + struct super_block *sb = file_inode(req->file)->i_sb; + + if (unlikely(!sb->s_dio_done_wq)) { + int ret = sb_init_dio_done_wq(sb); + if (ret) + return ret; + } + + /* + * Use the direct I/O completion workqueue, as that is used to queue + * fsyncs for O_(D)SYNC writes already. + */ + INIT_WORK(&req->work, aio_fsync_work); + queue_work(sb->s_dio_done_wq, &req->work); + return -EIOCBQUEUED; +} + +static int aio_fsync(struct fsync_iocb *req, struct iocb *iocb, bool datasync) +{ + int ret; + + if (iocb->aio_buf) + return -EINVAL; + if (iocb->aio_offset || iocb->aio_nbytes || iocb->aio_rw_flags) + return -EINVAL; + + req->file = fget(iocb->aio_fildes); + if (unlikely(!req->file)) + return -EBADF; + + ret = -EINVAL; + if (!req->file->f_op->fsync) + goto out_fput; + + req->datasync = datasync; + + ret = generic_aio_fsync(req); +out_fput: + if (unlikely(ret && ret != -EIOCBQUEUED)) + fput(req->file); + return ret; +} + static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, struct iocb *iocb, bool compat) { @@ -1723,6 +1785,12 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, case IOCB_CMD_PWRITEV: ret = aio_write(&req->rw, iocb, true, compat); break; + case IOCB_CMD_FSYNC: + ret = aio_fsync(&req->fsync, iocb, false); + break; + case IOCB_CMD_FDSYNC: + ret = aio_fsync(&req->fsync, iocb, true); + break; case IOCB_CMD_POLL: ret = aio_poll(req, iocb); break; -- 2.14.2