On 5/27/20 4:03 PM, Jérôme Pouiller wrote: > On Tuesday 26 May 2020 23:02:56 CEST Hauke Mehrtens wrote: >> On 5/25/20 11:35 AM, Jérôme Pouiller wrote: >>> On Thursday 21 May 2020 22:14:22 CEST Hauke Mehrtens wrote: >>>> When compiling inside the kernel include linux/stddef.h instead of >>>> stddef.h. When I compile this header file in backports for power PC I >>>> run into a conflict with ptrdiff_t. I was unable to reproduce this in >>>> mainline kernel. I still would like to fix this problem in the kernel. >>>> >>>> Fixes: 6989310f5d43 ("wireless: Use offsetof instead of custom macro.") >>>> Signed-off-by: Hauke Mehrtens <hauke@xxxxxxxxxx> >>>> --- >>>> include/uapi/linux/wireless.h | 6 +++++- >>>> 1 file changed, 5 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/include/uapi/linux/wireless.h b/include/uapi/linux/wireless.h >>>> index a2c006a364e0..24f3371ad826 100644 >>>> --- a/include/uapi/linux/wireless.h >>>> +++ b/include/uapi/linux/wireless.h >>>> @@ -74,7 +74,11 @@ >>>> #include <linux/socket.h> /* for "struct sockaddr" et al */ >>>> #include <linux/if.h> /* for IFNAMSIZ and co... */ >>>> >>>> -#include <stddef.h> /* for offsetof */ >>>> +#ifdef __KERNEL__ >>>> +# include <linux/stddef.h> /* for offsetof */ >>>> +#else >>>> +# include <stddef.h> /* for offsetof */ >>>> +#endif >>> >>> Hello, >>> >>> This patch also solves a warning I encountered when I launched sparse >>> (with make C=1): >>> >>> /usr/lib/gcc-cross/arm-linux-gnueabihf/9/include/stddef.h:406:9: warning: preprocessor token offsetof redefined >>> ./include/linux/stddef.h:17:9: this was the original definition >>> >>> However, I wonder if it useful to keep 'include <stddef.h>' when this file >>> is included from userspace. If it does not compile anymore, there is >>> problem somewhere else, no? >>> >>> (Globally, I always find suspicious a kernel source that includes a system >>> header) >> Hi, >> >> The wireless.h makes use of offsetof and this is defined in system >> stddef.h and in include/linux/stddef.h. When we only include >> linux/stddef.h it will work fine when compiled inside the kernel, but it >> could cause problems when used in user space, because this would include >> ./include/uapi/linux/stddef.h which does not define offsetof. >> >> I think we need the #ifdef __KERNEL__ to make this work in the kernel >> and in the user space. > > In this case, maybe the problem should be resolved directly in > uapi/linux/stddef.h? > > I have found other headers that use offsetof and may have the same problem > (currently, they do not include stddef.h. So, some of the macros do not > compile): > - include/uapi/linux/fuse.h > - include/uapi/linux/genwqe/genwqe_card.h > - include/uapi/linux/gfs2_ondisk.h > Hi, Would you prefer to add this to include/uapi/linux/stddef.h: #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER) #endif and then include linux/stddef.h in all header files which use offsetof? include/uapi/linux/fuse.h checks for __KERNEL__ and then includes linux/types.h or stdint.h, my initial approach would be to do this in a similar way for stddef.h. What is the kernel policy of including system header files like stddef.h? Hauke
Attachment:
signature.asc
Description: OpenPGP digital signature