2017-04-10 22:25:45

by Matthias Kaehlcke

[permalink] [raw]
Subject: [PATCH] PCI: Add cast when assigning PCI_ROM_ADDRESS_MASK to a 32-bit variable

This fixes a clang warning about "implicit conversion from 'unsigned
long' to 'u32'"

Signed-off-by: Matthias Kaehlcke <[email protected]>
---
drivers/pci/probe.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index dfc9a2794141..148e80d5caf1 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -180,7 +180,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
u16 orig_cmd;
struct pci_bus_region region, inverted_region;

- mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
+ mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0;

/* No printks while decoding is disabled! */
if (!dev->mmio_always_on) {
--
2.12.2.715.g7642488e1d-goog


2017-04-11 01:24:52

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [PATCH] PCI: Add cast when assigning PCI_ROM_ADDRESS_MASK to a 32-bit variable

On Mon, Apr 10, 2017 at 03:24:57PM -0700, Matthias Kaehlcke wrote:
> This fixes a clang warning about "implicit conversion from 'unsigned
> long' to 'u32'"
>
> Signed-off-by: Matthias Kaehlcke <[email protected]>
> ---
> drivers/pci/probe.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index dfc9a2794141..148e80d5caf1 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -180,7 +180,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
> u16 orig_cmd;
> struct pci_bus_region region, inverted_region;
>
> - mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
> + mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0;

Can we put the cast in the PCI_ROM_ADDRESS_MASK #define so we don't have to
repeat it in all the uses?

> /* No printks while decoding is disabled! */
> if (!dev->mmio_always_on) {
> --
> 2.12.2.715.g7642488e1d-goog
>

2017-04-11 10:09:25

by Mason

[permalink] [raw]
Subject: Re: [PATCH] PCI: Add cast when assigning PCI_ROM_ADDRESS_MASK to a 32-bit variable

On 11/04/2017 03:24, Bjorn Helgaas wrote:

> On Mon, Apr 10, 2017 at 03:24:57PM -0700, Matthias Kaehlcke wrote:
>
>> This fixes a clang warning about "implicit conversion from 'unsigned
>> long' to 'u32'"
>>
>> Signed-off-by: Matthias Kaehlcke <[email protected]>
>> ---
>> drivers/pci/probe.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
>> index dfc9a2794141..148e80d5caf1 100644
>> --- a/drivers/pci/probe.c
>> +++ b/drivers/pci/probe.c
>> @@ -180,7 +180,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>> u16 orig_cmd;
>> struct pci_bus_region region, inverted_region;
>>
>> - mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
>> + mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0;
>
> Can we put the cast in the PCI_ROM_ADDRESS_MASK #define so we don't have to
> repeat it in all the uses?

Fixing these "implicit conversion" warnings, especially for
unsigned types, is a slippery slope. (The behavior of the
conversion is well-defined.)

How about changing the type of PCI_ROM_ADDRESS_MASK instead?
It's defined as ~0x7ffUL but it's only used in the context
of u32.

So make it an unsigned int:
#define PCI_ROM_ADDRESS_MASK (~0x7ffU)

AFAIU, unsigned int is 32 bits on all platforms supported
by Linux.

Regards.

2017-04-11 17:23:15

by Matthias Kaehlcke

[permalink] [raw]
Subject: Re: [PATCH] PCI: Add cast when assigning PCI_ROM_ADDRESS_MASK to a 32-bit variable

El Tue, Apr 11, 2017 at 12:08:38PM +0200 Mason ha dit:

> On 11/04/2017 03:24, Bjorn Helgaas wrote:
>
> > On Mon, Apr 10, 2017 at 03:24:57PM -0700, Matthias Kaehlcke wrote:
> >
> >> This fixes a clang warning about "implicit conversion from 'unsigned
> >> long' to 'u32'"
> >>
> >> Signed-off-by: Matthias Kaehlcke <[email protected]>
> >> ---
> >> drivers/pci/probe.c | 2 +-
> >> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> >> index dfc9a2794141..148e80d5caf1 100644
> >> --- a/drivers/pci/probe.c
> >> +++ b/drivers/pci/probe.c
> >> @@ -180,7 +180,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
> >> u16 orig_cmd;
> >> struct pci_bus_region region, inverted_region;
> >>
> >> - mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
> >> + mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0;
> >
> > Can we put the cast in the PCI_ROM_ADDRESS_MASK #define so we don't have to
> > repeat it in all the uses?
>
> Fixing these "implicit conversion" warnings, especially for
> unsigned types, is a slippery slope. (The behavior of the
> conversion is well-defined.)
>
> How about changing the type of PCI_ROM_ADDRESS_MASK instead?
> It's defined as ~0x7ffUL but it's only used in the context
> of u32.
>
> So make it an unsigned int:
> #define PCI_ROM_ADDRESS_MASK (~0x7ffU)
>
> AFAIU, unsigned int is 32 bits on all platforms supported
> by Linux.

I considered this initially, but wasn't sure if the unsigned long
mask might be needed in some cases. From the comments I interpret that
there should be no problems with using a 32 bit mask everywhere.

I'll send out an updated patch shortly.

Thanks

Matthias

2017-04-11 17:29:07

by Mason

[permalink] [raw]
Subject: Re: [PATCH] PCI: Add cast when assigning PCI_ROM_ADDRESS_MASK to a 32-bit variable

On 11/04/2017 19:23, Matthias Kaehlcke wrote:

> El Tue, Apr 11, 2017 at 12:08:38PM +0200 Mason ha dit:
>
>> On 11/04/2017 03:24, Bjorn Helgaas wrote:
>>
>>> On Mon, Apr 10, 2017 at 03:24:57PM -0700, Matthias Kaehlcke wrote:
>>>
>>>> This fixes a clang warning about "implicit conversion from 'unsigned
>>>> long' to 'u32'"
>>>>
>>>> Signed-off-by: Matthias Kaehlcke <[email protected]>
>>>> ---
>>>> drivers/pci/probe.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
>>>> index dfc9a2794141..148e80d5caf1 100644
>>>> --- a/drivers/pci/probe.c
>>>> +++ b/drivers/pci/probe.c
>>>> @@ -180,7 +180,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>>>> u16 orig_cmd;
>>>> struct pci_bus_region region, inverted_region;
>>>>
>>>> - mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
>>>> + mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0;
>>>
>>> Can we put the cast in the PCI_ROM_ADDRESS_MASK #define so we don't have to
>>> repeat it in all the uses?
>>
>> Fixing these "implicit conversion" warnings, especially for
>> unsigned types, is a slippery slope. (The behavior of the
>> conversion is well-defined.)
>>
>> How about changing the type of PCI_ROM_ADDRESS_MASK instead?
>> It's defined as ~0x7ffUL but it's only used in the context
>> of u32.
>>
>> So make it an unsigned int:
>> #define PCI_ROM_ADDRESS_MASK (~0x7ffU)
>>
>> AFAIU, unsigned int is 32 bits on all platforms supported
>> by Linux.
>
> I considered this initially, but wasn't sure if the unsigned long
> mask might be needed in some cases. From the comments I interpret that
> there should be no problems with using a 32 bit mask everywhere.
>
> I'll send out an updated patch shortly.

Full disclaimer: I'm just a grunt with no knowledge of
the PCI framework. Bjorn is the authority here ;-)

Regards.