From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5EA79C43381 for ; Sat, 16 Mar 2019 00:13:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2C74B218AC for ; Sat, 16 Mar 2019 00:13:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=wdc.com header.i=@wdc.com header.b="BlST9sAx" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726713AbfCPAN3 (ORCPT ); Fri, 15 Mar 2019 20:13:29 -0400 Received: from esa1.hgst.iphmx.com ([68.232.141.245]:41062 "EHLO esa1.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726638AbfCPAN3 (ORCPT ); Fri, 15 Mar 2019 20:13:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1552695208; x=1584231208; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=8psBenVmCFv+KbSfKoJAunmGftzD40Z9Zs8c3WtqROI=; b=BlST9sAxfRBDBDJIVTNEwmVZCrTf8Qc/oJEZrol5r4TOSCP7jQG7pqR1 qgUev4Wr5N7+8DyDB/j/NmrjzH/g9KywZPCEDOOEjSCLjIU4MaMk7RatJ iYtL9SSs5MuLR8KLKFZXPteARGtldCs7esshIak5PEPXIfNS3AHy3LNn2 UJQrle4AqDFbgagrNFv02fxk0LSgw2qsSiGUiqkrFhIoQVLaBtk0qXMko tfl6nMSD1ZMLugozYE4n837XFvl6+qj4izXyuz7M4yHQO4oXKZ+oOsC0O knh7xLDIUi1vxWhGw1oOp1qYqCeMv8NF2VVTor70TqaPEpmLPXH0AZP1R Q==; X-IronPort-AV: E=Sophos;i="5.58,483,1544457600"; d="scan'208";a="209047197" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 16 Mar 2019 08:13:27 +0800 IronPort-SDR: sML72nlTR8fCUyoLi2LAzXQj8PCekyalRXOcAno2tHjdmc0ZDTEhqHojfPd3hfWDmnggRCo5V0 LDZaDK2EIKlpEpaO2/d7APg/tgNaawQ2hQF/sAhWiaiI5L8JlXz1W2IlPpf/v2UQySgaMr9zjd 9PQaP4jG6pqn2D8RQwY+ZuDWFtYR7zOP7G/py+L4OcgP8V6sv+EdOiisNSK3OkEXDlBLjcVpwb 79t8KS8QoEW7gbeb6ON3qhssL4OVYY4DJHVrCiCXmli+Udr3zh6tAEqr8VsEZqD5PtgNLIZuM9 MdGWJp885XtuAA39Tl3nC4q2 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP; 15 Mar 2019 16:51:11 -0700 IronPort-SDR: MmUb3ChbK2jMf/cJeRVeLEhZhFfDvsbKALLQCVo1XAmXYFZa8XXXTkln3sivh0eZNJSBT/H5sL JaZDw4IrBIsG3Z7J9Ryv+64g97yV2vJLhuyov8heWIIH+cPkBA81puSXKWk8HYtNQt/Y5bXSaC 21Cf1EizGQUGG/p5GZ1nhW5PFdTCcIvB3Lciqp5dnPP2ESyMCgN2Od5LuR1xhV7sFbf5wPes4h oxVreqU4MlgFzvn1bQqzdVPH/zUujxvFPyLO4KrLxnPNAzk/2L18QUHAHB3aLSbYqO7CJYqfWe 9RQ= Received: from washi.fujisawa.hgst.com ([10.149.53.254]) by uls-op-cesaip02.wdc.com with ESMTP; 15 Mar 2019 17:13:27 -0700 From: Damien Le Moal To: Jaegeuk Kim , Chao Yu , linux-f2fs-devel@lists.sourceforge.net Cc: linux-fsdevel@vger.kernel.org, Matias Bjorling , Masato Suzuki Subject: [PATCH 3/3] f2fs: improve discard handling with multi-device volumes Date: Sat, 16 Mar 2019 09:13:08 +0900 Message-Id: <20190316001308.18115-4-damien.lemoal@wdc.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190316001308.18115-1-damien.lemoal@wdc.com> References: <20190316001308.18115-1-damien.lemoal@wdc.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org f2fs_hw_support_discard() only tests if the super block device supports discard. However, for a multi-device volume, not all disks used may support discard. Improve the check performed to test all devices of the volume and report discard as supported if at least one device of the volume supports discard. To implement this, introduce the helper function f2fs_bdev_support_discard(), which returns true for zoned block devices (where discard is processed as a zone reset) and for regular disks supporting the discard command. f2fs_bdev_support_discard() is also used in __queue_discard_cmd() to handle discard command issuing for a particular device of the volume. That is, prevent issuing a discard command for block devices that do not support it. Signed-off-by: Damien Le Moal --- fs/f2fs/f2fs.h | 16 +++++++++++++++- fs/f2fs/segment.c | 8 ++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 576e637ef568..db4564c6531d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3527,9 +3527,23 @@ static inline bool f2fs_hw_should_discard(struct f2fs_sb_info *sbi) return f2fs_sb_has_blkzoned(sbi); } +static inline bool f2fs_bdev_support_discard(struct block_device *bdev) +{ + return blk_queue_discard(bdev_get_queue(bdev)) || + bdev_is_zoned(bdev); +} + static inline bool f2fs_hw_support_discard(struct f2fs_sb_info *sbi) { - return blk_queue_discard(bdev_get_queue(sbi->sb->s_bdev)); + int i; + + if (!f2fs_is_multi_device(sbi)) + return f2fs_bdev_support_discard(sbi->sb->s_bdev); + + for (i = 0; i < sbi->s_ndevs; i++) + if (f2fs_bdev_support_discard(FDEV(i).bdev)) + return true; + return false; } static inline bool f2fs_realtime_discard_enable(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index f40148b735d7..9b320dd1c9d7 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1342,6 +1342,9 @@ static int __queue_discard_cmd(struct f2fs_sb_info *sbi, { block_t lblkstart = blkstart; + if (!f2fs_bdev_support_discard(bdev)) + return 0; + trace_f2fs_queue_discard(bdev, blkstart, blklen); if (f2fs_is_multi_device(sbi)) { @@ -1728,8 +1731,6 @@ static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, } /* For conventional zones, use regular discard if supported */ - if (!blk_queue_discard(bdev_get_queue(bdev))) - return 0; return __queue_discard_cmd(sbi, bdev, lblkstart, blklen); } #endif @@ -1738,8 +1739,7 @@ static int __issue_discard_async(struct f2fs_sb_info *sbi, struct block_device *bdev, block_t blkstart, block_t blklen) { #ifdef CONFIG_BLK_DEV_ZONED - if (f2fs_sb_has_blkzoned(sbi) && - bdev_zoned_model(bdev) != BLK_ZONED_NONE) + if (f2fs_sb_has_blkzoned(sbi) && bdev_is_zoned(bdev)) return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen); #endif return __queue_discard_cmd(sbi, bdev, blkstart, blklen); -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Damien Le Moal Subject: [PATCH 3/3] f2fs: improve discard handling with multi-device volumes Date: Sat, 16 Mar 2019 09:13:08 +0900 Message-ID: <20190316001308.18115-4-damien.lemoal@wdc.com> References: <20190316001308.18115-1-damien.lemoal@wdc.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1h4wxD-0003HH-Rp for linux-f2fs-devel@lists.sourceforge.net; Sat, 16 Mar 2019 00:13:35 +0000 Received: from esa4.hgst.iphmx.com ([216.71.154.42]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) id 1h4wxC-00GoGN-Al for linux-f2fs-devel@lists.sourceforge.net; Sat, 16 Mar 2019 00:13:35 +0000 In-Reply-To: <20190316001308.18115-1-damien.lemoal@wdc.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net To: Jaegeuk Kim , Chao Yu , linux-f2fs-devel@lists.sourceforge.net Cc: linux-fsdevel@vger.kernel.org, Masato Suzuki , Matias Bjorling f2fs_hw_support_discard() only tests if the super block device supports discard. However, for a multi-device volume, not all disks used may support discard. Improve the check performed to test all devices of the volume and report discard as supported if at least one device of the volume supports discard. To implement this, introduce the helper function f2fs_bdev_support_discard(), which returns true for zoned block devices (where discard is processed as a zone reset) and for regular disks supporting the discard command. f2fs_bdev_support_discard() is also used in __queue_discard_cmd() to handle discard command issuing for a particular device of the volume. That is, prevent issuing a discard command for block devices that do not support it. Signed-off-by: Damien Le Moal --- fs/f2fs/f2fs.h | 16 +++++++++++++++- fs/f2fs/segment.c | 8 ++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 576e637ef568..db4564c6531d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3527,9 +3527,23 @@ static inline bool f2fs_hw_should_discard(struct f2fs_sb_info *sbi) return f2fs_sb_has_blkzoned(sbi); } +static inline bool f2fs_bdev_support_discard(struct block_device *bdev) +{ + return blk_queue_discard(bdev_get_queue(bdev)) || + bdev_is_zoned(bdev); +} + static inline bool f2fs_hw_support_discard(struct f2fs_sb_info *sbi) { - return blk_queue_discard(bdev_get_queue(sbi->sb->s_bdev)); + int i; + + if (!f2fs_is_multi_device(sbi)) + return f2fs_bdev_support_discard(sbi->sb->s_bdev); + + for (i = 0; i < sbi->s_ndevs; i++) + if (f2fs_bdev_support_discard(FDEV(i).bdev)) + return true; + return false; } static inline bool f2fs_realtime_discard_enable(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index f40148b735d7..9b320dd1c9d7 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1342,6 +1342,9 @@ static int __queue_discard_cmd(struct f2fs_sb_info *sbi, { block_t lblkstart = blkstart; + if (!f2fs_bdev_support_discard(bdev)) + return 0; + trace_f2fs_queue_discard(bdev, blkstart, blklen); if (f2fs_is_multi_device(sbi)) { @@ -1728,8 +1731,6 @@ static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, } /* For conventional zones, use regular discard if supported */ - if (!blk_queue_discard(bdev_get_queue(bdev))) - return 0; return __queue_discard_cmd(sbi, bdev, lblkstart, blklen); } #endif @@ -1738,8 +1739,7 @@ static int __issue_discard_async(struct f2fs_sb_info *sbi, struct block_device *bdev, block_t blkstart, block_t blklen) { #ifdef CONFIG_BLK_DEV_ZONED - if (f2fs_sb_has_blkzoned(sbi) && - bdev_zoned_model(bdev) != BLK_ZONED_NONE) + if (f2fs_sb_has_blkzoned(sbi) && bdev_is_zoned(bdev)) return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen); #endif return __queue_discard_cmd(sbi, bdev, blkstart, blklen); -- 2.20.1