Received: by 10.223.176.46 with SMTP id f43csp2753523wra; Mon, 22 Jan 2018 02:51:48 -0800 (PST) X-Google-Smtp-Source: AH8x225xPPEq8fHbbEahTc7/nfczPo7CEVKxclGlgR6zgBfLH/VABbM+E6QzLpumWBCE86C55f8I X-Received: by 10.101.67.130 with SMTP id m2mr6699106pgp.301.1516618308433; Mon, 22 Jan 2018 02:51:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516618308; cv=none; d=google.com; s=arc-20160816; b=pbDXFMDS3R/o19UC4btxHNnTdNcq6FNLViXGyJWhcita+8PZ54og2ZU86loOaN6AZe FJEEpok/cjaltzp4Y6dX+vl+l6b9ZcuTj8AT/+7R6PR/Yx88FtFrp5MzC7yV1WrrxyrB 8OPHWhLm6qppTerFxF6zO9mZ2p2z8/55VHTWfZ4YCnqemtqZ8aaPj0pN7onOlT/wlmrW Zq06+zYMAWpB02kkOkcubva4ZO+uXadF6U0cMudtmjC0Er8h1Ide0lMOu/1ZoaSQm74o fUEz3a/r7T/RH6LCnXF8loS1b9gTJGqFXT4SAjHjMgeWmd5KFcgPQciYTVRRwyv3K6Mi SzqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=nrRtHepCh0Q7iUIOlRYTUC17H6qhjQNdGFycR8d3CjE=; b=VNosKSjV37LlKZQ8OzRBZgMZHNurRg1+hzXR1uD6OyFotRCAwQAZIua4xrGkv6E8je z97ReQbhxAoFHWt0nAp5EiAdTirXL5w+oxPPk+Sbzaky8Mp4OjtNnQco7A5damTKb6bb FO0iPNme1iyP5BJX0xpmpvlJDCW1Y/YR1zUhd/WVnVVVtaTe1nJhNDeodWmsFD4h4yq1 10j7uf4Mm5FRkRC6gDlnoLLskLFHGIzbxcBXrxYCBbG5urWZEZ3eXhQOXptf+ijtCT35 ZZWEN7MQc9VXkl//OERDD9FUdG+ICOcKDIv46vD/JpbS72q7A6e4f6MnpxyyvSFOn1XG jxPQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j132si2238351pgc.789.2018.01.22.02.51.34; Mon, 22 Jan 2018 02:51:48 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751290AbeAVKuT (ORCPT + 99 others); Mon, 22 Jan 2018 05:50:19 -0500 Received: from LGEAMRELO12.lge.com ([156.147.23.52]:48621 "EHLO lgeamrelo12.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751100AbeAVKtu (ORCPT ); Mon, 22 Jan 2018 05:49:50 -0500 Received: from unknown (HELO lgeamrelo04.lge.com) (156.147.1.127) by 156.147.23.52 with ESMTP; 22 Jan 2018 19:49:48 +0900 X-Original-SENDERIP: 156.147.1.127 X-Original-MAILFROM: hyc.lee@gmail.com Received: from unknown (HELO localhost.localdomain) (10.177.225.35) by 156.147.1.127 with ESMTP; 22 Jan 2018 19:49:48 +0900 X-Original-SENDERIP: 10.177.225.35 X-Original-MAILFROM: hyc.lee@gmail.com From: Hyunchul Lee To: Jaegeuk Kim , Chao Yu Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, kernel-team@lge.com, Hyunchul Lee Subject: [PATCH 2/3] f2fs: support passing down write hints to block layer with F2FS policy Date: Mon, 22 Jan 2018 19:49:08 +0900 Message-Id: <1516618149-1495-3-git-send-email-hyc.lee@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1516618149-1495-1-git-send-email-hyc.lee@gmail.com> References: <1516618149-1495-1-git-send-email-hyc.lee@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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: + return WRITE_LIFE_LONG; + } + } else if (type == NODE) { + switch (temp) { + case COLD: + return WRITE_LIFE_NONE; + default: + 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; } -- 1.9.1