From nobody Tue Sep 29 09:08:30 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012070.outbound.protection.outlook.com [52.101.53.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E62673A4521; Mon, 10 Aug 2026 08:35:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350944; cv=fail; b=BcG1tMwCCILXrg7r/9U/dTllt9Gziwi2GN/ZNk/NhuPpJ4HgB3AOmda4nnHwi2fRpBjgf9iL9PBBvCX/XfNrwWRRjesVncwH997hKg8CjPGH2YbFX686iLTMnN4wLhQCUQV7yOhK6elL8ojI9rnnYyv4SFar+XA0ZHV2BR6Mi4c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350944; c=relaxed/simple; bh=/IBBxOTdY8A2ygAuP6hjpUMvkt+3YrpRdUQjh+sefdY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=P7Qoe3EBLHGjdXJUqZFiBAKXrQLfvEV1TVSLN429yqTeFznhS4/N7wfSa5k0B/rhLenRH4HGEPXvmBL1wqFeKreLAsXCe0NOmPO8AcqHH+TPudspbDKCDWb4pJofRVR93/3HKHe1uPBPoSQR97OSQVBNXXt3oeIXjURNjLIfm0w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=XbC6uvuj; arc=fail smtp.client-ip=52.101.53.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="XbC6uvuj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OVvpk0Ybf/UATOb9+OD7Uyhm4XE/KJYmhKfNHhqVmZQ/yZ6htiRhMcwd0AYI5s+ZQTVwwtoMmEXupjUay/MNb16DiTu3xTqrP+ef9nw+LBwP9xLSSwNFrhHKHosh5CpIPJzQ1+hi/xN8IfVlYilaEHYOXiYeuHIGoHOSQIZCkLOmlWgSjyjEkvU2CnWW7MHBFmqAfFct3vkfjE2IHhUnPL4MZUsTGL04VTEg0guhFmEVYqT51Ek3IOJtFRC7QXK2Kz8b9n3tvb3J04SfgKD4yrXSzKrAZsTAQnMsSNfRC7q5+2X06XYdtJb1C0d1dtYztMz2bxSA96rugfHLSJKDhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=7u7dvAPBl2WuKO3iwzYyxwsdySo7yOHzfxH3cCQuXO4=; b=cFeHnRww3PzUQy3wh4Yz/rY1qoJm1pIqhkfkYRgglwOkQz8vC+uT2qfK62pyjJa16qXMeHNsq/gUb4WuQSxY0MxvVb3CMOU3KF9/UFmP6Bx4QWik4jH9AWpLcDaYBSEaPBfdCn+tsXe6iHg9Y4Sb2ccAPg+WNIW116RaWvcM/RLgj77dwEQxaU1Q6wqRlAI/eIL/JtkuaF2lWBMaWS0Bbu1TOvc3yAOyatZlvDdmgNwgroRT0L/5wck7LItPGDtoxv/8wu3MWz7Blp2iH0Fo7M4BTaDqOvEIxcHhTcBdgZd2Yc6gB0aLCgREz3GrmgayqeqlDhN/G9PpCVXgJmc2Pg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7u7dvAPBl2WuKO3iwzYyxwsdySo7yOHzfxH3cCQuXO4=; b=XbC6uvujw/VNbvM/WeTFMgiuM3MchK1+agcR3F1ifPDeoMwFUV+369ZMTbMz3+QyKiRfbzMYpBV3yJe2QxeoEvrVDlqHdPDpH09y49M4/MBmH64MGWVlrun7q3TwKEP6LYAJrwmCoVPN5enl2cEFSiCU9PDNZZNHOR/T+urXBmDopR18532PkRTZUPNQWL1A62miU6m+zGQLMKqy+0mvTpKDxp7ycivyGWNjXRfr5p9wHZpo738q2b+SKXpb9PMNPu6LKEpWTltjHUkIG12awFZvt/FZnJhJpvIr3US7D+HUzGHxjpBzC62YoO/kosvf7KLOPDB//4wP08hNV3UFyQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by CY5PR12MB6036.namprd12.prod.outlook.com (2603:10b6:930:2c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.25; Mon, 10 Aug 2026 08:35:39 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.21.0292.024; Mon, 10 Aug 2026 08:35:39 +0000 From: Eliot Courtney Date: Mon, 10 Aug 2026 17:34:09 +0900 Subject: [PATCH v4 1/5] rust: bitmap: use function-level cfg on kunit test Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260810-chid-v4-1-c9f206fdcb97@nvidia.com> References: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> In-Reply-To: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> To: Alice Ryhl , Burak Emir , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: Greg Kroah-Hartman , John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TY4P286CA0016.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:2b0::14) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|CY5PR12MB6036:EE_ X-MS-Office365-Filtering-Correlation-Id: f707a148-3753-435d-cd92-08def6ba5b47 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|10070799003|366016|18002099003|22082099003|11063799006|56012099006|10067099003|921020; X-Microsoft-Antispam-Message-Info: 9n5rTTsWC3V4RvGcLSkPr5k7ndCG9MGgW8lPjc/7vA5Kg2fDrX1wG8q8n7OOTMwb6oaxhWo+vOoeNOVLTxXBwsT9BaKZhh10p9kQILq6WodhXARVCxAEl0kRvh9EJlXL/EkdUXoyK8Xk6b51GsLrskCmCExdczBLa9M+aKMFJrtfHqiIvshkBZxerNuNy+PIZHEax+DTRYnfyTUpnNDQIN1xxSEd/Pp+C4LqoaIPME7q4wZ3Q2Tiwk1ubzmCiT+VumPOm80RDMM/4D+bWmugCiZzeFW61zqWaTeoBdb46P28ql+yS5wtMoGzTjmFPml5KgZqk7eG39XCI3swfnfKfYNXW4lknzEHgXZLfbh6QO0A1672TMY/DcY24ZFIJt5XdlHIEqPtJoWSm7C5klJYjk71IrR53Hab8fK0SrJTERvPQMuV63vQ17x3JXiETP31HrHmeiOg9uwjLkkezoCPenfQzEZmtlteEsbb62QNasW9bMoMaqDXSGHFavIfW6HbXjB555AdyCVdG1dZzZ4LwHB1uPOoqy7fUGacBRV/naSej4gAGuDuuV8EpInQj1P6RG2pjteijeFUSjuunvrsW9QRlCICQ12kclUv9gJTogp2eg2exREJn9bTtTRgquHjlihHlZ8jtQrWyUGKVuPmRxHe0OBDx0p3pU2jnfwrwCvr0CiAL2NC7RV58qelHjtCRqstZ82pAUIAtfsoMPUQPQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(7416014)(376014)(10070799003)(366016)(18002099003)(22082099003)(11063799006)(56012099006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dVA0aDlqeUdobDg0Skd4cHBQTjZGWTdibTFPUm1JVlF5UGZsNC8wek9pVEFa?= =?utf-8?B?STV5LzlGK000M1BOWFlEUXFsdE5xRFNFR3hBaEU4UVQzdkJzb0tjVmxlWG1s?= =?utf-8?B?YjRWdzBrZTI4WXdWTkFCemlYd0ljMWt6d1JKa3NHblBNSVNzamk2Q1Z2SmhK?= =?utf-8?B?ZTRTaCtlbTEzRnhUenp1c05zcTNYam1uWElEdzM1ZW9xWTlYNHYyRCtUb1hm?= =?utf-8?B?V3k5ckRMaW1mTTVXOVYySWsrVUk1T2NlWmFTaXB6ekI3Zi9QVHhoRG5RbnI0?= =?utf-8?B?Tkh5RDZkK1Zqcm5yR01KSVprTE9IZDMvTlhHKy91Rlg2TjJWWmlmaUlEYzFW?= =?utf-8?B?Wkp4Y0hmVXlWMVE2VTlEZU43SWxLbTByalhBaHd4NU12VlF2QUpyYjh3Wk9G?= =?utf-8?B?eGRiTUMvZlU2WVltejhYQ3JXNWhNeWY1aUt1TGpwRDRxaGxPRW1TY3hPUmZq?= =?utf-8?B?eXBabmdoUlhvL1ZPZzY3ZHpFcEVuVGNXQXh0VjJFTHE0empVbWVHeldRN1E5?= =?utf-8?B?QWVEZGdFZ2ZmTXRvNVlCa3U2dzdoMjIyRThkTjQ0dGhNdmJTUFpKR3FPY2Jj?= =?utf-8?B?b0JZVFVWNElDcWxVWmhFK0drazBGRTY5T2xUd1NyTWVHV0pWRTlVRGhNZ2ND?= =?utf-8?B?K0E2Skh5akVPWWJsaENXR1FVeDVJQ1JVcXUrZGtNS01UaURLa2ZiVWxvbWRP?= =?utf-8?B?ZlhsZ294OSt3YTF6TGx2ekl1TzNZdVE5Z2xQdTJNcmhqTjRJQTBSQ1VGUjc2?= =?utf-8?B?NTFvbUVLVk1CVEtXQkdGVXUvYzBWd2dSdnRCd1g3dzdiQ3VSWVlOOEFyWnN3?= =?utf-8?B?dndoY0o0ZVZqWk0yYTYxRytvTUNmeFNNTjlLZUdHS29FK1N5N0dZcVRSTUpB?= =?utf-8?B?YWI0ODRuTEt4amNCQkpiNVdvUjMwYnQyejRGRmdZWkZQOERUVnE5TmI5aS8r?= =?utf-8?B?dlJnUXlBYVc4c3ljUm45WnlSOEttYnVrc1k3anJWY2lJQUdPRFVudVBxaFBR?= =?utf-8?B?azltdWtsR0kwSGVkMmN4aFprQkhrTnZhRVFZNzJibjNSS0xiRWhYTmhIM0E1?= =?utf-8?B?UGExQjBNL0tVQi9UQWR0aVYzYjZZSEw3NVRoRFJ6d2p3eWtKd2xYb2dNUlFI?= =?utf-8?B?b29nTitTKzlyd0xUQWEzSmZXT1FtcFBjVjEydUV3RXhrZUZLWmp6S252M2tm?= =?utf-8?B?OU9QU2JaTEFaaXJudnM3cm9aK0FnWmR4M2lXaEw2dG5mNmJ2YXQ0VWNuZ3Zv?= =?utf-8?B?SjFiODVwM0hyamZ6V3p3Ulh0dDhuV25lakQ1TmxNd0x0ZjNURUsxckxoQmNv?= =?utf-8?B?NUcvMTJVYnZ6MytZRS9pU0dSRmg5NzdCNVdNSTJ5Y3NuODhNU2RaTDlRazgx?= =?utf-8?B?Zko3VnBzR1VYMGVvQklIdHhGWjJjUVIrai9Kb1hSYi9HMXdIQ1U3dlI3RFBt?= =?utf-8?B?THBxSlNhTkFZOStmbFpLY0lvVVNFWXp2bjRzSHRJcExlTEduVHNTWDNyeXdI?= =?utf-8?B?V09RRFRtYVY0T2dxOEVzczR1Tk41cXpkaWEvK09lRDZDVzNDQWJZbSsrOWlG?= =?utf-8?B?Tll3STFvbWx2SmEwcndRdG4vbmlPeTBvTkhvTENhcHFqR2I5bFkzd09LaWFZ?= =?utf-8?B?ZDljdnd1L2R1cDhEcEJtQ3N3NlFCNkQvU1RXa2YzcVhaTjNCY3ZycDJXVUpn?= =?utf-8?B?UGhCSFFHcFlHZ0tBRi9ic1V0SE1yR0dxS05NSWFielVuVC8yT2poRjlVUllV?= =?utf-8?B?M3NrOGp5RVNaeHVxVUI2TjVWa1htVVN1V2l5MEZVblByUFQvS0dpUVdTTlJy?= =?utf-8?B?QTFrS2JYR0lLbXdXRmp2cGFBa1I2MkRBY2ZwRGZ4Vk5HZ0tJWVJoQ0FqQjFN?= =?utf-8?B?TTZWTnFhQ2NNRTJpN3dreFR6aVRLMlg1S3JjeHBiM0NDL3N4bFhHSTFlVGFK?= =?utf-8?B?bGNzSXZLQ21CZUtWd2pKR2xBRUpwbnhZbFZERmsrMVM5bUR1TFhJK3Qzbmpr?= =?utf-8?B?V0JQYVdDRVBRU1hveW9yc3M0MHZLRmpTb2Q5Z1NwcFhkS3N2K0RUS21YOVRU?= =?utf-8?B?cEhKeE05VzVac2xleVZ5V29odXp2VEpRNWV6MDk0T21ZY2duVFFCSFpQMnN4?= =?utf-8?B?OXU1MDgzVi9nY29sbUkzSXFXVVQxNGE2cTNJdTJHZVV0R3BVS3hlQy9sV1g4?= =?utf-8?B?TGFJcTRkWDdpbjcvVjRBSllJRncvZmhtY1VYTWcrbldBQjZEMWl3RzY4VUpC?= =?utf-8?B?UXorUHhmRXdUMFNhNHI0MkNUMzdYMHRKZ0E4RllHSTFobk8vS0RJMWJiQXZK?= =?utf-8?B?MGNaN1I0TnlaTlMwdWE5K2dOOHpxOENmMmhPK3IxNVhuK3VwYWoxM0NKeDdH?= =?utf-8?Q?ETFpcuhQEwCrPS09trn40lbPyLa3mTxeT66tPm4CIC1Ld?= X-MS-Exchange-AntiSpam-MessageData-1: MXuZJafl04dA8w== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: f707a148-3753-435d-cd92-08def6ba5b47 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2026 08:35:39.0777 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MWqh/tuSZZhB15E785RPihF7JXRhBt5KhAOxY44pzv2ivkHid2MhKq2CXeqpOTSIN6AV8uj/Y1r0w9vTxPT9Mg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6036 Since commit c652dc44192d ("rust: kunit: allow `cfg` on `test`s"), we no longer need this workaround. Reviewed-by: Alice Ryhl Signed-off-by: Eliot Courtney --- rust/kernel/bitmap.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/rust/kernel/bitmap.rs b/rust/kernel/bitmap.rs index b27e0ec80d64..a43bfe0ec3dc 100644 --- a/rust/kernel/bitmap.rs +++ b/rust/kernel/bitmap.rs @@ -572,24 +572,21 @@ fn bitmap_set_clear_find() -> Result<(), AllocError> { } =20 #[test] + #[cfg(not(CONFIG_RUST_BITMAP_HARDENED))] fn owned_bitmap_out_of_bounds() -> Result<(), AllocError> { - // TODO: Kunit #[test]s do not support `cfg` yet, - // so we add it here in the body. - #[cfg(not(CONFIG_RUST_BITMAP_HARDENED))] - { - let mut b =3D BitmapVec::new(128, GFP_KERNEL)?; - b.set_bit(2048); - b.set_bit_atomic(2048); - b.clear_bit(2048); - b.clear_bit_atomic(2048); - assert_eq!(None, b.next_bit(2048)); - assert_eq!(None, b.next_zero_bit(2048)); - assert_eq!(None, b.last_bit()); - } + let mut b =3D BitmapVec::new(128, GFP_KERNEL)?; + + b.set_bit(2048); + b.set_bit_atomic(2048); + b.clear_bit(2048); + b.clear_bit_atomic(2048); + assert_eq!(None, b.next_bit(2048)); + assert_eq!(None, b.next_zero_bit(2048)); + assert_eq!(None, b.last_bit()); Ok(()) } =20 - // TODO: uncomment once kunit supports [should_panic] and `cfg`. + // TODO: uncomment once kunit supports `#[should_panic]`. // #[cfg(CONFIG_RUST_BITMAP_HARDENED)] // #[test] // #[should_panic] --=20 2.55.0 From nobody Tue Sep 29 09:08:30 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012042.outbound.protection.outlook.com [40.107.200.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CD0D3AB291; Mon, 10 Aug 2026 08:35:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.42 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350948; cv=fail; b=bY7uexzgFoKDXUwUK3mEaJwn4sorK3osZXfTl3xP7yWWDvEI9IgG5w97Ot8HgrodeZzv+FIHBUVWVjQfTsXyW/f0TTnegy6tphZNLMOxALemCX2RQbVCpZRS+1zQBdfJLQLVwd3J/jEjnpm0p5ciCQB8tCo36Yqf0iesS+aGixI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350948; c=relaxed/simple; bh=TEke6lcAJU7phO1s4VwG4gjtEsKHOwZO2OixGgzeiB4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=PfWFMVwSMlCz7KC5+OJqrHe6kwKVpEHF5nifrUjMa7o3iCn93PNW5hiXs1n3dyvxb1a5qaDUsk60bTveXsu4Mg4a054ykKFAOnGmUbbCMf9MPyVZvk429H/rsTzXvd5x6v31yf9ewLKtQbr077AWsJv6wpl0WThPEt3z6YSzhVU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=SyWWTSIA; arc=fail smtp.client-ip=40.107.200.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="SyWWTSIA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=K/iIoEk9J07HzrjQfhSG9sHD88LhjssC91DRuVWeL6cTAQlq8xMgMfGJ0ASwfBpqKGGfE31k+jdX3RL90bCWsuw0ZLWM5tcd3l2QEvpG1qBax9fEBOzMreXx8g2hmuyLsEveDa6DuAHXjkjQQenTSeOGmXk0XqhG3md/6HH4i6Km708pLRXyQtei5R857GQj+2JwNqFhJxQYJMV285nuCbMeKO3a5PTxSK6SYr1fHKEtUceCtZygqc3zwoOlRG7/WTloyedDrkPO4bDcrZXFopsuOPBSi9p7OvLNzijwuJZPV5pG882O9dWg4uvjzx9abYy34aZ6nQUOXEsnts+MmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Uj2204dTDoA/COASlUYF+k68w7X/AUy2/BhrHJC5RL4=; b=R9LvQQmJifd0IXRevPQlKn3ODxBoeHu+gcnlEDmhKrgKoRyRIKnsvyzz6/zY0YKENtL8NVqGusCAGGyw3mlZSLCgVNB2YT95k14tTLPhRVhf1C83ObAVTzuAecNZgzwj50R/E3MTJx4dHmOo/a83HlPADclIpdp+gumiZnVjsIkS6CDSmny1c9ziskmrGeNcK12iWd2aazgFHCsNcv1rdkWzWrqLEPAtY+KGTOVD5UAAVJ2+vXGNNkxy/QUGia9c43E4OljTCAXnYfWEdzZbPF1j2pqAXRFRqUvQtQpPJG8aPPEjYeNZc+Wzt4yF9hF1OjcZQJXhFB+Xa4oQtiWWOA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Uj2204dTDoA/COASlUYF+k68w7X/AUy2/BhrHJC5RL4=; b=SyWWTSIAWa5eI5l/L8s9mdNZMJP4ahkNmrLGE70SqB+mu8LMegdypP8NtvLy/oOJUrhSpJQ1E4h/E0nOOTBc2Et2nKUcWs9PEBHEkXUS3zg7lRyaxWMSQIkfB6j6XL0SNwQi413neRsG7ybaEaq5N6thiAk+rcPAoYect381Yy57z5ngLWksjOHEZMJgeUbEW+uj/mAz/F3csft8jZvu7C/3qgvFrTP1m/7cPe5qZnqzk1tPCLjXAN9o7MCGeV/KJlJx/zyaGeJOKYJiDQy7Vvtv2hAj1iA9yLQzYxqb0sODVgfOPNIrdfWGka2b7HGSo9zUXD4A3njsWZbZfShUlQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by CY5PR12MB6036.namprd12.prod.outlook.com (2603:10b6:930:2c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.25; Mon, 10 Aug 2026 08:35:42 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.21.0292.024; Mon, 10 Aug 2026 08:35:42 +0000 From: Eliot Courtney Date: Mon, 10 Aug 2026 17:34:10 +0900 Subject: [PATCH v4 2/5] rust: bitmap: restrict bitmap length to at most i32::MAX Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260810-chid-v4-2-c9f206fdcb97@nvidia.com> References: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> In-Reply-To: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> To: Alice Ryhl , Burak Emir , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: Greg Kroah-Hartman , John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP301CA0013.JPNP301.PROD.OUTLOOK.COM (2603:1096:400:386::16) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|CY5PR12MB6036:EE_ X-MS-Office365-Filtering-Correlation-Id: 8b686e30-22f5-47ad-5709-08def6ba5d70 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|10070799003|366016|18002099003|22082099003|6133799003|11063799006|56012099006|10067099003|921020; X-Microsoft-Antispam-Message-Info: alv++W0nkR+hMAtyUvhGhPpaxLxoa0JlsIlc6abmUK4S43cWlRAxV/K3UiYqqnYsEAP6DCFY14hw9BuBAxc1rYag4FlKWJ7vDMxK7umychUGnKbP8D5C7NYiVfD1e799BReXqmNFD4mcqgIa+vXv3US1eFycX0v9fCtC978OVK0T/tmexwmigrTs+RuYhmmfQ0UlitSP7zC4TVsNLaTx4yYFX6I+9voLtPW24rT4qxgap+eTzMs7b7oVMaTCTTqR+iMF+aC0L2mBHG9DAQwNvqIbvaNo8G0PRTJkU5EIXxri/MsIUf7puG8ylXFYTbWH47cfXuHUk08bStFePnqPrjitzIm4l2SvyxqhrfIkAOQu5yVfmmBFB4/7jBcnnHr2E8NvSg4U26Oh8UBeGRcj5hIXMXqzJPjQBSFKpxySk41afGbak9dixulO8srKy7PzGLZE4bUkRhJWXVKQAlnmh0CbjVWY8qGYICnDiiq+uuVvmHHXbjaVj/O9vPmdXr7Oj/V9iPF2/Nn2qzLAbKRqRXu9Mr030iWGF68NvDjLxLhdEzkQfF3MvS82RpMyZPhLzr8yNZvH/4aACljRkuVPSwmo3eW5oYnPBzufb6CMiUkgBe2zunMhV3u+aRBbc4jrlDsDIXB74FNdsSY1pNx/4c7QcQLVGMreE+Uq9cs2PXgzl/xF9E4hrKAGc/oJqGhiChTPNq/S0xPyD8jW/zqKzg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(7416014)(376014)(10070799003)(366016)(18002099003)(22082099003)(6133799003)(11063799006)(56012099006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?c2VNZXhXdWJNQ2dKWlZzL3M0aG5KTmtCQnRqc2trb2diYllNNHVRdFpWa3Nx?= =?utf-8?B?aUowSnF1YWR4bWNBTkpyN0I1Q1MzMG4zVHlydThsT1lXbGNNNlJnYUNzemdt?= =?utf-8?B?Ujd5OXVOLzZmeStDRHdWMVZ2OTlRM0JPdlc4QnJta0hYSlVKaloxZUU3UTVE?= =?utf-8?B?UkhZTUpQV3dTTGE0MjJIMmhlMkZEV3RKYnhxa1dUQmtPSERVK0YzQXptcFJV?= =?utf-8?B?NGQ1VTlkNmNiV3llNWV4aVFqcWV0QVBxWnduN0FWbGdLSDJCSkNBUTJDRDRW?= =?utf-8?B?ck8rc3F1TVFRWFF1WlJETisxVWNQRG81SkJET3hFOEFNcVJDcXBVeW9BSDFv?= =?utf-8?B?Z09BdW85SEFadEhMMWo2MFpuQUFtRll3alA5R2I1eHJna1hzeFRtU2ZtUXFL?= =?utf-8?B?MFg5SkV6YzZJUWhTL3RDVUlDRVVVS1pWRnBialRUZXBkSjZmSXBBaW1MY3RG?= =?utf-8?B?TXcwTTJJcnIxSUIyQ0ZxSU0yeWFtdWxZWXVFQnlocjJoL2ZVREFuZENwTUxh?= =?utf-8?B?UUQyMTNOaUZLRWlCS3B2cFhUT2QrV2pnSzNCTmdyTjBIWnRDM2FYRW50cnNx?= =?utf-8?B?NmpreDBvdWk2TFM1QUE1end2YjJIdGZzYXpJZXZhMHkyTmJqR25WYUFBOXk4?= =?utf-8?B?ME5MYjlIZEhBaHlyYWRpWFlQT0pnYThxSC9XejhDcHh2N2Flc0VZZE5jOHdw?= =?utf-8?B?WmdPN3VXSWp3SDc4ajRKWUVSa0tCNU1EOUViUzcxK0t1WmI4T3Y0akNpdjI5?= =?utf-8?B?REovbU5EVjdENXFmTXN5MGN6R0tlTHBQK3pvcTJJRVJ1a1E5OGZZRlhZRHB6?= =?utf-8?B?cllVKytIWEc5ZkVmejAycFJFTlZiTGpLaGR5Ylp6ZXN4ZXBIU2hqNEFkRVBS?= =?utf-8?B?QnF4UkZsekdncmZ3OEFYMlpMVVk2SHZNbXVTeHZmdUhxc3lOSzByMnF4Yitv?= =?utf-8?B?d051N2trcTZGUTV1V2xNdTNGbXU0WXVETmIvVUR1bG9JQ2podkNQaFRqaTg5?= =?utf-8?B?QnQwdjZwWS9adzdadTA1WG03ZjVqWEpvVEExOWo2WXhuYkJGUHl1cytWQWhB?= =?utf-8?B?UlpLZGRWRXhrWlQ4cUlkWlFta1dqU1o0eHVTcnpqUzdtNVVwcVN1ZUJVemRV?= =?utf-8?B?NFZWZlFDS1hRdkkyUVpUVlJ5RDQ4bmloVFBjc1Z3dTJqOHI2UDkzQUVzOU41?= =?utf-8?B?dGhwUStTOFhYT2tXeitGZTNEdXFBT0FqVWpkZWlWRGIybFVrUk41K2pQQ1h5?= =?utf-8?B?b2xrSUcxNVRaRVF5cmc2cjdmZ3IwQlduQ0V4UVZ6Tzl3VWNPclFtUUJRQTZQ?= =?utf-8?B?UllMemllSXVZUTU5emZSaDk5bFNNaHlzMVRrM0hGNGIrc0ZwUkg2Y3RSYnY3?= =?utf-8?B?OXgzTG5Hb3NLeGdpNE53VFRuRHFBZXpsd1R1aG9QWnVveEZRbEtJb1NPZXNh?= =?utf-8?B?VmMwOVhYVWhCN3pmVXo5UWFaQTNPZ0pSbzNhZ0pKdCtuUDlLL3dSQm1zV1Zu?= =?utf-8?B?RFFQM1BlZFBaQ0dyczM2Um1IYzZlVlFZNC8xK1ZxUUdIdUY2SkxuNENJZmQr?= =?utf-8?B?aHUyOHoraXFySTlOSUF2Y29vU0FsMjhaaU1xUjYxUkJNWUY3QnFoWG16UlpH?= =?utf-8?B?Nmg4YVkzMmZpa1JVam10b0F4NGVtazlubkcycmRKY082ZGltbWlmWkR4aTJC?= =?utf-8?B?Wm41VDZZcHkyNDAzYlU3dnZKcERBbkRiRTVja015WjJWZSsweEcycHlJMmpy?= =?utf-8?B?S0I2OUJUdmxPTEE3Zy9ZL2NqZEhXc3hlUVBZK0ErclpjWXV4VU92OHhzaFZJ?= =?utf-8?B?dWtRQ1o5eUpGMi9OODdjOTR4NldOaldRaHNvOFpSaWZURllwUjJUbVZ3cytU?= =?utf-8?B?ckZMdVpuZnNvWVZJRHZ6dHQ1cjlJWmsxd1RDY1FyL1dmdTQ2VGErS0RJV3RO?= =?utf-8?B?VTYyaHJ1azNvWVZDTHFGZ1I2ZjNZOWxTUDBIa3FHZmpjb1RaZU94Y0Vya05L?= =?utf-8?B?L0ZDV1E4SVp3eUhpOThVWXc3QWljMnZzR3FZQWlEckE2MTZuckdSWWxrbGVE?= =?utf-8?B?Tk1hdTltQTFwSm4weUowdVBUSHU3cTRuaW9qMlZRZkVTYlo3RWV6TU9xTjUy?= =?utf-8?B?RnZxWi96MXJlUWFPZjNYbUdXRUp6UUdYeHFvRmZjRDFHVjhNS3hUV2Q3SG5B?= =?utf-8?B?c2ZUamxENnlRL0YxWWlvU3BJbmlKbXJ1czBMQnV1T0pFVVVtSlBKTmhscXVJ?= =?utf-8?B?SEE1azJVM1MxNzAwUjZ6VWtSZlpUUVlremw4d0NjWlpNa2krWlFlbmUrY3JP?= =?utf-8?B?dXNkUU1qeVRFOFdtc2VzWWIzcUNWSjZSS1pFc1d0THhIYnVIcDJqUSt2TnRP?= =?utf-8?Q?pszRx//cEWaL4um4PDp2e0N/FtfxmIs54zXlTtZdKdbix?= X-MS-Exchange-AntiSpam-MessageData-1: VYCaQ0+gKPu7mg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8b686e30-22f5-47ad-5709-08def6ba5d70 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2026 08:35:42.6294 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IaysC2AmeX3ew7SymiA4OlPDTiRBfPMRcJVL2YSeInMopdG/drH0puXkDzYK7bIC/YXhVPPA862wh2YHG9rGlQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6036 It is currently possible to construct a non-`BitmapVec` backed `Bitmap` using `Bitmap::from_raw` that is larger than `i32::MAX`, and it is not part of the unsafe requirements. Restricting all bitmaps (even non-`BitmapVec` backed ones) to a maximum size of `i32::MAX` simplifies a few things and matches `BitmapVec::MAX_LEN`. Add that requirement to the unsafe requirements on `Bitmap::from_raw` and `Bitmap::from_raw_mut`, and to the invariants on `Bitmap`. This also fixes u32 casts truncating in `copy_and_extend`, which could otherwise lead to OOB writes. Fixes: 11eca92a2cae ("rust: add bitmap API.") Link: https://lore.kernel.org/DKG0U8RLO7LZ.2I1AIH0S38PAP@nvidia.com Signed-off-by: Eliot Courtney --- rust/kernel/bitmap.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rust/kernel/bitmap.rs b/rust/kernel/bitmap.rs index a43bfe0ec3dc..0d481d761f2a 100644 --- a/rust/kernel/bitmap.rs +++ b/rust/kernel/bitmap.rs @@ -17,6 +17,7 @@ /// # Invariants /// /// Must reference a `[c_ulong]` long enough to fit `data.len()` bits. +/// Must not be longer than `i32::MAX` bits. #[cfg_attr(CONFIG_64BIT, repr(align(8)))] #[cfg_attr(not(CONFIG_64BIT), repr(align(4)))] pub struct Bitmap { @@ -30,11 +31,13 @@ impl Bitmap { /// /// * `ptr` holds a non-null address of an initialized array of `unsig= ned long` /// that is large enough to hold `nbits` bits. + /// * `nbits` must not exceed `i32::MAX`. /// * the array must not be freed for the lifetime of this [`Bitmap`] /// * concurrent access only happens through atomic operations pub unsafe fn from_raw<'a>(ptr: *const usize, nbits: usize) -> &'a Bit= map { let data: *const [()] =3D core::ptr::slice_from_raw_parts(ptr.cast= (), nbits); // INVARIANT: `data` references an initialized array that can hold= `nbits` bits. + // INVARIANT: the caller guarantees that `nbits` does not exceed `= i32::MAX`. // SAFETY: // The caller guarantees that `data` (derived from `ptr` and `nbit= s`) // points to a valid, initialized, and appropriately sized memory = region @@ -55,11 +58,13 @@ pub unsafe fn from_raw<'a>(ptr: *const usize, nbits: us= ize) -> &'a Bitmap { /// /// * `ptr` holds a non-null address of an initialized array of `unsig= ned long` /// that is large enough to hold `nbits` bits. + /// * `nbits` must not exceed `i32::MAX`. /// * the array must not be freed for the lifetime of this [`Bitmap`] /// * no concurrent access may happen. pub unsafe fn from_raw_mut<'a>(ptr: *mut usize, nbits: usize) -> &'a m= ut Bitmap { let data: *mut [()] =3D core::ptr::slice_from_raw_parts_mut(ptr.ca= st(), nbits); // INVARIANT: `data` references an initialized array that can hold= `nbits` bits. + // INVARIANT: the caller guarantees that `nbits` does not exceed `= i32::MAX`. // SAFETY: // The caller guarantees that `data` (derived from `ptr` and `nbit= s`) // points to a valid, initialized, and appropriately sized memory = region @@ -415,7 +420,8 @@ pub fn clear_bit_atomic(&self, index: usize) { #[inline] pub fn copy_and_extend(&mut self, src: &Bitmap) { let len =3D core::cmp::min(src.len(), self.len()); - // SAFETY: access to `self` and `src` is within bounds. + // SAFETY: access to `self` and `src` is within bounds. Both lengt= hs fit in `u32` + // because a `Bitmap` is at most `i32::MAX` bits, so the casts are= lossless. unsafe { bindings::bitmap_copy_and_extend( self.as_mut_ptr(), --=20 2.55.0 From nobody Tue Sep 29 09:08:30 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011012.outbound.protection.outlook.com [40.93.194.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DC193A6F19; Mon, 10 Aug 2026 08:35:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350954; cv=fail; b=PS+ZwMcXtchcmt6V+4e42uw8uVpk59zYdlNFda5QO7NgDnn2kTy8OTRHgG9z0OUZgHeVr7crSdWhmIZdWMB9zS4wzDRXqQ6Skfns/nFvxLGaFxB30y2G82DJTIjeWvbUMZnDBNlWLf5l81bSpB/S51JIxPSifynkij7XBhKuwwg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350954; c=relaxed/simple; bh=I29rGs5lLRJIZtsBn0O8Ukl1RjpeMt94Rh+CujHOObY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=rIfyDR5JHCmajhIoYP0CqjXnFePBU5Qo+pjYuWlIvPzE1KCTDOFwN4Fglr3K3kTXELRjcuylHu0BNf+e8KyPA78pLC6UU1ZMKgYyuhgbctHlrVkTzXm7NeOLg/RhUVltp/u2S6emShlMUodROAydfK3hvjNQEfNxNBk57YwqTy8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=PRva55HT; arc=fail smtp.client-ip=40.93.194.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="PRva55HT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ttEAwlcymxnxXjWmngl62upOXkXS3Iz3970yi8wrmtCmmStX7qvD71SGsarx3VTp2zfUpGiABo+e86PFygDpjhGYP+17wdhGenIoSl0/PpdmEDInOYwbzoDLq+H1gvtuagEQA8YWYFPus/XDpFu6IyYWT0cDYKO2nVD0VcohZLAARnj/MZb0Cn7RdGM/W6z85FQXK15+fslvt94NnIz+kqOyuMPL0qHfZRvdZT79/fASTgqIeia2yqhtdMvGpzNXzJrOlvNBjk3HTm2nZ0PIoRGUwdAmN0DikCJPcow2kLaQeX7Ohyx37sNb24KpcUE+tGMCSb8Q6BLMSZK12WiIdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=7EfpNXYZNQb95qB8zSqk17KFoQZWzSx1vuxImCjgYF4=; b=dpwF55KMsk2EMvDSIopq72+siEPwWpp1RcNDpS6Z2XxX4gJWtPmGf/IP6yuXaVV9RC/xFTWoO4alohnldW8FYu6aqswZp2Kdd5Bz9Kq/oIZ0f0j3sb3SwCIrqeYDdQJfL7h6U+BBqp5/2kTblYsriZl7e9O7YZlfbishp26TeeTo2AGpX+VIRJG5q1aM+d/hZygrc8Vf3PGaSn0CcPWGsOB3WiFDeKQExJGJyISFzGVBQHkV7f6Q4xBLyrbSmOERKPBfsDO4EITD4bu/tXbEnAR8hJGN6+cXqPaFeLMgOtp9lF1o9EZ6dmEdQXWHds2Ni1ynwvX124VHzCNm6ysnRA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7EfpNXYZNQb95qB8zSqk17KFoQZWzSx1vuxImCjgYF4=; b=PRva55HTSppTFjg2dqGN9qLG2zRTEGMmZSDytBnuPADhmFdeLB0KKtceuefymLFY+b+XTyNyh8ou/jdF7p73ZtBSpIc3hpowpgvyxDFGWOjTAajwrZX7VFfat3Vu36nUCKs+AvykAZQTfYtXET6y6qSLd5Smd4NZGJj5/FSOV9zkqRLN4OUjrRtURAEdn/GcZl113Y2lk7Mr6e05DpuMTWkTRD4iML0D3xfvT+17oo9q1k4hRRcxFBXue2YlbV4CUv3K9khfCUrGbyFWVUppDOAwIOYGPJcAOx0PIOzi/p78agwSDgyrChjlYwBn9qKFZtWSixYg8hnTZK8mgUD3qg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by CY5PR12MB6036.namprd12.prod.outlook.com (2603:10b6:930:2c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.25; Mon, 10 Aug 2026 08:35:48 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.21.0292.024; Mon, 10 Aug 2026 08:35:48 +0000 From: Eliot Courtney Date: Mon, 10 Aug 2026 17:34:11 +0900 Subject: [PATCH v4 3/5] rust: bitmap: add contiguous area operations Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260810-chid-v4-3-c9f206fdcb97@nvidia.com> References: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> In-Reply-To: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> To: Alice Ryhl , Burak Emir , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: Greg Kroah-Hartman , John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: DU7P190CA0014.EURP190.PROD.OUTLOOK.COM (2603:10a6:10:550::12) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|CY5PR12MB6036:EE_ X-MS-Office365-Filtering-Correlation-Id: ddc638a5-4c2a-4dc6-9b45-08def6ba60d4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|10070799003|366016|18002099003|22082099003|6133799003|5023799004|11063799006|56012099006|10067099003|921020; X-Microsoft-Antispam-Message-Info: 5WwCriuY2ttkrTPkFYlJPLRC80+5/JIYsO+QWyubD2I0ExjNrhxRRUQftOPhZjMlLsRsJNERXFo1FA/6AmvbPw5PH+Oqs0ZHelaaR4F1Vd0DZWIeWciYt5aoCU1QETEHsijpS5lI61jjtR4tNoGsycC2gqp+4C124NORosZ4Zjo70VfD6MbpXKcXtOQR0wf6zCRoIoC9JXF28Oty9FRQzOKi7Nczy8SAg3ca1l0xWaMfPQ/ze0Sjan0gXRLgV6Ac3xUA+TkvZfxNnmOv6vJxUBdnoQbohd3u0s5qrhi9oPevjHAv/U5iJR+tOOifjuY0t48deKm2lJyu670kAaxlkf02vItEwqUoFIoRys5XapYTdm014/8xzqzmC7dPs6W1T7IN+zoi8Rvqs0GMBx69OxseQ/WFYLQ5vNBKHrKoFkaB5KHbWA5avbX3sIKQcDhYL5g8xhMyqCJxvV51afq0vAVekKn6IasddgZSomTeUfSHTdr0HrWEnkqhpjs+bgZagoWxvfdN10KHW8EqYKyFz3dodDXAJcRuWjbscQPHIKjPYBjHy6mxJit3MzDl6OhZ5YS3LhC5r28aeDyYBtx/cOHp5FMuFK95LFq/GX5Ts7WEtfKnDrN20WJ0EUooJtycCugTt2dyTGr9erGXQjg9zMqsIWoaHxS4n3STSTujgtrxgCZ0mD56JC1i93JmEjHO1Q5uhAVnzKGVUUv8/LYxgw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(7416014)(376014)(10070799003)(366016)(18002099003)(22082099003)(6133799003)(5023799004)(11063799006)(56012099006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UXRuNVM4QTlLdVNjMlYrNFVQVi9yR1JUeE81bElMcmtqczNlaDNxWU5Ndnp0?= =?utf-8?B?QjJzZVkzTmF2M1Ava2w0ekZ1LzdHNm9rc252Q0V2OE13VkkvVkFqRnk3TXZa?= =?utf-8?B?bmxjVUhiejNDVFRPN1Y4cEVFZklKZ1c4aFZIV3FzQXFzaDY2RjJNWm4xb3Y3?= =?utf-8?B?Z3JtWGh0M2ZCak1KWUdnWFFER1c1QXpBdi84eDdUWnQ1YTJWa3FDY2NwR05M?= =?utf-8?B?UjJITHVZWlBEd29pSTN0TWEzaTRWZ0c5RC92WEdveFhPOGZXODRZaDhISWZk?= =?utf-8?B?NThTa21vdklCR1F0KzBQTVV0RGt1bXRuZWNXeGR4RG9PS0J6ZFp1VzZsR0lt?= =?utf-8?B?ZjBoK01CMlplU093ZjN2UlJTWkpYOXorSTk2YjBUM1Bsakw4VEhFdW13b2lR?= =?utf-8?B?NWtHNnpFaysyc0ZwVjJ0dFIrWTVkM2NQU2lkQ2E5YlMyV2JReUdzV1l5cHpF?= =?utf-8?B?SVFyRFJEVGYyVTRRMDF0THFwM2JVUzZLemg5UGxTTW9DZmxvd0V2YkxLbU9u?= =?utf-8?B?eWtjMmNNYllRcG02R0Z6bWRpdFV6bWp2dldHNzhZbzQvMWJSUHk1YTY0a3k1?= =?utf-8?B?UjRVR1A3RjZjVngzWGlNa1BKaTNXejlUQ1M2dHVRaGgzaWdYV201WXNNN3dh?= =?utf-8?B?ZXhVdWd3K21EZytyRVZsaWxzMkpFVGFSUjhEY1hLamM4MHErRTVOZnpkaTh3?= =?utf-8?B?clpTOC9ZUjl1ZnBBK0syNjhOcjQvbWE3b3BUaXNqTXhDNjhIN1U0KytsWUYy?= =?utf-8?B?N0tYbXRxZ1RzVjZ4SHNSNjFqa3ArcHgwcXlHRHI0QjRScFZ4cDZsUit1ZkZp?= =?utf-8?B?azE2cWZ6TXIxTjBFczMvMW44NDJxMjgwbmE1dmxXUVlkNGZpdkI3WVFJa2VT?= =?utf-8?B?TXlNaUpWVjdDSXBjL1YwOElyNXh0bFFOU2xoN3ZwczIreDg1U0hwWWVTQkUw?= =?utf-8?B?SXdLcEdSMzlFU0hmdDdtS0pGczdvelh4Wk9VVmFhdkErUUJSTE5tOUV0V3hO?= =?utf-8?B?NnVvazdKTEEwVVhDQ1c2MFhwc0hIcG5ZSTBmRTVCZ0g0NGZWUFBGa1BCS3hL?= =?utf-8?B?RUh0c1JsK0x2c01GZ3kwUUp2WWUxdVJkZFV4bzBoS3ZDc3dQdFJrS2pBSUtT?= =?utf-8?B?Qzl6RkN2cjNibGNyUEJTVzl3aDVDZy8rOWVQNGxXUHhBSHZBZ1p0Wk5DbFZK?= =?utf-8?B?V2JtRUVuRUJsYkVnMDNPTkFsL0k3d1orb3AyMmJyR0R3Y2gySkovanVVOXpl?= =?utf-8?B?RjM4bEtGZ1UzdHpodm4ycFY4T3ZUYmlNcHFDVHJaUFg3SlU2dUtTb094UWVl?= =?utf-8?B?N24rQ2x1RkFRb0lXTlI4UEpjL1hrckJNQjZFRW9ZWGx1OVVuM3JPR2o4b0VQ?= =?utf-8?B?RzkyU1gzcis0OWRyZWtMbittMVJWK3pqRDZSc2JsQTNQOU81dmFPaUlndFdT?= =?utf-8?B?N3hBUjZEaHVqOHRwYVZpc3F6eitWczNsWkIzeE1IakFhQjZhSjExaHppeWlq?= =?utf-8?B?M2x3dXBqSG5OejV5Q2tXcGZHWG1GOElTQzlrbldUV1l2RTFRNm0xa3NTbWt1?= =?utf-8?B?bGtjcWQ0TlJNRmU5MlpySDZpc2NTZE1qcDl2OGZhcmwxTGk0YmwyZXI2MkF6?= =?utf-8?B?K2lRR3o5cjhla0pINTRXUzY5cjVsVXJBVTZoOVhiQUovU1gwYzV0UjJGWjVm?= =?utf-8?B?aHVCd21pa0JqMHRTVVhSK2NqQjdWR09WZU9maS9zSmVpNzJmZkJLYTdsR1VR?= =?utf-8?B?eEdVcVFLeHBMc2JEL3I3Z1I4U1dxUzMxdDF3SFFhdE5QK1pNT1pKbkMwNmw3?= =?utf-8?B?N2Vwc3BDbUpYM2YzaGdSSkpGcFNUK0VwMVpTemlUb1hjNHN4dTdvbGN0KzFP?= =?utf-8?B?emZvbzVvYTduZTAxajQ1ZFd0eWJOb2xyVXk5OUhITk5RRTVSNFMrWC9yTHhR?= =?utf-8?B?RXByc3NnRGFnemh5Q2dPNG50OFdsQnh2cGxoMlhYOG9GU2grN2JLTldhVlVn?= =?utf-8?B?U05tS0RESGZ6Ty9KeVQrMG1jbzYwMUJFb0grK21lUysvT1pWYVdYMnVDblRk?= =?utf-8?B?NjFBMGpqczkyYUh3SFU4MDFoekZobDc5eWtsSnc4R0tLTnpMN2xaWDNmWDZr?= =?utf-8?B?TDBvYTNRaGI1R2Jac25WWUhlaGU2VUpkM2NXS2w5LzBLelNoTHVHR2Qwc3pV?= =?utf-8?B?UVMrT24yQnQ3MjJTNXpIdW1oRUJXNlhEQ2d5em5UVGk5WHFHODVlMGd2VjVz?= =?utf-8?B?Wm11TW9oMCtDTEkvVlVhZm5mcGxUL1E5TVFzNVR4bXZuS0ZpcnpDb0tsMEtC?= =?utf-8?B?OGIzeVQ5bXQxQ2ZOWktHVzFJM1lXNmR0dEFSb2FsbTFCSkhzUmZHUXJCYTFR?= =?utf-8?Q?J5+fyIbcM0s5pGJpWnBTGfK9rVY9YVThfPCK1kjgTOGMj?= X-MS-Exchange-AntiSpam-MessageData-1: r5LWqf5ZDk6Nxg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ddc638a5-4c2a-4dc6-9b45-08def6ba60d4 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2026 08:35:48.3102 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Z9IKXL00jrKB4z5WKc6uL0dHcUmB6iWLw/LMKTILJkrDQ6oRz/mmH8uuCUOYhQ+w5WxxJ4oMBcrcaFgkD3Qm4w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6036 Add bindings for area operations on bitmaps. Each one is made safe by adding some extra checks compared to the underlying C code (for example, checking bounds) and with additional checks to catch likely erroneous usage if `CONFIG_RUST_BITMAP_HARDENED` is on. Add tests demonstrating the edge cases. Signed-off-by: Eliot Courtney --- rust/kernel/bitmap.rs | 235 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 235 insertions(+) diff --git a/rust/kernel/bitmap.rs b/rust/kernel/bitmap.rs index 0d481d761f2a..a2557e9c5cfe 100644 --- a/rust/kernel/bitmap.rs +++ b/rust/kernel/bitmap.rs @@ -10,6 +10,7 @@ use crate::bindings; #[cfg(not(CONFIG_RUST_BITMAP_HARDENED))] use crate::pr_err; +use crate::ptr::Alignment; use core::ptr::NonNull; =20 /// Represents a C bitmap. Wraps underlying C bitmap API. @@ -503,6 +504,138 @@ pub fn next_zero_bit(&self, start: usize) -> Option { Some(index) } } + + /// Finds a contiguous area of `nbits` zero bits at or after `start`, = where the area plus + /// `align_offset` is aligned to `align`. + /// + /// Returns the bit index of the start of the area, or [`None`] if no = such area fitting in + /// the bitmap exists. + /// + /// The returned index plus `align_offset` is a multiple of `align`. + /// + /// # Panics + /// + /// Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and `start` is ou= t of bounds. + #[inline] + pub fn next_zero_area_off( + &self, + start: usize, + nbits: usize, + align: Alignment, + align_offset: usize, + ) -> Option { + bitmap_assert!( + start < self.len(), + "`start` must be < {}, was {}", + self.len(), + start + ); + + let nr =3D u32::try_from(nbits).ok()?; + + // The C alignment and end arithmetic must not overflow, or it can= read out of bounds. + // Overflow is only possible on 32-bit. + let align_mask =3D align.as_usize() - 1; + align_mask.checked_add(self.len())?.checked_add(nbits)?; + + // SAFETY: `bitmap_find_next_zero_area_off` is safe to use with an= out of bounds `start` + // value and, given the overflow check above, never reads beyond `= self.len()` bits. + let index =3D unsafe { + bindings::bitmap_find_next_zero_area_off( + self.as_ptr().cast_mut(), + self.len(), + start, + nr, + align_mask, + align_offset, + ) + }; + + (index < self.len()).then_some(index) + } + + /// Finds a contiguous area of `nbits` zero bits at or after `start`, = aligned to `align`. + /// + /// Returns the bit index of the start of the area, or [`None`] if no = such area fitting in + /// the bitmap exists. + /// + /// The returned index is a multiple of `align`. + /// + /// # Panics + /// + /// Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and `start` is ou= t of bounds. + /// + /// # Examples + /// + /// ``` + /// use kernel::alloc::{AllocError, flags::GFP_KERNEL}; + /// use kernel::bitmap::BitmapVec; + /// use kernel::ptr::Alignment; + /// + /// let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + /// let unaligned =3D Alignment::new::<1>(); + /// + /// assert_eq!(Some(0), b.next_zero_area(0, 8, unaligned)); + /// b.set(0, 5); + /// assert_eq!(Some(5), b.next_zero_area(0, 8, unaligned)); + /// assert_eq!(Some(8), b.next_zero_area(0, 8, Alignment::new::<8>())); + /// assert_eq!(None, b.next_zero_area(0, 65, unaligned)); + /// # Ok::<(), AllocError>(()) + /// ``` + #[inline] + pub fn next_zero_area(&self, start: usize, nbits: usize, align: Alignm= ent) -> Option { + self.next_zero_area_off(start, nbits, align, 0) + } + + /// Sets a contiguous area of `nbits` bits starting at `start`. + /// + /// If CONFIG_RUST_BITMAP_HARDENED is not enabled and the area `start.= .start + nbits` is out of + /// bounds, does nothing. + /// + /// # Panics + /// + /// Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and the area `sta= rt..start + nbits` is out + /// of bounds. + #[inline] + pub fn set(&mut self, start: usize, nbits: usize) { + bitmap_assert_return!( + start + .checked_add(nbits) + .is_some_and(|end| end <=3D self.len()), + "Area `start..start + nbits` ({}..{}) must be within bounds {}= ", + start, + start.saturating_add(nbits), + self.len() + ); + // SAFETY: The area `start..start + nbits` is within bounds and a = `Bitmap` is at most + // `i32::MAX` bits, so the casts are lossless. + unsafe { bindings::__bitmap_set(self.as_mut_ptr(), start as u32, n= bits as i32) }; + } + + /// Clears a contiguous area of `nbits` bits starting at `start`. + /// + /// If CONFIG_RUST_BITMAP_HARDENED is not enabled and the area `start.= .start + nbits` is out of + /// bounds, does nothing. + /// + /// # Panics + /// + /// Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and the area `sta= rt..start + nbits` is out + /// of bounds. + #[inline] + pub fn clear(&mut self, start: usize, nbits: usize) { + bitmap_assert_return!( + start + .checked_add(nbits) + .is_some_and(|end| end <=3D self.len()), + "Area `start..start + nbits` ({}..{}) must be within bounds {}= ", + start, + start.saturating_add(nbits), + self.len() + ); + // SAFETY: The area `start..start + nbits` is within bounds and a = `Bitmap` is at most + // `i32::MAX` bits, so the casts are lossless. + unsafe { bindings::__bitmap_clear(self.as_mut_ptr(), start as u32,= nbits as i32) }; + } } =20 #[cfg(CONFIG_RUST_BITMAP_KUNIT_TEST)] @@ -620,4 +753,106 @@ fn bitmap_copy_and_extend() -> Result<(), AllocError>= { assert_eq!(Some(17), long_bitmap.last_bit()); Ok(()) } + + #[test] + fn bitmap_area_set_clear_find() -> Result<(), AllocError> { + let mut b =3D BitmapVec::new(128, GFP_KERNEL)?; + let unaligned =3D Alignment::new::<1>(); + + assert_eq!(Some(0), b.next_zero_area(0, 5, unaligned)); + b.set(0, 5); // Now contains {[0, 5)}. + + assert_eq!(Some(0), b.next_bit(0)); + assert_eq!(Some(4), b.next_bit(4)); + assert_eq!(Some(5), b.next_zero_bit(0)); + assert_eq!(Some(5), b.next_zero_area(0, 5, unaligned)); + assert_eq!(Some(8), b.next_zero_area(0, 5, Alignment::new::<8>())); + + b.set(8, 8); // Now contains {[0, 5), [8, 16)}. + assert_eq!(Some(16), b.next_zero_area(0, 4, Alignment::new::<16>()= )); + assert_eq!(Some(16), b.next_zero_area(0, 4, unaligned)); + + b.clear(0, 5); // Now contains {[8, 16)}. + assert_eq!(Some(0), b.next_zero_area(0, 5, unaligned)); + assert_eq!(Some(8), b.next_bit(0)); + assert_eq!(Some(15), b.last_bit()); + + b.clear(16, 0); // Zero-length in-bounds clears are no-ops. + assert_eq!(Some(8), b.next_bit(0)); + assert_eq!(Some(15), b.last_bit()); + + // A zero-length request returns the first aligned position at or + // after the next zero bit, even if that position's own bit is set. + assert_eq!(Some(1), b.next_zero_area(1, 0, unaligned)); + assert_eq!(Some(8), b.next_zero_area(1, 0, Alignment::new::<8>())); + + b.set(60, 10); // Now contains {[8, 16), [60, 70)}. + assert_eq!(Some(60), b.next_bit(16)); + assert_eq!(Some(69), b.last_bit()); + assert_eq!(Some(16), b.next_zero_area(9, 40, unaligned)); + assert_eq!(Some(70), b.next_zero_area(0, 45, unaligned)); + + b.clear(62, 6); // Now contains {[8, 16), [60, 62), [68, 70)}. + assert_eq!(Some(62), b.next_zero_area(60, 6, unaligned)); + assert_eq!(Some(61), b.next_bit(61)); + assert_eq!(Some(69), b.last_bit()); + + b.set(64, 0); // Zero-length in-bounds sets are no-ops. + assert_eq!(Some(62), b.next_zero_bit(62)); + Ok(()) + } + + #[test] + fn bitmap_area_exhaustion() -> Result<(), AllocError> { + let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + let unaligned =3D Alignment::new::<1>(); + + assert_eq!(None, b.next_zero_area(0, 65, unaligned)); + assert_eq!(None, b.next_zero_area(0, usize::MAX, unaligned)); + assert_eq!(None, b.next_zero_area(1, usize::MAX, unaligned)); + + b.set_bit(0); // Now contains {[0, 1)}. + assert_eq!(None, b.next_zero_area(0, usize::MAX, unaligned)); + + b.set(0, 61); // Now contains {[0, 61)}. + assert_eq!(None, b.next_zero_area(0, 4, unaligned)); + assert_eq!(Some(61), b.next_zero_area(0, 3, unaligned)); + assert_eq!(None, b.next_zero_area(0, 1, Alignment::new::<64>())); + Ok(()) + } + + #[test] + fn bitmap_area_off() -> Result<(), AllocError> { + let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + let align8 =3D Alignment::new::<8>(); + + b.set(0, 5); // Now contains {[0, 5)}. + + // The area plus align_offset starts at a multiple of the alignmen= t. + assert_eq!(Some(7), b.next_zero_area_off(0, 8, align8, 1)); + assert_eq!(Some(5), b.next_zero_area_off(0, 8, align8, 3)); + + // A zero offset behaves like next_zero_area(). + assert_eq!( + b.next_zero_area(0, 8, align8), + b.next_zero_area_off(0, 8, align8, 0) + ); + Ok(()) + } + + #[test] + #[cfg(not(CONFIG_RUST_BITMAP_HARDENED))] + fn owned_bitmap_area_out_of_bounds() -> Result<(), AllocError> { + let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + + // Should be ignored since out of bounds. + b.set(64, 4); + b.set(62, 8); + b.set(usize::MAX, 0); + b.clear(usize::MAX, 0); + b.clear(2048, 8); + assert_eq!(None, b.next_bit(0)); + assert_eq!(None, b.next_zero_area(64, 1, Alignment::new::<1>())); + Ok(()) + } } --=20 2.55.0 From nobody Tue Sep 29 09:08:30 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013016.outbound.protection.outlook.com [40.93.201.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD4D83A71BE; Mon, 10 Aug 2026 08:35:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350960; cv=fail; b=rI96UZUj1s1d8Y1GzpmiU2YglgawLObbVgK6HOGQEienKTCYa6dRlIVd1hMRTxLnBRewZdZZ5+3ueOpvPK4nKEh3O76xMIaiv0zZxLmnla0YYGPvy7Ca5kQgeLM7sd/WPbGnsHNNL+T28kCgYTig6uGaOwLhqHO9Mah1c+vpFjQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350960; c=relaxed/simple; bh=rciIy2lr4prGOGGPlEq8Tf4+YnmFt4iVnDhMAuc4LfY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=SidAfOs7YbMOsprpUa6pvbm6PMKtYAIw2gSvtyRcWuJOvXn+QYa5brvU4fzSrsphg6unqMOwuqNDT0A4WWC4JaSYJssFgN+pxwoQbUxHQcNRV52hvLhScYrIZ+PeS1HKTvGd0MJrtxj7S4L0Px6AwqWWsDgU5jWjL6ubbGccLhg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=dSB9DiRj; arc=fail smtp.client-ip=40.93.201.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="dSB9DiRj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CQdd3XuIMP1U2EvN5jnZQ64MjakGx/E1tpED1hzJtjRNpDjji+Na/Z+s/1MUVxkEkJdQRvtiIgpSZK7WXqMHaAcwbf0kfXfjcm26NFF0+h1OwlogbAX+6je/S6LI41FX3pDNqBbTzXQVuY3eWEfrSAmC/1xyK1Xmx2GI4aFYamd7NPTBJHxfLygCDwm3/Q2I1hJ7vJ9PpfzsfkibEJWk7FoRRwrIH2v9J7NeBiyGkEaBkVz4/qGCJ1bqipnpz+6AvP0WyS8YA8NBRh0Ynn8AMHrclC52DaSivh6awpv0VBAgw0OyKaURo8xcAVl7Zl53QKCVCPmh4srLc34osGzvqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=mBWa5tFnDAYid/53BtJQEhxB04OqYLxXPt1H44UHjD8=; b=YT2PFkfYG8nkYeUH3NZLvVbc3n7NgzVM1/trZIdvk7K99ye2QAeoyTCxNRNzY1MBKwb/88iUzQhGUn8fG/nHK9mJHHkk2aNkYr5J1QfyiaKGDglug3YyBf+wt4+zA/3/0VRe82pSBsRuz3prGHEvkZbx3RnFNjCsSADVT0y0V+zhU0lxoDm3vNmMJsuwtdTO+5sK+rCIm20z0oXoM9C+hf5BX4Q02cB/NAB8KlteGfqVaNoAzojHRRksPDou9XqfYlKpkFPVb+nVHdGd7HH5awPXsi1uZyFnrxrTPx9VNWfcbN9cc921MEp0s4GyBSYOQp4bURW8Ffj4BWGoWxw7Ww== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mBWa5tFnDAYid/53BtJQEhxB04OqYLxXPt1H44UHjD8=; b=dSB9DiRjcMAcFC0emLQGEeW9vGYzbMipwzxweZXWa3qEIt+7DMGd9JJPrXskhK+Gx9nXu8BVqdK2fHav/CVYGc1vGLhWB8nC870JX6edHwvAh0AxEH35dOqj0N6fs8ksiwcUy/i5A6Yx3ux6vQik/EI24FcJlH1bC5ooNX1V2CocMivjhhKaO5gXMg2qlXdbFiEeKiY9a74w9o8C8Hn05OzqjmQaG2ILihN6I593iQ3bn7dUY2mx6nKphmJTcQrRFKxED0ruHrw6bLMFkdMn9VlyPqVwEJfuqdew//cdOpfA4XFNl2H+7PifApYruQ94O2G/E47ygvGIXqz5PDsvlQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by CY5PR12MB6036.namprd12.prod.outlook.com (2603:10b6:930:2c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.25; Mon, 10 Aug 2026 08:35:53 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.21.0292.024; Mon, 10 Aug 2026 08:35:53 +0000 From: Eliot Courtney Date: Mon, 10 Aug 2026 17:34:12 +0900 Subject: [PATCH v4 4/5] rust: id_pool: add contiguous area allocation Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260810-chid-v4-4-c9f206fdcb97@nvidia.com> References: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> In-Reply-To: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> To: Alice Ryhl , Burak Emir , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: Greg Kroah-Hartman , John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: DU7P195CA0005.EURP195.PROD.OUTLOOK.COM (2603:10a6:10:54d::24) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|CY5PR12MB6036:EE_ X-MS-Office365-Filtering-Correlation-Id: d1a7f126-966b-4342-e99f-08def6ba63fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|10070799003|366016|18002099003|22082099003|11063799006|56012099006|10067099003|921020; X-Microsoft-Antispam-Message-Info: lDJ0E91NHVmuCf9ZjkSI1NCIjEpUTZS+IRVHlh14I+SvcZhEGVUErqkEVqxPFm9PLdon0NAlln02dcvLCVIuxhkvUJr+6DFZ7kmmINpvHTeuOUfIQ2zw8Kn2vwwiSV2LUbP1ezKjEm09RjAhHQrXx/3Vh6VeK5GO1w/ewyV3q/ZXqYhBmBl++JUVo94KvIn4+RSoIVi/wEsseAQT/k2VNBuaAJIuFcMYBM6HQvzjQRwHRuAm2xP36NI19qhLL1qoB3d49Pdv5MXy3o0lxuSkly84PJZaudJSF2USBj9B9fuKWlwnIJWFyWS53QNef2iR5qwezsJ56zoCDI5/QdZaFQGjCHFCAFCnHgIZisGaxW7k4XEFHpY0dkGEJbAdwr/yqxtQPZLE5sudyZeKxmXPrc+NOr00H6H+GBgIMQ9JlW4DlU8C3yUXG+UI64PK7sDtR5LS3G8Sktdq2CiDa1QOzNs+fDs9hj0z4wSW5LKlnV4SAPlgfrIY2wv1C+yi4IRtXbXrbptAr0MQO98Xl8OvXAcsrERMpMacOxVA6NOKyrpdJOVpqB2YWnnrl7bm8xIlDIY6fpKC/9DVehFN3mW4Qp7QNKBZTTruGGy7MmtrHzTPKyuuSGkSmcrMrpWmAn7Ov3F1PdyBPHh7O2rCWkflbZOrQJSimNBPvH3A9susTWLY94bJSucUToIdqshlqUnuxfQ91Vu5VgmBG8nnon8AeQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(7416014)(376014)(10070799003)(366016)(18002099003)(22082099003)(11063799006)(56012099006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cDRsN3NoL0xkQU9WOS9TUWpmdm4rOFVDVGRXMG01VnNuajNHZ1g0R0I0d2ti?= =?utf-8?B?MEtHazJJZTlOTnMvQ2xNOUxnM3pFVXNoZEw2d0hyYUtmcml1VXkzMUVrd1ox?= =?utf-8?B?YkNBeWFCUnRPWTdqS1gzc09KNjlOL281TTZmd25ObE1mbm1QclNwSWxyUmIy?= =?utf-8?B?VStoRWxtMTRoUG5rbjZpdkpsMUNRWWl5UEFrTFlucS9TZzFHZ055RmdoVTR1?= =?utf-8?B?VDYzVjU3dVFMaVRrN3d6a0RxWGRkNnRXNXRFU3pyR291dnBvWTF5Mk9DNUlG?= =?utf-8?B?c2JkTmFGbmVNbyt1cHBhOUZMSHZCSXRrbEUwaFNVSE56ODZvVzh5ZmV0YWdw?= =?utf-8?B?RXNzS1BwYUhNeHY5MElMSndpQ0lxdkpvTnhyZkJpU0hMeUl0T28vSlFkRlQ0?= =?utf-8?B?bnhjT3l0d1BFUmk1YVdOWmFpVHpMaGFuSjhKT3d6T2NqRGwxSXd0YzBpeDhU?= =?utf-8?B?cEFYTUNYdkw1V1hGRG13U3dRa1oyZS9jejZBWC9taFRMZ09idk5qNDZmRGo0?= =?utf-8?B?bEFLR0VsTE0rSU0vdGdmdGlIa2ZaMTZrV2duNkE4T2pRYVdIZTJvVUQyUlhz?= =?utf-8?B?aVZaaXc0Y0dScXA4RER2S1JXNzc2WCtSeWRsUUVvVzVqNm9BWjV6OVRpV0pH?= =?utf-8?B?Ly9TZVRCaEV1Z2MrZk1Fck5LY0xUK0RndXJPV0Z2a0xKQ2l0d0xVcUZ0Snl1?= =?utf-8?B?QkhvV1ZQNkJuT2RTLzRldm5XTzU5d29ETDc5S2tJQUdUUTM0MCtqLzArTkFC?= =?utf-8?B?ZTlWaTVzVit1RUVqS0hpRGVDa3RNbUwwbFFJdFB5Vm9IanNudmU1Y3dBemQ0?= =?utf-8?B?RldhQis4TTI4VWp6WHYvbHdGMnpjUkJ0amZoaXM3MTAxazNNc2FQRGpIM2RQ?= =?utf-8?B?VnpoOG5tTVUxTTE1RStUblFnMjRLMkhteVE0M0l4cUdZVXhaSXhKQjJraXFo?= =?utf-8?B?c0Nkdk1RMnFFZHpzZ2NoeGtGVW9DQms0aThMYkdTSjlmM2hRZnFrK05UWU5k?= =?utf-8?B?ZnZjY0xPT05nMGE0UHp3S2VYRFdsMi9NZmVEdnlNWngweE1xeE9xZk5SR3hY?= =?utf-8?B?NG5xT1c0K0xTLzJKbTM1dW1DNVB0L0dMYjh2YW4zUVhtaWpGdjVkSmNtY0Zy?= =?utf-8?B?d3lzQTg0ZFc3MklWQy9Vai9RbGVQRUZMc3lFbVZWQVR4RUxTQkNNWEZKYmVO?= =?utf-8?B?OVoxNTJsMDhHdHoyYmg5NUxiNEQ5bVhMbjNLRndDSjAxNm5QRW1Dam0xTUJx?= =?utf-8?B?blQ4cm5wekdGSUY0UXYwQ25naUdabHMybTV2c2tsek5jdjl2eUZORytnSUx2?= =?utf-8?B?UDRFT0FGWFFzbkU4ZVQ4K0d3dEtnb2lzekhGWXEwc3M0Q01hTTU1ZG82NStD?= =?utf-8?B?V2JKcEJJSmgyVnhDN3MxcXRabHgzWlF6WGx1NHR1MHdoUDRsMk13ekJLbkhV?= =?utf-8?B?UWpOUE5TaVZNMzM2Y3hGTXgwSXVqUHc1MXNkeWtGQ3U5ZEVHeXBWQmNlLzhu?= =?utf-8?B?dCtqYVJ4bjQ5Qm11Zmx1OXBhYXljRTZqaVRadExZeUhRaCs0SU16M2tLdDdE?= =?utf-8?B?MWNnVkMzTzY1ZnNsOFRuaStHZ24xT01NL1FqTVFYQnNFT2lxb3d3ekNpZTgw?= =?utf-8?B?cEVqMitRR1pGUHlEZlplTjFlZy9sdVdCNzNoRDNQY3ZqSkJCYTBDR0YyL1dl?= =?utf-8?B?TWhtSXBVUytUV2lQWkxURjI5c3FaeUloNzdsUlIxZVF4SFZybDNqUnJtamdE?= =?utf-8?B?MnZjOWdpSDB0V2ord2dTeDU5OWZ1a3VGRWFTaURDRWR2R29oaEN3aVdQVkVp?= =?utf-8?B?YTQyR1g5TlFBVVU1bjhkbzZkNi93TlFFV25qOU5WTnQ0eFNQdURiSFNDaWFL?= =?utf-8?B?TlVFRlBYQWVpU1pvaSt6ODdLMmJDa3RYcGRhSERuM2Q2Y0YzcGxEZEdKaTNG?= =?utf-8?B?OUZwS0RuK1ZvaGt6QXVwTEsxRTBySXVMZjh6d0VDV1JmNGlTZnJnMnhwT3dY?= =?utf-8?B?aEN0L1dhNWZaZFhrdWh1R1BLY3dXd0NLd3IwTS9EZjQwR09hbHRpaDV0Y0Zq?= =?utf-8?B?UUM3N1BMU0p6cFJRRVBEODN1bWxUMWIwb3RYYm5xYkM0UWYwSUhNRUtkYU50?= =?utf-8?B?Z2pNU1BLU3pGYVpzT01xMlJwcGRQVFNIWVNOYWFaTWlEMlJ6dEVDc0tXb2d5?= =?utf-8?B?QVR4cWZ3RTkyRzhFanRqTEk2aUlnV29yaWZXU01zTFk0QWJwSEZHaWl1NWZy?= =?utf-8?B?SXBESmRKK1Q5OExTMEIzS0RNUUk1SzZNVUJ4aHhNZFQyYVNyRjNtVXNRM2tq?= =?utf-8?B?d1VMbDRXVnJubEwxaDhReTAwY1U4eVpQRE9NWTNzMjFNUlJJajlkQk0yb0ZG?= =?utf-8?Q?RfrwMWLTlSfhdtL6j+9DXaZZQ37jtIVHD5VpRkiVPPu0y?= X-MS-Exchange-AntiSpam-MessageData-1: uIs5rj6HTcE6Tg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d1a7f126-966b-4342-e99f-08def6ba63fa X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2026 08:35:53.8143 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: tVnM94s3DsMXddvGULexX8KtsImRGbpOni0RHX/jiVIZ5rXdC6eRdlMF6oTxasPdfVbgl/2azTKYJY3JJStWwg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6036 Add support for contiguous area allocation. Add a new type, `UnusedArea`, following the same pattern as `UnusedId`. Signed-off-by: Eliot Courtney --- rust/kernel/id_pool.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 69 insertions(+) diff --git a/rust/kernel/id_pool.rs b/rust/kernel/id_pool.rs index 384753fe0e44..eb911a0e3217 100644 --- a/rust/kernel/id_pool.rs +++ b/rust/kernel/id_pool.rs @@ -4,8 +4,14 @@ =20 //! Rust API for an ID pool backed by a [`BitmapVec`]. =20 +use core::{ + num::NonZero, + ops::Range, // +}; + use crate::alloc::{AllocError, Flags}; use crate::bitmap::BitmapVec; +use crate::ptr::Alignment; =20 /// Represents a dynamic ID pool backed by a [`BitmapVec`]. /// @@ -240,6 +246,33 @@ pub fn find_unused_id(&mut self, offset: usize) -> Opt= ion> { pub fn release_id(&mut self, id: usize) { self.map.clear_bit(id); } + + /// Finds a contiguous area of `count` unused IDs at or after `offset`. + /// + /// The start of the returned area is a multiple of `align`. + /// + /// Returns an [`UnusedArea`] upon success, or [`None`] if no such are= a could be found. + #[inline] + #[must_use] + pub fn find_unused_area( + &mut self, + offset: usize, + count: NonZero, + align: Alignment, + ) -> Option> { + let start =3D self.map.next_zero_area(offset, count.get(), align)?; + // INVARIANT: `next_zero_area()` returns None or a start with `sta= rt + count <=3D map.len()`. + Some(UnusedArea { + range: start..start + count.get(), + pool: self, + }) + } + + /// Releases a contiguous area of IDs. + #[inline] + pub fn release_area(&mut self, range: &Range) { + self.map.clear(range.start, range.len()); + } } =20 /// Represents an unused id in an [`IdPool`]. @@ -287,6 +320,42 @@ pub fn acquire(self) -> usize { } } =20 +/// Represents an unused, contiguous area of IDs in an [`IdPool`]. +/// +/// # Invariants +/// +/// `range.start <=3D range.end <=3D pool.map.len()`. +#[must_use =3D "the ID range is not reserved unless acquired"] +pub struct UnusedArea<'pool> { + range: Range, + pool: &'pool mut IdPool, +} + +impl<'pool> UnusedArea<'pool> { + /// Returns the unused ID range. + /// + /// Be aware that the area has not yet been acquired in the pool. The + /// [`acquire`] method must be called to prevent others from taking it. + /// + /// [`acquire`]: UnusedArea::acquire() + #[inline] + #[must_use] + pub fn range(&self) -> Range { + self.range.clone() + } + + /// Acquires the area. + /// + /// Returns the now-reserved ID range. + #[inline] + pub fn acquire(self) -> Range { + let Self { range, pool } =3D self; + // By the type invariants, the range is within bounds. + pool.map.set(range.start, range.end - range.start); + range + } +} + impl Default for IdPool { #[inline] fn default() -> Self { --=20 2.55.0 From nobody Tue Sep 29 09:08:30 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013021.outbound.protection.outlook.com [40.93.201.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07B123A5E8F; Mon, 10 Aug 2026 08:36:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350964; cv=fail; b=UEvhZ+JfY0fNr9krAX7sGXppsEBlgAe6wvOhUMeYsFz801tb/bdFpb+KvrEpu93fjSk78mKHFYHYUMGJfcWVLDjHqtojEXCHAU+GGAu8yirdE+hYByrZmEx045V9fmA7L6hF8sG49xXazPVBzk7IaMzOS5VqA0wrKSjc8t5bgWc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786350964; c=relaxed/simple; bh=CBRJK9QDKkwtIHAPU3IaTh14bAJrWIGItKf60vdLGzQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ki2o9KEdSABdmgZEEARBDSb6g2aB6DpVbzOUnF0bqTwv3A1vbBImX+6ylV4AHv4aScDrQNnkPFh7Dd3gVhbVlZZYQoUygV9u9HMBWeEabAGK+cn8ffXaWyy4sqhqdqSshYTf5H2UIYOKBbRVtrAmY9YXBYbP+k6fXtEHD7bPNew= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=p0dCm9X1; arc=fail smtp.client-ip=40.93.201.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="p0dCm9X1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=txh42d0BQM+NuNd4hbGnBen9s1fFvs5J1vxgGCtJ2wX60ane2y4w0i/PhCcyiKIGK6KN4qn/PV4382/BGu/omGO+Y3Pshbj0eTzcnA4NCjaBqzbZ1oCy4I7Om1auPbbxgehCJXw+nrWMTWuYnC5dSasVd9Toonn87kPCbHVl5XbZLD1zJ6pudp6jgUDYy/ga1xvRu8I0qJHAfJx23UoE/cSSa6mY1SZAiPQRMy8OS8ur8d6xz3zful9XYjRrX57edP30HsKj1qeKCc7Q4kXba5w3o5JaXnDJpDS9tLOVMtYyxBfbMJt5XzNjc4UdzN1hj9Bb6awCBoMr55P6OwIpsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=kYYa87mvZyrUbfsj52KaS35BAILXm/I/ciOxRXaZQOs=; b=YycZd9YFfxcPi1f1T0n2GpYYGLrjTHSqDln6bGRalyKlnj8j79AmKh0QNTIv9F6EkNOew0zsOnrL2Cn3K7DhXdJRnCYHMgxreyx2eISZWIaHWe3ZXtAZC5hFm0RNhzWf78tX3duwz4ha1kMBTAR5QZgbSHMfA63zwMdqsmGWEuOXkcHddEKnl/gYOdqIvYX8h98iKjJ/QEau6N3tblesy4wOUYUU+mofmYH4PGAabZ37NI0QgSj07A1dWKKLu8fFB9dSqfkOHJEznrAEb0mc795s3s0uXctLfDiHtJKqPzVvztJ+mqBjfuPuca7jI4Va4vhkaNlWU5UZxWkygQXOcQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kYYa87mvZyrUbfsj52KaS35BAILXm/I/ciOxRXaZQOs=; b=p0dCm9X1os+VRuqyReqO67cIEYzJhvJ67enNxRuXCYC0PYqUcOE0CdVmPu/lm5+pKOB9ZB1LgLmNiqxZuZCEogaCfljDdUXM500UyKpxeYCPb/CtrWWktnCBu3r/dCb49b+dzF+GeRNePOPizEgU9tZFRkOAUi/a2FyuVoxm4HFGgbyQ9xXT7baBMfnyPxQjqv1aKLn/du52wCOhLssegzhQ7DsX/nABQ1Dpl57fEffgyuLb9MhGyxZPJhncpV6wPG0//noNqdRfMow6sgchYSk4VrK3KNDzRWU5OF6syABeeBZHXL/qS8ONtfnSVjAxE2stloSRiul5yk+y2TpuWQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by CY5PR12MB6036.namprd12.prod.outlook.com (2603:10b6:930:2c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.292.25; Mon, 10 Aug 2026 08:35:58 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.21.0292.024; Mon, 10 Aug 2026 08:35:57 +0000 From: Eliot Courtney Date: Mon, 10 Aug 2026 17:34:13 +0900 Subject: [PATCH v4 5/5] gpu: nova-core: add ChannelIdPool Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260810-chid-v4-5-c9f206fdcb97@nvidia.com> References: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> In-Reply-To: <20260810-chid-v4-0-c9f206fdcb97@nvidia.com> To: Alice Ryhl , Burak Emir , Yury Norov , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , =?utf-8?q?Onur_=C3=96zkan?= , David Airlie , Simona Vetter Cc: Greg Kroah-Hartman , John Hubbard , Alistair Popple , Timur Tabi , Zhi Wang , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, nova-gpu@lists.linux.dev, dri-devel@lists.freedesktop.org, Eliot Courtney X-Mailer: b4 0.15.2 X-ClientProxiedBy: TYCP301CA0055.JPNP301.PROD.OUTLOOK.COM (2603:1096:400:384::6) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|CY5PR12MB6036:EE_ X-MS-Office365-Filtering-Correlation-Id: 00e886ef-4fad-47d7-b2e7-08def6ba6680 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|7416014|376014|10070799003|366016|18002099003|22082099003|11063799006|56012099006|10067099003|921020; X-Microsoft-Antispam-Message-Info: FBBe3P8NGneQbJoOEUxL9FY5Or5Ur+USjGiwdArFsl9r7kKeUuntMjC9X65vWcndLnAjLntKPCNmQWzgmzIeO9bmzuE/E1O5aWxOpu42koeFznWDifrF7rLAQWrpCsbkVXDSALo3H6o2GwhN94/+2XCPIqleV9lz/gdWHGUHlvFuiL5K+krPhvgB7Uc1Ei0DPFYBAlvAEPwBWPpQ0FpzDqbnF87hUWjsDa/MXL9wzCY6O68x3rd2XgGn9UUgR0PwZdpvbchzsBYl1F7zDelVuvYjQixQTpZymcQEQeiAYij/H/uweqLl4Td9qH4zCIAE80T0/k2I1LHEy+gf3pjmtCxzh+iWoe/CBK/10ScAM0Y9AQ/Gr5r6WNOWhbRJJubhntSoEcrNLtShnkskA6GyjwRHvH62uFqN2J7lfyvnGHo3aMPIcAzzu8inJYI1QHyd7jMatcMiZhYlr37usKyKUbPE/pqWRJGT6HyGyC13GJiuG2Qx7ovdCBtzxU81z2ftiEiMmv8NkQdquyIYQrwtf9Y+L4AGQV1wx0Hg79Q8eP4UpDnvQnelyBgGIGUknyVLzN5h+g6fE9rHiWMRLCBW+06iFGwK5Tvu5Ae/xP66J/AmrD8mHNnNy7L+SAefbeNqvmkkkcjYV2cjNDKYsFt4+RI6bXy5WvK52gPg2IOHKXR7ER+gc3YAtHsrykudXLccE90ycy0QV0v7PBq3XIDbMA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(7416014)(376014)(10070799003)(366016)(18002099003)(22082099003)(11063799006)(56012099006)(10067099003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TytDRFRjQU4wL0UwNWJPbFpObnpnNEdFQ0p0M2N6SCtoZnFjZ3FtekNGV1A3?= =?utf-8?B?RmNpaUVZT3RBcUZEclVJdWpEWHNvUDdKZmtMZ1IyZjBxRTNPcFZVWk5TNXBw?= =?utf-8?B?R0J2NUtFd1p5TzFtUHdEQnVMVFlHRlBHWnk0MEJKeVhEUm5ZOUY2L2xQY3NW?= =?utf-8?B?KzVzTmhMaER6NEpZdVZUbTJpWHIrcTFmenZmd0hZRFR4VG54bFBYOHFnQnND?= =?utf-8?B?UGMzS0Y1aEI3TDBCUWlJU2dxNytyOWVyeC8vRy9QRGVUam0rOUJSOE81aWps?= =?utf-8?B?anUwMUtQRURoUTZKUStMNnNKRVY0bm1jSHBuNG96cmNyQjRmTHM2WHprQzls?= =?utf-8?B?TmszSVlUUVAvTjg2RUgyTUlObUpTc25ydEtqM0VwNVRKdlVEM0xlYWxObXBh?= =?utf-8?B?ODlTSkdJRVMvbGk1WWhodTJtcG9IdUVTeU5KM3hML2kweUJpM0tScGNFa0tD?= =?utf-8?B?T0JVTDBWUG1DWTQ1RWZRMHZGMFRnTlNNalRONVRremdHMm8xWGZzSWdiVjNh?= =?utf-8?B?OUJaaGdPRUhvbytiWlZwWjl6SXJpYnh0OG1ZNE9KbkR3eFYzaEFTaDc2dHBh?= =?utf-8?B?NlRsblM4SFFxUG96T2RTTXZCQy9sUDVIUTNsQXlNZ3F4MVJrK2dGVjFBdFRx?= =?utf-8?B?ckdsdXl1c2lSeWEzS2xaTzlka3hFalE2ZXd6aWMwSUw4ZnVmVzRYOEwvT1NI?= =?utf-8?B?NUdRQnc2bjJEZFpkNVFGeVMvYm9GeXk4R1pyWWk2dEtrQUNZak5pa1ppRVkw?= =?utf-8?B?a1RLekk4NWlCV0x5UzdIRUlyc1U5REhoRzNvNFU0aGFNRUZ6UU5SQWFhUkNv?= =?utf-8?B?R2dLU05FcjNoK20vKzBjR25VZG52UUwrRm5vTVV6em1kUnoxUGV6ZUxOa3RS?= =?utf-8?B?WHdBQktNTXR0WjNSR2Z0eXZBWmlSYjIrVDVSWG9ISlpxWkZyaTRVcjV2Y3hZ?= =?utf-8?B?STY0dGU3RWwzWFp0WDRwWE8vRHYwNVl1R0RXVEQvMTFkZ052S2VXL2cyZ0V2?= =?utf-8?B?UVUxN2hmQlg5V29SM2YyTDNNcTJCMXVHbEtSZy9wd2Q4Y0psZWtpeDVZZ2hj?= =?utf-8?B?UDdsa1RpWXU0TFE5b25zeGEvcjFEOVVFa2d1K2dBalJNKy9MVEtUNVlVTDZp?= =?utf-8?B?MSt4dTU5b2lNOEVESWRXN2hOVWZlTmZoUXZYZTVuNm5QYUYzNnF1bUdTcktQ?= =?utf-8?B?TVJTL1hYN3M0WFlKSGVpMnRKMmZlMko2Q09hNi9QVUFBMER6aVhNMGhqOEdu?= =?utf-8?B?aXRHcnhlbjdvM3FLZFMyeVg5ckhiSlk5dE54NlYxUk9VcTJ3c0NQTWdxN3Ni?= =?utf-8?B?YVFvbkpGeGQ1bXVXNXZvdFRyZUJxeUxQYXhjTENacUJtM29RSEhTRnFaQmdV?= =?utf-8?B?VWF2VzMxYlBsZVd0Y25JaWFSTGN3NzUzVzFHSG42R1VwVnhBdUJLSndYSTZs?= =?utf-8?B?bXBBNWY2RnRTUHFLUjF5cGJPbmZ3b3p1M3BBZnkyUlFzRkx0QXVRRUtiemFm?= =?utf-8?B?bU9mZW5xMk52dVludEVic0J0c28rMzBoRnh6TDBsWmcwNzkzQUwzQzdmUjZW?= =?utf-8?B?Tmlwa0p5dCt4czdPbjhoMmFpNE40TDB6ck01cjZ3ZkRkZG9uN25UcFloSU9x?= =?utf-8?B?S2lRQXVTdTVwVmdVQnV5MG5aMnAzWGdxbStheFdQWHB1cGRWOUlpdGx5QlZz?= =?utf-8?B?RmovdUNGbFBhL090b2tsWC9FeHA0MHZ6MGdnYkE3YWlpVmJMVU9za3dYaGND?= =?utf-8?B?RmhJRVVUYXJBYlhXNFN6WUw5RkFHVWRIOFFZdlRUclpSNWhIK2FmbGlGbXBU?= =?utf-8?B?WGljVlF2VWs0K2ViRkFiMkFUQkpqQk5FSkNMS3k3VDQyVk5EWHFUSkQzNDBo?= =?utf-8?B?S0dEdGwxYTRJeXFLQUxvakRqSzhhWUx6d0EyUXJGbXRid3U3UTd4bUNBWGdT?= =?utf-8?B?MXg5ZWNMSEJsYko4Ujcrd01xSWJnV1pHMzZiNXZqVFZveldqRVkxSk9lVktJ?= =?utf-8?B?TWxTajIyR08vMSt2RlJtaWEzVUdRYmRVYVpXK1dLNUJIaTQvdWo4aGNJYnZn?= =?utf-8?B?NTNaSkIrVFlnRXAraGlJTjk1VTVKZXp0ajhId2JpelFEZXIxaTJ3NFRYQ3Vy?= =?utf-8?B?d1hxN0R0dmhLUFJPQmFNYk03aStKTE1oK1ZKSWorSzBwenUvVDhQRWNGRmJz?= =?utf-8?B?ZzBvMmVQQVpzbkJaWFRyTDViQ3o4QW9zQ29SWGUvZEQrRTJHUFNOd0dSeTVQ?= =?utf-8?B?di9vc0gyMjVZUk10RTdlRjgrb1RBbm5rb3FjcDMzejVGQWVyT3BTcHpyd2xJ?= =?utf-8?B?Q1lMQUFxN3lOd2lZQW5DU21QL0VPRDVaeWh5UzlLT0o3bHVodEhiRVJPVHQy?= =?utf-8?Q?yVc8JWj3zLwPDTtaInr42WGq7DEVrmgoioaORSsn1H5Lr?= X-MS-Exchange-AntiSpam-MessageData-1: keBzgFUCeyw/hA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 00e886ef-4fad-47d7-b2e7-08def6ba6680 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Aug 2026 08:35:57.8406 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pFHXsaKPQgmh2zNv+grJyj1BLfG8gBmya1b0IJ9hI+H+gD52zJBIppd0kXrkFwTQbQY7JicnA6BRLvOORkAy5Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR12MB6036 Add `ChannelIdPool` which adds automatic tracking and releasing of channel IDs on top of `IdPool`. This is necessary for apportioning ranges of channel IDs to be used in e.g. vGPU. Channel IDs are allocated as a contiguous sequence with a specific length and sometimes a specific alignment [1] for vGPU. The ID space is small (limited to 2048) and allocation is not on a hot path, so a bitmap-backed `IdPool` is a better fit than IDA/xarray (which allocate a single ID within a range, not a contiguous sequence) or a maple tree (where aligned allocation needs an alloc_range()+erase() retry loop that essentially reimplements bitmap_find_next_zero_area()) [2]. It is also faster than maple tree [3]. Link: https://lore.kernel.org/all/84bc8bd2-e292-4b84-9580-a1b5df4c5bdc@nvid= ia.com/ # [1] Link: https://lore.kernel.org/all/20260710-chid-maple-v1-1-4ee869055268@nvi= dia.com/ # [2] Link: https://lore.kernel.org/all/20260717053241.916441-1-ynorov@nvidia.com= / # [3] Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/gpu.rs | 2 + drivers/gpu/nova-core/gpu/channel.rs | 180 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 182 insertions(+) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 42a4cd7971fa..66ea697a89f8 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -33,6 +33,8 @@ vgpu::VgpuManager, // }; =20 +#[cfg_attr(not(CONFIG_KUNIT =3D "y"), expect(dead_code))] +mod channel; mod hal; =20 macro_rules! define_chipset { diff --git a/drivers/gpu/nova-core/gpu/channel.rs b/drivers/gpu/nova-core/g= pu/channel.rs new file mode 100644 index 000000000000..b755d2184aee --- /dev/null +++ b/drivers/gpu/nova-core/gpu/channel.rs @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Channel ID allocation. + +use core::{ + num::NonZero, + ops::{ + Deref, + Range, // + }, // +}; + +use kernel::{ + id_pool::IdPool, + prelude::*, + ptr::Alignment, + sync::{ + new_mutex, + Mutex, // + }, // +}; + +/// Pool for tracking reservations of channel IDs. +#[pin_data] +pub(crate) struct ChannelIdPool { + #[pin] + inner: Mutex, + num_chids: usize, +} + +impl ChannelIdPool { + /// Creates a pool managing `num_chids` channel IDs. + pub(crate) fn new(num_chids: usize) -> impl PinInit { + try_pin_init!(Self { + inner <- new_mutex!(IdPool::with_capacity(num_chids, GFP_KERNE= L)?), + num_chids, + }) + } + + /// Reserves a contiguous area of `count` channel IDs starting at a mu= ltiple of `align`, + /// returning a guard that releases the area on drop. + pub(crate) fn alloc_area( + &self, + count: NonZero, + align: Alignment, + ) -> Result> { + let mut ids =3D self.inner.lock(); + let area =3D ids.find_unused_area(0, count, align).ok_or(ENOSPC)?; + + // If the pool is small, the backing bitmap may be rounded up to a= larger size. + if area.range().end > self.num_chids { + return Err(ENOSPC); + } + Ok(ChannelIdArea { + pool: self, + range: area.acquire(), + }) + } +} + +/// A reserved contiguous area of channel IDs. +/// +/// Releases the whole area back to its [`ChannelIdPool`] when dropped. Re= leasing locks a +/// sleeping [`Mutex`], so the area must be dropped in a context that is a= llowed to sleep. +#[must_use =3D "the channel ID area is released immediately when unused"] +pub(crate) struct ChannelIdArea<'a> { + pool: &'a ChannelIdPool, + range: Range, +} + +impl Drop for ChannelIdArea<'_> { + fn drop(&mut self) { + self.pool.inner.lock().release_area(&self.range); + } +} + +impl Deref for ChannelIdArea<'_> { + type Target =3D Range; + + fn deref(&self) -> &Self::Target { + &self.range + } +} + +#[kunit_tests(nova_core_channel)] +mod tests { + use super::*; + + const fn nz() -> NonZero { + const { NonZero::new(N).unwrap() } + } + + #[test] + fn chid_area() -> Result { + let pool =3D KBox::pin_init(ChannelIdPool::new(2048), GFP_KERNEL)?; + let unaligned =3D Alignment::new::<1>(); + + let first =3D pool.alloc_area(nz::<48>(), unaligned)?; + assert_eq!(0, first.start); + assert_eq!(48, first.len()); + assert_eq!(48, first.end); + + let second =3D pool.alloc_area(nz::<48>(), unaligned)?; + assert!(first.end <=3D second.start || second.end <=3D first.start= ); + + let first_start =3D first.start; + drop(first); + assert_eq!(first_start, pool.alloc_area(nz::<48>(), unaligned)?.st= art); + Ok(()) + } + + #[test] + fn chid_bounded_by_num_chids() -> Result { + let pool =3D KBox::pin_init(ChannelIdPool::new(4), GFP_KERNEL)?; + let unaligned =3D Alignment::new::<1>(); + + { + let a =3D pool.alloc_area(nz::<1>(), unaligned)?; + let b =3D pool.alloc_area(nz::<1>(), unaligned)?; + let c =3D pool.alloc_area(nz::<1>(), unaligned)?; + let d =3D pool.alloc_area(nz::<1>(), unaligned)?; + assert_eq!(0, a.start); + assert_eq!(1, b.start); + assert_eq!(2, c.start); + assert_eq!(3, d.start); + assert_eq!( + Err(ENOSPC), + pool.alloc_area(nz::<1>(), unaligned).map(|_| ()) + ); + } + + assert_eq!(0, pool.alloc_area(nz::<4>(), unaligned)?.start); + assert_eq!( + Err(ENOSPC), + pool.alloc_area(nz::<5>(), unaligned).map(|_| ()) + ); + + let head =3D pool.alloc_area(nz::<3>(), unaligned)?; + assert_eq!(0, head.start); + assert_eq!( + Err(ENOSPC), + pool.alloc_area(nz::<2>(), unaligned).map(|_| ()) + ); + assert_eq!(3, pool.alloc_area(nz::<1>(), unaligned)?.start); + Ok(()) + } + + #[test] + fn chid_area_aligned() -> Result { + let pool =3D KBox::pin_init(ChannelIdPool::new(16), GFP_KERNEL)?; + let unaligned =3D Alignment::new::<1>(); + let align4 =3D Alignment::new::<4>(); + + // Alloc 0 so the first fit for the next area is unaligned. + let pad =3D pool.alloc_area(nz::<1>(), unaligned)?; + assert_eq!(0, pad.start); + + let a =3D pool.alloc_area(nz::<4>(), align4)?; + assert_eq!(4, a.start); + + // The area skipped over by the aligned allocation should still be= available. + let b =3D pool.alloc_area(nz::<1>(), unaligned)?; + assert_eq!(1, b.start); + + let c =3D pool.alloc_area(nz::<8>(), Alignment::new::<8>())?; + assert_eq!(8, c.start); + + // Only 2 IDs left. + assert_eq!(Err(ENOSPC), pool.alloc_area(nz::<4>(), align4).map(|_|= ())); + assert_eq!( + Err(ENOSPC), + pool.alloc_area(nz::<1>(), Alignment::new::<32>()) + .map(|_| ()) + ); + + assert_eq!(2, pool.alloc_area(nz::<2>(), unaligned)?.start); + Ok(()) + } +} --=20 2.55.0