From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shreyansh Jain Subject: Re: [PATCH v2 1/8] eal: define container_of macro Date: Thu, 8 Dec 2016 12:31:57 +0530 Message-ID: References: <1479747322-5774-1-git-send-email-jblunck@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Cc: , Jan Viktorin To: Jan Blunck , Return-path: Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0041.outbound.protection.outlook.com [104.47.32.41]) by dpdk.org (Postfix) with ESMTP id 4D2872A66 for ; Thu, 8 Dec 2016 07:59:14 +0100 (CET) In-Reply-To: <1479747322-5774-1-git-send-email-jblunck@infradead.org> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hello Jan, Need your help in resolving the checkpatch issue for this patch. I have used this in EAL Bus series [1]. [1] http://dpdk.org/ml/archives/dev/2016-December/051350.html On Monday 21 November 2016 10:25 PM, Jan Blunck wrote: > This macro is based on Jan Viktorin's original patch but also checks the > type of the passed pointer against the type of the member. > > Signed-off-by: Jan Viktorin > Signed-off-by: Shreyansh Jain > [jblunck@infradead.org: add type checking and __extension__] > Signed-off-by: Jan Blunck > --- > lib/librte_eal/common/include/rte_common.h | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h > index db5ac91..8dda3e2 100644 > --- a/lib/librte_eal/common/include/rte_common.h > +++ b/lib/librte_eal/common/include/rte_common.h > @@ -331,6 +331,26 @@ rte_bsf32(uint32_t v) > #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) > #endif > > +/** > + * Return pointer to the wrapping struct instance. > + * > + * Example: > + * > + * struct wrapper { > + * ... > + * struct child c; > + * ... > + * }; > + * > + * struct child *x = obtain(...); > + * struct wrapper *w = container_of(x, struct wrapper, c); > + */ > +#ifndef container_of > +#define container_of(ptr, type, member) __extension__ ({ \ > + typeof(((type *)0)->member) *_ptr = (ptr); \ > + (type *)(((char *)_ptr) - offsetof(type, member)); }) > +#endif (I think there was discussion in ML about this but where, I couldn't find it). Above code snippet doesn't go down well with the checkpatch script. It reports: ---->8---- ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses #40: FILE: lib/librte_eal/common/include/rte_common.h:349: +#define container_of(ptr, type, member) __extension__ ({ \ + typeof(((type *)0)->member) *_ptr = (ptr); \ + (type *)(((char *)_ptr) - offsetof(type, member)); }) ERROR:SPACING: need consistent spacing around '*' (ctx:WxV) #41: FILE: lib/librte_eal/common/include/rte_common.h:350: + typeof(((type *)0)->member) *_ptr = (ptr); \ ---->8---- Second error is primarily because of '*_ptr' rather than '*_ptr'. Is do{ ... }while(0) the fix for the first one? This: ---->8---- #ifndef container_of #define container_of(ptr, type, member) do { \ __extension__ \ typeof(((type *)0)->member) * _ptr = (ptr); \ (type *)(((char *)_ptr) - offsetof(type, member));\ } while (0) #endif ---->8---- Seems to be ok with checkpatch. Do you see any technical/compiler issue with this? > + > #define _RTE_STR(x) #x > /** Take a macro value and get a string version of it */ > #define RTE_STR(x) _RTE_STR(x) > - Shreyansh