Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752483AbcLGNvm (ORCPT ); Wed, 7 Dec 2016 08:51:42 -0500 Received: from smtpoutz29.laposte.net ([194.117.213.104]:55650 "EHLO smtp.laposte.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751654AbcLGNvl (ORCPT ); Wed, 7 Dec 2016 08:51:41 -0500 Subject: Re: [PATCH v3] add equivalent of BIT(x) for bitfields To: Jakub Kicinski References: <87bmwom8on.fsf@purkki.adurom.net> <489b2ea4-0678-97ac-f46e-4fc8a7853358@laposte.net> <20161207110517.45f54a9a@jkicinski-Precision-T1700> <20161207123800.6dd89eff@jkicinski-Precision-T1700> Cc: Kalle Valo , zijun_hu , Andrew Morton , linux-kernel@vger.kernel.org, Linus Torvalds , Mason , Harvey Harrison , Borislav Petkov From: Sebastian Frias Message-ID: <99472464-f6a0-3d92-29c0-6728d9b50b00@laposte.net> Date: Wed, 7 Dec 2016 14:51:36 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <20161207123800.6dd89eff@jkicinski-Precision-T1700> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-VR-SrcIP: 92.154.11.170 X-VR-FullState: 0 X-VR-Score: -100 X-VR-Cause-1: gggruggvucftvghtrhhoucdtuddrfeelfedrhedvgddvhecutefuodetggdotefrodftvfcurfhrohhf X-VR-Cause-2: ihhlvgemucfntefrqffuvffgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhs X-VR-Cause-3: ucdlqddutddtmdenucfjughrpefuvfhfhffkffgfgggjtgfgsehtjeertddtfeehnecuhfhrohhmpefu X-VR-Cause-4: vggsrghsthhirghnucfhrhhirghsuceoshhfkeegsehlrghpohhsthgvrdhnvghtqeenucffohhmrghi X-VR-Cause-5: nhepmhgrrhgtrdhinhhfohenucfkphepledvrdduheegrdduuddrudejtdenucfrrghrrghmpehmohgu X-VR-Cause-6: vgepshhmthhpohhuthdphhgvlhhopegludejvddrvdejrddtrddvudegngdpihhnvghtpeelvddrudeh X-VR-Cause-7: gedruddurddujedtpdhmrghilhhfrhhomhepshhfkeegsehlrghpohhsthgvrdhnvghtpdhrtghpthht X-VR-Cause-8: ohepjhgrkhhusgdrkhhitghinhhskhhisehnvghtrhhonhhomhgvrdgtohhm X-VR-AvState: No X-VR-State: 0 X-VR-State: 0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3854 Lines: 111 On 07/12/16 13:38, Jakub Kicinski wrote: > On Wed, 7 Dec 2016 12:23:56 +0100, Sebastian Frias wrote: >> On 07/12/16 12:05, Jakub Kicinski wrote: >>> On Wed, 7 Dec 2016 11:00:57 +0100, Sebastian Frias wrote: >>>> On 07/12/16 09:42, Kalle Valo wrote: >>>>> Sebastian Frias writes: >>>>> >>>>>> Introduce GENVALUE(msb, lsb, value) macro to ease dealing with >>>>>> continuous bitfields, just as BIT(x) does for single bits. >>>>>> >>>>>> GENVALUE_ULL(msb, lsb, value) macro is also added. >>>>>> >>>>>> This is useful mostly for creating values to be packed together >>>>>> via OR operations, ex: >>>>>> >>>>>> u32 val = 0x11110000; >>>>>> val |= GENVALUE(19, 12, 0x5a); >>>>>> >>>>>> now 'val = 0x1115a000' >>>>>> >>>>>> >>>>>> Signed-off-by: Sebastian Frias >>>>>> Link: https://marc.info/?l=linux-kernel&m=148094498711000&w=2 >>>>>> --- >>>>>> >>>>>> Change in v2: >>>>>> - rename the macro to GENVALUE as proposed by Linus >>>>>> - longer comment attempts to show use case for the macro as >>>>>> proposed by Borislav >>>>>> >>>>>> Change in v3: >>>>>> - use BUILD_BUG_ON_ZERO() to break if some input parameters >>>>>> (essentially 'lsb' but also 'msb') are not constants as >>>>>> proposed by Linus. >>>>>> Indeed, 'lsb' is used twice so it cannot have side-effects; >>>>>> 'msb' is subjected to same constraints for consistency. >>>>> >>>>> (I missed there was v3 already, but I'll repeat what I said in v1.) >>>>> >>>>> Please check FIELD_PREP() from include/linux/bitfield.h, doesn't it >>>>> already do the same? >>>> >>>> Indeed, it appears to do the same :-) >>>> Any reason why "include/linux/bitfield.h" is not included by default in >>>> bitops.h? >>> >>> Hi! >>> >>> The code is in a separate header because of circular dependencies >>> (coming from bug.h including bitops.h, IIRC). You could possibly add an >>> include of bitfield.h in bitops.h if you're very careful, I haven't >>> tried TBH :) >>> >> >> Well, the following seems to work just fine: >> >> diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h >> index f6505d8..24c7480 100644 >> --- a/include/linux/bitfield.h >> +++ b/include/linux/bitfield.h >> @@ -15,8 +15,6 @@ >> #ifndef _LINUX_BITFIELD_H >> #define _LINUX_BITFIELD_H >> >> -#include >> - > > That would break users who include bitfield.h directly and don't > include bug.h, no? That's why I was asking if there's a way to verify that I did not break anything, as it may be simpler to just modify the users. Right now bitops.h does not include bug.h yet my patch on this thread used BUILD_BUG_ON_ZERO() inside bitops.h without issues. So it seems like the "proper" include order is already in place. (even though I agree with you that ideally each header file should include headers required for it to work properly, regardless of include order) Would the following files be the only two users we would need to worry about? $ git grep "linux/bitfield\.h" drivers/net/ethernet/netronome/nfp/nfp_bpf.h:#include drivers/net/wireless/mediatek/mt7601u/mt7601u.h:#include I can take a look at the underlying include order issue later. > >> /* >> * Bitfield access macros >> * >> diff --git a/include/linux/bitops.h b/include/linux/bitops.h >> index a83c822..7e5fab8 100644 >> --- a/include/linux/bitops.h >> +++ b/include/linux/bitops.h >> @@ -24,6 +24,8 @@ >> #define GENMASK_ULL(h, l) \ >> (((~0ULL) << (l)) & (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h)))) >> >> +#include "bitfield.h" >> + >> extern unsigned int __sw_hweight8(unsigned int w); >> extern unsigned int __sw_hweight16(unsigned int w); >> extern unsigned int __sw_hweight32(unsigned int w); >> >> >> Is there a way to be sure it works in all cases? Otherwise >> I could just submit that, right? >