From patchwork Mon Jul 11 11:14:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anand Jain X-Patchwork-Id: 12913385 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0E8C6C43334 for ; Mon, 11 Jul 2022 11:32:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231557AbiGKLcj (ORCPT ); Mon, 11 Jul 2022 07:32:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47346 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231474AbiGKLcX (ORCPT ); Mon, 11 Jul 2022 07:32:23 -0400 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 824947C19B for ; Mon, 11 Jul 2022 04:15:12 -0700 (PDT) Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26BAkYxF008338; Mon, 11 Jul 2022 11:15:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2021-07-09; bh=9YEY/5DXIdBebIgGo48ZCE/j5lHAPHQOOTpmPPTexVk=; b=Gx9SrKUV6HrXZTeGSy9oUpjZ5UPbONytGTA/ZjStxS7kMYdIJpdZ2NBCBrS5ajUEfCKh SwlGf3d/5jD1u6g3FwVoE57JNcFJbdm9T8NgF43C4CsGEmJhp4BsEkFjuGMRypfef8io h6xDhlDpVIn/deajMEv7IzlinoNCfTpxz6wbf+q6scuCRRp9bwFhh40lc6ohi19XSWCU wan1blgpXrAE0suWRNZ0ch91cK/hRP/uKOAFbzfSFQ/bdCSM09oKhKN2ToOFSXDuEN0v ZuyRXJoZ92HjKM8L/I8LKseCUN2vQdT0+aCznd3Ez5vkJZtBaoGyNnuE4O2er73LRlSD 7Q== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3h71xrb3qt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Jul 2022 11:15:09 +0000 Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 26BB5FIW020831; Mon, 11 Jul 2022 11:15:09 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2109.outbound.protection.outlook.com [104.47.55.109]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3h7042bath-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Jul 2022 11:15:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZKrSiHL+4ioHCg757uKUHCCzGG5VltpRYpazgySWHhcc3u7lEyN8FxdwAat8nAq7BDEj0rrye+nl4wLdfJWCI9DDbi9cesciOAykV3cP+rEPIJB9mwTXth1lIDUca8R1QzdM506Sd4rGEogSatUrEHhVqWM0KZQC6NMRkoAj+s3AE5sCp54Es/hDohukChfEx1B5QNVmU3n3UwC92KC/2aInt6GO7TPs66auFhaeStldO5K/ITAIhSnfu3Ssx7ashG7qIVStlYZOcb7dDQnNPcupD7bMBkcxLzWR9d8S6KXdiIDE4+t6lOOe/FDcD1C4K6EcWmEh3rYjLmsZXX+FNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=9YEY/5DXIdBebIgGo48ZCE/j5lHAPHQOOTpmPPTexVk=; b=VBJDh/cvt0yGzozUU9LrmM+0Zxn7wXkXYjRR4zXeebtUOHlycRR65UL8gW1qw7poPMQxf7QlQIINJYXtOadRY7LF7RxsG3UCvoym3GKoyfwQ0flJyQ/1iRL1FWWywJPCmJ1YTuNuz8eE6HGI5dFHFQ/+RFNFUNVP2HUJ/LeOWJe8NEWrLN6g8jYPgnIRwya00jA61X25D6EZl7OGewlBKl5A4N01A1kAHLWUi2mx3l1oXGQZTVepez36qhC5cfIbu/Cmg3ZsRys7wXRyVaqkagAuFhdBsJZtWc+KJ8/vpfrytsEjjI8WjIEpRq+RxdCDjO4DdYJzwyhMoFqEcJBcwg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9YEY/5DXIdBebIgGo48ZCE/j5lHAPHQOOTpmPPTexVk=; b=DflY2eM7eizn4GKAoGATjZOWsNuESipw42Kag4ukZcH38yeojU2MyWsMpsUhTyFuslg2FBsQXRDFtRl80LAP6WcI+sFbp9ds1VsJRnKNl+0saeJil1J/ebG4NQ15go8jd6DkrPd/eb8lkA2ccAbda6Kfcnl6qAKFqsbXeteb3Bc= Received: from PH0PR10MB5706.namprd10.prod.outlook.com (2603:10b6:510:148::10) by CH0PR10MB5001.namprd10.prod.outlook.com (2603:10b6:610:c2::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.20; Mon, 11 Jul 2022 11:15:06 +0000 Received: from PH0PR10MB5706.namprd10.prod.outlook.com ([fe80::bcb9:f224:ac37:6044]) by PH0PR10MB5706.namprd10.prod.outlook.com ([fe80::bcb9:f224:ac37:6044%7]) with mapi id 15.20.5417.016; Mon, 11 Jul 2022 11:15:06 +0000 From: Anand Jain To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com Subject: [PATCH 1/2 v2 RFC] btrfs: keep device type in the struct btrfs_device Date: Mon, 11 Jul 2022 19:14:51 +0800 Message-Id: <9b608b4fb235e95b439233f8fe778c5594da4e4d.1657536723.git.anand.jain@oracle.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: References: X-ClientProxiedBy: SG2PR01CA0147.apcprd01.prod.exchangelabs.com (2603:1096:4:8f::27) To PH0PR10MB5706.namprd10.prod.outlook.com (2603:10b6:510:148::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3fdcf7c6-a710-4f3e-99d0-08da632e9bd2 X-MS-TrafficTypeDiagnostic: CH0PR10MB5001:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: R9SWCFL0Kmn8hMAg41xAVF6fYS/GG5DWtkRrGRo067bnCDH+KBu0touXp/tbPgDmc82Vc2k9YsHdP52Cldn4wIPgFq25Zdxih0oUJp1NnIWyv+giP5NvrTTRn6cT4XWZfgIIkCGXavUz54S8KI3yDBz3/41B2UM0ZsMuUzP3QaxhFv31WYRDwksG4pBovjSRQf+vGpa2G6PG7HgTdXIcx7c6LDgz/ZEyvMf9Hc+HscYBP3X6gJog/coltv09tFjJSPaSXoP+ZS5unajoPuH+hwTMerGntryn8ByaljBuL21GlCuvr9fv2hxO+tCgOlG0APdhJk/ihggVUS6LgmYtxjNr12iSSGaOmHWR/mUTbK9vZ/JRI05kJOEkaclGECZbxIpxdJyEq9oVqflOOqiCPfSlfMCk1l5bgMUHryYHLW1B0vzVYZJiK059IKMtu7NH1VBzmoBSKsBXFw4M8osGJdkZq+CzFSaJSoFtdfN8y2ExeE4tsELve8fYxoL1WwBcT/dVgYe1exF6korahRPHtu/a0JM4D7HhRA1yxcuA2MW77IhGht3ptJ9c8orG/SUAGXeBuUeOJK7+5cfPNKj4KNucd2bgQccuBojLkWF+pePgx7wZLp+kcKMN6L2tvc2iOGk2TgdXHhywAtFZju10SRWngXkiZ3WPA1M4A/J4cikTbCmQ+xOR+EE/lnMYLk+iyMyPx5b3XI1NrNbhHQnrAS5IW7tjpq+QA/MyTu0bVTUyuyGrQ7frRVDGlZUAZi1v X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH0PR10MB5706.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(346002)(376002)(136003)(39860400002)(396003)(366004)(66556008)(478600001)(41300700001)(6666004)(8676002)(2906002)(66476007)(36756003)(6916009)(86362001)(4326008)(6512007)(66946007)(6506007)(26005)(316002)(6486002)(83380400001)(38100700002)(2616005)(5660300002)(44832011)(8936002)(186003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: R3kN9rNNmlSXNnCvQzwOzB0MvObKscxoN1/clrzhOVApIH0ypKrN9e8UxUR5X7BzaDlR5ynguhQ/1STphQ4FvxnwO2eka0JBdU/+uFd3TloSdULXup9nPNPejjCnlwaduFDIbRCsNFFThXYg9ml1LhKp4p1ow1NfbI2ijQOXT3RvvraHC6XwRo/znxRrcCRfVyEX1KruBkV3OmyUsEea2IqQE2bYtJRurNKsu6TCnaK7OD3myXysxDslbHxfKxv8Fw6Lnkb69EKHWdneimvYnWDfMOwqeXjRv3eovZWbTBxj4fBonwmn09z3KQhp5V0xW7Mc+2VEBQ5QG3ncvUm0Wparxbji2iVULdE6fjfB7EqCermmHgZjfQ9Qon+3rtT9Tg4xYg3KiBekVEKyzZAsPawmxxG/VK/ly0Hn5YfQjMzBHFrjp60hcSJUkq3HlFjB8EUCxJ5OX31Ne1SScgU7nc2VaJswxjBH9c8YAmpY3RSCvUx8J3fZSZ5DRoVr9+OJcEHLGqJdezGYJ6Ytdz5WE0kKfTjeu2SuBB4klrCcvSX3uDly3GVn/FmUybaWWYIBZlo7HMvchfgvwHp3IL0bw0/9eq24QHYAxvjO/QvDfTX8N9v5dr1DxVVW8oa5cpjh+q7/bZ93UWxdEAMcMAJub8jeV8x+P/U0L+UTsv9zpBlSAGtrj0fGHjg1BKk3oTy3LlLr7FONzbDcl+14siVRVUHV08B9BCi1NxwcNicJIsjnsXDLvocVelmJfY/rIYGKu/SnDKM2zc2mAzU4mbqGB0KvURNwcKUHdEs6hndXIU+875ZKxpG4LPVdZFlyGfg5AdMcvPEQWZQhnqKI/9k6jBU0JgKNyieUTIUYryqt42gIey2+vQJfabTtLSlUOgJXDYejvfYc7JJ31ekc0jY8Gm4rZ6wtA3T1syJiERy37dtAZU/iQ8CGWmIn3HwE4VifPARLu2jx4btwAwiOm08xyZ9rwlgXO9mzJJvky5QPgY1q/qUYVh5Ni4iHU3E3NUug2f3uTWigNSfi1zlJMEMeNxsILAMJheTFrS3f3JrH0gG9kbZiuAuhi8/yTG1RGCib0HOx1kFK6iPGhLJm1T0pemg1EvXP027SrXYbydOZ7jRwas7/A8dzPOfSkdKnOwq00W/wHG8ssUDYOh3K+rhQkmh5ckqgnIrdISGX6NlDGRzLFIefzMqc5WPjuoiheDK3JAXGKenvLZX2rh9tWpRutGUaBc3xsVUKEpSO7oMiJZHlpDumwTkex3XxfO1fcmI1i4aUvNBQW2iakDq7p3wk7hHI3RxbynigEU+FmrAPjum5i/Eju5feEE3V5eAjqdAhYcNMMccxL/5BL9HSVU1ojGhwnawY5eH2W9tTE/35Adk56eTr/E2BzuIEClpETo5J3E7fzKLalQAH6bIGyvMZqUgFpX6QnbphNkZCosbL1CYu55abO2t+yuergbQnxHJIUnMFkmgQaWf5ZkiE5mlVpBUGu4mSweW6JGsPVzwe1oPj5gXjcYO2FuM/WOrlqcqtxsFaNgJJJKmFyRlQzua1P2NC7Xl1YdjYYnd8rfQm1+5ksO7RU/P3GbE8k9FG26Fw X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3fdcf7c6-a710-4f3e-99d0-08da632e9bd2 X-MS-Exchange-CrossTenant-AuthSource: PH0PR10MB5706.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jul 2022 11:15:06.3417 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7KLcuRxfk3Hj07/ULF5xQSGfgU/UsjxSD1R7lX7QGTqc6UDBJPEZ/lZcfSTZA93dftDbOEFwFIWSu6QEi5GizQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5001 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.517,18.0.883 definitions=2022-07-11_17:2022-07-08,2022-07-11 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 phishscore=0 mlxscore=0 suspectscore=0 adultscore=0 spamscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207110048 X-Proofpoint-GUID: wli2F_lLMbp0VgI-23WBetcy-eDULIDN X-Proofpoint-ORIG-GUID: wli2F_lLMbp0VgI-23WBetcy-eDULIDN Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org This patch adds a member 'dev_type' to hold the defined device types in the struct btrfs_devices. This new member 'dev_type' is in preparation - To make data/metadata chunks allocations based on the device types. Struct btrfs_device has an existing member 'type' that stages and writes back to the on-disk format. This patch does not use it. As just an in-memory only data will suffice the requirement here. The types defined here are the broad classes of the device types ignoring the interfaces used. Signed-off-by: Anand Jain --- v2: Add BTRFS_DEV_TYPE_NR and add device_list_mutex in btrfs_init_dev_type fs/btrfs/dev-replace.c | 1 + fs/btrfs/disk-io.c | 2 ++ fs/btrfs/volumes.c | 38 ++++++++++++++++++++++++++++++++++++++ fs/btrfs/volumes.h | 23 +++++++++++++++++++++-- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index f43196a893ca..ff04653eda9d 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c @@ -324,6 +324,7 @@ static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info, device->mode = FMODE_EXCL; device->dev_stats_valid = 1; set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); + device->dev_type = btrfs_get_device_type(device); device->fs_devices = fs_devices; ret = btrfs_get_dev_zone_info(device, false); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 70b388de4d66..ceef98267047 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3649,6 +3649,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device goto fail_block_groups; } + btrfs_init_dev_type(fs_info->fs_devices); + /* * If we have a uuid root and we're not being told to rescan we need to * check the generation here so we can set the diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 2d788a351c1f..b8ab13127caf 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2570,6 +2570,29 @@ static int btrfs_finish_sprout(struct btrfs_trans_handle *trans) return ret; } +enum btrfs_dev_types btrfs_get_device_type(struct btrfs_device *device) +{ + bool nonrot = blk_queue_nonrot(bdev_get_queue(device->bdev)); + bool zoned = bdev_is_zoned(device->bdev); + + if (zoned) { + if (nonrot) + return BTRFS_DEV_TYPE_ZNS; + else + return BTRFS_DEV_TYPE_ZONED; + } + + if (nonrot) { + /* Major 259 is a NVMe device */ + if (MAJOR(device->devt) == 259) + return BTRFS_DEV_TYPE_NVME; + + return BTRFS_DEV_TYPE_NONROT; + } + + return BTRFS_DEV_TYPE_ROT; +} + int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path) { struct btrfs_root *root = fs_info->dev_root; @@ -2662,6 +2685,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path device->mode = FMODE_EXCL; device->dev_stats_valid = 1; set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); + device->dev_type = btrfs_get_device_type(device); if (seeding_dev) { btrfs_clear_sb_rdonly(sb); @@ -8293,3 +8317,17 @@ bool btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical) return true; } + +void btrfs_init_dev_type(struct btrfs_fs_devices *fs_devices) +{ + struct btrfs_device *device; + + mutex_lock(&fs_devices->device_list_mutex); + list_for_each_entry(device, &fs_devices->devices, dev_list) { + if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) + continue; + + device->dev_type = btrfs_get_device_type(device); + } + mutex_unlock(&fs_devices->device_list_mutex); +} diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 9537d82bb7a2..853c7a2e8960 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -86,6 +86,16 @@ struct btrfs_io_geometry { #define BTRFS_DEV_STATE_FLUSH_SENT (4) #define BTRFS_DEV_STATE_NO_READA (5) +/* The device class type list. */ +enum btrfs_dev_types { + BTRFS_DEV_TYPE_NVME = 1, + BTRFS_DEV_TYPE_NONROT, + BTRFS_DEV_TYPE_ZNS, + BTRFS_DEV_TYPE_ROT, + BTRFS_DEV_TYPE_ZONED, + BTRFS_DEV_TYPE_NR +}; + struct btrfs_zoned_device_info; struct btrfs_device { @@ -135,9 +145,17 @@ struct btrfs_device { /* optimal io width for this device */ u32 io_width; - /* type and info about this device */ + + /* Type and info about this device. On-disk (currently unused) */ u64 type; + /* + * Device type. In memory only. May consider merging with the member + * 'type' above at some point. Possibly, when we want to support + * user-defined devid-based chunk allocation. + */ + enum btrfs_dev_types dev_type; + /* minimal io size for this device */ u32 sector_size; @@ -714,5 +732,6 @@ int btrfs_bg_type_to_factor(u64 flags); const char *btrfs_bg_type_to_raid_name(u64 flags); int btrfs_verify_dev_extents(struct btrfs_fs_info *fs_info); bool btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical); - +enum btrfs_dev_types btrfs_get_device_type(struct btrfs_device *device); +void btrfs_init_dev_type(struct btrfs_fs_devices *fs_devices); #endif From patchwork Mon Jul 11 11:14:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anand Jain X-Patchwork-Id: 12913386 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7276FC433EF for ; Mon, 11 Jul 2022 11:32:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229816AbiGKLco (ORCPT ); Mon, 11 Jul 2022 07:32:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229668AbiGKLc1 (ORCPT ); Mon, 11 Jul 2022 07:32:27 -0400 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 53BCBDF for ; Mon, 11 Jul 2022 04:15:21 -0700 (PDT) Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26BAkd8K008365; Mon, 11 Jul 2022 11:15:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2021-07-09; bh=QlB1y3XGI3+aQTB52hEuvturZM2kMrSJ1ApXmArx4lg=; b=EXO+z4csqf004jWK7TEU00B0DvE+z1jFHZ6VxLZAEBKN9stlOEq7V7jjqOW9TXXXgplo n6NBuMJwiz7Z82L8M+71JSxavu3zwQbjZJ4JZvhlm6r2tWMLLwRzJIXTZAswo8sfvGm7 ywiwRi2DOqdgldm4pTSQFEjoRBbxEq1/XX9uFYVTYuR2zssSXqOhLPV2HTQgeGA6rfTq EQGGo7JD3AA7xbKP21NmQidwzQK2F6Qn3LHnJNXR/SVXusM2mAYcdVPXUF+oHAjlf1S+ huRYkhsfYFFh0gUFFPblHES2siRa0E6a/VvvkxtphmUm9Ufg+PqervetmHK6arSwDfnP og== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3h71xrb3r6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Jul 2022 11:15:17 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 26BB6gFE014269; Mon, 11 Jul 2022 11:15:16 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2107.outbound.protection.outlook.com [104.47.55.107]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3h7041uhxv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Jul 2022 11:15:16 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NpKO23KOstAiN5LBN7JotFloMA1XdjwvRpsn4WM+p0P484qHKUbdIqTYrT9A9DflOroOOxPKoS+y9iwTEXJehWUvTFoU+Uc8hU/OQg3f16QU794iMfdIK26YST8p8AX3nW5xzkQ2D3LlX7jMAb1ZYCUMgJHoxqAqCRvTwuBgMtTawEvzYiN+yZlpGr0neG7hvlZfvaU9JgMxLT3Gg2KyxFB0Fyxvh2usQc+XVnCwJVF+SZThJeecubqgcF2M1NStZgsGin5TF7cSWx75G3JE8WFBZQoM7QFiSAD8j1HQdEW9lfdDKyvOHYQh9be6Lg1ubQU5CnpULLE4Of79VnpOpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QlB1y3XGI3+aQTB52hEuvturZM2kMrSJ1ApXmArx4lg=; b=iX0XOnUO30U7ddJ2/5p4ikwcFG1ANCU1Hlp+GesI6IEu5RQ8qpMIBXiGcXJWGQfdkGIyDSggbsDNtqsriObT37lUMGNKQLn9CLLhDwX23caU+wDtqGaJ8CW0t7/OjbYNer8HOQd3Iosw6Po5tmDV0epdiz0UXRxOzcW8hZQycpP4yw3kzfMefhNz4CP/InQ66LUp7EHU9NO4Y///udDeM6Obk6ZtT6aqsl5Jfy9Zz51KM3v63zxyE2kUkROLx4p+CAFrKHStibqYJVtOjBhtZirPQi9PpZlzDeE3OWqJsy32bhpDYHyzZGc4oM9E4LC9idSVSb9PNwlGcgY2oAdUlw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QlB1y3XGI3+aQTB52hEuvturZM2kMrSJ1ApXmArx4lg=; b=oqjg+ifDay8eN/fNBGD6qGNHIno3UohvdH5bFxmYKdRB125/tUzSdc0Pmc3j7O+kBUWC1BlFJJEopHaPuI9Y/QQ295JA+EZhJLbeIisuXAgBnQGy/JyZIWlC95RtQH3xmZZHXOLloB+PdBY3jxrjAckiLI3dYIgyj0YAkWgVshw= Received: from PH0PR10MB5706.namprd10.prod.outlook.com (2603:10b6:510:148::10) by CH0PR10MB5001.namprd10.prod.outlook.com (2603:10b6:610:c2::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5417.20; Mon, 11 Jul 2022 11:15:13 +0000 Received: from PH0PR10MB5706.namprd10.prod.outlook.com ([fe80::bcb9:f224:ac37:6044]) by PH0PR10MB5706.namprd10.prod.outlook.com ([fe80::bcb9:f224:ac37:6044%7]) with mapi id 15.20.5417.016; Mon, 11 Jul 2022 11:15:13 +0000 From: Anand Jain To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.com Subject: [PATCH 2/2 v2 RFC] btrfs: create chunk device type aware Date: Mon, 11 Jul 2022 19:14:52 +0800 Message-Id: <007dccb0651ea5d278d88d9f991214543c1a14c5.1657536723.git.anand.jain@oracle.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: References: X-ClientProxiedBy: SG2PR06CA0204.apcprd06.prod.outlook.com (2603:1096:4:1::36) To PH0PR10MB5706.namprd10.prod.outlook.com (2603:10b6:510:148::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a7a6c003-4406-4f35-cec7-08da632ea04d X-MS-TrafficTypeDiagnostic: CH0PR10MB5001:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: hDbzEJHh4zlwrsRkQ/GzyU6VgYEFoKKVVUp1IISSSGgMBiif3XdOsVuo9pqTJ5ElytnOCEaRWiIHWo9Mc+CsA/0Chx+stSxLPVVBJUJgzA2QkArXEXno7cmsQuG9h3WTiIjqQ0P4gcR5lEoiIx1czUoEWoNjs/1TkyZ5+XTLWCe58QGG5uD2x/3yS+WUG7EG9kNHfyqckvJGiEcUrTtX44dFaUJXV7kvpG3+v0eLeVUE5Kg5vPNjAgrj37oJP4UfXqQIUa/hrzH1ZB5U012as/l56PXhZ8TqLsqqv4qnAe1eIy/rpTsdc8fKATeFXKQZbAivmqRX2Ztp0aaSfB8nn33+YyFWMTaCdkMvOZbIyZcRDT3x59Zf/lRVqOVe1oESruknkmKXiRJSEZd/U+3cjm2dDf8QGsxTwTyFtP1HKvkj/jaKmJgxBbWxdL3nG+Wdcz+pFb1BgTNpv3DuLOpwHTAXWZhXMKCAo9GXYNdTSIpQtMxUSPFdJs7vV1WLmWp2CCktr/JCcucd6K2jsGy05vcTdA3F59ezvsY9auWYWxcqiDDijRr7VYKkf2UqqR5zXPxPfeMQ1RkNXsFep6+kdfcKAamBvr1OpsQT/dec4YhznM33mu4Vslpc8XeQh26kZmL54d8s9M0alSrxgnbARENp8x0t/WN5k8nCiszS5d97kgXVQRcrZzLA25aAd+/28ESOgkEINPiEDdMO/Qj67v/g5K1dC7HbcDAA2UJIjIaUcemp+WittLTgsGJA4R8y X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH0PR10MB5706.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(346002)(376002)(136003)(39860400002)(396003)(366004)(66556008)(478600001)(41300700001)(6666004)(8676002)(2906002)(66476007)(36756003)(6916009)(86362001)(4326008)(6512007)(66946007)(6506007)(26005)(316002)(6486002)(83380400001)(38100700002)(2616005)(5660300002)(44832011)(8936002)(186003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 5R6RcoYBHxRCQhA1F06a34luYsZ5g1fWlfreQaERw5mRB/1Ru1y3bsDioEOjT3wO3UkiGJ7x4XdX5cU0wZZMbfKQiR02RqoObzh/XpLpkaVaPru71gPe8aapI8OXsJ80lI3IC18/SPCAJeDBL7xhDd2BwfOVV+G6HplChpvUsNZEAJN4nifuAoLSpgCUKR7bmwKfxvRVgZMwXSlW0IfbekuZwOFrvJj221ONBTxOutqJF+hchnxFlOtrzLAAU3h9gCUEk6kKr4APrRkTxrgWmjJSReW5clGykMRz/DRJhnX2Bdd1zAebeMlq1Afu3HY7eJD6gQR1PIYRgOtUZNOhthBOOffBtIcYefSSnmsGD0L020tr2xYjkcJGeD9OmPfG9Uql8uhgvVlL4sFi+1etJnqQe1IUJuY1LuIReELLFuWHDk6K6GpLvcVcGmpdzPRBMW2pK9QtIQWvMm0gdsIsXfzzAKLWRV/Q2UyZUQhgY40m5+vYcVeqj/ak3GtZ1EVck44N9kbLQEsns3Gz1bXfqWZ1+Hwux8fSwVzS1kuar7xZXYjGREu/6EvJxce8LejEVVlB5qz1UguqQ/tEjzfM+iBUc5KayGnKDX0Q6LepStJ6Eox7GUg8FS2GLFMooiIiYYY7gqQlDspT33/dQK7m7xGG2ftxy8YnzDPStHe2oPHM8QEt/9pOaCx42xfiiqlZ+71X5uxv5vFoBxUzHq+BchpOS8XQstLZVO0rKqL8HDz6OhvRGOH23bm6v+haRlAXyTwaxr/CliMQUSYpUO2xv/6CvW440wxVCwtOcQYoqPkZ5srDjLKYnxoOhqSfPk3cFFl8A3z+LfJmDM9ORyUDTo8SldaBN3mrLLAblxOJI5votz4UmDNjc3I4+/HYrpM/CBKEJs7zzA9+b6V+GJYUbNUZqpreJhW91Zd2iOmmE35nvo5l5OfRLrLgbtIZoFKKOErD32vJb6CGsSOjWDzR2rI+VPNfpxLedLruQqen2ar3+sO8ymA0CgaSGlAK2GPu2oN+gGxzclCTg62s+KYsKUxAW9TiLkYfSzST0EhM4feouFKklaae3fMlfYG7koCZ3UHA27p5E0nHvVwRwWRhonuImYl5Sezgk9OaEaOeUMeKorpcRUJUbx/PxPCP7SkpvC2oDMjzM7wLPnzstr+PnN6T6njyG4eG2tWirIQ0nTvTJLLWz8Dna7SPvaFsiLiIgdx8Nlyd7LFlvb3OapobXT+nulNSRWg+c6WU42VjNBuX/Jsr2dGffTKPMwooVKckV8FfjDBcmPS8tNqdfOIZkWKF4SC/XMwI5fYIpPIvci9FUDd1sjF9xqKhN42sBmP9TKwyqoPT+xLz1YkKSmohe7YFf1jQa3JI5rvSnF5lxk4Ln5tsz8XP9GbsHHQPvZ+g8vOoSE074QFJuKCV9o/f9yCGpx7mOBt7WeGJvuFG8qk8olIT4GrHJyiw6muBxhEa+EERxibdy0LMqofhZL70fX2vpbpuot6rHPnhl48q6dGIfRl295yVWwEEkOmerh86xLSucCzxGtYfOFz8CMdAlRYI9FV8aTG2WJNSaxDo0AgqOiO/xM3Ezx4zMEXieae4 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: a7a6c003-4406-4f35-cec7-08da632ea04d X-MS-Exchange-CrossTenant-AuthSource: PH0PR10MB5706.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jul 2022 11:15:13.8101 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: qtTxQl0LPM2hpNvcpmSr1+tHxYlzTdr0S5bONJ46ZV0ncyWIWDcKB8dL1cseqKQPMbJpgZFyzRXVtd0aFcSmvg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5001 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.517,18.0.883 definitions=2022-07-11_17:2022-07-08,2022-07-11 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxlogscore=999 mlxscore=0 suspectscore=0 phishscore=0 spamscore=0 malwarescore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207110048 X-Proofpoint-GUID: wOlTBw5XBr2rvakc4tXMwL_JE2HKSLjs X-Proofpoint-ORIG-GUID: wOlTBw5XBr2rvakc4tXMwL_JE2HKSLjs Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Mixed device-types use case prefers that the data chunk allocates on lower latency device type and the metadata chunk allocates on the faster device type when possible. As of now, in the function gather_device_info() called from btrfs_create_chunk(), we sort the devices based on unallocated space only. After this patch, the function will also check for mixed device types. First, it sorts the devices based on the latency. That is, sort ascending if the allocation type is metadata and reverse-sort if the allocation type is data. Next, within a device type, sort the devices by their free space. enum btrfs_device_types values are in the ascending order of latency. It is a simple static list helps in most common cases. For any user options it can be added later. When one of the device types runs out of free space, that device will not make it to the available device list. Then allocation will continue by the free space next preferred device type. At some point later, we can change this behaviour too by the user option, to fail with ENOSPC or to warn(). The advantage of this method is that data/metadata allocation distribution based on the device type happens automatically for the performance without any manual configuration. Signed-off-by: Anand Jain --- v2: Initialize btrfs_dev_types array btrfs_devices_by_latency to hold latency value. (Kdave). Sort devices by type and then by latency. (Kdave). fs/btrfs/volumes.c | 89 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index b8ab13127caf..838ebf62e517 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -5027,6 +5027,47 @@ static int btrfs_add_system_chunk(struct btrfs_fs_info *fs_info, return 0; } +/* The most preferred type for Metadata is at the top. */ +enum btrfs_dev_types btrfs_devices_by_latency[] = { + BTRFS_DEV_TYPE_NVME, + BTRFS_DEV_TYPE_NONROT, + BTRFS_DEV_TYPE_ZNS, + BTRFS_DEV_TYPE_ROT, + BTRFS_DEV_TYPE_ZONED, +}; + +static int btrfs_dev_type_to_latency(enum btrfs_dev_types type) +{ + int p; + + for (p = 0; p < BTRFS_DEV_TYPE_NR; p++) { + if (btrfs_devices_by_latency[p] == type) + return p; + } + + return -EINVAL; +} + +/* Sort the devices in the ascending order of their latency. */ +static int btrfs_device_latency_asc(const void *a, const void *b) +{ + const struct btrfs_device_info *di_a = a; + const struct btrfs_device_info *di_b = b; + int latency_a = btrfs_dev_type_to_latency(di_a->dev->dev_type); + int latency_b = btrfs_dev_type_to_latency(di_b->dev->dev_type); + + if (latency_a > latency_b) + return 1; + if (latency_a < latency_b) + return -1; + return 0; +} + +static int btrfs_device_latency_des(const void *a, const void *b) +{ + return -btrfs_device_latency_asc(a, b); +} + /* * sort the devices in descending order by max_avail, total_avail */ @@ -5185,6 +5226,7 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices, u64 dev_extent_want = ctl->max_stripe_size * ctl->dev_stripes; int ret; int ndevs = 0; + unsigned int mixed_type = 0; u64 max_avail; u64 dev_offset; @@ -5239,15 +5281,52 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices, devices_info[ndevs].max_avail = max_avail; devices_info[ndevs].total_avail = total_avail; devices_info[ndevs].dev = device; + mixed_type |= 1 << device->dev_type; ++ndevs; } ctl->ndevs = ndevs; - /* - * now sort the devices by hole size / available space - */ - sort(devices_info, ndevs, sizeof(struct btrfs_device_info), - btrfs_cmp_device_info, NULL); + /* Check if the gathered devices have mixed device types. */ + if (mixed_type && !is_power_of_2(mixed_type)) { + u64 cur_index; + u64 start_index; + int start_type; + + /* + * Sort devices by their type. Ascending for metadata and descending + * for the data chunks. + */ + sort(devices_info, ndevs, sizeof(struct btrfs_device_info), + ctl->type & BTRFS_BLOCK_GROUP_DATA ? + btrfs_device_latency_des : btrfs_device_latency_asc, + NULL); + + /* Now sort devices in each type by its available space */ + start_index = 0; + start_type = devices_info[0].dev->dev_type; + for (cur_index = 1; cur_index < ndevs; cur_index++) { + int cur_type = devices_info[cur_index].dev->dev_type; + + if (cur_type == start_type) + continue; + + sort(&devices_info[start_index], + cur_index - start_index, + sizeof(struct btrfs_device_info), + btrfs_cmp_device_info, NULL); + + start_index = cur_index; + start_type = cur_type; + } + if (cur_index - start_index > 1) + sort(&devices_info[start_index], cur_index - start_index, + sizeof(struct btrfs_device_info), + btrfs_cmp_device_info, NULL); + } else { + /* Sort the devices by hole size / available space */ + sort(devices_info, ndevs, sizeof(struct btrfs_device_info), + btrfs_cmp_device_info, NULL); + } return 0; }