Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp2255408imm; Sun, 9 Sep 2018 20:18:31 -0700 (PDT) X-Google-Smtp-Source: ANB0VdbjfswALN3hQxR13gzU5L09zmTCnMnRWele3IQ8ORovXcIrdVVx9lSCbV0fq5MiPWIdIGtW X-Received: by 2002:a17:902:4906:: with SMTP id u6-v6mr19466223pld.44.1536549511093; Sun, 09 Sep 2018 20:18:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536549511; cv=none; d=google.com; s=arc-20160816; b=S71irMd2n0Qrnfe5F7AXIY2VEf7SRvSXALJkwtLaQvOZpFymIIRxFXgtF+1qCzsH7Y WG14A4YaGH6qC2xx2UwBZsbPT0JQmbhkKoPlWK576yin9GQ5ctz0l7BaACAJA+8yTgHQ gtg0Q74LFIauKSPCqitEqvIXSz5bjLvFK4P5vCzSH+y+EhQjiXZ+vUJiKlWrLRVOrVDA F+4tutoxZnnwaQunsqJLwR0rteCzh92+xZ3m5uckTVRmUuoQhmBKyWgdTyD8IjU5bGPv bUINceTH/Y0/KwG83k2vtGCm90ZKIlCDFNubOSZJkX0eAMg3Kqt2ffA0ACUi72dzG/81 Vtxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dmarc-filter:dkim-signature:dkim-signature; bh=xjE0nicKGTz+Eo+OGP9W5jFzjR0z3pVhHSg3FLvY5hk=; b=PYj42icS59De7x/JkQgn35rbazb5SlUhKcyudPgKfCz/pqR6GnlfvvXtSjfNpm++cR TnvjSM9PEKCoF37ASnf+sqyuRAOcn9lYwqpSDECOwOIz1DBwuJ0vLYKreAiu+nyEznoq Ael4xOlOQnCrHI9epWWxmTKLi5sUwn6PuDcm7UjjIIcfN8AXRxIRVYNk0jJ/NGxyBE7n JUjRn0u8Fygu+wo0zQlrFpLcaWZBdfJ9ML6COMhW/rrUbc4XmHPDXH8pqm9bC0p7EfIS XCRDFu7inkltviADuRTqHl1I8ZvCgMwOk3WXqCzHxmUo5zjqS9fljXVpKBy1ayUJN0mW +TTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=eMOoCowE; dkim=pass header.i=@codeaurora.org header.s=default header.b=GmePcuIs; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h5-v6si14836721pll.385.2018.09.09.20.18.15; Sun, 09 Sep 2018 20:18:31 -0700 (PDT) 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=@codeaurora.org header.s=default header.b=eMOoCowE; dkim=pass header.i=@codeaurora.org header.s=default header.b=GmePcuIs; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726736AbeIJIIf (ORCPT + 99 others); Mon, 10 Sep 2018 04:08:35 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:50592 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725972AbeIJIIe (ORCPT ); Mon, 10 Sep 2018 04:08:34 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 6ACBB607B5; Mon, 10 Sep 2018 03:16:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1536549404; bh=DlOfC9B/0gHIc4VBLX8wZnGqKS1+cIw+CFPt+hHOtMQ=; h=From:To:Cc:Subject:Date:From; b=eMOoCowELxX1GTkqTvXJbfSTmOg7OrwNJkb0tvMILXANLuVYX9w5r0DDjeM2c/5WK Ypr3vEytD35jZ+PYssfSsbjaqrmQ8872sBvofCClUEKvZbgOkFbPecEh6wJD+t84fg HEihjleAlKTO5l/jZcV7Y+467Zr8z82QQaocW7oE= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from codeaurora.org (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: stummala@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 7898B60558; Mon, 10 Sep 2018 03:16:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1536549403; bh=DlOfC9B/0gHIc4VBLX8wZnGqKS1+cIw+CFPt+hHOtMQ=; h=From:To:Cc:Subject:Date:From; b=GmePcuIskOOegDWPAjPezcLVHUKsUDjLpPa4Cxb3r3XjYicSS5XC3acaABcmQMrtk rSZ3HBXiTzciHbNOKL1FO/Wi/4bjwh3oCeEP2w/zup+xLQlV5UflW7w9SPEuvXfb2R gyZXn8dxOp0B1tMS03MafjHw2LwRNV0KxBB4RUno= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 7898B60558 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=stummala@codeaurora.org From: Sahitya Tummala To: Jaegeuk Kim , Chao Yu , linux-f2fs-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org, Sahitya Tummala Subject: [PATCH] f2fs: add new idle interval timing for discard and gc paths Date: Mon, 10 Sep 2018 08:46:22 +0530 Message-Id: <1536549382-23584-1-git-send-email-stummala@codeaurora.org> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This helps to control the frequency of submission of discard and GC requests independently, based on the need. The sleep timing of GC thread is now aligned with this idle time when the dev is busy, to avoid unnecessary periodic wakeups. Suggested-by: Chao Yu Signed-off-by: Sahitya Tummala --- Documentation/ABI/testing/sysfs-fs-f2fs | 17 ++++++++++++++++- fs/f2fs/f2fs.h | 31 +++++++++++++++++++++++++++---- fs/f2fs/gc.c | 6 ++++-- fs/f2fs/segment.c | 14 +++++--------- fs/f2fs/super.c | 2 ++ fs/f2fs/sysfs.c | 5 +++++ 6 files changed, 59 insertions(+), 16 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index 94a24ae..3ac4177 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -121,7 +121,22 @@ What: /sys/fs/f2fs//idle_interval Date: January 2016 Contact: "Jaegeuk Kim" Description: - Controls the idle timing. + Controls the idle timing for all paths other than + discard and gc path. + +What: /sys/fs/f2fs//discard_idle_interval +Date: September 2018 +Contact: "Chao Yu" +Contact: "Sahitya Tummala" +Description: + Controls the idle timing for discard path. + +What: /sys/fs/f2fs//gc_idle_interval +Date: September 2018 +Contact: "Chao Yu" +Contact: "Sahitya Tummala" +Description: + Controls the idle timing for gc path. What: /sys/fs/f2fs//iostat_enable Date: August 2017 diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index abf9256..6070681 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1093,6 +1093,8 @@ enum { enum { CP_TIME, REQ_TIME, + DISCARD_TIME, + GC_TIME, MAX_TIME, }; @@ -1347,14 +1349,35 @@ static inline void f2fs_update_time(struct f2fs_sb_info *sbi, int type) sbi->last_time[type] = jiffies; } -static inline bool f2fs_time_over(struct f2fs_sb_info *sbi, int type) +static inline bool f2fs_time_over_cp(struct f2fs_sb_info *sbi) +{ + unsigned long interval = sbi->interval_time[CP_TIME] * HZ; + + return time_after(jiffies, sbi->last_time[CP_TIME] + interval); +} + +static inline bool f2fs_time_over_req(struct f2fs_sb_info *sbi, int type) +{ + unsigned long interval = sbi->interval_time[type] * HZ; + + return time_after(jiffies, sbi->last_time[REQ_TIME] + interval); +} + +static inline unsigned int f2fs_get_wait_time(struct f2fs_sb_info *sbi, + int type) { unsigned long interval = sbi->interval_time[type] * HZ; + unsigned int wait_ms = 0; + long delta; + + delta = (sbi->last_time[REQ_TIME] + interval) - jiffies; + if (delta > 0) + wait_ms = jiffies_to_msecs(delta); - return time_after(jiffies, sbi->last_time[type] + interval); + return wait_ms; } -static inline bool is_idle(struct f2fs_sb_info *sbi) +static inline bool is_idle(struct f2fs_sb_info *sbi, int type) { struct block_device *bdev = sbi->sb->s_bdev; struct request_queue *q = bdev_get_queue(bdev); @@ -1363,7 +1386,7 @@ static inline bool is_idle(struct f2fs_sb_info *sbi) if (rl->count[BLK_RW_SYNC] || rl->count[BLK_RW_ASYNC]) return false; - return f2fs_time_over(sbi, REQ_TIME); + return f2fs_time_over_req(sbi, type); } /* diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 5c8d004..c0bafea 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -83,8 +83,10 @@ static int gc_thread_func(void *data) if (!mutex_trylock(&sbi->gc_mutex)) goto next; - if (!is_idle(sbi)) { - increase_sleep_time(gc_th, &wait_ms); + if (!is_idle(sbi, GC_TIME)) { + wait_ms = f2fs_get_wait_time(sbi, GC_TIME); + if (!wait_ms) + increase_sleep_time(gc_th, &wait_ms); mutex_unlock(&sbi->gc_mutex); goto next; } diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index c5024f8..f8a6a7b 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -511,7 +511,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) else f2fs_build_free_nids(sbi, false, false); - if (!is_idle(sbi) && + if (!is_idle(sbi, REQ_TIME) && (!excess_dirty_nats(sbi) && !excess_dirty_nodes(sbi))) return; @@ -521,7 +521,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) excess_prefree_segs(sbi) || excess_dirty_nats(sbi) || excess_dirty_nodes(sbi) || - f2fs_time_over(sbi, CP_TIME)) { + f2fs_time_over_cp(sbi)) { if (test_opt(sbi, DATA_FLUSH)) { struct blk_plug plug; @@ -1371,7 +1371,7 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, f2fs_bug_on(sbi, dc->state != D_PREP); if (dpolicy->io_aware && i < dpolicy->io_aware_gran && - !is_idle(sbi)) { + !is_idle(sbi, DISCARD_TIME)) { io_interrupted = true; break; } @@ -1564,8 +1564,6 @@ static int issue_discard_thread(void *data) struct discard_policy dpolicy; unsigned int wait_ms = DEF_MIN_DISCARD_ISSUE_TIME; int issued; - unsigned long interval = sbi->interval_time[REQ_TIME] * HZ; - long delta; set_freezable(); @@ -1602,10 +1600,8 @@ static int issue_discard_thread(void *data) __wait_all_discard_cmd(sbi, &dpolicy); wait_ms = dpolicy.min_interval; } else if (issued == -1){ - delta = (sbi->last_time[REQ_TIME] + interval) - jiffies; - if (delta > 0) - wait_ms = jiffies_to_msecs(delta); - else + wait_ms = f2fs_get_wait_time(sbi, DISCARD_TIME); + if (!wait_ms) wait_ms = dpolicy.mid_interval; } else { wait_ms = dpolicy.max_interval; diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 896b885..1706f45 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2423,6 +2423,8 @@ static void init_sb_info(struct f2fs_sb_info *sbi) sbi->dir_level = DEF_DIR_LEVEL; sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL; sbi->interval_time[REQ_TIME] = DEF_IDLE_INTERVAL; + sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL; + sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL; 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 81c0e53..0afe99c 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -407,6 +407,9 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, cp_interval, interval_time[CP_TIME]); 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, 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); @@ -460,6 +463,8 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, ATTR_LIST(dirty_nats_ratio), ATTR_LIST(cp_interval), ATTR_LIST(idle_interval), + ATTR_LIST(discard_idle_interval), + ATTR_LIST(gc_idle_interval), ATTR_LIST(iostat_enable), ATTR_LIST(readdir_ra), ATTR_LIST(gc_pin_file_thresh), -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.