Re: [RFC PATCH v0.2] PCI: Add support for tango PCIe host bridge

From: Mason
Date: Mon Mar 27 2017 - 11:19:24 EST


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.