From nobody Fri Jul 24 21:52:34 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010017.outbound.protection.outlook.com [52.101.85.17]) (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 96F69412C18; Thu, 23 Jul 2026 09:01:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.17 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797262; cv=fail; b=LAhm5kWM7pVLd2jsT+UyBVDeiDTw/NJlkjaL7B8ftDcriqUufwA9DrhwWNRqJneFvHo8/EWKB7yejB10J1kHdvd0Ayg0X8v8AmK5C0PYfyC7yerjNcydJ4LD474ZmnkHknxciBBt0jngKMqaqjFKRcmkuUrrp/aw4t0PSVu0PGw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797262; c=relaxed/simple; bh=/IBBxOTdY8A2ygAuP6hjpUMvkt+3YrpRdUQjh+sefdY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=r/Iz1XUC1BnEX/Z1Ur4xQJvOXr/M6MP9xYMX1gLVG7pRetjRdwxGFc5afAhkmqzClfUwEyDPjYi7F3IqES2i08aAasuW5D86QHSgPYZUcWFXSb4iuEHvKnAfefq/YDMGGBINc4U61uXcQhvBjhTOE9jEB9OWE4gJEza/2I/MRWM= 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=AGIreq46; arc=fail smtp.client-ip=52.101.85.17 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="AGIreq46" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x6DRtXzAb8W6F7OWKxRjH/6klyu5xZjjsWQ3nHZVzDLVL4T8svgkR5nqvl90Fy+hqV4dxu3gP/IA2DmU2mnYDlIVSgQ5L0F/3tWsqQLA980NI4XfRtbmuTunMBI2/jLoT/o9WqPc7hChNPCkaQSmdlW8VpUjmdwG6GS7KcdoMp5EOdM/92szrHzcmzcxD86vjZJz4dXcv2dlyqrkRpmZULsL4pw8k9yDjvSgX2c3LD5uKgOm8hGnig7nz4wyFvGQApEsslzDa7zBfNit7oUblqHsU+crru9vjkYCwU92NJUhZFvPscjllqTnTaTiwX4qV0fIcJQumjC1tbZFsuunbQ== 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=EuJnuLM26rKTeuCB/bCuHGJw1bPiTFLbRu/6k7J3vZKVO2e6HozEGIN+2dmIuqUhTv/PjXjF1r9dj28SrtEfm+264+oB9JHdCEmhLeLAOH7Y4+6ksuwbQPEb/AdtA4Xf2PNx4Xto8DUm9qE0MTkoL1920pXUHZ1kZJF6DijdOuBqS/8QgvcuqV0Sbkwj1YfzXszedP5JNaHbnHJ5Zl2a4Aws95fT58FfZj1Kw+ZTuKxQIekM8jxfaj6ZV5yj1SqtVwRJQuZVYzTLTi3WeEkbrqz9PjeV2uBVTiGob6YE3Ceq5ENlKpOCop61N522IWd64EWAxUQu/hXig+ivqdA2VQ== 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=AGIreq46DcJ8Lo9nI24lViwpA1whgTcPn93OgQKElcfg/1rSTmPkpWMj1F09FmWm7DKoH+HpRnbvBOiYn4B7QJe5tOG8Za4P7bjOpDgDULjFTFf4Bve9sv0NywjodtDLoG+LX9NXJDOWm43AsJni4qQemD/Wu13x/DamSAy6u5iNVK34Tmf5xaLc4RwMViNgLlBTfhTzLOBqOzOM7prj/t0RzkQ9uhApRsJtlFcSwQIpCerzQ0fqKrE854dPMXYUjDrSS9FW2iAPcO0mNqN+kbb392jAQYGELTvVBasQgOwnjjAyESeljuPHe6sSWn56pOCIxGYhaRWCtmSOHq0C7Q== 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 SA1PR12MB7104.namprd12.prod.outlook.com (2603:10b6:806:29e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.223.18; Thu, 23 Jul 2026 09:00:55 +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.0245.010; Thu, 23 Jul 2026 09:00:55 +0000 From: Eliot Courtney Date: Thu, 23 Jul 2026 17:59:10 +0900 Subject: [PATCH v2 1/4] rust: bitmap: use function-level cfg on kunit test Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260723-chid-v2-1-c35e5e9fb3d9@nvidia.com> References: <20260723-chid-v2-0-c35e5e9fb3d9@nvidia.com> In-Reply-To: <20260723-chid-v2-0-c35e5e9fb3d9@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: TY4PR01CA0035.jpnprd01.prod.outlook.com (2603:1096:405:2bd::17) 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_|SA1PR12MB7104:EE_ X-MS-Office365-Filtering-Correlation-Id: 13554aae-9ab6-4a5c-8ecc-08dee898e780 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|7416014|376014|10070799003|22082099003|18002099003|10067099003|56012099006|11063799006|921020; X-Microsoft-Antispam-Message-Info: wVDDXDy+5v7qykner71RorDa+BQj8iwHodglCCCSZlMzXQMR1aG3gV07f+dduo0bOgrLBEZTldejMFKpiNCadWcbEGvnHZsVf1d+Su162SJwWjV7l9zh68KOWaYj3cvoQzBlcw0fSyLHUx2MvJAGn9HHSVanDt3GodNGpP7rvtH1BRrRd1a5JvoSuKD7X+1MDD1nqlz88OJE+cBwado2Cv3hYusqhLQAWTxPW/0cUM5w+bo4EhIeuwuAC9RScLob7zrq2ixzEbMGvNrdtu1pwun+s1v4smeyydJa085B2J/OMMJrik1/REFzZ1yjDgt75DGyU9gIBCMN8X6BQPZSweNHQQAFbKhq+0tYNogAZ03J82q7mBOG2vVPVQdaYjooiNxn1hQO72rD15wYxh4fi9zA6yD2G5JMbgfq7sM9T2gS6XM+dgvM8+nvAOCqxkHmp7Dhq0TDZq5AyHZa98vcBj34DmqwnJLPHQoya2TEH7LbXeY081bAfsio7PZ0bLH8MSn5oO3/ETGquqgOjV1/JG7OOA0iKV7IVG7wN6UqsPQoLMJKiivP1Pi9hmCnlDq+NG3iIhYD7KEq4KyCrjgK0QXTIRjfzDes4ySc1ztXHy0VkFdQu2da42l0wRV6R+LHJEl/kmPg+UfnB9GdTmjB6z4UEpNRtFwp5hqEuI4vKN6G5ObMRZBpR1lzgTSpGfB4eZcGFySBZq5Fg09F9gkkkg== 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)(366016)(1800799024)(23010399003)(7416014)(376014)(10070799003)(22082099003)(18002099003)(10067099003)(56012099006)(11063799006)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?alBLdlNlZ2MwV2txbjBkaEc0Q3ppd3hEaWVlNE9vVytMUm53UnJ6SnV3TlJC?= =?utf-8?B?VFBibWRNN0xneXB2YXV4L2dLOTREM0FJcjNrYkVmT2hqeWZKcFY2QVFnL2to?= =?utf-8?B?QTZialRLcitGQUtpRUorTC9OUFptT2hqZE9XTi9ubmZwdCtPZmRMR3l4Q0Nz?= =?utf-8?B?NTJKOFpzaE5Vcjk1cExxL3RFZHN0ai9KSTI0U1Zuc2NHblcwZFExNTd3dFln?= =?utf-8?B?ZHVPWFErbmxtcWJ6N0FZYzVadE15MEludzZCelk4dEtKK2hOUUlDbkNTTjNx?= =?utf-8?B?WlZqaC9nczN4QnkySHhJS0FjemM0ZlFGcnNLRkFtQTV6MmozK2lWeG1mKzJW?= =?utf-8?B?eEV0aFBBdWdBd1haazdXNjBxZlUyRkFUMFkxQzJ2eXp2UG9wV3N3UGsvdWJy?= =?utf-8?B?MkY0c0M3Q1pUaUQ0b2lZVGlrU2NwaTlNNTVmeVZBZ2pWS1dSOVYxaHFCRGly?= =?utf-8?B?VlAzSjE3bUlXcFJ1cGpjQnZ1QVpLZ2xyUjVKS0hkQ3ZpMURNbG1wN1ljYllo?= =?utf-8?B?cDA0bE0yUkdUZzNvam1ONmNEQXJKTDVRUm5KT1E0ZXB3R1JoNWNkakNqSEEy?= =?utf-8?B?R2FzWFZkRXhFTktyR2ZSckk3V2tXVjM1ZVBydjMvQm9YOUx4UGZ0V1lzbG1Y?= =?utf-8?B?bVlaTktYaGZqUkJrN1hXQ04yVHpOWGxsZkZzUDllditNY1hTckltSHpmVzEv?= =?utf-8?B?SVFiZzZZNURQMUtkWEZwYmFtN0kyWGdJKzZVZE1ZSHpwNjVsQkR1NXlCN2Rv?= =?utf-8?B?QVBXaTBVWWNNNVVOTStyTDRNNzhKZGh5UUxMQVg3MDVYeUY3T1UyL3phMjJo?= =?utf-8?B?Z2pHSFhzMWg4ZnJXK0xoVTFDT0VvSm16Q2dkbkdSRFJxRTRJRzVhVVd3SnVv?= =?utf-8?B?QTd2MzBNODdaZCtDSHZ1N01jb2FlUU5Ga3F5TnExbWxSVFFUNGVUS1psSCtU?= =?utf-8?B?YU9IRjBRaWd2S2ZHVmw0UVllLzl4Y0xUTVl2Ty9Md092Ym9DNmtEYnJVSDlT?= =?utf-8?B?Qm0xeXFuT282bFZuMU9XRGwza0JZOGRJQ0tuRU1STmZLZ1NuSTJXWEg5bUZw?= =?utf-8?B?VlBqWWZYSjlxL3pMdzZCbU1zdElKU2JBZXhWb2NNUGR2bGczenFUOHM4R0N6?= =?utf-8?B?U2xQNnpJYSs5cmRramk5ZWk2OVNCZnZDdTA0VVpXaHVXUUkwdzh1L2VzOTJB?= =?utf-8?B?eEpRQXdVTDFwdUxDUDVuRnVGbUZuV1A3KzFmcjIzWkFjN2RzcXZMRktLZmZl?= =?utf-8?B?TDh1OUZOVm9GckNqYWFqZkdQY2kxcnA2dDkzWjhjVEovQk9FLzg3akNQamMr?= =?utf-8?B?QXdOeVhiSWFEQUgxdXFqYWFCaEpDamM1WEVZN0xtamxrdy9vMS9FQk16T05T?= =?utf-8?B?RC9TQkJ0b282dW5kRjI2bEwvQ0FBZXdlYXRxSklSZDNON01EZyttYmpaVzhW?= =?utf-8?B?dk1yUUE0bjNFcjdkRGRSTUlMMDdJZnR6UEczK2NlWHpDYWdsTGRoMTdQYVV5?= =?utf-8?B?MFNRY0dRS0tGU3puKzcwZkVrVm1aL3VaTEk1VUpybnMzN3VuYnhqMVo1dmhp?= =?utf-8?B?L0FQbXZ3U0NqekZWTmdlUE9JN2FhZkRGQXpZRmRnSzB6TE44aGFaZ3IyZEt1?= =?utf-8?B?RWlIMitJQjVGSk41MnM3OVdUSkpWWjNJWkFrTllhSW5wVC9uQ3JFMmlzL0ph?= =?utf-8?B?SUhkN2FzQjkvdTFvc2pWVTZIOTdPa0RZVmkwbkdDbW8wVE1PTlBCdExPQklM?= =?utf-8?B?UmJXY0cwS3BtTTNTVERXNEt0dmNDKzR4bk5iL3ZiVG5rYWVvVFo4aXJxUlpT?= =?utf-8?B?b2JnNDhMcnd0U0VQWDBSNUNraFQvRkZHNXc5U0UrN0dsYTVHMUZXdERHTVNw?= =?utf-8?B?TkNZVFRxeGpIa1dmRHA1WFFrZlRydzN0T3EyUGxiaStyUWpFVGN6K0tid25D?= =?utf-8?B?cHVhVWcrYm85N2xKa2UzTnB0Nk0vSk5OOEl0RlVSaC9OUmxUWTM2VSs1SS9M?= =?utf-8?B?R2JGcEhybUlvSTY1TG5menRPbC9UcU5BK05hSmVEMzRLTktFYkhEc2J5cmxr?= =?utf-8?B?b2RTditsSnNpcHdoOEltMUhLZ0tvMlhqZEd6dlRlNTVBam1TcGxKR1NVR1Ey?= =?utf-8?B?VnhCbGNVUStyM28wVEFOQ2NUWmZVNTI3dTJMenkweWlqeFRXSzZNMFpKbzc3?= =?utf-8?B?amd4K3NqRkxiQnFFVjR0Vkx4dWFyM3c0NDdFZ253SXVxOWNzU1IxNVJHSU5I?= =?utf-8?B?dnFFZ1VmcnYycE85UkpVUWdwZnd5NWIxNFJJYkhMcG9VRXBkWTJ5bHd6MDZz?= =?utf-8?B?Mk9PSGlNcGIwZnlvZnpnMnlDYTJ0bjFMR1RYajV4Q3p1TjlZcnhleU9WZlQw?= =?utf-8?Q?mpAC6dfUZmyRiaysvYiMeYcqEapd3vHywN71QXzahxUJ8?= X-MS-Exchange-AntiSpam-MessageData-1: 5cGqcSgN2B6wkg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 13554aae-9ab6-4a5c-8ecc-08dee898e780 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2026 09:00:55.0845 (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: FkJHknj24ZQ61UwfwH80qFIF+K3LgR7gNrbJRIDejnDyuvVt+xuv3dpxqd1RBtwIZt5aa5nEfwOJ6GT6/BNTtQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB7104 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 Fri Jul 24 21:52:34 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010021.outbound.protection.outlook.com [52.101.46.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 F3675411FA3; Thu, 23 Jul 2026 09:01:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797266; cv=fail; b=buAKTk8BFqF+ScYhfBfiEGYD/6cWu3c6cs9+otR6oVyVyNM9nRs38aKBUBLL1qy+HdCTYc6xqJTLn9FmEgTjhorVVpDNnwTnRmMkPQiEdCYa4qdZcD3+LAEbaDFyp4hBt21xcONYLlfpVRdmGJQJFmKYaksusqSPPJ+JoHx0Ln0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797266; c=relaxed/simple; bh=uEZdbF29de8j5hh40+JKA7iNPZvcB1nLQfwlyPf7HRs=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=k7MjU+rexOA9jVEWYcX/BB41Zpxt1HbrRzDKjzdRH95O+pGXaCaPHHg4eUj+RZMcgjNB5BWNG+0zatBJgs4nWndLkDemP4tEdnAeV8jhSM6pbPsnVvXfOJqYFWcQueRFmlakq/CuBP+fTPOJETga+dW24wFfWEwosEtdUUHAiEc= 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=Qj6vd0UN; arc=fail smtp.client-ip=52.101.46.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="Qj6vd0UN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RAmsbQdTHYp8XqRBLyRX7Pt25W4rCbHtbwTUP/ZIRvDCMJmjWBvSKucIgAPPfvdlcouHE5QDERS6rpFBhslofc7kiptL2hCFriGo8uidEeXH8QOvWza1MDsu4R6YVHriI0S2O2ivFB6l5sRmacrKdPLBIVsKL2R/K5Y+ydsO88Fp5rrGqLGNxsEmdUa05TTJHl/3h2OXlrqRWfA03vuLA0IG/7w3WggOJ1eradponbGkI4ekvIDF14O4O3gTYS58PdmJ1tjulIYYjp3LDSW3hyyVyu6cBhAndbT6DEG6vE0Dmw7ZosyIPre/Ut0Uz4dCH9P9h28kwgFMhqTutqTyaw== 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=OC58iInQGyjLPfbhggyWjI/MOwIUsNz/d/TYiFPJPYs=; b=G77gwbrYWwPiaYb1mwmlJYk/QGn+3F5R1aJ2O4fFuhdJrBn9R5QPYhaFqK6JwJ3SaAxkaDylCB26cyjGsELAXMgT8iexRlmucOZwIqt1yWtNPGktu2dKqYyZbgaBbmGkZq+kvh9pgkpS/WWPKO6TyMLkfN170bn06t3gfM6RXZKZFTGLefxHYbCM2l2qrG5vu+ppPNyk184aviz5ELeplyjNHzFQUL8zJsKydHOsVe+QeSm/SwHPlufsPqWSj2PqiQAvmwcho1erHjekzWCHdUHFJKDuxBhUEeFKCnSb49OGf/DI8GPr710ivcZh+ydV+xczTyaNpfAbA0ve4HYeDA== 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=OC58iInQGyjLPfbhggyWjI/MOwIUsNz/d/TYiFPJPYs=; b=Qj6vd0UN2e1q2XgowJ8rxprj87hrn+gMleAKn1uRn1EaqI8mVGA1gu7Pn0auFjTHwyPUJ/KAHG8SaPA4La08SPkVYIRLMvbUNBG4NVIgnSQZrhqsm6mCjdBWtVRPiv57+S089grUP65DVnbm9cJKHljfOHN+CYBvHnf6t3zviGY+Qrw/D4csg3zZXiZKdDJ1m6fH5YqWPBHAYmeu7aE0xLNfy+V/vwTkcznUp+H7NYqtFTeLoQjSN76JwxcIjy7i5K7myQwbuzOIo1QwOiCd8sE/GgN71gWpvCw79h+MTxUDqcCsav6KDd2nMCytCTuXScYj8gTMP3IAN9uygR0lqg== 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 SA1PR12MB7104.namprd12.prod.outlook.com (2603:10b6:806:29e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.223.18; Thu, 23 Jul 2026 09:00: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.0245.010; Thu, 23 Jul 2026 09:00:58 +0000 From: Eliot Courtney Date: Thu, 23 Jul 2026 17:59:11 +0900 Subject: [PATCH v2 2/4] rust: bitmap: add contiguous area operations Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260723-chid-v2-2-c35e5e9fb3d9@nvidia.com> References: <20260723-chid-v2-0-c35e5e9fb3d9@nvidia.com> In-Reply-To: <20260723-chid-v2-0-c35e5e9fb3d9@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: TYCP286CA0206.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:385::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_|SA1PR12MB7104:EE_ X-MS-Office365-Filtering-Correlation-Id: edc06dbc-b19c-450d-36c1-08dee898e9ae X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|7416014|376014|10070799003|22082099003|18002099003|3023799007|10067099003|56012099006|5023799004|11063799006|921020|6133799003; X-Microsoft-Antispam-Message-Info: KsCkT6O3YZoOk1wJKzHN08wLmyHkyCjLb7yNx7+NgZD40alTefH6Cpp+9+RTdOxCw/BVP02hXsoLjbp8UF6rg3GlXOIWKZU2LETVFa2YlLmp3VOClXye/oCrSND6qRW2iWznere0gqv6SH3BtBxH8LXFOKvmpLIyoEAeWt/3+oNP3ZQ50BeZSXEENR/n8jI2efDgid6qTCf48Hn7sMcZ24Fvewnz+J9iB8fYQQ1Ry0jhadeOS6iNW0O2iG8qV62oi/VMTEDHQFcTB2/076k3RK4qtCKrusJqPE80o2A+WE7gStKuMEh4R+fPiju0G2zAwEbKn3Uk5F+UTW8I7JXEbTceTlytgY5HCfLVeFmuUboJPtWqbGIxuTJRLL9Hs/C7qB/MTPqncOu4NUPOf5oBdpTXlSUF6le4SCwpQab2NSIz9DURqDoR8AZVWynft3WS00qRTuKLWeJULSy5CEhefhtrDOAfZR48SWGNdhRm0cO4l4hPon3vpIwuKYv2g3Xk6IFF4qEdNBcPTqqLkaVp/o2J674HGE6H9r4bmwOiDexNHo2NgRWJhgZGpGlVNa8ua5+4wwFaT+EiWVCWlNbg7XdlE0K4d5TGk3OWkdN73fda2ZPtjJ7xeX/PKVTyN1yUhMml/LXAHxlWZTT5tY5gEVhzZSh81duebdSnD0eyXjX04kZrXopfEEALQvqvSDuIA3H/jbVAddPJd9qn5rSb3g== 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)(366016)(1800799024)(23010399003)(7416014)(376014)(10070799003)(22082099003)(18002099003)(3023799007)(10067099003)(56012099006)(5023799004)(11063799006)(921020)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?azdUUWVIT3J3a0w2Y0Erays0WTNpaTlBYy8rNmRFY2lNeWFuYm5zUUp5Wm5x?= =?utf-8?B?MHJrRnBTWlhPbEdVcUp0dzY4cHJBWmU3cTZRVjQ3enp0WGRXRnFlOC91Y2VC?= =?utf-8?B?TkdWVDZLekFJRkpvNkE2cTQ1UHB2N1JQRkozZ3NnMGdxUi9NSDhueWMydHQv?= =?utf-8?B?K2JzOVBTYy9FZ0Exc25ubC9kN09Ta3M4aDBTSUNyU0thTVZkTGUzdGFjS3Vz?= =?utf-8?B?eDRyUnNkNG5JUllpbDBoT3M1SUhzRkhwMitqZjlIWk96YTVleW9xUkdGUVl1?= =?utf-8?B?dEhmZHhWMXY0a2dGM3RjTk1kemNiRTZwV1ZLUlFFS0lsMXhsWk9XOGIvUjRr?= =?utf-8?B?cFhFRldkT3c2UGVSL0lVaktNOW1tVzVyWWtNRWx1NjhpYWpoTHdkRFllaDFR?= =?utf-8?B?VjQ0WlhJdityRU95cHdZQXlNRFdWY0tmWVVzTlJ2Q2FXdUppTTF2Nm5OMVUz?= =?utf-8?B?R2srcnBmYzE2M3F5ZlNrWHp3Q2ZEbnF0c1NpQXZTeHBUVUxOc3lwL1FMdmtT?= =?utf-8?B?NXFvb1VxbXdvMElzZFdDS0R6L21EVU5LZkd4TFEyTlhBMk1iT3c3YVY4MEV5?= =?utf-8?B?SVgvZTZDMUlHTnozd3IvUFVuM092djUzOTM2ck1iZGYxa2x5VWZSM0VmZ1VE?= =?utf-8?B?OG5KRnNxZW9yTUFVZFNWbUdRcEFwanlldXlJWkVqRTgzWXNWaDJFZUpzT0c5?= =?utf-8?B?ckVDWHBkdjVkdllkN0d0Z0w1S1ZLS3BjdWd5TmFrSHB5a0RKdXlUOWxjZ1Nr?= =?utf-8?B?V1JPY1VYK0daVG1CRVg2ZkI0VDUvR3c5RXNCYkVDWGZ0c3B5ZkN2b0pPZG1r?= =?utf-8?B?QVhQRzc5WmhrTThnVFRVemM0a0wyUDk2MGRJLytvWVpVQ3ZSelEyeUY0OG9o?= =?utf-8?B?UVVvbE4zclU2R3ZRQXRIbnNYeUpQVUF0SHc4TmJIWXNZTlRyQ09VREkwemNl?= =?utf-8?B?OS84RE1LK25GU0Z0R3FLR1BHaklLNSs2UzZ5dkgvdG5PdlhtVmlYR3Jua3Jq?= =?utf-8?B?dUs4ckxmQ3VZZGphbU1oMm1UbkdjQlFmNHJJRW1ub0lQR3VaVDZVazVhcUtF?= =?utf-8?B?d3pPNExYd1ZiMFZ1WkI1U0ZLbmJXdjB0Q2xRMnlOZ2tKcWVuY1lkREgwRzJo?= =?utf-8?B?Ylk0MXZDTi9sTEc1UVd5bURJa1F0QTJkcGl1L2JEZ29sZm1KV1F0SjhYZ2wy?= =?utf-8?B?a3AxSENRQ1RmNmN4S2VKd2J2dHdhNjRZaHJmK3U5eVd4UG11NkRZSzYzR08w?= =?utf-8?B?eFByQ2JmMzg1YXZtSDBjMXZJMTJpTUN1dUhwbXZ4ZFVUZmxPWFFXQUNjd2N4?= =?utf-8?B?dFVhSWxqMlNGc3JMckpab1o3dVliaTdjZEl6NjV3NnBoZml0ZTNFS0o1YStY?= =?utf-8?B?dnhPbmlXUVV1ZzBvQmVrejl2ZlZMTk1qVXE2Vk05MlRFQnR5eCtlUHJKZGpT?= =?utf-8?B?cUpQK0VCaTZLQTYzdWtaTlZDTEQrMU1NTFhYTVo4ckZpRzZsOWozcTN3dXVQ?= =?utf-8?B?c2d5ZERUbzFBYWU5bzJOd09PSGRoaUkweFdyR0pEbEM2S1hrYVdOdVhvU2tH?= =?utf-8?B?U3dNQmgzYlRXLytEY2xRK2xwalZqL2ZlQjB1NlQrcGJPUktMMTFDSjhwWFJV?= =?utf-8?B?ZnFSb3pwUDFGd0pvbVZ0dVZBN3dJNlRwQkRkZlJvT01hdGRGNVZyNmRlYTJU?= =?utf-8?B?TzNDUklFd3JYZG5kZUFWT0ZPOHVKRmpycHdvNGZJcFFMSU81Q3NLOHhyUU0w?= =?utf-8?B?V2MvZ2hwNlZ4dXRXZkhhT2Y5SUQzM3RrMUpiTCtycEpjTDZwMmhiZUdzNHJt?= =?utf-8?B?Z09OUDAzei95amx0bEFaRlpSOVBQcUsyQUFXalFJYzd6Mm9BKzZCRlk2K1RJ?= =?utf-8?B?NldRdEFkdG9DS1hqZW1NQzluTXdJOTFRL3hicndqWFVVZEw5T2RsOTVaVlhh?= =?utf-8?B?MDlpaVloWU1XcjUxSDJ2UUt1MUsyR2JrdDR2TlF4azlEYW03Mk1IejRMTjJ5?= =?utf-8?B?cmtRMUtxUm5TUU9PTVVlM2dZMERXS0k3V1RDOCsrZCtuazhPSnFyeGxmRTc0?= =?utf-8?B?QUFCaXI2ZVpoTmExckYvQytraTBmMTlMQm5wNStkdzJmZERBNE4rSHdiSTlU?= =?utf-8?B?OXh5dExPbnVFRnJoZUNhSGtTU2MzMlhiazJ5eFJLT05JcjJlam04RU9DcFVr?= =?utf-8?B?REdDeE9YNVdNdFdYdnA5SlF4T0s3ekVhdU45RWsweElmMStjTWsxcFBFQVQ0?= =?utf-8?B?YVNRaUg4eE1lTktUc2JiZjBPdGVDcjdVR3lkNzJqQVdINUxTeER4SmhhZEZS?= =?utf-8?B?WWJRZDIrdlpZUUhBNFhScW5rUEx1MjlGc2Y5UEhKZXhpdm5HbXQxTG9yUC91?= =?utf-8?Q?sx5luHHCzpPk/wccNj+HFfnuxG60Yiv4l4NYYOpj08njI?= X-MS-Exchange-AntiSpam-MessageData-1: CW5UUIjhFwXXNg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: edc06dbc-b19c-450d-36c1-08dee898e9ae X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2026 09:00:58.7551 (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: J1hWfhm1bNKlH6ySJl21VpUrHoPyiVKXG36f2M1BRBiE/Tmwg+VEfQUm0e5Z48xxJHPfEMRJZTt3t80XwTyiKg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB7104 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. The C code uses signed integers for some parameters, for example the length for `__bitmap_set`, so bounds check against i32::MAX. We can't rely on `BitmapVec::MAX_LEN` because `Bitmap` may not necessarily be backed by `BitmapVec`. There's also a few cases where an `align_mask` can cause an infinite loop in the C code: masks that are not a power of two minus one, and masks where `self.len() + align_mask` overflows the alignment step, so check for those. Add tests demonstrating the edge cases. Signed-off-by: Eliot Courtney --- rust/kernel/bitmap.rs | 217 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 217 insertions(+) diff --git a/rust/kernel/bitmap.rs b/rust/kernel/bitmap.rs index a43bfe0ec3dc..1395bbe99cbb 100644 --- a/rust/kernel/bitmap.rs +++ b/rust/kernel/bitmap.rs @@ -497,6 +497,127 @@ pub fn next_zero_bit(&self, start: usize) -> Option { Some(index) } } + + /// Finds a contiguous area of `nbits` zero bits at or after `start`, = aligned per `align_mask`. + /// + /// Returns the bit index of the start of the area, or [`None`] if no = such area fitting in + /// the bitmap exists or the `align_mask` is invalid. + /// + /// `align_mask` should be `0` (no alignment) or one less than a power= of two, in which case the + /// returned index is a multiple of that power of two. Masks such that= `self.len() + align_mask` + /// overflows are checked and considered invalid, as they can hang the= underlying C code. + /// + /// # Panics + /// + /// Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and `start` is ou= t of bounds or + /// `align_mask` is invalid. + /// + /// # Examples + /// + /// ``` + /// use kernel::alloc::{AllocError, flags::GFP_KERNEL}; + /// use kernel::bitmap::BitmapVec; + /// + /// let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + /// + /// assert_eq!(Some(0), b.next_zero_area(0, 8, 0)); + /// b.set(0, 5); + /// assert_eq!(Some(5), b.next_zero_area(0, 8, 0)); + /// assert_eq!(Some(8), b.next_zero_area(0, 8, 7)); + /// assert_eq!(None, b.next_zero_area(0, 65, 0)); + /// # Ok::<(), AllocError>(()) + /// ``` + #[inline] + pub fn next_zero_area(&self, start: usize, nbits: usize, align_mask: u= size) -> Option { + bitmap_assert!( + start < self.len(), + "`start` must be < {}, was {}", + self.len(), + start + ); + + let valid_align_mask =3D align_mask.wrapping_add(1).is_power_of_tw= o() + && align_mask.checked_add(self.len()).is_some(); + bitmap_assert!( + valid_align_mask, + "`align_mask` must be 0 or `2^k - 1`, with `len + align_mask` = not overflowing, was {}", + align_mask + ); + if !valid_align_mask { + return None; + } + + let nr =3D u32::try_from(nbits).ok()?; + + // SAFETY: `bitmap_find_next_zero_area_off` is safe to use with an= out of bounds `start` + // value and 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, + 0, + ) + }; + + // In case of overflow, we may get back a range outside of what we= requested. + let end =3D index.checked_add(nbits)?; + if index < start || index >=3D self.len() || end > self.len() { + None + } else { + Some(index) + } + } + + /// 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() && end <=3D i32::MA= X as usize), + "Area `start..start + nbits` ({}..{}) must be within bounds {}= ", + start, + start.saturating_add(nbits), + self.len() + ); + // SAFETY: The area `start..start + nbits` is within bounds. + 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() && end <=3D i32::MA= X as usize), + "Area `start..start + nbits` ({}..{}) must be within bounds {}= ", + start, + start.saturating_add(nbits), + self.len() + ); + // SAFETY: The area `start..start + nbits` is within bounds. + unsafe { bindings::__bitmap_clear(self.as_mut_ptr(), start as u32,= nbits as i32) }; + } } =20 #[cfg(CONFIG_RUST_BITMAP_KUNIT_TEST)] @@ -614,4 +735,100 @@ 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)?; + + assert_eq!(Some(0), b.next_zero_area(0, 5, 0)); + 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, 0)); + assert_eq!(Some(8), b.next_zero_area(0, 5, 7)); + + b.set(8, 8); // Now contains {[0, 5), [8, 16)}. + assert_eq!(Some(16), b.next_zero_area(0, 4, 15)); + assert_eq!(Some(16), b.next_zero_area(0, 4, 0)); + + b.clear(0, 5); // Now contains {[8, 16)}. + assert_eq!(Some(0), b.next_zero_area(0, 5, 0)); + 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, 0)); + assert_eq!(Some(8), b.next_zero_area(1, 0, 7)); + + 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, 0)); + assert_eq!(Some(70), b.next_zero_area(0, 45, 0)); + + b.clear(62, 6); // Now contains {[8, 16), [60, 62), [68, 70)}. + assert_eq!(Some(62), b.next_zero_area(60, 6, 0)); + 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)?; + + assert_eq!(None, b.next_zero_area(0, 65, 0)); + assert_eq!(None, b.next_zero_area(0, usize::MAX, 0)); + assert_eq!(None, b.next_zero_area(1, usize::MAX, 0)); + + b.set_bit(0); // Now contains {[0, 1)}. + assert_eq!(None, b.next_zero_area(0, usize::MAX, 0)); + + b.set(0, 61); // Now contains {[0, 61)}. + assert_eq!(None, b.next_zero_area(0, 4, 0)); + assert_eq!(Some(61), b.next_zero_area(0, 3, 0)); + assert_eq!(None, b.next_zero_area(0, 1, 63)); + Ok(()) + } + + #[test] + #[cfg(not(CONFIG_RUST_BITMAP_HARDENED))] + fn bitmap_area_invalid_align() -> Result<(), AllocError> { + let mut b =3D BitmapVec::new(64, GFP_KERNEL)?; + b.set_bit(0); + + assert_eq!(Some(1), b.next_zero_bit(1)); + // If this isn't rejected, it would cause a hang in the C code. + assert_eq!(None, b.next_zero_area(1, 1, usize::MAX)); + // Reject non `2^k - 1` alignment masks. + assert_eq!(None, b.next_zero_area(1, 1, 2)); + assert_eq!(None, b.next_zero_area(1, 1, 5)); + 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, 0)); + Ok(()) + } } --=20 2.55.0 From nobody Fri Jul 24 21:52:34 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010006.outbound.protection.outlook.com [52.101.201.6]) (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 11896410D1A; Thu, 23 Jul 2026 09:01:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.6 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797272; cv=fail; b=tcCfbOmZoJKz9Bn3SsmlUymcjEAk5qfOnierb5toIHA6IEhFK7gFle31bpGGn3otleqIwf8Ogh0mrYHZ1bOt1+4VH6IvgAqoNefAAMUIUdYREdgnsUJaouyOtWjPyObc360q0Q8TxnLq47HGWiFA9ODs5AV/uF2R6W6bAu1FMbw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797272; c=relaxed/simple; bh=4ivBn4JmL4qMzbhFwhQ/yk/d85pj4vujNhmxfVjCYrg=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=WIOzMJd+nPB+VBTjRnqpbDib8rFK09eb6fTQPaOp4iVJGgfb93ve6Mua1eE4O1C3wV0tPV3wOFZ5lyBaS7kxcYTR1puHGueEJwsF51kUNscGM5vqLV7deG3DgKluZUHC6JeN59pS2jvbNqFijqvF5FSM1lRguPWSm7a8eEUG7dQ= 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=Q7emB1sC; arc=fail smtp.client-ip=52.101.201.6 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="Q7emB1sC" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WOzdAGVcYKGLlsrSak8culzHWOAxT+37/mlv26qgLko5Noxs0AGmsXE182hmQkv2NiaYPv4jrLpux1hrw2h/UGRj2tEpnx2ewxNsi/sdLzQZ44l7Sgh/Ku7U7JdQEl0e8TahrJGWN4qxcHP14GMA9VTK4HMjjf0igCjZc42UgRW0EucL3jcKy6TvO/DJMJQfqXPpDcUtJWJ7l7ktyywmvLyadrJW6S8hDkCC+sE/gfhkLjvrb4QpssziFhnv7rZBHkp8VQuymtBvChxdzFuCOcC60wBwCcg8uBnwRot7Z6J2gbH1+2YncaFXGm7g05d98FG2DE7zdEYFRPfdp/7XxA== 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=3fC0pQO/Qhj61kXLWX6QAZzDFfLQaEuQTnbgtsLnh/0=; b=SwpjvmFzwSbPjaHJsqkIfEypeWcz8VSe1N7MBTH3ult+TDzLEgBA4U+oZ/97Gr+qk0lquvwSRZQ0riULAg7TctytzXBAWGEgorSY5f5LFJkxeGRw6CjcPlgdL3jZemxDUNjA7vHAwO6c4bVjj8auL9L0YvuyhY2cJXgCg7KWbaB4yyw4j6leXirWS8blgI9CB6l4BzEgw9bf3DQvyqxowR5X0HIusbQYxWQujSj1D/ZIKC77jmiop1aYTt81Him2dNJiuJr56u4PrIz9csTkRV4kmEeSFLMRpL7zrQEULmISoqPbU+cFo9tkwlFT/Q/nuSwu0KR3sQSRTIDM4re5tA== 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=3fC0pQO/Qhj61kXLWX6QAZzDFfLQaEuQTnbgtsLnh/0=; b=Q7emB1sCVIJo8seRNLiCiC/3VbL5aH2p9DKUPSOy5hy+nkjWURbUNdAMnGBOZZAPUsqZUHwmRg9Rkazq3JCghi6zUrMCS8v4QPM3+oDjaoSobWMJ8MFKvoPEIUdbd0cxu/ReAtnM1lLbFD5xJ/mgo0dfsBUDNmfHnWwqPElNJTninvNZlAOQGITUWb9hCU83MHUF0yVoIzk20NgwXanlqdb5CtR0hLoCYS40XQNUzWfDnG67cEOPr+AohqNrNzwO1vZ1+sQFLBmx20ejkukjaXK7ZKQGTeWQsrWipn/bQ9Q9YSW3tQ7yQl2rQF1qhh8yVQ44I7EBn0jx0rfqK3IdCQ== 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 SA1PR12MB7104.namprd12.prod.outlook.com (2603:10b6:806:29e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.223.18; Thu, 23 Jul 2026 09:01:03 +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.0245.010; Thu, 23 Jul 2026 09:01:03 +0000 From: Eliot Courtney Date: Thu, 23 Jul 2026 17:59:12 +0900 Subject: [PATCH v2 3/4] rust: id_pool: add contiguous area allocation Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260723-chid-v2-3-c35e5e9fb3d9@nvidia.com> References: <20260723-chid-v2-0-c35e5e9fb3d9@nvidia.com> In-Reply-To: <20260723-chid-v2-0-c35e5e9fb3d9@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: TYCP286CA0322.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3b7::11) 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_|SA1PR12MB7104:EE_ X-MS-Office365-Filtering-Correlation-Id: af4d4e8f-4b80-4feb-d607-08dee898ec43 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|7416014|376014|10070799003|22082099003|18002099003|10067099003|56012099006|11063799006|921020; X-Microsoft-Antispam-Message-Info: GjhbcUR5tWFzaNkOdK09DX5HJS+ZGOwHgfI2Y/K1xyPp3Rm+Biu6VzCb4Slm2RbO9fDGdEZYsgGp5B5Qz8WixX33uFK958eVqocB5S1lCMlKgc2p52cX1/XaC1FuvRhzNPpw09Vv9xlBRwWBYbl8h3GVGk+lRdtfssa+K9OzdPixjtHj5A8grAW587Y11Mk1XU/ztGamRTYA7WeeGxFN2owH8HzqACePEW/EEYz+xGDiOkT4acjUzcqRyqYbcdAwxU2vsjhiU977/0LIW/DJi2AyYUPt740Xk83zTBte3HdnWq9SkCZq+UYESsIWOHRBLgk7GiVCtp5+uVEqtu//JPWs8JD53YhAu/WG+CsJpFrjowObDu00Mj6elBdA38IQimNkephzgS1EePmFdd57iS3iBPqLnTL7I3kS2Yjv42zYCciOnznKLZ+EGkO1v7ffFClofMrqmg/c0/YZL2b0av9PQKJpHFW+TMguVSvY1ntWXReeGx67jQtWCM9VrD784UCsKZACCZVZaKTfTwkv+FydUlxuZxnAS/GeFSNUJ7GtyUTKmy0nW37camM0jOGjO0oi5DMwA/zXnB6/GlX+wHCrHb4aw7xt7qrYMBeDB9eM4T/nfawni/0b9Hvngw5jpJa11pEyZ4pzTGM7RtwEEgB0UFb6AopXjrYvQk+WMbsxJ1AbmP4Kfh9/5HUoxQkWTU+vCPooGrHEW917cfLh+Q== 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)(366016)(1800799024)(23010399003)(7416014)(376014)(10070799003)(22082099003)(18002099003)(10067099003)(56012099006)(11063799006)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZldieERJMEhlK0JlRjNkL0pwSXA1RkphS3FSdzk1YmJFMDZ1eGpJMS8vRHdX?= =?utf-8?B?WHo3R3R1U2N2ZmptQnlKanlCVEZkaUFqNGlIK25LTGUvNzV1UlBiU3o4MDl0?= =?utf-8?B?NEh2ZWNxWTFxbURQeUx5MU5RenZ3Z3lsZHFLR1grMlBGN1U3c3RHbTJyZURh?= =?utf-8?B?VElRRDl6ZldqZlBFM1U2MURiRUErWmpuL2htQmtvUWdUdGtqVlByK0l1N3NX?= =?utf-8?B?QVllMFlsTFVlSXJpbTU4ejczSkpCS1Y1VDM4ODNOQUF3RFhtc0Nyb2k3K1VG?= =?utf-8?B?QVFuOWV4UWVHdkwrTzJxNDdERWlNN1BSMTQ0bUdMTXhOeHRqdDFFaGlNOWIx?= =?utf-8?B?R2ZnQmgraXJtM0xGRndnSlk0VVA1aWlYMDNjSXY3SWgzRHFTbGR6ZjJnMlZK?= =?utf-8?B?R3pLY3Vac2NDNUNmdXd4cUVmVktIWXJ0MTRKcE5rd2IrdERMTEM0MnZCTENa?= =?utf-8?B?MTcrRmFVZDdWaU92S0hWTEIvMHYxY3hmSnFVOGlwUFlPQkpnWU0yTWVmUnpu?= =?utf-8?B?cHdoZ3BPK3JmdnNJS0NpQUxuU0E3ZmdvNTNCYjlpbDMyZGJNMVBwcjIwRnVS?= =?utf-8?B?ZFptbFZiSnJtNXY5MXk0SnNsdzZ3ZHp5dDM1K2Z5SVBkNjJoZWNQbFVUQkJv?= =?utf-8?B?YSttb29vdDBTalFRV1ZtbkY4RmR5ZFp3QVQ5WFBCdktpd3BOMGRjTCtzK09o?= =?utf-8?B?QlZ2d0c3MmJTRDFweGFQNmxMbmd3dUVNSHZCYktINUNCb0Y1d05zTjAvL05w?= =?utf-8?B?dWM2c0VIQXp5RDVpUi9sS1Awb01OT0ZJTStDUyt2QnN6YlJ0WU1oc0FSSlFZ?= =?utf-8?B?eXFvVkpTVElCQXI2SnlLbzlQeDd6dFZZRW1XSk5IQThPOG44RlRrUmZ2NXpy?= =?utf-8?B?WFUvQUl4emtDSFNkRGptcVRVOGdkRHU5TFNJclErS29Md0RnMG9uM2hqbm9t?= =?utf-8?B?bnJyRWJPNm80QlRQK3hQTkV3Q0NGa0YxZGFhTFo5U2h4RGRFUDhaREJvWnVk?= =?utf-8?B?M1pwcUt2YWY3TklEdHh1eHpqQnBxdStwaUlkem9QbGJTTDBJS2JJQWhHTEtp?= =?utf-8?B?RHhyK0ZuVURCWHZrVk50bzRYa1R6NkZ5UTRnL1g1U3FXTElhUGl3TlF2Y1F4?= =?utf-8?B?SnhZOGF1VXc4SnY0QktiRVpIMGhUekU2cjFpd3ZlUzZTMGRVcnpxcXZPeno2?= =?utf-8?B?Rnl2akNBUHlaZlFnVHlxemVXQTZlZnRnUWEyOEQvWVErRW5nRHV3SHlkVjFm?= =?utf-8?B?aEZoaG5HZTcvcWZyakpnOWJSMlZKdUdsZWp1Y3ZFa3ZJM3pCSHpxN2RHS2Zs?= =?utf-8?B?VW1nUjRSOXRXamJvTWpXcTdyb0VNcGRXODJhNG5UNExmQTdYQklQaDhrWjIw?= =?utf-8?B?YzlVdGRJYnRCWlIva0tUU215T2lKVno1ZW84TFFhK2psTFJkZTJPbVJPOWtP?= =?utf-8?B?YWdCVEpCNWJwczdiY1MwQmdGc0hldXdCMlRlWXJEaklFcTcwL1dXVjBwUjla?= =?utf-8?B?VVZGVG9mSyswWlorTHFRUFI2NzNWK1hTN2NUbzF1SDBrVVhYMm5wSlc5K2Vi?= =?utf-8?B?ZnhDTE83eXN4b2lNeCtybC9VTkZwSk5OOUNwcFpaeUdHVURpbGtzbXkzVFlE?= =?utf-8?B?ME1Qc2VSNkIvaUZRY1VzYUJsM00zd1VsL2VKZFVUM3IxZmx6UGRPWGZQNk5o?= =?utf-8?B?NFVlWmcxSGVNOXpndll5ZVFSNHV2ek9VbDNCQ2NBb2tzWktHS2daWUMxSmZ4?= =?utf-8?B?NVE5S3grZFlvUnlGMjA4YStTaFlmRU9Ic2YrQWRHZSt4Z1Jic2Vta3hTVzJF?= =?utf-8?B?VHZkTXJpQVVMMklCM3l6UC9PQ0pFR2pyOEVxUVdRTFRKY0dnTS9MVWYrTW5I?= =?utf-8?B?SGZxdFRKTXlTeHEza1ZxeEIwQUVsb3hNaXYxL0xUallkZzdnTzRtbkc1R3Nk?= =?utf-8?B?QlFVQmxuWGxKVUQySlhCRWNzSS9pUEtob2wzKzU3ZGVmbWdJUFRDa21Gb0ZE?= =?utf-8?B?MzBIN3lxSVArY0RlU1VUU1Y4RHFhODhvcy9paWRmSWZEQTAvMXk0WnN2dHZC?= =?utf-8?B?eTdZZnArMTRCVFJETW50NktuRTJCMWI3cXg5UEtsdGxNMElJTEtZUERQcS9a?= =?utf-8?B?UWQ2YlJobGhUem9kdUFwaks3Y3Y5WVB5amFYNGtJUkxDRTRURjA2V3hEODUy?= =?utf-8?B?RHN4K09kWHpaUlZLU1FRTi9xdjc3YkppdUlNUjgzRzMrelNuV3hLNHRkcWVK?= =?utf-8?B?UURRYWdBN3RCYlBQYkNHUjRpK2tJRTJFb2E0bUN3cGs1cC82cGJyRzYyMjVp?= =?utf-8?B?SUlZemVCVXYrdk9BMnRrTnBrNk9DQzZyOXRmWkFoTGU5bVQ1RHhORUI2N0tq?= =?utf-8?Q?yLg2gO0tsTtrTWD6VlEx88sUvvssbHG5ISb7Gp2PJ8MqI?= X-MS-Exchange-AntiSpam-MessageData-1: 16pMoAw2zVT6FQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: af4d4e8f-4b80-4feb-d607-08dee898ec43 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2026 09:01:03.0880 (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: irbRwiQNcYJo3IsEqgxts3h7bmCCTwoZgwPaU3FishKbpVg7Zp2AGzb5s6dYn622a83i0Gqj3Dgsd8fMyiuoyA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB7104 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..b1d05e0429a5 100644 --- a/rust/kernel/id_pool.rs +++ b/rust/kernel/id_pool.rs @@ -4,6 +4,11 @@ =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; =20 @@ -240,6 +245,34 @@ 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`. + /// + /// `align_mask` must be `0` (no alignment) or one less than a power o= f two, in which case the + /// start of the returned area is a multiple of that power of two. + /// + /// 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_mask: usize, + ) -> Option> { + let start =3D self.map.next_zero_area(offset, count.get(), align_m= ask)?; + // 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 Fri Jul 24 21:52:34 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010061.outbound.protection.outlook.com [52.101.201.61]) (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 30B64413247; Thu, 23 Jul 2026 09:01:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.61 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797277; cv=fail; b=NGarDvLoCNdk3NA1UzSIGSa2yVQQcimxHJKwiW/oBwzaFn1ZbhC+C8ycdOtBNEQbR/FTfTtp1UfdeJYulABVnMdpzgagjg3Bm7kYAByIxJ6p5pLuR79ipC/EKaAYJK0KUGJDxKmpCPWt/7gDGamYUaDBeLqJzkZQkO+y5+h9Caw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784797277; c=relaxed/simple; bh=oEyvFBv85YvIJwky4QDsKheHgOsgDalXJAd96ztC0MU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=TZAC9R0jjQsijeX71iLFun17tjBqjIJI5raTJr9A3EPAt3/h7MXX7zvrfjHXr4DGD1Zly0YtkDUKd/VJJtBPVsoOOwDkyUZHzYzhrWyQB27sL8cTYCwbcwMq4y4xAjZXYdSGGxSWaCgLABH+Xpk1HWYGcQPevUh2YkUFpn94b54= 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=jD8Por1S; arc=fail smtp.client-ip=52.101.201.61 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="jD8Por1S" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CtV6/cw+RnOhFtYmnxsmHdxfOxdLose/mLEoBLEidGENyPmlD937psmwJd6ilBhfDEZ1ErfS4bBL0tcWH+mnmCv9fDK6tyhC7rAxn8b3d3tUmpBjs0ejfNhiMf+y9m2pgTwqZadw3agBAC0W9eYmj05hurh0R2vVp8JARGcUpW4Ie6AGm/qg2AJVpa0cZLbusNQCShQp5PR9EeTp/YV7C3qnuDV8lQcwGhC0Fu4AxHqSW729sFYDzICFBMAucXGE7vkasTVL5kfsFG3VCw/2svWIoGLrr/zWnX40UPhmMlCB0uHuxeJI1XLl8rT78iDlBAMZ1y6fNG+8N+ybDxWZuQ== 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=O3xAFEHlpC1Rq1MwX6qKlWSgrQpXH75g7itF12MADwU=; b=lwpb0hq0zsud5JdPMlALeKZyTONpTT5rXjqA61DtEI8MyeVB9DSTNXlQnVUAnF4zpBJqOaK6V1kaUx4U/6rJs0Oyqy7TSZ+95q26RQUiz5ImO42jyE7fLmihMuBQCGlhtIlvfT0Twd3mlRnodjQRlFAqNinGeT/fcln+pyVbO+/HmTj8y9BpXMHTAAWud2hXnnZ3znM8sM5aS5OvAtBb8wvLNvzCfxTAZQrpR9480T6mUzK2wO2u3cBOduo6JQ57QsN8TywI7gGNrs6EsKVAZyBpq5XXcvw/GmoY6bEYVK/MlveCNB+rtuMhtxSGCjnZml88jgF2xHowMUFsM1rMkg== 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=O3xAFEHlpC1Rq1MwX6qKlWSgrQpXH75g7itF12MADwU=; b=jD8Por1SRwAKfqYZZ54q3Fu8NcSKwew/5HZGYIfFj4vYpB1cT4HUV+2+0kxdhVYiqqyeZeu8ILt2Lb7Qs8Yst+9ugF+IhSxIVNB5np1r1bwGeUFWe50NA8ZEAKHtol5ZMngukx1CJoyqDOSqBEsyDqp2lS3lfyAqPudWk/CZenkaX2N2ZCIWnV+13qbtnrxGiXYgddryio11cw8LoKq6KdlsoXS/fDMIRxxJtJJGabQB+os/ZI2rA5i8L5AvgSIgqwQ/ZkaAofRvbb/hdqzWuTSbfKabD3Acy3hAzVzZm7Lwk2RCq2LwYP3NTqFTW/mP0ULoFx1Z0eAkqJQnvBBh/w== 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 SA1PR12MB7104.namprd12.prod.outlook.com (2603:10b6:806:29e::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.223.18; Thu, 23 Jul 2026 09:01:07 +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.0245.010; Thu, 23 Jul 2026 09:01:07 +0000 From: Eliot Courtney Date: Thu, 23 Jul 2026 17:59:13 +0900 Subject: [PATCH v2 4/4] gpu: nova-core: add ChannelIdPool Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260723-chid-v2-4-c35e5e9fb3d9@nvidia.com> References: <20260723-chid-v2-0-c35e5e9fb3d9@nvidia.com> In-Reply-To: <20260723-chid-v2-0-c35e5e9fb3d9@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: TYCP286CA0325.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3b7::8) 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_|SA1PR12MB7104:EE_ X-MS-Office365-Filtering-Correlation-Id: 4386e8ca-8653-47ce-71ec-08dee898eeb1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|23010399003|7416014|376014|10070799003|22082099003|18002099003|10067099003|56012099006|11063799006|921020; X-Microsoft-Antispam-Message-Info: LO7+II3nxeLV2rRZqBPi97kQTlX7Q2BNYXOQp7RRTTvSL9m0W40HU3tU+nOk+4SpnPfJS5nDCGRCvH1p/MQOGSa92tPXwnQjfRAa0gs1e2aRk5CiYQkWWZ97xpmk2YPb2dMRL5fJQ0lZ1SLUM8WDSKBq62Ra5mKHXdU72AvEL80eJNgbisQqHGGAF5MTj04g7Knn3uXewjM3h/WPZs2oBiwnDKh7UHWM+hI9QJP9TDDmV1zuilj7lCtRPtnp8Z9Pkn+Xdsg24rIZu20mYdI71dvHK4LayEMhtfgvpSKeGIDbPymyakazYrPKDkpJG9GKBdIY7mX/fNWTeogFEPEAJsVCjlpHIgkGcxHlvmcBsMsTjwQkVf9CKBZB1aoOkAZFaYgZmeaOhc2kPMbeUI4ZJoxq5IJDi3glTwv3IHSWorqadHhAc3S6kUb/GVRRUioNmj4TcquPitvjVMxzGqxiMaTCfa65Uq9cYZCmVsus9ltwhzyKwrHUAFLcuA0Cs+vwT7fo7l3+N+VPhB9sABo6MSfFs3x6RhQSNDBCvE1s/RxPjNT5ZEoVgbk/ukkNSrH5aeypLxsNUACPSy4aI9/J6TQgLaIQEr66uG/pInfLL/lULoQo0NscY/WlZ8uqZgMJ5g3zYMPlTbtetJWJkntITAKArv6rmeWCfqDTC84a/yS4J7F+h4lNW5TxpS7ztDzgUzCBCXrFwJjE68KQTRwZFw== 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)(366016)(1800799024)(23010399003)(7416014)(376014)(10070799003)(22082099003)(18002099003)(10067099003)(56012099006)(11063799006)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?czBobk5jV2ZrOU9raWNXRW9rcW01ZDNXNFpoTzVZZDh5ZERDUXQ0c0VPR3NW?= =?utf-8?B?eUNRR0kvbXZWa0lhSFB0Z0tFbnczMDJFMHRrTjJsdW9kVWRKUkQ0UFphTXNJ?= =?utf-8?B?Q29TcUVyYUNaYmxVTVlTcGdMelMzME9aazAxbjluWXI0eDlhaUwza1FhL3A5?= =?utf-8?B?ZW5yNFVzSnUvWDdzVnNaamM2c0JKUUJ6Q3BHd3k1U0Z4MlNIZ3BWQkIrQ3h6?= =?utf-8?B?cjY4bXNCUXUvN1FxcjR5VWlJcjZDUktZNk16dGRreS9vMVE0N1RFeCtBcVBz?= =?utf-8?B?WlllQkFXSUZRSnFWdnFPdzB6N3ZZMm9wamx4K0FLRTJYVGtKTWNWVWVwcStC?= =?utf-8?B?VEFDVzVzbTF4bm9nTCtxSVU3VTN2T2lkeEJwV2F6OUtWVnBwS0I3RDdnRkdW?= =?utf-8?B?azc5cHdxWXJiZG9VdGxzRGFoVUZVUjBoQnZsejI4YlR3Wjh4N2d0VDBTY2d3?= =?utf-8?B?ZE0zQVhCVndCRENwdzUvSzRWUXArRkVFaXordmhycUxjcFpsL3d1UHcrMTU5?= =?utf-8?B?UXd6cGJ1eHZQTDNoU3dJQjJTUGd2bHpUWW9rWUJ2bTZhbFJIRC9SU3FOTEJH?= =?utf-8?B?RVRscXRqMS9XRHQ2MUVxQnBCdWV5Z0VpZFFsOWQ5b2llZU03c084aTloM2Rw?= =?utf-8?B?cUtpZGdkT09NM0FENWRsNlFhbUM3Sk1oZTAxK2prU1RGc0E3ZHRIemtpbDFY?= =?utf-8?B?SEZXa01qQ0d3Z3FSQmVwejlJM0g1allXQXhHaW90QkRWaUNXc2JxNDVDSzZ1?= =?utf-8?B?Z2EyRzZEbWkxUlZxVFpsUGdPYnJaY28rd1FEOEU4SlRCL1NIRGZqRUU5S0oy?= =?utf-8?B?VVQxTkxjVTNhRnR5NzkraUJtSm9Lc0pjYUFDSGFaWDVKWm9IZXd5OHBEVGFv?= =?utf-8?B?NGN2U0M3dHpJNWdTSElsSUdybzcyMGc0N1RqVnVNT2hOK3pwUVpvSjNFSEpx?= =?utf-8?B?TFl4eGJjaGF2WDN0MXphTVVZVTNTaEsxekRraitCcFF5eHl0NnF4dERBVDhD?= =?utf-8?B?Q2thaE04blo4VmMrWlhPbXp4WW9ZL2FrdGRxdTR2bklDclRna1JEYy8wWVc1?= =?utf-8?B?UnRLTGllcm1iWXRyZno1Q1cyRlBiMzlqY2tRalErS1NMYm9ONGpLMHQxNENh?= =?utf-8?B?bGYrS1l4d1N1NGtIV3gwZXExSFdHa3ZkMzMzR3ZXdFV4clNKYllnYnJsRll3?= =?utf-8?B?MCtlMFNGMk1OQ0pRQ3BqMnphbHhaZFQ1ODVxOHNLbjlsTE5KSHJya2psQ05L?= =?utf-8?B?Mis2cC9GMnFwWkFRQ0FlRmc2OHRLR0UrcFJUS2RZZ2NSNElEZEpWMVpKZ1VU?= =?utf-8?B?WVVFVUhpcGZxYytLM001eTNybytIR0t4NERlQUtKS2V4UllQTDMzM2FBUEV2?= =?utf-8?B?SHdrdHZtQzNGcFFOc2dhTW94WHZKRlJZUGF3Ri9IV2RGTWJVeWpXTEcrTG5q?= =?utf-8?B?emFDQ1gwSm9PNC9icVMwVmNyRjc5TzdwK3RsY2krSFVIT2tiWUFUZDVPUnl3?= =?utf-8?B?U3krWjF1dWpwUWhZQm13aGQ3cnFtZStJdUFyS2o4am56c1Vwdmw1WHlkR3pB?= =?utf-8?B?N0UvdVU3QUNEOHE5NklpSzllQXRGdkN1TkdWNEovWDVhVjJJK1VPWmx0MUg5?= =?utf-8?B?Mm1IMnp6cE5pWFFVUDYvc2l1WUxPaXNwNzI0dzF6Tmo0MFRBYlhiWGpyZ2dE?= =?utf-8?B?YWdQbzRtZGZyNktQdXBXK09JT3Y0aUZQdG0wQUIwWE44UVpKQlZ6RWRWTjdK?= =?utf-8?B?cjFUbSt1b3QxWk83d085Q0ZVT1R3ako0ZHFXOTBkZ2RuZXQrcnJyVEROaTNM?= =?utf-8?B?KzE0NUtkbGRCTjc2aUswOXBQR1BTTGhLUmE0TGRMR216VDdUb0ErYVVFeDFO?= =?utf-8?B?NTNyTXErWUVRNUREci96UC8zTmUxSWpEMVdodEl4cEppbk40WmhSdE1VOVhp?= =?utf-8?B?dlI4VTJ1SFV2VTRMc1BwOGh0b3pHczFKQ2cycllDNG9lQ2s5dUQyT0EyREhi?= =?utf-8?B?bGNYWXRndlNIeDNpZFdWTnZlVDh3M3RxbnFaQWIyWmJSZzIrNDZuQ1NzYk5K?= =?utf-8?B?TENPbFlOSXczL2FkZWJYa2NUUVlFTVRzemNiQWhBa3BEZEI0TGt3WklaZHVQ?= =?utf-8?B?aDd5b2s3dGNlbXdwN3gvKzNBVStXU1FJcTdDQ2hZbzhKK0Y1QjFsTUJSKzV5?= =?utf-8?B?V2E4SHp2Ly9kQ0ZSeGdzdURROHBVNUpqUDRFQUpCQytRQ0hJejJNSzlwMlJZ?= =?utf-8?B?VjBEcEl6UHIrN3cwQXZBVE52RnFsaHQ2aTFVaFVqcjlwbElvVnQ4T0w4akNq?= =?utf-8?B?WjZjZ2dxVTRzNlY5cmh2M3hjSGpYTzlYcXphdTlaS3RuRkcyUEEvbWtzQkVX?= =?utf-8?Q?3FHAEA6sBKH5SBttpujjTL96cPSTLE3RwFO1qd2UriRfh?= X-MS-Exchange-AntiSpam-MessageData-1: deLGzFaHsg06sA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4386e8ca-8653-47ce-71ec-08dee898eeb1 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2026 09:01:07.3073 (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: cwIiMPE1t63Znh+ScnFt78cKdHN/GbhES5PTHti/k8NayUV888fv6NFNZQwgNjAV5dwuMT2A6EcK33rRX524mQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR12MB7104 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 | 182 +++++++++++++++++++++++++++++++= ++++ 2 files changed, 184 insertions(+) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 442c0979f9c6..4e58fc06a371 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -32,6 +32,8 @@ regs, }; =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..d3d315ba6c6b --- /dev/null +++ b/drivers/gpu/nova-core/gpu/channel.rs @@ -0,0 +1,182 @@ +// 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.as_usize() - 1) + .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