From patchwork Tue Oct 6 00:05:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Simmons X-Patchwork-Id: 11817901 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 430DE6CB for ; Tue, 6 Oct 2020 00:07:00 +0000 (UTC) Received: from pdx1-mailman02.dreamhost.com (pdx1-mailman02.dreamhost.com [64.90.62.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 23DEE206F4 for ; Tue, 6 Oct 2020 00:07:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 23DEE206F4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lustre-devel-bounces@lists.lustre.org Received: from pdx1-mailman02.dreamhost.com (localhost [IPv6:::1]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id AE4372F5A8E; Mon, 5 Oct 2020 17:06:47 -0700 (PDT) X-Original-To: lustre-devel@lists.lustre.org Delivered-To: lustre-devel-lustre.org@pdx1-mailman02.dreamhost.com Received: from smtp4.ccs.ornl.gov (smtp4.ccs.ornl.gov [160.91.203.40]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 0248621FDBB for ; Mon, 5 Oct 2020 17:06:31 -0700 (PDT) Received: from star.ccs.ornl.gov (star.ccs.ornl.gov [160.91.202.134]) by smtp4.ccs.ornl.gov (Postfix) with ESMTP id 2246F10087D8; Mon, 5 Oct 2020 20:06:25 -0400 (EDT) Received: by star.ccs.ornl.gov (Postfix, from userid 2004) id 205872F0E5; Mon, 5 Oct 2020 20:06:25 -0400 (EDT) From: James Simmons To: Andreas Dilger , Oleg Drokin , NeilBrown Date: Mon, 5 Oct 2020 20:05:55 -0400 Message-Id: <1601942781-24950-17-git-send-email-jsimmons@infradead.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1601942781-24950-1-git-send-email-jsimmons@infradead.org> References: <1601942781-24950-1-git-send-email-jsimmons@infradead.org> Subject: [lustre-devel] [PATCH 16/42] lustre: llite: reuse same cl_dio_aio for one IO X-BeenThere: lustre-devel@lists.lustre.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "For discussing Lustre software development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Wang Shilong , Lustre Development List MIME-Version: 1.0 Errors-To: lustre-devel-bounces@lists.lustre.org Sender: "lustre-devel" From: Wang Shilong IO might be restarted if layout changed, this might cause ki_complete() called several times for one IO. Fixes: fde7ac1 ("lustre: clio: AIO support for direct IO") Fixes: 52f2fc5 ("lustre: llite: fix short io for AIO") WC-bug-id: https://jira.whamcloud.com/browse/LU-13835 Lustre-commit: db6f203965d91 ("LU-13835 llite: reuse same cl_dio_aio for one IO") Signed-off-by: Wang Shilong Reviewed-on: https://review.whamcloud.com/39542 Reviewed-by: Andreas Dilger Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin Signed-off-by: James Simmons --- fs/lustre/llite/file.c | 57 ++++++++++++++++++++++++++++---------------------- fs/lustre/llite/rw26.c | 5 +++++ 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/fs/lustre/llite/file.c b/fs/lustre/llite/file.c index d872cf3..251cca5 100644 --- a/fs/lustre/llite/file.c +++ b/fs/lustre/llite/file.c @@ -1563,13 +1563,26 @@ static void ll_heat_add(struct inode *inode, enum cl_io_type iot, unsigned int retried = 0; unsigned int ignore_lockless = 0; bool is_aio = false; + struct cl_dio_aio *ci_aio = NULL; CDEBUG(D_VFSTRACE, "file: %pD, type: %d ppos: %llu, count: %zu\n", file, iot, *ppos, count); + io = vvp_env_thread_io(env); + if (file->f_flags & O_DIRECT) { + if (!is_sync_kiocb(args->u.normal.via_iocb)) + is_aio = true; + ci_aio = cl_aio_alloc(args->u.normal.via_iocb); + if (!ci_aio) { + rc = -ENOMEM; + goto out; + } + } + restart: io = vvp_env_thread_io(env); ll_io_init(io, file, iot == CIT_WRITE, args); + io->ci_aio = ci_aio; io->ci_ignore_lockless = ignore_lockless; io->ci_ndelay_tried = retried; @@ -1585,15 +1598,6 @@ static void ll_heat_add(struct inode *inode, enum cl_io_type iot, vio->vui_fd = file->private_data; vio->vui_iter = args->u.normal.via_iter; vio->vui_iocb = args->u.normal.via_iocb; - if (file->f_flags & O_DIRECT) { - if (!is_sync_kiocb(vio->vui_iocb)) - is_aio = true; - io->ci_aio = cl_aio_alloc(vio->vui_iocb); - if (!io->ci_aio) { - rc = -ENOMEM; - goto out; - } - } /* * Direct IO reads must also take range lock, * or multiple reads will try to work on the same pages @@ -1632,29 +1636,18 @@ static void ll_heat_add(struct inode *inode, enum cl_io_type iot, * EIOCBQUEUED to the caller, So we could only return * number of bytes in non-AIO case. */ - if (io->ci_nob > 0 && !is_aio) { - result += io->ci_nob; + if (io->ci_nob > 0) { + if (!is_aio) { + result += io->ci_nob; + *ppos = io->u.ci_wr.wr.crw_pos; /* for splice */ + } count -= io->ci_nob; - *ppos = io->u.ci_wr.wr.crw_pos; /* prepare IO restart */ if (count > 0) args->u.normal.via_iter = vio->vui_iter; } out: - if (io->ci_aio) { - /** - * Drop one extra reference so that end_io() could be - * called for this IO context, we could call it after - * we make sure all AIO requests have been proceed. - */ - cl_sync_io_note(env, &io->ci_aio->cda_sync, - rc == -EIOCBQUEUED ? 0 : rc); - if (!is_aio) { - cl_aio_free(io->ci_aio); - io->ci_aio = NULL; - } - } cl_io_fini(env, io); CDEBUG(D_VFSTRACE, @@ -1675,6 +1668,20 @@ static void ll_heat_add(struct inode *inode, enum cl_io_type iot, goto restart; } + if (io->ci_aio) { + /** + * Drop one extra reference so that end_io() could be + * called for this IO context, we could call it after + * we make sure all AIO requests have been proceed. + */ + cl_sync_io_note(env, &io->ci_aio->cda_sync, + rc == -EIOCBQUEUED ? 0 : rc); + if (!is_aio) { + cl_aio_free(io->ci_aio); + io->ci_aio = NULL; + } + } + if (iot == CIT_READ) { if (result >= 0) ll_stats_ops_tally(ll_i2sbi(file_inode(file)), diff --git a/fs/lustre/llite/rw26.c b/fs/lustre/llite/rw26.c index 7010fe8..a4ae211 100644 --- a/fs/lustre/llite/rw26.c +++ b/fs/lustre/llite/rw26.c @@ -243,6 +243,11 @@ struct ll_dio_pages { int iot = rw == READ ? CRT_READ : CRT_WRITE; atomic_add(io_pages, &anchor->csi_sync_nr); + /* + * Avoid out-of-order execution of adding inflight + * modifications count and io submit. + */ + smp_mb(); rc = cl_io_submit_rw(env, io, iot, queue); if (rc == 0) { cl_page_list_splice(&queue->c2_qout,