ethdev: missing typecast from void in eth_dev_pci_specific_init

Message ID 1554927376-93022-1-git-send-email-drc@linux.vnet.ibm.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series ethdev: missing typecast from void in eth_dev_pci_specific_init |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

David Christensen April 10, 2019, 8:16 p.m. UTC
  The function eth_dev_pci_specific_init is missing a typecast to
(struct rte_pci_device *) for the input argument bus_device.

Cc: stable@dpdk.org

Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Thomas Monjalon April 10, 2019, 8:29 p.m. UTC | #1
10/04/2019 22:16, David Christensen:
> The function eth_dev_pci_specific_init is missing a typecast to
> (struct rte_pci_device *) for the input argument bus_device.
> 
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>

This is a duplicate of this patch:

https://patches.dpdk.org/patch/52505/

You are from 2 different Linux teams at IBM,
you hit the same issue at the same time,
you both miss to give an explanation,
funny.

About collaborating inside IBM, please check this email:
http://mails.dpdk.org/archives/dev/2019-April/129915.html
  
David Christensen April 10, 2019, 8:58 p.m. UTC | #2
> This is a duplicate of this patch:
> 
> https://patches.dpdk.org/patch/52505/
> 
> You are from 2 different Linux teams at IBM,
> you hit the same issue at the same time,
> you both miss to give an explanation,
> funny.

We both work for infrastructure teams who are supporting a project team 
that is developing a DPDK application that runs across multiple CPU 
architectures and encountered the error.

The error comes from g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0:

[CXX]       g++ -o utils/pcap_handle.o -c utils/pcap_handle.cc -g3 
-ggdb3 -mcpu=native -mtune=native -isystem 
/home/rchirra/gen/io/ppc64include -std=gnu++11 -flax-vector-conversions 
-Werror -isystem /home/rchirra/gen/io

In file included from drivers/pmd.cc:7:0:
/home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:
In function ‘int eth_dev_pci_specific_init(rte_eth_dev*, void*)’:
/home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:75:35: 
error: invalid conversion from ‘void*’ to ‘rte_pci_device*’ [-fpermissive]
   struct rte_pci_device *pci_dev = bus_device;
                                    ^~~~~~~~~~
make[1]: *** [drivers/pmd.o] Error 1

Do you believe that more permissive compiler flags are the better answer?

Dave
  
Bruce Richardson April 10, 2019, 9 p.m. UTC | #3
On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
> The function eth_dev_pci_specific_init is missing a typecast to
> (struct rte_pci_device *) for the input argument bus_device.
> 
> Cc: stable@dpdk.org
> 
> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
> ---
>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> index 23257e9..a325311 100644
> --- a/lib/librte_ethdev/rte_ethdev_pci.h
> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> @@ -72,7 +72,7 @@
>  
>  static inline int
>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
> -	struct rte_pci_device *pci_dev = bus_device;
> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
>

Is this needed for building some C++ apps that are including the header
file (directly, or indirectly), because for pure C, "void *" types should
be assignable to any other pointer type without casting?

/Bruce
  
Thomas Monjalon April 10, 2019, 9:14 p.m. UTC | #4
10/04/2019 22:58, David Christensen:
> > This is a duplicate of this patch:
> > 
> > https://patches.dpdk.org/patch/52505/
> > 
> > You are from 2 different Linux teams at IBM,
> > you hit the same issue at the same time,
> > you both miss to give an explanation,
> > funny.
> 
> We both work for infrastructure teams who are supporting a project team 
> that is developing a DPDK application that runs across multiple CPU 
> architectures and encountered the error.
> 
> The error comes from g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0:
> 
> [CXX]       g++ -o utils/pcap_handle.o -c utils/pcap_handle.cc -g3 
> -ggdb3 -mcpu=native -mtune=native -isystem 
> /home/rchirra/gen/io/ppc64include -std=gnu++11 -flax-vector-conversions 
> -Werror -isystem /home/rchirra/gen/io
> 
> In file included from drivers/pmd.cc:7:0:
> /home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:
> In function ‘int eth_dev_pci_specific_init(rte_eth_dev*, void*)’:
> /home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:75:35: 
> error: invalid conversion from ‘void*’ to ‘rte_pci_device*’ [-fpermissive]
>    struct rte_pci_device *pci_dev = bus_device;
>                                     ^~~~~~~~~~
> make[1]: *** [drivers/pmd.o] Error 1
> 
> Do you believe that more permissive compiler flags are the better answer?

No, we should not force any compiler flag of the application.
We are even trying to support pedantic flags in the app.
So it seems we must fix it.

We just need to change the title to mention it fixes the build for C++,
and add the error message in the body.
  
Stephen Hemminger April 10, 2019, 11:08 p.m. UTC | #5
On Wed, 10 Apr 2019 22:00:18 +0100
Bruce Richardson <bruce.richardson@intel.com> wrote:

> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
> > The function eth_dev_pci_specific_init is missing a typecast to
> > (struct rte_pci_device *) for the input argument bus_device.
> > 
> > Cc: stable@dpdk.org
> > 
> > Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
> > Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
> > ---
> >  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> > index 23257e9..a325311 100644
> > --- a/lib/librte_ethdev/rte_ethdev_pci.h
> > +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> > @@ -72,7 +72,7 @@
> >  
> >  static inline int
> >  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
> > -	struct rte_pci_device *pci_dev = bus_device;
> > +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
> >  
> 
> Is this needed for building some C++ apps that are including the header
> file (directly, or indirectly), because for pure C, "void *" types should
> be assignable to any other pointer type without casting?
> 
> /Bruce

Another example of Why the Hell is this inline?
  
Ferruh Yigit April 12, 2019, 5:09 p.m. UTC | #6
On 4/11/2019 12:08 AM, Stephen Hemminger wrote:
> On Wed, 10 Apr 2019 22:00:18 +0100
> Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
>> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
>>> The function eth_dev_pci_specific_init is missing a typecast to
>>> (struct rte_pci_device *) for the input argument bus_device.
>>>
>>> Cc: stable@dpdk.org
>>>
>>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
>>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
>>> ---
>>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>>> index 23257e9..a325311 100644
>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>>> @@ -72,7 +72,7 @@
>>>  
>>>  static inline int
>>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
>>> -	struct rte_pci_device *pci_dev = bus_device;
>>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
>>>  
>>
>> Is this needed for building some C++ apps that are including the header
>> file (directly, or indirectly), because for pure C, "void *" types should
>> be assignable to any other pointer type without casting?
>>
>> /Bruce
> 
> Another example of Why the Hell is this inline?
> 

It has been done inline intentionally at the time as far as remember, this
header is for drivers not for applications, it has helper functions.

The common code from drivers related to the bus put into header files, so the
code itself belongs to drivers not ethdev and reduces duplicates in them.
  
Ferruh Yigit April 12, 2019, 5:13 p.m. UTC | #7
On 4/10/2019 10:14 PM, Thomas Monjalon wrote:
> 10/04/2019 22:58, David Christensen:
>>> This is a duplicate of this patch:
>>>
>>> https://patches.dpdk.org/patch/52505/
>>>
>>> You are from 2 different Linux teams at IBM,
>>> you hit the same issue at the same time,
>>> you both miss to give an explanation,
>>> funny.
>>
>> We both work for infrastructure teams who are supporting a project team 
>> that is developing a DPDK application that runs across multiple CPU 
>> architectures and encountered the error.
>>
>> The error comes from g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0:
>>
>> [CXX]       g++ -o utils/pcap_handle.o -c utils/pcap_handle.cc -g3 
>> -ggdb3 -mcpu=native -mtune=native -isystem 
>> /home/rchirra/gen/io/ppc64include -std=gnu++11 -flax-vector-conversions 
>> -Werror -isystem /home/rchirra/gen/io
>>
>> In file included from drivers/pmd.cc:7:0:
>> /home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:
>> In function ‘int eth_dev_pci_specific_init(rte_eth_dev*, void*)’:
>> /home/rchirra/gen/io/deps/dpdk/build/include/rte_ethdev_pci.h:75:35: 
>> error: invalid conversion from ‘void*’ to ‘rte_pci_device*’ [-fpermissive]
>>    struct rte_pci_device *pci_dev = bus_device;
>>                                     ^~~~~~~~~~
>> make[1]: *** [drivers/pmd.o] Error 1
>>
>> Do you believe that more permissive compiler flags are the better answer?
> 
> No, we should not force any compiler flag of the application.
> We are even trying to support pedantic flags in the app.
> So it seems we must fix it.
> 
> We just need to change the title to mention it fixes the build for C++,
> and add the error message in the body.
> 

I agree our public headers should be usable from c++ applications, but this
header is not a public header.

Is the DPDK driver compiled with c++ in this case?
If so do we support (or have a target for support) that DPDK library itself can
be compiled by c++ compiler?
  
Ananyev, Konstantin April 12, 2019, 5:15 p.m. UTC | #8
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ferruh Yigit
> Sent: Friday, April 12, 2019 6:09 PM
> To: Stephen Hemminger <stephen@networkplumber.org>; Richardson, Bruce <bruce.richardson@intel.com>
> Cc: David Christensen <drc@linux.vnet.ibm.com>; thomas@monjalon.net; arybchenko@solarflare.com; dev@dpdk.org;
> radhika.chirra@ibm.com; stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] ethdev: missing typecast from void in eth_dev_pci_specific_init
> 
> On 4/11/2019 12:08 AM, Stephen Hemminger wrote:
> > On Wed, 10 Apr 2019 22:00:18 +0100
> > Bruce Richardson <bruce.richardson@intel.com> wrote:
> >
> >> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
> >>> The function eth_dev_pci_specific_init is missing a typecast to
> >>> (struct rte_pci_device *) for the input argument bus_device.
> >>>
> >>> Cc: stable@dpdk.org
> >>>
> >>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
> >>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
> >>> ---
> >>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
> >>>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>>
> >>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> >>> index 23257e9..a325311 100644
> >>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
> >>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> >>> @@ -72,7 +72,7 @@
> >>>
> >>>  static inline int
> >>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
> >>> -	struct rte_pci_device *pci_dev = bus_device;
> >>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
> >>>
> >>
> >> Is this needed for building some C++ apps that are including the header
> >> file (directly, or indirectly), because for pure C, "void *" types should
> >> be assignable to any other pointer type without casting?
> >>
> >> /Bruce
> >
> > Another example of Why the Hell is this inline?
> >
> 
> It has been done inline intentionally at the time as far as remember, this
> header is for drivers not for applications, it has helper functions.
> 
> The common code from drivers related to the bus put into header files, so the
> code itself belongs to drivers not ethdev and reduces duplicates in them.

Ok that's the common code used by the drivers...
But why it still can't be in .c file?
Konstantin
  
Ferruh Yigit April 12, 2019, 5:25 p.m. UTC | #9
On 4/12/2019 6:15 PM, Ananyev, Konstantin wrote:
> 
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ferruh Yigit
>> Sent: Friday, April 12, 2019 6:09 PM
>> To: Stephen Hemminger <stephen@networkplumber.org>; Richardson, Bruce <bruce.richardson@intel.com>
>> Cc: David Christensen <drc@linux.vnet.ibm.com>; thomas@monjalon.net; arybchenko@solarflare.com; dev@dpdk.org;
>> radhika.chirra@ibm.com; stable@dpdk.org
>> Subject: Re: [dpdk-dev] [PATCH] ethdev: missing typecast from void in eth_dev_pci_specific_init
>>
>> On 4/11/2019 12:08 AM, Stephen Hemminger wrote:
>>> On Wed, 10 Apr 2019 22:00:18 +0100
>>> Bruce Richardson <bruce.richardson@intel.com> wrote:
>>>
>>>> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
>>>>> The function eth_dev_pci_specific_init is missing a typecast to
>>>>> (struct rte_pci_device *) for the input argument bus_device.
>>>>>
>>>>> Cc: stable@dpdk.org
>>>>>
>>>>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
>>>>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
>>>>> ---
>>>>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
>>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>> index 23257e9..a325311 100644
>>>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>>>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>> @@ -72,7 +72,7 @@
>>>>>
>>>>>  static inline int
>>>>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
>>>>> -	struct rte_pci_device *pci_dev = bus_device;
>>>>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
>>>>>
>>>>
>>>> Is this needed for building some C++ apps that are including the header
>>>> file (directly, or indirectly), because for pure C, "void *" types should
>>>> be assignable to any other pointer type without casting?
>>>>
>>>> /Bruce
>>>
>>> Another example of Why the Hell is this inline?
>>>
>>
>> It has been done inline intentionally at the time as far as remember, this
>> header is for drivers not for applications, it has helper functions.
>>
>> The common code from drivers related to the bus put into header files, so the
>> code itself belongs to drivers not ethdev and reduces duplicates in them.
> 
> Ok that's the common code used by the drivers...
> But why it still can't be in .c file?

When it is in .c file, it will be either in ethdev library, single location in
.c file and binary file, but location is not exactly right, because code belongs
to drivers.
Or code should be in .c files of each drivers, this will be code duplication.

Having in .h file makes code in single place, but when compiled code will be in
each driver object file/ library.

Of course it works when put into a .c file in ehtdev, but bus (pci and vdev)
related code are not belongs to ethdev library and I believe shouldn't be part
of ethdev binary. And those bus helper headers are only for drivers to include,
so having inline shouldn't be a problem at all because there is not stability
concern in that interface.
  
Ferruh Yigit April 12, 2019, 5:29 p.m. UTC | #10
On 4/12/2019 6:25 PM, Ferruh Yigit wrote:
> On 4/12/2019 6:15 PM, Ananyev, Konstantin wrote:
>>
>>
>>> -----Original Message-----
>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ferruh Yigit
>>> Sent: Friday, April 12, 2019 6:09 PM
>>> To: Stephen Hemminger <stephen@networkplumber.org>; Richardson, Bruce <bruce.richardson@intel.com>
>>> Cc: David Christensen <drc@linux.vnet.ibm.com>; thomas@monjalon.net; arybchenko@solarflare.com; dev@dpdk.org;
>>> radhika.chirra@ibm.com; stable@dpdk.org
>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: missing typecast from void in eth_dev_pci_specific_init
>>>
>>> On 4/11/2019 12:08 AM, Stephen Hemminger wrote:
>>>> On Wed, 10 Apr 2019 22:00:18 +0100
>>>> Bruce Richardson <bruce.richardson@intel.com> wrote:
>>>>
>>>>> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:
>>>>>> The function eth_dev_pci_specific_init is missing a typecast to
>>>>>> (struct rte_pci_device *) for the input argument bus_device.
>>>>>>
>>>>>> Cc: stable@dpdk.org
>>>>>>
>>>>>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
>>>>>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
>>>>>> ---
>>>>>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
>>>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>> index 23257e9..a325311 100644
>>>>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>> @@ -72,7 +72,7 @@
>>>>>>
>>>>>>  static inline int
>>>>>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
>>>>>> -	struct rte_pci_device *pci_dev = bus_device;
>>>>>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
>>>>>>
>>>>>
>>>>> Is this needed for building some C++ apps that are including the header
>>>>> file (directly, or indirectly), because for pure C, "void *" types should
>>>>> be assignable to any other pointer type without casting?
>>>>>
>>>>> /Bruce
>>>>
>>>> Another example of Why the Hell is this inline?
>>>>
>>>
>>> It has been done inline intentionally at the time as far as remember, this
>>> header is for drivers not for applications, it has helper functions.
>>>
>>> The common code from drivers related to the bus put into header files, so the
>>> code itself belongs to drivers not ethdev and reduces duplicates in them.
>>
>> Ok that's the common code used by the drivers...
>> But why it still can't be in .c file?
> 
> When it is in .c file, it will be either in ethdev library, single location in
> .c file and binary file, but location is not exactly right, because code belongs
> to drivers.
> Or code should be in .c files of each drivers, this will be code duplication.
> 
> Having in .h file makes code in single place, but when compiled code will be in
> each driver object file/ library.
> 
> Of course it works when put into a .c file in ehtdev, but bus (pci and vdev)
> related code are not belongs to ethdev library and I believe shouldn't be part
> of ethdev binary. And those bus helper headers are only for drivers to include,
> so having inline shouldn't be a problem at all because there is not stability
> concern in that interface.
> 

btw, if you put those into .c file in ethdev, you will be creating a dependency
from ethdev to bus code, to all available buses which will make impossible to
disable any bus type if you use ethdev.
  
Stephen Hemminger April 12, 2019, 9:31 p.m. UTC | #11
On Fri, 12 Apr 2019 18:29:46 +0100
Ferruh Yigit <ferruh.yigit@intel.com> wrote:

> On 4/12/2019 6:25 PM, Ferruh Yigit wrote:
> > On 4/12/2019 6:15 PM, Ananyev, Konstantin wrote:  
> >>
> >>  
> >>> -----Original Message-----
> >>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ferruh Yigit
> >>> Sent: Friday, April 12, 2019 6:09 PM
> >>> To: Stephen Hemminger <stephen@networkplumber.org>; Richardson, Bruce <bruce.richardson@intel.com>
> >>> Cc: David Christensen <drc@linux.vnet.ibm.com>; thomas@monjalon.net; arybchenko@solarflare.com; dev@dpdk.org;
> >>> radhika.chirra@ibm.com; stable@dpdk.org
> >>> Subject: Re: [dpdk-dev] [PATCH] ethdev: missing typecast from void in eth_dev_pci_specific_init
> >>>
> >>> On 4/11/2019 12:08 AM, Stephen Hemminger wrote:  
> >>>> On Wed, 10 Apr 2019 22:00:18 +0100
> >>>> Bruce Richardson <bruce.richardson@intel.com> wrote:
> >>>>  
> >>>>> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:  
> >>>>>> The function eth_dev_pci_specific_init is missing a typecast to
> >>>>>> (struct rte_pci_device *) for the input argument bus_device.
> >>>>>>
> >>>>>> Cc: stable@dpdk.org
> >>>>>>
> >>>>>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
> >>>>>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
> >>>>>> ---
> >>>>>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
> >>>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>
> >>>>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> >>>>>> index 23257e9..a325311 100644
> >>>>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
> >>>>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> >>>>>> @@ -72,7 +72,7 @@
> >>>>>>
> >>>>>>  static inline int
> >>>>>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
> >>>>>> -	struct rte_pci_device *pci_dev = bus_device;
> >>>>>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
> >>>>>>  
> >>>>>
> >>>>> Is this needed for building some C++ apps that are including the header
> >>>>> file (directly, or indirectly), because for pure C, "void *" types should
> >>>>> be assignable to any other pointer type without casting?
> >>>>>
> >>>>> /Bruce  
> >>>>
> >>>> Another example of Why the Hell is this inline?
> >>>>  
> >>>
> >>> It has been done inline intentionally at the time as far as remember, this
> >>> header is for drivers not for applications, it has helper functions.
> >>>
> >>> The common code from drivers related to the bus put into header files, so the
> >>> code itself belongs to drivers not ethdev and reduces duplicates in them.  
> >>
> >> Ok that's the common code used by the drivers...
> >> But why it still can't be in .c file?  
> > 
> > When it is in .c file, it will be either in ethdev library, single location in
> > .c file and binary file, but location is not exactly right, because code belongs
> > to drivers.
> > Or code should be in .c files of each drivers, this will be code duplication.
> > 
> > Having in .h file makes code in single place, but when compiled code will be in
> > each driver object file/ library.
> > 
> > Of course it works when put into a .c file in ehtdev, but bus (pci and vdev)
> > related code are not belongs to ethdev library and I believe shouldn't be part
> > of ethdev binary. And those bus helper headers are only for drivers to include,
> > so having inline shouldn't be a problem at all because there is not stability
> > concern in that interface.
> >   
> 
> btw, if you put those into .c file in ethdev, you will be creating a dependency
> from ethdev to bus code, to all available buses which will make impossible to
> disable any bus type if you use ethdev.

The problem I see is rte_ethdev_pci.h, it should be headers only and then put
code rte_ethdev_pci.c
  
Ferruh Yigit April 15, 2019, 4 p.m. UTC | #12
On 4/12/2019 10:31 PM, Stephen Hemminger wrote:
> On Fri, 12 Apr 2019 18:29:46 +0100
> Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> 
>> On 4/12/2019 6:25 PM, Ferruh Yigit wrote:
>>> On 4/12/2019 6:15 PM, Ananyev, Konstantin wrote:  
>>>>
>>>>  
>>>>> -----Original Message-----
>>>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ferruh Yigit
>>>>> Sent: Friday, April 12, 2019 6:09 PM
>>>>> To: Stephen Hemminger <stephen@networkplumber.org>; Richardson, Bruce <bruce.richardson@intel.com>
>>>>> Cc: David Christensen <drc@linux.vnet.ibm.com>; thomas@monjalon.net; arybchenko@solarflare.com; dev@dpdk.org;
>>>>> radhika.chirra@ibm.com; stable@dpdk.org
>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: missing typecast from void in eth_dev_pci_specific_init
>>>>>
>>>>> On 4/11/2019 12:08 AM, Stephen Hemminger wrote:  
>>>>>> On Wed, 10 Apr 2019 22:00:18 +0100
>>>>>> Bruce Richardson <bruce.richardson@intel.com> wrote:
>>>>>>  
>>>>>>> On Wed, Apr 10, 2019 at 03:16:16PM -0500, David Christensen wrote:  
>>>>>>>> The function eth_dev_pci_specific_init is missing a typecast to
>>>>>>>> (struct rte_pci_device *) for the input argument bus_device.
>>>>>>>>
>>>>>>>> Cc: stable@dpdk.org
>>>>>>>>
>>>>>>>> Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
>>>>>>>> Tested-by: Radhika Chirra <radhika.chirra@ibm.com>
>>>>>>>> ---
>>>>>>>>  lib/librte_ethdev/rte_ethdev_pci.h | 2 +-
>>>>>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>>>> index 23257e9..a325311 100644
>>>>>>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>>>>>>>> @@ -72,7 +72,7 @@
>>>>>>>>
>>>>>>>>  static inline int
>>>>>>>>  eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
>>>>>>>> -	struct rte_pci_device *pci_dev = bus_device;
>>>>>>>> +	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
>>>>>>>>  
>>>>>>>
>>>>>>> Is this needed for building some C++ apps that are including the header
>>>>>>> file (directly, or indirectly), because for pure C, "void *" types should
>>>>>>> be assignable to any other pointer type without casting?
>>>>>>>
>>>>>>> /Bruce  
>>>>>>
>>>>>> Another example of Why the Hell is this inline?
>>>>>>  
>>>>>
>>>>> It has been done inline intentionally at the time as far as remember, this
>>>>> header is for drivers not for applications, it has helper functions.
>>>>>
>>>>> The common code from drivers related to the bus put into header files, so the
>>>>> code itself belongs to drivers not ethdev and reduces duplicates in them.  
>>>>
>>>> Ok that's the common code used by the drivers...
>>>> But why it still can't be in .c file?  
>>>
>>> When it is in .c file, it will be either in ethdev library, single location in
>>> .c file and binary file, but location is not exactly right, because code belongs
>>> to drivers.
>>> Or code should be in .c files of each drivers, this will be code duplication.
>>>
>>> Having in .h file makes code in single place, but when compiled code will be in
>>> each driver object file/ library.
>>>
>>> Of course it works when put into a .c file in ehtdev, but bus (pci and vdev)
>>> related code are not belongs to ethdev library and I believe shouldn't be part
>>> of ethdev binary. And those bus helper headers are only for drivers to include,
>>> so having inline shouldn't be a problem at all because there is not stability
>>> concern in that interface.
>>>   
>>
>> btw, if you put those into .c file in ethdev, you will be creating a dependency
>> from ethdev to bus code, to all available buses which will make impossible to
>> disable any bus type if you use ethdev.
> 
> The problem I see is rte_ethdev_pci.h, it should be headers only and then put
> code rte_ethdev_pci.c
> 

Where this 'rte_ethdev_pci.c' should be? Because of reasons explained above,
ehtdev is not good place.
Perhaps a 'common' folder for net drivers may work, create a 'rte_ethdev_pci.o'
and link it with relevant drivers.?
  

Patch

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index 23257e9..a325311 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -72,7 +72,7 @@ 
 
 static inline int
 eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
-	struct rte_pci_device *pci_dev = bus_device;
+	struct rte_pci_device *pci_dev = (struct rte_pci_device *)bus_device;
 
 	if (!pci_dev)
 		return -ENODEV;