[dpdk-dev,1/7] ether: add function to query for link state interrupt

Message ID 1423098809-21305-2-git-send-email-stephen@networkplumber.org (mailing list archive)
State Superseded, archived
Headers

Commit Message

Stephen Hemminger Feb. 5, 2015, 1:13 a.m. UTC
  From: Stephen Hemminger <shemming@brocade.com>

Allow application to query whether link state will work.
This is also part of abstracting dependency on PCI.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/librte_ether/rte_ethdev.c | 14 ++++++++++++++
 lib/librte_ether/rte_ethdev.h | 12 ++++++++++++
 2 files changed, 26 insertions(+)
  

Comments

Neil Horman Feb. 5, 2015, 1:47 a.m. UTC | #1
On Wed, Feb 04, 2015 at 05:13:23PM -0800, Stephen Hemminger wrote:
> From: Stephen Hemminger <shemming@brocade.com>
> 
> Allow application to query whether link state will work.
> This is also part of abstracting dependency on PCI.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/librte_ether/rte_ethdev.c | 14 ++++++++++++++
>  lib/librte_ether/rte_ethdev.h | 12 ++++++++++++
>  2 files changed, 26 insertions(+)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index ea3a1fb..4d803d0 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -1264,6 +1264,20 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
>  	}
>  }
>  
> +int
> +rte_eth_has_link_state(uint8_t port_id)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	if (port_id >= nb_ports) {
> +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> +		return 0;
> +	}
> +	dev = &rte_eth_devices[port_id];
> +
> +	return (dev->pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) != 0;
> +}
> +
>  void
>  rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
>  {
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 1200c1c..9d43ca3 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -2038,6 +2038,18 @@ extern void rte_eth_link_get_nowait(uint8_t port_id,
>  				struct rte_eth_link *link);
>  
>  /**
> + * Test whether device supports link state interrupt mode.
> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @return
> + *   - (1) if link state interrupt is supported
> + *   - (0) if link state interrupt is not supported
> + */
> +extern int
> +rte_eth_has_link_state(uint8_t port_id);
> +
> +/**
>   * Retrieve the general I/O statistics of an Ethernet device.
>   *
>   * @param port_id
> -- 
> 2.1.4
> 
> 
I think if your intention is to expose this as an application (or other library
visible api), you'll need to add it to the appropriate version map file for the
link now.  Should just be a single line addition

Regards
Neil
  
Stephen Hemminger Feb. 5, 2015, 5:49 a.m. UTC | #2
On Thu, 5 Feb 2015 01:47:37 +0000
Neil Horman <nhorman@tuxdriver.com> wrote:

> On Wed, Feb 04, 2015 at 05:13:23PM -0800, Stephen Hemminger wrote:
> > From: Stephen Hemminger <shemming@brocade.com>
> > 
> > Allow application to query whether link state will work.
> > This is also part of abstracting dependency on PCI.
> > 
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> >  lib/librte_ether/rte_ethdev.c | 14 ++++++++++++++
> >  lib/librte_ether/rte_ethdev.h | 12 ++++++++++++
> >  2 files changed, 26 insertions(+)
> > 
> > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> > index ea3a1fb..4d803d0 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -1264,6 +1264,20 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
> >  	}
> >  }
> >  
> > +int
> > +rte_eth_has_link_state(uint8_t port_id)
> > +{
> > +	struct rte_eth_dev *dev;
> > +
> > +	if (port_id >= nb_ports) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return 0;
> > +	}
> > +	dev = &rte_eth_devices[port_id];
> > +
> > +	return (dev->pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) != 0;
> > +}
> > +
> >  void
> >  rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
> >  {
> > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > index 1200c1c..9d43ca3 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -2038,6 +2038,18 @@ extern void rte_eth_link_get_nowait(uint8_t port_id,
> >  				struct rte_eth_link *link);
> >  
> >  /**
> > + * Test whether device supports link state interrupt mode.
> > + *
> > + * @param port_id
> > + *   The port identifier of the Ethernet device.
> > + * @return
> > + *   - (1) if link state interrupt is supported
> > + *   - (0) if link state interrupt is not supported
> > + */
> > +extern int
> > +rte_eth_has_link_state(uint8_t port_id);
> > +
> > +/**
> >   * Retrieve the general I/O statistics of an Ethernet device.
> >   *
> >   * @param port_id
> > -- 
> > 2.1.4
> > 
> > 
> I think if your intention is to expose this as an application (or other library
> visible api), you'll need to add it to the appropriate version map file for the
> link now.  Should just be a single line addition
> 
> Regards
> Neil
> 

Will add that after other changes are approved.
Also looking at the map files they seem to have been auto generated
because some symbols are exposed which are unnecessary (example pci_driver_list)
  
Neil Horman Feb. 5, 2015, 12:39 p.m. UTC | #3
On Wed, Feb 04, 2015 at 09:49:07PM -0800, Stephen Hemminger wrote:
> On Thu, 5 Feb 2015 01:47:37 +0000
> Neil Horman <nhorman@tuxdriver.com> wrote:
> 
> > On Wed, Feb 04, 2015 at 05:13:23PM -0800, Stephen Hemminger wrote:
> > > From: Stephen Hemminger <shemming@brocade.com>
> > > 
> > > Allow application to query whether link state will work.
> > > This is also part of abstracting dependency on PCI.
> > > 
> > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > > ---
> > >  lib/librte_ether/rte_ethdev.c | 14 ++++++++++++++
> > >  lib/librte_ether/rte_ethdev.h | 12 ++++++++++++
> > >  2 files changed, 26 insertions(+)
> > > 
> > > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> > > index ea3a1fb..4d803d0 100644
> > > --- a/lib/librte_ether/rte_ethdev.c
> > > +++ b/lib/librte_ether/rte_ethdev.c
> > > @@ -1264,6 +1264,20 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
> > >  	}
> > >  }
> > >  
> > > +int
> > > +rte_eth_has_link_state(uint8_t port_id)
> > > +{
> > > +	struct rte_eth_dev *dev;
> > > +
> > > +	if (port_id >= nb_ports) {
> > > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > > +		return 0;
> > > +	}
> > > +	dev = &rte_eth_devices[port_id];
> > > +
> > > +	return (dev->pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) != 0;
> > > +}
> > > +
> > >  void
> > >  rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
> > >  {
> > > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > > index 1200c1c..9d43ca3 100644
> > > --- a/lib/librte_ether/rte_ethdev.h
> > > +++ b/lib/librte_ether/rte_ethdev.h
> > > @@ -2038,6 +2038,18 @@ extern void rte_eth_link_get_nowait(uint8_t port_id,
> > >  				struct rte_eth_link *link);
> > >  
> > >  /**
> > > + * Test whether device supports link state interrupt mode.
> > > + *
> > > + * @param port_id
> > > + *   The port identifier of the Ethernet device.
> > > + * @return
> > > + *   - (1) if link state interrupt is supported
> > > + *   - (0) if link state interrupt is not supported
> > > + */
> > > +extern int
> > > +rte_eth_has_link_state(uint8_t port_id);
> > > +
> > > +/**
> > >   * Retrieve the general I/O statistics of an Ethernet device.
> > >   *
> > >   * @param port_id
> > > -- 
> > > 2.1.4
> > > 
> > > 
> > I think if your intention is to expose this as an application (or other library
> > visible api), you'll need to add it to the appropriate version map file for the
> > link now.  Should just be a single line addition
> > 
> > Regards
> > Neil
> > 
> 
> Will add that after other changes are approved.
> Also looking at the map files they seem to have been auto generated
> because some symbols are exposed which are unnecessary (example pci_driver_list)
It wasn't quite auto generated.  It was generated based on what the requisite
header files for a library exposed to the various applications that used them.
In your example above pci_driver_list is a global public variable, that is
referenced by applications that the DPDK ships (in this case the test_pci
application).  I completely agree that it shouldn't need to be versioned, as it
shouldn't be exposed at all, relying instead on accessor functions to reach it,
but as such, it is what it is.  By versioning it, we at least allow ourselves
the option to maintain backwards compatibility if the list type changes or we
wish to start hiding the symbol in future versions.

Neil

>
  

Patch

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index ea3a1fb..4d803d0 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1264,6 +1264,20 @@  rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 	}
 }
 
+int
+rte_eth_has_link_state(uint8_t port_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return 0;
+	}
+	dev = &rte_eth_devices[port_id];
+
+	return (dev->pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) != 0;
+}
+
 void
 rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 1200c1c..9d43ca3 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -2038,6 +2038,18 @@  extern void rte_eth_link_get_nowait(uint8_t port_id,
 				struct rte_eth_link *link);
 
 /**
+ * Test whether device supports link state interrupt mode.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (1) if link state interrupt is supported
+ *   - (0) if link state interrupt is not supported
+ */
+extern int
+rte_eth_has_link_state(uint8_t port_id);
+
+/**
  * Retrieve the general I/O statistics of an Ethernet device.
  *
  * @param port_id