netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* what's in a bus_info
@ 2011-11-04 22:27 Rick Jones
  2011-11-04 23:02 ` Ben Hutchings
  0 siblings, 1 reply; 7+ messages in thread
From: Rick Jones @ 2011-11-04 22:27 UTC (permalink / raw)
  To: netdev; +Cc: rusty, mst

...or would an interface name smell as sweet? (as PCI bus addressing)

Is there a "standard" for what is returned in bus_info of 
ethtool_drvinfo?  I have been very used to seeing PCI bus addressing 
information in that field (at least as displayed by ethtool -i) and when 
I went to "leverage how to" from other drivers, to add "native" ethtool 
-i support to virtio_net, I ended-up with "eth0" rather than the PCI 
information I see in lspci output and in ethtool -i against other 
devices.  Including an emulated e1000 interface in the same kernel.

What I'm doing is calling pci_name(), feeding it with to_pci_dev() from 
the address of the struct device in the struct net_device.  The perhaps 
overly paranoid work-in-progress:

static void virtnet_get_drvinfo(struct net_device *dev,
                                 struct ethtool_drvinfo *info)
{

         struct device *dev_dev;
         struct pci_dev *pci_dev = NULL;


         dev_dev = &(dev->dev);
         if (dev_dev != NULL)
                 pci_dev = to_pci_dev(dev_dev);
         strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
         strlcpy(info->version,"I am versionless", sizeof(info->version));
         strlcpy(info->fw_version,"I have no firmware", 
sizeof(info->fw_version));
         strlcpy(info->bus_info,
                 (pci_dev != NULL) ? pci_name(pci_dev) : "",
                 sizeof(info->bus_info));

}

So, with the emulated e1000 I get:

raj@raj-ubuntu-guest:~$ ethtool -i eth0
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version: N/A
bus-info: 0000:00:11.0
raj@raj-ubuntu-guest:~$

and I see that the e1000 driver calls pci_name().  However, the code 
above, when I boot the guest with the virtio device gives me:

raj@raj-ubuntu-guest:~$ ethtool -i eth0
driver: virtio_net
version: I am versionless
firmware-version: I have no firmware
bus-info: eth0

00:03.0 Ethernet controller: Red Hat, Inc Virtio network device

Am I chasing the wrong pointers?  Is it  a function of virtio?

rick jones

BTW, I notice some drivers call strlcpy and some strncpy, and some even 
call strcpy.  Is there one that is meant to be preferred over the others?

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-04 22:27 what's in a bus_info Rick Jones
@ 2011-11-04 23:02 ` Ben Hutchings
  2011-11-04 23:31   ` Rick Jones
  0 siblings, 1 reply; 7+ messages in thread
From: Ben Hutchings @ 2011-11-04 23:02 UTC (permalink / raw)
  To: Rick Jones; +Cc: netdev, rusty, mst

On Fri, 2011-11-04 at 15:27 -0700, Rick Jones wrote:
> ...or would an interface name smell as sweet? (as PCI bus addressing)
> 
> Is there a "standard" for what is returned in bus_info of 
> ethtool_drvinfo?  I have been very used to seeing PCI bus addressing 
> information in that field (at least as displayed by ethtool -i) and when 
> I went to "leverage how to" from other drivers, to add "native" ethtool 
> -i support to virtio_net, I ended-up with "eth0" rather than the PCI 
> information I see in lspci output and in ethtool -i against other 
> devices.  Including an emulated e1000 interface in the same kernel.
>
> What I'm doing is calling pci_name(), feeding it with to_pci_dev() from 
> the address of the struct device in the struct net_device.

to_pci_dev() just uses container_of() to find a pci_dev when you have a
pointer to the generic device structure embedded in it.  However, you're
passing a pointer to the device embedded in a net_device.  The net
device is a child of the PCI device, so you need to do:

	dev_dev = dev->dev.parent;

And you don't even have to assume that the parent is a PCI device,
because you can use the generic dev_name().

But you don't even need to this, since the ethtool core has a default
implementation that does this...

[...]
> BTW, I notice some drivers call strlcpy and some strncpy, and some even 
> call strcpy.  Is there one that is meant to be preferred over the others?

strlcpy() is preferred - if it has to truncate, it will at least leave a
null terminator, as clients may expect.  Back when drivers handled
SIOCETHTOOL directly strncpy() may have been preferable since they were
responsible for initialising the entire structure returned to
user-space.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-04 23:02 ` Ben Hutchings
@ 2011-11-04 23:31   ` Rick Jones
  2011-11-04 23:42     ` Ben Hutchings
  0 siblings, 1 reply; 7+ messages in thread
From: Rick Jones @ 2011-11-04 23:31 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: netdev, rusty, mst

On 11/04/2011 04:02 PM, Ben Hutchings wrote:
> On Fri, 2011-11-04 at 15:27 -0700, Rick Jones wrote:
>> ...or would an interface name smell as sweet? (as PCI bus addressing)
>>
>> Is there a "standard" for what is returned in bus_info of
>> ethtool_drvinfo?  I have been very used to seeing PCI bus addressing
>> information in that field (at least as displayed by ethtool -i) and when
>> I went to "leverage how to" from other drivers, to add "native" ethtool
>> -i support to virtio_net, I ended-up with "eth0" rather than the PCI
>> information I see in lspci output and in ethtool -i against other
>> devices.  Including an emulated e1000 interface in the same kernel.
>>
>> What I'm doing is calling pci_name(), feeding it with to_pci_dev() from
>> the address of the struct device in the struct net_device.
>
> to_pci_dev() just uses container_of() to find a pci_dev when you have a
> pointer to the generic device structure embedded in it.  However, you're
> passing a pointer to the device embedded in a net_device.  The net
> device is a child of the PCI device, so you need to do:
>
> 	dev_dev = dev->dev.parent;
>
> And you don't even have to assume that the parent is a PCI device,
> because you can use the generic dev_name().
>
> But you don't even need to this, since the ethtool core has a default
> implementation that does this...

Yes, I noticed that.  For a little while I was confused because ethtool 
-i was emitting something even before I added a ".get_drvinfo" - though 
what it ends-up returning in my case is "virtio0." Which is also what I 
get if I take the path through the virtio_device to the struct device 
therein instead of the path through the struct net_device alone.

I guess that wraps back around to the question of whether there is a 
"standard" for what should be in bus_info.  And if it is impractical to 
get the PCI bus information, whether it is better to return virtioN or 
ethN.  Or perhaps something else entirely.

> [...]
>> BTW, I notice some drivers call strlcpy and some strncpy, and some even
>> call strcpy.  Is there one that is meant to be preferred over the others?
>
> strlcpy() is preferred - if it has to truncate, it will at least leave a
> null terminator, as clients may expect.  Back when drivers handled
> SIOCETHTOOL directly strncpy() may have been preferable since they were
> responsible for initialising the entire structure returned to
> user-space.

Thanks.  Perhaps that is another "floor sweeping" opportunity.

rick jones

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-04 23:31   ` Rick Jones
@ 2011-11-04 23:42     ` Ben Hutchings
  2011-11-05  0:05       ` Rick Jones
  0 siblings, 1 reply; 7+ messages in thread
From: Ben Hutchings @ 2011-11-04 23:42 UTC (permalink / raw)
  To: Rick Jones; +Cc: netdev, rusty, mst

On Fri, 2011-11-04 at 16:31 -0700, Rick Jones wrote:
> On 11/04/2011 04:02 PM, Ben Hutchings wrote:
> > On Fri, 2011-11-04 at 15:27 -0700, Rick Jones wrote:
> >> ...or would an interface name smell as sweet? (as PCI bus addressing)
> >>
> >> Is there a "standard" for what is returned in bus_info of
> >> ethtool_drvinfo?  I have been very used to seeing PCI bus addressing
> >> information in that field (at least as displayed by ethtool -i) and when
> >> I went to "leverage how to" from other drivers, to add "native" ethtool
> >> -i support to virtio_net, I ended-up with "eth0" rather than the PCI
> >> information I see in lspci output and in ethtool -i against other
> >> devices.  Including an emulated e1000 interface in the same kernel.
> >>
> >> What I'm doing is calling pci_name(), feeding it with to_pci_dev() from
> >> the address of the struct device in the struct net_device.
> >
> > to_pci_dev() just uses container_of() to find a pci_dev when you have a
> > pointer to the generic device structure embedded in it.  However, you're
> > passing a pointer to the device embedded in a net_device.  The net
> > device is a child of the PCI device, so you need to do:
> >
> > 	dev_dev = dev->dev.parent;
> >
> > And you don't even have to assume that the parent is a PCI device,
> > because you can use the generic dev_name().
> >
> > But you don't even need to this, since the ethtool core has a default
> > implementation that does this...
> 
> Yes, I noticed that.  For a little while I was confused because ethtool 
> -i was emitting something even before I added a ".get_drvinfo" - though 
> what it ends-up returning in my case is "virtio0." Which is also what I 
> get if I take the path through the virtio_device to the struct device 
> therein instead of the path through the struct net_device alone.
> 
> I guess that wraps back around to the question of whether there is a 
> "standard" for what should be in bus_info.  And if it is impractical to 
> get the PCI bus information,

I'm not that familiar with virtio, but would I be right in thinking that
the virtio 'bus' device is likely to be the child of a PCI device?  So
then you mgiht want to get bus_name() for the grandparent of the net
device:
	dev_dev = dev->dev.parent->parent;
(possibly checking for nulls).

If there's some reasonable way to distinguish a 'real' from a virtual
bus then we could have the generic implementation try to follow parents
until it finds a bus device.  However I think the device model
maintainers have been gradually moving away from the bus/class
distinction and so we may not be able to do that.

> whether it is better to return virtioN or 
> ethN.  Or perhaps something else entirely.
[...]

Returning the device name seems entirely unhelpful since the user
already has that.  'virtioN' is perhaps not much better though.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-04 23:42     ` Ben Hutchings
@ 2011-11-05  0:05       ` Rick Jones
  2011-11-05  0:07         ` Stephen Hemminger
  0 siblings, 1 reply; 7+ messages in thread
From: Rick Jones @ 2011-11-05  0:05 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: netdev, rusty, mst

On 11/04/2011 04:42 PM, Ben Hutchings wrote:
> On Fri, 2011-11-04 at 16:31 -0700, Rick Jones wrote:

>> I guess that wraps back around to the question of whether there is a
>> "standard" for what should be in bus_info.  And if it is impractical to
>> get the PCI bus information,
>
> I'm not that familiar with virtio, but would I be right in thinking that
> the virtio 'bus' device is likely to be the child of a PCI device?  So
> then you mgiht want to get bus_name() for the grandparent of the net
> device:
> 	dev_dev = dev->dev.parent->parent;
> (possibly checking for nulls).

I'll take a look.

> If there's some reasonable way to distinguish a 'real' from a virtual
> bus then we could have the generic implementation try to follow parents
> until it finds a bus device.  However I think the device model
> maintainers have been gradually moving away from the bus/class
> distinction and so we may not be able to do that.
>
>> whether it is better to return virtioN or
>> ethN.  Or perhaps something else entirely.
> [...]
>
> Returning the device name seems entirely unhelpful since the user
> already has that.  'virtioN' is perhaps not much better though.

Agreed, but thought I should ask :)

rick

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-05  0:05       ` Rick Jones
@ 2011-11-05  0:07         ` Stephen Hemminger
  2011-11-05  1:17           ` Rick Jones
  0 siblings, 1 reply; 7+ messages in thread
From: Stephen Hemminger @ 2011-11-05  0:07 UTC (permalink / raw)
  To: Rick Jones; +Cc: Ben Hutchings, netdev, rusty, mst

On Fri, 04 Nov 2011 17:05:05 -0700
Rick Jones <rick.jones2@hp.com> wrote:

> On 11/04/2011 04:42 PM, Ben Hutchings wrote:
> > On Fri, 2011-11-04 at 16:31 -0700, Rick Jones wrote:
> 
> >> I guess that wraps back around to the question of whether there is a
> >> "standard" for what should be in bus_info.  And if it is impractical to
> >> get the PCI bus information,
> >
> > I'm not that familiar with virtio, but would I be right in thinking that
> > the virtio 'bus' device is likely to be the child of a PCI device?  So
> > then you mgiht want to get bus_name() for the grandparent of the net
> > device:
> > 	dev_dev = dev->dev.parent->parent;
> > (possibly checking for nulls).
> 
> I'll take a look.
> 
> > If there's some reasonable way to distinguish a 'real' from a virtual
> > bus then we could have the generic implementation try to follow parents
> > until it finds a bus device.  However I think the device model
> > maintainers have been gradually moving away from the bus/class
> > distinction and so we may not be able to do that.
> >
> >> whether it is better to return virtioN or
> >> ethN.  Or perhaps something else entirely.
> > [...]
> >
> > Returning the device name seems entirely unhelpful since the user
> > already has that.  'virtioN' is perhaps not much better though.
> 
> Agreed, but thought I should ask :)

My view of bus_info, is that it is an informational string for administrators.
Tools shouldn't depend on the value.  If a tool wants to find out about
the physical device, then it should readlink the value of /sys/class/net/ethX/device

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: what's in a bus_info
  2011-11-05  0:07         ` Stephen Hemminger
@ 2011-11-05  1:17           ` Rick Jones
  0 siblings, 0 replies; 7+ messages in thread
From: Rick Jones @ 2011-11-05  1:17 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Ben Hutchings, netdev, rusty, mst

On 11/04/2011 05:07 PM, Stephen Hemminger wrote:
> My view of bus_info, is that it is an informational string for administrators.
> Tools shouldn't depend on the value.  If a tool wants to find out about
> the physical device, then it should readlink the value of /sys/class/net/ethX/device

Just a quick look under device for the virtio_net interface shows it 
isn't quite as "complete" as a bare iron tg3 interface (as an example)

The bare iron tg3 example:
raj@tardy:~$ ls /sys/class/net/eth0/device
broken_parity_status      enable         net        resource0
class                     firmware_node  numa_node  subsystem
config                    irq            power      subsystem_device
consistent_dma_mask_bits  local_cpulist  remove     subsystem_vendor
device                    local_cpus     rescan     uevent
dma_mask_bits             modalias       reset      vendor
driver                    msi_bus        resource   vpd

The virtio_net interface:

raj@raj-ubuntu-guest:~$ ls /sys/class/net/eth0/device
device  features  net    status     uevent
driver  modalias  power  subsystem  vendor


I have found that if I add a function to return a struct pci_dev * given 
a struct virtio_device, to virtio/virtio_pci.c and do a pci_name() 
against that, I do get a familiar looking bus address:

raj@raj-ubuntu-guest:~$ ethtool -i eth0
driver: virtio_net
version: I am versionless
firmware-version: I have no firmware
bus-info: 0000:00:03.0

and it even matches the lspci output for the guest:

00:03.0 Ethernet controller: Red Hat, Inc Virtio network device

(still my "playing around" version, hence the silly strings in version 
and firmware-version)

I suppose the question becomes whether it is worthwhile to clean it up 
and submit.    I'm also thinking it would be goodness to start 
displaying some sort of version number, and if there is anything the 
driver might query to fill-in as a firmware-version - perhaps something 
about the version of the driver on the other side?

rick jones

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-11-05  1:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-04 22:27 what's in a bus_info Rick Jones
2011-11-04 23:02 ` Ben Hutchings
2011-11-04 23:31   ` Rick Jones
2011-11-04 23:42     ` Ben Hutchings
2011-11-05  0:05       ` Rick Jones
2011-11-05  0:07         ` Stephen Hemminger
2011-11-05  1:17           ` Rick Jones

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).