Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3073121ybt; Mon, 29 Jun 2020 14:35:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQB/uRtK9iN/IlH8yLbHYbiX4xlP9Hbyrcd1SAjlh28SjWWPLqu1n4Az+FXOnXUGZ4RaNU X-Received: by 2002:a50:bc03:: with SMTP id j3mr20255403edh.234.1593466543544; Mon, 29 Jun 2020 14:35:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593466543; cv=none; d=google.com; s=arc-20160816; b=GAX901BFC91N7KWSspjpPJR3iDsx+bFtvWqBtI4ysIZxsI6hxjHh3js3/gzZ68/vNF AwsMmPmYz9c8v1hefEZsd+SRktmDb6w9jb/iWU+/7IaQHn1yh5jb5vQi3bYh3CbKDENG ohAqHG+rvV2kU+5SoX9+hrImVG7PLKRVp5OFZ45lPzb7V9QKR3NhUJo4hj7BnALPc87v eLjOMOkivrnPMhqWrYUwRUtJUJtgDSZcyoezUiW1bl86CJDFAsA0gJ/vCV8LotpXOyaO gWs+k+V3N+A8x41mKRL4cJwdr1rNPlm9PtS7vxnSMkXJAfWBd7DfNBubNrvEKAcQMTDZ jfdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:to:from:date :dkim-signature; bh=Q8x+bY+4f4UHnuB7a7UE3tDKiuJhI3mXD5Qiix8UB/s=; b=EaHXxQdfc2l9l80bgvv96pKlQwHVhGxjYHpxnd1WTuVhygHYDZqRPO8VIcPl1Kn+f8 aMxb7heSJa8qQuSVpRu/m3JzUiCW/2NgyERLNML7YlaTMLq5Jcx5ZDShMHOm8cNZNVLo l0L9Al/+EwXOwU1kRdBWLqfijjQbxrtd9hRZC5Ygugxcppcm/qq+eXF6hZa/B9X4cx3g UU3fC+a/Wnad3nMVzYxgP05CniCqmkoHkFuAiAIRHGbaVR2kpg9Aib3mdKa+vTLu+VCs X5HDS/Ns7sEQR8hDNi9PebrlPdIzNvY4p8K3KvI+bctoEZyaxMQuluyluNjsfxoB0toK ywZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qYycy74u; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dj5si416368edb.367.2020.06.29.14.35.21; Mon, 29 Jun 2020 14:35:43 -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.org header.s=default header.b=qYycy74u; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391280AbgF2Vel (ORCPT + 99 others); Mon, 29 Jun 2020 17:34:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:60668 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728598AbgF2Sk4 (ORCPT ); Mon, 29 Jun 2020 14:40:56 -0400 Received: from localhost (unknown [104.132.1.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0108C23E53; Mon, 29 Jun 2020 15:03:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593443004; bh=raL4d33RBba0Q+Amt7jmBy+/u73rlt5v3RwFSVQIRYY=; h=Date:From:To:Subject:References:In-Reply-To:From; b=qYycy74u4p+VrNz3wJU8piFLUBVQZrNd8YIJ2V5+OiyNijLS+DIk3Tysqkxk+ETl4 Imz+y6ajfoESV+TsNjb06OCNnyFWo/z8TBbUKFh6pk0xAgy28AyOY5XR0uoNod8Oki oeTLGo81shimoB2dCesRITTW2XNk8GK8q1B0rTzY= Date: Mon, 29 Jun 2020 08:03:23 -0700 From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Subject: Re: [PATCH v2] f2fs: avoid readahead race condition Message-ID: <20200629150323.GA3293033@google.com> References: <20200624012148.180050-1-jaegeuk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200624012148.180050-1-jaegeuk@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If two readahead threads having same offset enter in readpages, every read IOs are split and issued to the disk which giving lower bandwidth. This patch tries to avoid redundant readahead calls. Signed-off-by: Jaegeuk Kim --- v2: - add missing code to bypass read fs/f2fs/data.c | 18 +++++++++++++++++- fs/f2fs/f2fs.h | 1 + fs/f2fs/super.c | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index d6094b9f3916..9b69a159cc6c 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -2403,6 +2403,7 @@ int f2fs_mpage_readpages(struct address_space *mapping, #endif unsigned max_nr_pages = nr_pages; int ret = 0; + bool drop_ra = false; map.m_pblk = 0; map.m_lblk = 0; @@ -2413,13 +2414,25 @@ int f2fs_mpage_readpages(struct address_space *mapping, map.m_seg_type = NO_CHECK_TYPE; map.m_may_create = false; + /* + * Two readahead threads for same address range can cause race condition + * which fragments sequential read IOs. So let's avoid each other. + */ + if (pages && is_readahead) { + page = list_last_entry(pages, struct page, lru); + if (F2FS_I(inode)->ra_offset == page_index(page)) + drop_ra = true; + else + F2FS_I(inode)->ra_offset = page_index(page); + } + for (; nr_pages; nr_pages--) { if (pages) { page = list_last_entry(pages, struct page, lru); prefetchw(&page->flags); list_del(&page->lru); - if (add_to_page_cache_lru(page, mapping, + if (drop_ra || add_to_page_cache_lru(page, mapping, page_index(page), readahead_gfp_mask(mapping))) goto next_page; @@ -2484,6 +2497,9 @@ int f2fs_mpage_readpages(struct address_space *mapping, BUG_ON(pages && !list_empty(pages)); if (bio) __f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA); + + if (pages && is_readahead && !drop_ra) + F2FS_I(inode)->ra_offset = -1; return pages ? 0 : ret; } diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 35afa13124b8..a95f84d72a55 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -806,6 +806,7 @@ struct f2fs_inode_info { struct list_head inmem_pages; /* inmemory pages managed by f2fs */ struct task_struct *inmem_task; /* store inmemory task */ struct mutex inmem_lock; /* lock for inmemory pages */ + pgoff_t ra_offset; /* ongoing readahead offset */ struct extent_tree *extent_tree; /* cached extent_tree entry */ /* avoid racing between foreground op and gc */ diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 0e860186a9c5..6fd2ad43d9e4 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1011,6 +1011,8 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) /* Will be used by directory only */ fi->i_dir_level = F2FS_SB(sb)->dir_level; + fi->ra_offset = -1; + return &fi->vfs_inode; } -- 2.27.0.111.gc72c7da667-goog