From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010043.outbound.protection.outlook.com [52.101.85.43]) (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 9240B1A680C for ; Mon, 13 Apr 2026 16:40:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.43 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776098423; cv=fail; b=RvrJgfz1GnJnsSTxZBNbQ5F55p+PAdEKZCwOp8J52rvONHNj0zuDS27/XUI41rQEhDzpTAURTdHCAGxXyzd7YYaXnCIYOp+FJDo7lRxT5gIEXABpHv5Gf+s3RDPMA5BFqAMGWT8zxwHbbDswOX+RM85Sng8Oi0Ph6NiVnk+eW0I= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776098423; c=relaxed/simple; bh=TsBFMw8qWHsJPBEZIlxvHPh8c/SJKq1yAP7Dy5qH9AQ=; h=Date:From:To:Cc:Subject:Message-ID:References:Content-Type: Content-Disposition:In-Reply-To:MIME-Version; b=bles/S1JOsjq6dXjrveJGkS9Mm5SBDMEPXxdOri6vUTsGqPIO+83/CZFqeWakA0lCuTlXl46/Az0HuHBcDK3jtCMBvHip1EMa7UsJBwaKmdIb11fVHEPqdd38/7OgxwE4nhkmgSz1w7BRjSxe05nQ4ubyUvvGRlE0UlNoqTmLPc= 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=EEPt7XdM; arc=fail smtp.client-ip=52.101.85.43 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="EEPt7XdM" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sJTRp24h9PhUjfvWOZ4/L5UVYxDQ7fC1mM9dcTut/3qYGtF8EOq+c33g5Vaom2hOyTPA62Ffgb3rk3dWudZVTexNgbRLdrn69azCFj13stMZDQtDuQfL+5RXLxRFCLJpny9QXif9Z4YTq3PjJABTPGSbtKtAPGeFucw67LZvv1F+jzf/FyHKUUAww2F2sxSf+IJF5tGLbh6tjAYW4I1OFxMnAjFsercUXSQB1k4XpF86NQHVcw8yQD1w9meNtZy50aaljRhGoHotXiODShYBI3SUx/5YBL9uz1n3hBPfhRd0GtRTetwpJKYdoaq9+fiwIwhuKSPh90HdEDXsW5FnCg== 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=9E+CPLwzjrkSCuxWVf37rlCj3i+3TittjuuX/3AGyFo=; b=bR+xyDvK4xYSJJF/rjm2OM62SH/lk6RP1G5m3zb0ErPt1jVcNjLGi05rqxllwmj/u8g2MKO3qyNetHK06aC85oShvJpZ69O2DZ/dtcANIUH8+sSuPSKwlRmQ09FWg3L5nJouOdNrSScCtS5dbbKzoQTqcG/+DFtiOZ+hHnX8VoJYiy7mdl6K0I5ypRhYgKvTAVs5hRz4pY8M3M3KT+Gndq1oWfdBhe16VytyFUu7xjfnDUIdpZe1Hs2Xii8CffY9rCHSMsGz+f/NtzKgmTW16g3ZQCwn54zaLWagIPi26qd0SbCdVz6qmQJE5+ROcgV/1NLOFLoF1PP8O/GSDnNQFQ== 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=9E+CPLwzjrkSCuxWVf37rlCj3i+3TittjuuX/3AGyFo=; b=EEPt7XdMy95YFbGvgD1SH02nTtkr4BLMPVvoB0uVe/mNqXWCG+4kRLx1rPC6yomkK+E5n7j8dzgBM9wDH+tGC6fEqvvA1Ueo4u5pbBAK86G3UIesnWYxqxCuW/vZSenWM3k6W2EaUHdDHys19Ygp+3K6Rx8VkHy86ZkTx95msIUzScjT32mFKMJCd4ydtvn0eCgLG1/ywi1n9y333/LQBWzvbVfY7fdwqwU0bsMqSKphLKUwIHcp1cQ1PPvNd1UxbUXRK0Gcv50Ez0yVC5kO833SHim7+F2Y20o65d8tOy+smwQS1hVS3jgkhvO8pzzrHajZM7QMvHvhdKZ6U9+ZBw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CY8PR12MB8300.namprd12.prod.outlook.com (2603:10b6:930:7d::16) by PH7PR12MB7020.namprd12.prod.outlook.com (2603:10b6:510:1ba::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.48; Mon, 13 Apr 2026 16:40:14 +0000 Received: from CY8PR12MB8300.namprd12.prod.outlook.com ([fe80::ce75:8187:3ac3:c5de]) by CY8PR12MB8300.namprd12.prod.outlook.com ([fe80::ce75:8187:3ac3:c5de%3]) with mapi id 15.20.9769.046; Mon, 13 Apr 2026 16:40:14 +0000 Date: Mon, 13 Apr 2026 12:40:11 -0400 From: Yury Norov To: David Laight Cc: Geert Uytterhoeven , Alexandre Belloni , Jonathan Cameron , Crt Mori , Nuno =?iso-8859-1?Q?S=E1?= , Richard Genoud , Andy Shevchenko , Yury Norov , Rasmus Villemoes , Matt Coster , open list Subject: Re: [PATCH 1/1] bitfield.h: Ensure FIELD_PREP_CONST() is constant Message-ID: References: <20260410090927.60484-1-david.laight.linux@gmail.com> <20260410194539.560b5fdc@pumpkin> <20260411115415.3724cdcd@pumpkin> Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260411115415.3724cdcd@pumpkin> X-ClientProxiedBy: BN9P223CA0013.NAMP223.PROD.OUTLOOK.COM (2603:10b6:408:10b::18) To CY8PR12MB8300.namprd12.prod.outlook.com (2603:10b6:930:7d::16) 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: CY8PR12MB8300:EE_|PH7PR12MB7020:EE_ X-MS-Office365-Filtering-Correlation-Id: 7080f40e-b8f8-4689-ca7c-08de997b5655 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|7416014|376014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: ELyIdr3JJrxjY6awFD6xBmnMTEQ25S9IotSsRTBKr40scHfIKLkKdO3HX9y0ZMkd+Wx/tjB3xeNp7rkEIgxU8c4kocQWdVT8HQ003fSn/HkvEn+/5e3lkDwfW3B4y1qe3Drf/TgwRGhk1X7VGTW1NkBzCwEzOPJNzn+n3ChuJnzdkvY6RwogLRMeNBlsF9DY8LRIc8rDCVtUj0k5zj4QT+q4BQf0+BWG4Bb0Un+ou+wsqB3vfsOJOjA9LqKWDcanqGzn7uhT017TUZe/QutergUGZdO87xVpZP/oDp+df65DobA2R1+EyIv9Ar0P8SFtz1DNnmpYAj4AshuaIA933zscqNBm03svSfwlwsCEM6kB8zuf7Kc84+TuBS8/BAUJHhwW39kN4dxxgsSAzU81dFBM1+3UtvG4PDVMJ72lcn5L1hMaMFMgNN3hHbWkCKooomomUZrklZrnKF/e5qfWG3y9WLea2IIVNyiBbDpdSj5fdr5eiiBGGmXXnlD4aQphj5vXH8cRDpjM4IuA2HxULUMvEXXix9IopVKJSoN+HrD1btuip5JpPbS3z1g2bzhtQqPkFAdyoWIHgGZYGYwcKyLYMowcLyQeqHSsJr4JRw0aG9bCdMzIiSRHjcGJly8vsI+s/m8hiXuIO9LT40+bedzPkM0zgyXjB9RlI42PTn1OUZIOfEVo+r/+qD9gBT+Y3lOK6uA6qkhxZL/3E+5Ok5/eiw6OIHnRK9IUz81MCZKvw+6gDw6DwhhBKKoe90cw X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY8PR12MB8300.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(7416014)(376014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eE7PReM6j2ofuLWD1BGleQFbd2+oXFECBs+T0mwQDg1X9SaqOkA+MadxeMsq?= =?us-ascii?Q?sGVDslEviiq+L/smXY+xLumeuqhZbKfkJcF5aOTcvUSwH6vKtwFbQ+4Ywetc?= =?us-ascii?Q?bflJedzwbrAGSMwHgnqjWZsDw3MmBeB+WPOESvPzc6ZUceqWAXXGZQ8oAgiu?= =?us-ascii?Q?wu6IPNTEqtQIBPGXWWXMk18Fu0a8pFBqlKcHs711rmG2uPFTNz+jDmV2R35B?= =?us-ascii?Q?AF2gUIv3rBE2YNELCInPZ2yczaOhquMosfcb07zy44H9nh4LBucX2P/Cgcd3?= =?us-ascii?Q?J5dA7lcIiJAUM88k5THJriAoOyBIfp/SRiZNUZpEMRVnOpbGvf7fRTPl0FJm?= =?us-ascii?Q?9pzAbuihlkdSPrYsKhvpHfXXt9cp5nI0nerXzsWvS54p83F+i9nnwrExC8ig?= =?us-ascii?Q?6Fde7RWXNPISPE1f/yQuEED/9uQq9Q1KyZHV5T5Dn8CPzQRmjR2fLSDE7ZrK?= =?us-ascii?Q?m7IObvweryrx7iaajkPMo2DbyHy/XP+caQDwiwVlIZz9w6FoWo7f/MjuXbBU?= =?us-ascii?Q?faRZBdou67UeKZFbtDmCz0lNyny9jEYbKCyeXgiaL3xbyGrni/wqF8i3gREs?= =?us-ascii?Q?5UKmd1v95oUkxF8uAS7VuuowO8vhXK4sIeHGtXxRDLnVfk5UzaMzSMXlyjga?= =?us-ascii?Q?SV4P3eQnZcuTzFj+SjNOklNXNaJuzAc53rVXPy9Q3wWaCExwMmbxY8wGz/om?= =?us-ascii?Q?z6aGIU9VliXVZsMPrHgxZLGbuKERHaamUiYmWvpqeuUJMljsRU9CNcE7SS+i?= =?us-ascii?Q?c47OEi7+yWQwk7FlQyZvT8wwc2SA5Tpb4M+9Q46s2XVJj/2GvJSbA2RPzNBa?= =?us-ascii?Q?9D/8DeqalmHGgsXjBJLMvarvl9uydvQeyNsAu9bFa8nKzSyyJ40wEINiRD81?= =?us-ascii?Q?KvjCZnqZkWo5kxwfSuTc4RKwXz/OYHwPUYVI6PYe/Sbl6zuC8Z/rWO8Jt2VM?= =?us-ascii?Q?HrqoiiSqDS0lP6TRGYK1PQP0ZvM32z1RaKCY+Helkl52ziCkzT6OMU2xspz9?= =?us-ascii?Q?a0HehoFJ+ekxtcgm79wv1wejp4VK6e2D8GD4rt6fravAQmnGptxeB9l0/eY4?= =?us-ascii?Q?m0ENM+3j4s2tsaik7gCPaJseHo6+aejGMofdDG4USXZl/Ex5y4QOFTxgg3OK?= =?us-ascii?Q?WnHaQuY/3P1H3jmCM9JIxW9Hy1Dwd6hI4GACYnkakcBFEojoFrBNMPFz2nP0?= =?us-ascii?Q?17K86ZagDgt83/EmeiRPjbM+9TDf0HL1NUwqRuWQCQfupm9hl6yGcoga9Ssn?= =?us-ascii?Q?v2Vif5Syjc9jPynO921BxU2AR+YAIpSGoR5xT9WwsgLJRPggWmnEtpVqEqpb?= =?us-ascii?Q?VYz2rwoWQ5n+lMcQneqNZkZKqv0vom0u8kw0l435Q7cAcuDbMCxOcdA0FjqF?= =?us-ascii?Q?mVK29iFm5pOr1d0uOd6NlfkogGKZHYwwXmzB0O/fnPY8mVytdRFFSVB+Syjv?= =?us-ascii?Q?hO1a7Kgfk3zDctzbN95G4o9ymjSB41Fp9q/8kRN0rjn9SxC80oMp0RGfkD2A?= =?us-ascii?Q?4y8D70pV+GrtQZYv9Qu2/yQYO50m3oD0f7iTmsy54ta81DLXMOkERwgl9gEh?= =?us-ascii?Q?0eOSaCMMq+0RncoKekl/lDqluK/2N42tckG4/TLlluS7G06qsN9k/McRQYn0?= =?us-ascii?Q?rYInFbeErWv/+MdBAz+7U4jgwqe5PYMKhT3viu3ybTJheaRBHaSd0Eoq+hC3?= =?us-ascii?Q?BpST3N53J6YCig9xioMQQxmyWGve9ddh7rqHHRAPZ1BE1JEo+2T1rrmN/SqP?= =?us-ascii?Q?6aXTdJPO3nseIdUfdxs98MoDpk7RLiLOwD7muKkAuDoNyzWR/J9h?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7080f40e-b8f8-4689-ca7c-08de997b5655 X-MS-Exchange-CrossTenant-AuthSource: CY8PR12MB8300.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2026 16:40:14.5245 (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: Hj85N/4m3PEazva0v3JLzXGrsBz+qOfbw4TQQ3f8exfTLwFCTO16msoufONQ62huKmGanrS8e1n0gehYQv0Rlw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7020 On Sat, Apr 11, 2026 at 11:54:15AM +0100, David Laight wrote: > On Sat, 11 Apr 2026 00:24:28 -0400 > Yury Norov wrote: > > > On Fri, Apr 10, 2026 at 07:45:38PM +0100, David Laight wrote: > > > On Fri, 10 Apr 2026 12:55:25 -0400 > > > Yury Norov wrote: > > > > ... > > > > > > > Note that when 'val' is a variable 'val << constant' is likely > > > > > to execute faster than 'val * (1 << constant)'. > > > > > So the normal FIELD_PREP() is best left alone. > > > > > > > > Do you have any numbers? I'd prefer to have the codebase consistent > > > > when possible. > > > > > > I think the multiply instruction will have a higher latency than the shift. > > > So you are talking about a very small number of clocks if the expression > > > is in the critical register dependency path. > > > However FIELD_GET() would need to use a divide - and that would be a lot > > > worse. > > > > > > Having written that, ISTR that 'mask' is required to be a constant. > > > So the compiler may use a shift anyway - if the divide is unsigned. > > > But for non-constant mask you definitely want a 'shift right'. > > > > Non-constant masks are handled with __field_get(), which doesn't use > > __bf_shf(). > > > > > While you might think that it only makes sense to use unsigned values, > > > I've found one piece of code (IIRC in the x86 fault handler) that > > > passes a signed value to FIELD_GET() and needs the result sign extended. > > > So, unless that is changed, FIELD_GET() must use an explicit right shift. > > > (Of course, right shift of negative values is probably UB...) > > > > FIELD_GET() is quite fine with the change: > > > > #define __FIELD_GET(mask, reg, pfx) \ > > ({ \ > > __BF_FIELD_CHECK_MASK(mask, 0U, pfx); \ > > - (typeof(mask))(((reg) & (mask)) >> __bf_shf(mask)); \ > > + (typeof(mask))(((reg) & (mask)) / __bf_low_bit(mask)); \ > > }) > > > > void my_test(void) > > { > > f3 0f 1e fa endbr64 > > 48 83 ec 08 sub $0x8,%rsp > > volatile int i = -1; > > > > pr_err("%lx\n", FIELD_GET(GENMASK(10,5), i)); > > 48 c7 c7 13 e3 51 82 mov $0xffffffff8251e313,%rdi > > volatile int i = -1; > > c7 44 24 04 ff ff ff movl $0xffffffff,0x4(%rsp) > > ff > > pr_err("%lx\n", FIELD_GET(GENMASK(10,5), i)); > > 8b 74 24 04 mov 0x4(%rsp),%esi > > > > } > > 48 83 c4 08 add $0x8,%rsp > > pr_err("%lx\n", FIELD_GET(GENMASK(10,5), i)); > > 81 e6 e0 07 00 00 and $0x7e0,%esi > > 48 c1 ee 05 shr $0x5,%rsi > > e9 32 aa b9 ff jmp <_printk> > > There is a subtle difference between (https://www.godbolt.org/z/KM7MesPWM): > > int a(int x) > { > return x >> __bf_shf(0xf0u); > } > > int b(int x) > { > return x / __bf_low_bit(0xf0); > } > > int c(int x) > { > return x / __bf_low_bit(0xf0u); > } > > a: > movl %edi, %eax > sarl $4, %eax > ret > b: > testl %edi, %edi > leal 15(%rdi), %eax > cmovns %edi, %eax > sarl $4, %eax > ret > c: > movl %edi, %eax > shrl $4, %eax > ret > > A while ago I did a compile-test for negative values and found one > place that requires the sign-replicating right shift. Again, please be more certain. When? Which compiler did you use? Which place have you found? Does that place still exist? > > So you'd need that check and to fixup the caller. None of them use DIV or MUL expensive instructions, which was your original concern. If you're concerned about code generation in (b), you can typecast it to an unsigned with __bf_cast_unsigned(). And I also think that __bf_low_bit() is a bad name - low bit is always #0. Maybe ffs_mask(), lsb_mask() or more wordy least_set_bit_mask()? Altogether, IMO this would be: #define ffs_mask(val) (__bf_cast_unsigned(val, val) & \ (~(__bf_cast_unsigned(val, val)) + 1) -- Regardless of __bf_low_bit() discussion, __bf_shf() needs to get fixed for gcc <= 14, because it's a public API and has over 100 users in the kernel. So, Matt, you're very welcome to submit v2. Thanks, Yury