On 27/03/2017 16:46, Thomas Gleixner wrote: > On Mon, 27 Mar 2017, Mason wrote: > >> On 24/03/2017 19:22, Marc Zyngier wrote: >> >>> You cannot directly use a pointer to a u32 in any of the bitmap >>> operations. You need to copy the value to an unsigned long, and >>> apply the bitmap op on that. >> >> On my platform, find_first_zero_bit() resolves to >> >> int _find_first_zero_bit_le(const void * p, unsigned size); >> >> If the underlying implementation actually expects an unsigned long >> pointer, should the function prototype be changed? > > Errm? Why are you worrying about the underlying implementations? > > find_first_zero_bit() is what you are supposed to use in your code. And > that explicitely takes a unsigned long pointer. I don't think so. If the prototype for find_first_zero_bit() specified the first argument as an unsigned long pointer, then the compiler would have rejected my code like this: CC drivers/pci/host/pcie-tango.o In file included from ./include/linux/bitops.h:36:0, from ./include/linux/kernel.h:10, from ./include/linux/list.h:8, from ./include/linux/smp.h:11, from ./include/linux/irq.h:12, from ./include/linux/irqchip/chained_irq.h:21, from drivers/pci/host/pcie-tango.c:1: drivers/pci/host/pcie-tango.c: In function 'tango_irq_domain_alloc': drivers/pci/host/pcie-tango.c:122:28: error: passing argument 1 of '_find_first_zero_bit_le' from incompatible pointer type [-Werror=incompatible-pointer-types] pos = find_first_zero_bit(&mask, 32); ^ ./arch/arm/include/asm/bitops.h:199:59: note: in definition of macro 'find_first_zero_bit' #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) ^ ./arch/arm/include/asm/bitops.h:162:12: note: expected 'const long unsigned int *' but argument is of type 'u32 * {aka unsigned int *}' extern int _find_first_zero_bit_le(const unsigned long * p, unsigned size); ^ cc1: some warnings being treated as errors make[1]: *** [drivers/pci/host/pcie-tango.o] Error 1 make: *** [drivers/pci/host/pcie-tango.o] Error 2 But, in fact, the compiler remained silent, specifically because the situation on my platform is: #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) int _find_first_zero_bit_le(const void * p, unsigned size); So I asked if the prototype could/should be changed, to have the compiler catch the error as early as possible. Regards.