Received: by 10.223.176.46 with SMTP id f43csp905667wra; Wed, 24 Jan 2018 07:40:52 -0800 (PST) X-Google-Smtp-Source: AH8x224YuGnmzme42HXsT2GH8S0QuEUo2s31g1LS2OV2j74LHUNCkRcCI0ZKCmBMm9aPnmA4lsKG X-Received: by 10.98.185.14 with SMTP id z14mr13289496pfe.185.1516808452708; Wed, 24 Jan 2018 07:40:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516808452; cv=none; d=google.com; s=arc-20160816; b=uo05n5r5ZkHrW6xTiXo+geMZQYQhvgcRpEmtSlFpU00quIt70hJYwcgEWZ0XRLIF6z G91XC/QixYfl3cmqOTe4lfDWBxbnVcYtzhNjt47wZm+xilt7gqJEMq52bY7+qxotwogQ hivnGNc9h8QhFy+T/HjSXAhHjheo9XDArtz4bf7u56dxgFP43RIDQCnbEO1ciN0T6LUv y9p8GJ5zfc/eET8TMzduSjAVR0vda1XZABZjzeVjlCh9ZqP7CSPbNLv8uE+2ubs1cLeO 9rOoqGLHvw42OBw4GwtDxHmKzCkZE4PZ5ebI5C4Xg6qPAoKgMbwnghJy/IHJ8VEKlbej wzRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dmarc-filter :arc-authentication-results; bh=JCbTm/0f+4Epz07vSsUxnf80gO+VRz89kG5SP+EDpdA=; b=jxQSvIXhyTpTDJJmWur0cyZk2CCjljeCltMto2zgw18xkaeJq0O5h804g1qf1ctlgG oxvjEiE1x3QLDqvruYO1TIUVwwsmbgK7wHdcyUW9JLUmsw0ECzr1QejDavau7ReUl0ip i+IHS3pZBT6kqxUmaYDo2ZLj3DwTdSQZlX/pDLp6M/QCr9V9ZfzYYcMaYT2IPWtHCgGh EeYNxQAXgoyUyZgsAaXvNzfkqRtdY4cRiZwgOpE/uPVxRpclyOfs8+KucKIQAKlN2MJu ECQjy/2gayB8fOeq4KhcEs/4J7eM+nw+BFPZihC+kjd2bCNZ5BMPfBsQsImcubRqElb9 xNXA== ARC-Authentication-Results: i=1; mx.google.com; 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 f80si3056737pfa.111.2018.01.24.07.40.36; Wed, 24 Jan 2018 07:40:52 -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; 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 S934146AbeAXPjk (ORCPT + 99 others); Wed, 24 Jan 2018 10:39:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:45898 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933953AbeAXPji (ORCPT ); Wed, 24 Jan 2018 10:39:38 -0500 Received: from [192.168.0.101] (unknown [180.109.255.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 31FCD20835; Wed, 24 Jan 2018 15:39:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 31FCD20835 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=chao@kernel.org Subject: Re: [f2fs-dev] [PATCH 2/3] f2fs: support passing down write hints to block layer with F2FS policy To: Hyunchul Lee , Jaegeuk Kim , Chao Yu Cc: linux-fsdevel@vger.kernel.org, kernel-team@lge.com, Hyunchul Lee , linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net References: <1516618149-1495-1-git-send-email-hyc.lee@gmail.com> <1516618149-1495-3-git-send-email-hyc.lee@gmail.com> From: Chao Yu Message-ID: Date: Wed, 24 Jan 2018 23:39:17 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <1516618149-1495-3-git-send-email-hyc.lee@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018/1/22 18:49, Hyunchul Lee wrote: > From: Hyunchul Lee > > Add 'whint_mode=fs-based' mount option. In this mode, F2FS passes > down write hints with its policy. > > * whint_mode=fs-based. F2FS passes down hints with its policy. > > User F2FS Block > ---- ---- ----- > META WRITE_LIFE_MEDIUM; > HOT_NODE WRITE_LIFE_NOT_SET > WARM_NODE " > COLD_NODE WRITE_LIFE_NONE > ioctl(COLD) COLD_DATA WRITE_LIFE_EXTREME > extension list " " > > -- buffered io > WRITE_LIFE_EXTREME COLD_DATA WRITE_LIFE_EXTREME > WRITE_LIFE_SHORT HOT_DATA WRITE_LIFE_SHORT > WRITE_LIFE_NOT_SET WARM_DATA WRITE_LIFE_LONG > WRITE_LIFE_NONE " " > WRITE_LIFE_MEDIUM " " > WRITE_LIFE_LONG " " > > -- direct io > WRITE_LIFE_EXTREME COLD_DATA WRITE_LIFE_EXTREME > WRITE_LIFE_SHORT HOT_DATA WRITE_LIFE_SHORT > WRITE_LIFE_NOT_SET WARM_DATA WRITE_LIFE_NOT_SET > WRITE_LIFE_NONE " WRITE_LIFE_NONE > WRITE_LIFE_MEDIUM " WRITE_LIFE_MEDIUM > WRITE_LIFE_LONG " WRITE_LIFE_LONG > > Many thanks to Chao Yu and Jaegeuk Kim for comments to > implement this patch. > > Signed-off-by: Hyunchul Lee > --- > fs/f2fs/f2fs.h | 1 + > fs/f2fs/segment.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- > fs/f2fs/super.c | 5 +++++ > 3 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index d7c2797..898f37d 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -1038,6 +1038,7 @@ enum { > enum { > WHINT_MODE_OFF, /* not pass down write hints */ > WHINT_MODE_USER, /* try to pass down hints given by users */ > + WHINT_MODE_FS, /* pass down hints with F2FS policy */ > }; > > struct f2fs_sb_info { > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 8bc1fc1..b7cae61 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -2491,6 +2491,32 @@ int rw_hint_to_seg_type(enum rw_hint hint) > * > * 2) whint_mode=off. F2FS only passes down WRITE_LIFE_NOT_SET. > * > + * 3) whint_mode=fs-based. F2FS passes down hints with its policy. > + * > + * User F2FS Block > + * ---- ---- ----- > + * META WRITE_LIFE_MEDIUM; > + * HOT_NODE WRITE_LIFE_NOT_SET > + * WARM_NODE " > + * COLD_NODE WRITE_LIFE_NONE > + * ioctl(COLD) COLD_DATA WRITE_LIFE_EXTREME > + * extension list " " > + * > + * -- buffered io > + * WRITE_LIFE_EXTREME COLD_DATA WRITE_LIFE_EXTREME > + * WRITE_LIFE_SHORT HOT_DATA WRITE_LIFE_SHORT > + * WRITE_LIFE_NOT_SET WARM_DATA WRITE_LIFE_LONG > + * WRITE_LIFE_NONE " " > + * WRITE_LIFE_MEDIUM " " > + * WRITE_LIFE_LONG " " > + * > + * -- direct io > + * WRITE_LIFE_EXTREME COLD_DATA WRITE_LIFE_EXTREME > + * WRITE_LIFE_SHORT HOT_DATA WRITE_LIFE_SHORT > + * WRITE_LIFE_NOT_SET WARM_DATA WRITE_LIFE_NOT_SET > + * WRITE_LIFE_NONE " WRITE_LIFE_NONE > + * WRITE_LIFE_MEDIUM " WRITE_LIFE_MEDIUM > + * WRITE_LIFE_LONG " WRITE_LIFE_LONG > */ > > enum rw_hint io_type_to_rw_hint(struct f2fs_sb_info *sbi, > @@ -2509,9 +2535,28 @@ enum rw_hint io_type_to_rw_hint(struct f2fs_sb_info *sbi, > } else { > return WRITE_LIFE_NOT_SET; > } > - } else { > - return WRITE_LIFE_NOT_SET; > + } else if (sbi->whint_mode == WHINT_MODE_FS) { > + if (type == DATA) { > + switch (temp) { > + case COLD: > + return WRITE_LIFE_EXTREME; > + case HOT: > + return WRITE_LIFE_SHORT; > + default: How about changing to use explicit code: case HOT: return WRITE_LIFE_SHORT; case WARM: return WRITE_LIFE_LONG; case COLD: return WRITE_LIFE_EXTREME; > + return WRITE_LIFE_LONG; > + } > + } else if (type == NODE) { > + switch (temp) { > + case COLD: > + return WRITE_LIFE_NONE; > + default: Ditto, case HOT: case WARM: return WRITE_LIFE_NOT_SET; case COLD: return WRITE_LIFE_NONE; Thanks, > + return WRITE_LIFE_NOT_SET; > + } > + } else if (type == META) { > + return WRITE_LIFE_MEDIUM; > + } > } > + return WRITE_LIFE_NOT_SET; > } > > static int __get_segment_type_2(struct f2fs_io_info *fio) > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index 9e22926..2115285 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -691,6 +691,9 @@ static int parse_options(struct super_block *sb, char *options) > } else if (strlen(name) == 3 && > !strncmp(name, "off", 3)) { > sbi->whint_mode = WHINT_MODE_OFF; > + } else if (strlen(name) == 8 && > + !strncmp(name, "fs-based", 8)) { > + sbi->whint_mode = WHINT_MODE_FS; > } else { > kfree(name); > return -EINVAL; > @@ -1245,6 +1248,8 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) > f2fs_show_quota_options(seq, sbi->sb); > if (sbi->whint_mode == WHINT_MODE_USER) > seq_printf(seq, ",whint_mode=%s", "user-based"); > + else if (sbi->whint_mode == WHINT_MODE_FS) > + seq_printf(seq, ",whint_mode=%s", "fs-based"); > > return 0; > } >