Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2634703imu; Thu, 24 Jan 2019 16:58:02 -0800 (PST) X-Google-Smtp-Source: ALg8bN5x1fYuawjUOvP07S0cF0P6WzQXj07V32KFD/wAyfxGHlqK13lL1dd3sLAG4DZHwCUk5PIz X-Received: by 2002:a17:902:4d46:: with SMTP id o6mr8408155plh.302.1548377882472; Thu, 24 Jan 2019 16:58:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548377882; cv=none; d=google.com; s=arc-20160816; b=z6Srt1D2rurbchOffmnfoA+D8jUFuV/8DQx2n35XgnrBiEXhJ9uNt1lRAOfXN8yJDO 1oyyhx3qt4YwgrMnr/6MFr2UGV+fw5tYmVhXWpls0rwwzwR+apNczXONTiBGh2i6T+sW 3td2/wHZu4VH+1SHiJRAfKUF5lkdHdSRwQKt4HFTMA4HA4ZJAL0VQkJzeSqd1EG0iads 6rP4wlHUgBIgFECMdO7rHgC99KbHfzaR3jvOgQVMqAglatHRJ6r5jfvAVEODXSkRfufV fIkaHI8msH/cwy6IPWSZlMqqxqh+gGFtnIcNnMOIIRbP8iI2k9M9zGKzzsYqlwMbVoge d1dA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:to :from:date:dkim-signature; bh=iZSNHBqKE0NpZvLEUkSqqn3QWyx3k8xIp9agtwREG6U=; b=EGfgbpjIduNIhZ6X0JVSobtk32r/2eXo55eM29wKWrxTkgTQbmThIWtfGuH1MbPTSp Zy8d+BQ8x09W917LIuvnGSJWu86SUwGGRyH4hmwDn/THn1d9rxR0Q4HtrxIkI1W6HKq/ 7VPplqgqqhaK5FFT9Uzf7jlWb8j2YlR87UHYwr0eISTGDsZPQX552LXmapPkhW7OZ/O2 lpr/4BKW9EX3otcYQ8MgRvxmTCRvm57sgmk2kuiyoOnviD3tmo7KoBqAaVTjZkQ+xLAE sHs0Nn7P5hH6vHHr79XyQ1vsV0lou27GWuoclR9hDONhAhdf0j/vAXP04sCuV7K6YTgD 8XoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UbkePkBq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id y26si19596140pfd.25.2019.01.24.16.57.47; Thu, 24 Jan 2019 16:58:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UbkePkBq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1728286AbfAYA46 (ORCPT + 99 others); Thu, 24 Jan 2019 19:56:58 -0500 Received: from mail.kernel.org ([198.145.29.99]:50278 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726015AbfAYA46 (ORCPT ); Thu, 24 Jan 2019 19:56:58 -0500 Received: from localhost (unknown [104.132.1.80]) (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 0BB2A218B0; Fri, 25 Jan 2019 00:56:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548377817; bh=ElFYgCA1fQvkHIZQKUpRWK3oGa6OGjfQagiDYfr47TM=; h=Date:From:To:Subject:References:In-Reply-To:From; b=UbkePkBqvOAsmJO9Q71B7QQ7ejzXxHiJ+EDaeIe8UR64q5pSqKYPBaAle7nfAA/CJ G4v2+g6d1gHOHVrMJkc/Gj5rHKKv5qspnsmJiUgFriFbtFvYtVq0zsOhaQuo8xd1iB V7abiwYoIRDm97H/vurGYG3l6aso/tLY+Q/ONzTs= Date: Thu, 24 Jan 2019 16:56:56 -0800 From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Subject: Re: [PATCH 1/2 v2] f2fs: run discard jobs when put_super Message-ID: <20190125005656.GC2196@jaegeuk-macbookpro.roam.corp.google.com> References: <20190123000229.45236-1-jaegeuk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190123000229.45236-1-jaegeuk@kernel.org> User-Agent: Mutt/1.8.2 (2017-04-18) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we umount f2fs, we need to avoid long delay due to discard commands, which is actually taking tens of seconds, if storage is very slow on UNMAP. So, this patch introduces timeout-based work on it. By default, let me give 5 seconds for discard. Signed-off-by: Jaegeuk Kim --- Change log from v1: - use 0 for initial timeout Documentation/ABI/testing/sysfs-fs-f2fs | 7 +++++++ fs/f2fs/f2fs.h | 5 ++++- fs/f2fs/segment.c | 11 ++++++++++- fs/f2fs/super.c | 17 ++++++++--------- fs/f2fs/sysfs.c | 3 +++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index a7ce33199457..91822ce25831 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -86,6 +86,13 @@ Description: The unit size is one block, now only support configuring in range of [1, 512]. +What: /sys/fs/f2fs//umount_discard_timeout +Date: January 2019 +Contact: "Jaegeuk Kim" +Description: + Set timeout to issue discard commands during umount. + Default: 5 secs + What: /sys/fs/f2fs//max_victim_search Date: January 2014 Contact: "Jaegeuk Kim" diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 0f564883e078..6b6ec5600089 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -191,6 +191,7 @@ enum { #define DEF_CP_INTERVAL 60 /* 60 secs */ #define DEF_IDLE_INTERVAL 5 /* 5 secs */ #define DEF_DISABLE_INTERVAL 5 /* 5 secs */ +#define DEF_UMOUNT_DISCARD_TIMEOUT 5 /* 5 secs */ struct cp_control { int reason; @@ -310,6 +311,7 @@ struct discard_policy { bool sync; /* submit discard with REQ_SYNC flag */ bool ordered; /* issue discard by lba order */ unsigned int granularity; /* discard granularity */ + int timeout; /* discard timeout for put_super */ }; struct discard_cmd_control { @@ -1110,6 +1112,7 @@ enum { DISCARD_TIME, GC_TIME, DISABLE_TIME, + UMOUNT_DISCARD_TIMEOUT, MAX_TIME, }; @@ -3006,7 +3009,7 @@ void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr); bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr); void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi); void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi); -bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi); +bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi); void f2fs_clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc); void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 9b79056d705d..5b2b9be6f28d 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1037,6 +1037,7 @@ static void __init_discard_policy(struct f2fs_sb_info *sbi, dpolicy->max_requests = DEF_MAX_DISCARD_REQUEST; dpolicy->io_aware_gran = MAX_PLIST_NUM; + dpolicy->timeout = 0; if (discard_type == DPOLICY_BG) { dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME; @@ -1424,7 +1425,14 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, int i, issued = 0; bool io_interrupted = false; + if (dpolicy->timeout != 0) + f2fs_update_time(sbi, dpolicy->timeout); + for (i = MAX_PLIST_NUM - 1; i >= 0; i--) { + if (dpolicy->timeout != 0 && + f2fs_time_over(sbi, dpolicy->timeout)) + break; + if (i + 1 < dpolicy->granularity) break; @@ -1611,7 +1619,7 @@ void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi) } /* This comes from f2fs_put_super */ -bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi) +bool f2fs_issue_discard_timeout(struct f2fs_sb_info *sbi) { struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; struct discard_policy dpolicy; @@ -1619,6 +1627,7 @@ bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi) __init_discard_policy(sbi, &dpolicy, DPOLICY_UMOUNT, dcc->discard_granularity); + dpolicy.timeout = UMOUNT_DISCARD_TIMEOUT; __issue_discard_cmd(sbi, &dpolicy); dropped = __drop_discard_cmd(sbi); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 6f4dfbd6f325..2af0db2b738e 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1029,6 +1029,9 @@ static void f2fs_put_super(struct super_block *sb) int i; bool dropped; + /* be sure to wait for any on-going discard commands */ + dropped = f2fs_issue_discard_timeout(sbi); + f2fs_quota_off_umount(sb); /* prevent remaining shrinker jobs */ @@ -1044,17 +1047,12 @@ static void f2fs_put_super(struct super_block *sb) struct cp_control cpc = { .reason = CP_UMOUNT, }; - f2fs_write_checkpoint(sbi, &cpc); - } - /* be sure to wait for any on-going discard commands */ - dropped = f2fs_wait_discard_bios(sbi); + if ((f2fs_hw_support_discard(sbi) || + f2fs_hw_should_discard(sbi)) && + !sbi->discard_blks && !dropped) + cpc.reason |= CP_TRIMMED; - if ((f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi)) && - !sbi->discard_blks && !dropped) { - struct cp_control cpc = { - .reason = CP_UMOUNT | CP_TRIMMED, - }; f2fs_write_checkpoint(sbi, &cpc); } @@ -2721,6 +2719,7 @@ static void init_sb_info(struct f2fs_sb_info *sbi) sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL; sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL; sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_INTERVAL; + sbi->interval_time[UMOUNT_DISCARD_TIMEOUT] = DEF_UMOUNT_DISCARD_TIMEOUT; clear_sbi_flag(sbi, SBI_NEED_FSCK); for (i = 0; i < NR_COUNT_TYPE; i++) diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index 5b83e1d66cb3..18c627e8fc90 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -426,6 +426,8 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, idle_interval, interval_time[REQ_TIME]); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, discard_idle_interval, interval_time[DISCARD_TIME]); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_idle_interval, interval_time[GC_TIME]); +F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, + umount_discard_timeout, interval_time[UMOUNT_DISCARD_TIMEOUT]); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, iostat_enable, iostat_enable); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, readdir_ra, readdir_ra); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_pin_file_thresh, gc_pin_file_threshold); @@ -483,6 +485,7 @@ static struct attribute *f2fs_attrs[] = { ATTR_LIST(idle_interval), ATTR_LIST(discard_idle_interval), ATTR_LIST(gc_idle_interval), + ATTR_LIST(umount_discard_timeout), ATTR_LIST(iostat_enable), ATTR_LIST(readdir_ra), ATTR_LIST(gc_pin_file_thresh), -- 2.19.0.605.g01d371f741-goog