[RFT] net/netvsc: initialize link state

Message ID 20200207001038.7254-1-sthemmin@microsoft.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series [RFT] net/netvsc: initialize link state |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-testing success Testing PASS
ci/iol-nxp-Performance success Performance Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/travis-robot warning Travis build: failed
ci/Intel-compilation fail apply issues

Commit Message

Stephen Hemminger Feb. 7, 2020, 12:10 a.m. UTC
  If application is using link state interrupt, the correct link state
needs to be filled in when device is started. This is similar to
how virtio updates link information.

Reported-by: Mohammed Gamal <mgamal@redhat.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
This version marked RFT because am in airport without access to a
machine to test it.

 drivers/net/netvsc/hn_ethdev.c | 4 ++++
 1 file changed, 4 insertions(+)
  

Comments

Mohammed Gamal Feb. 7, 2020, 1:22 p.m. UTC | #1
On Thu, 2020-02-06 at 16:10 -0800, Stephen Hemminger wrote:
> If application is using link state interrupt, the correct link state
> needs to be filled in when device is started. This is similar to
> how virtio updates link information.
> 
> Reported-by: Mohammed Gamal <mgamal@redhat.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> This version marked RFT because am in airport without access to a
> machine to test it.
> 
>  drivers/net/netvsc/hn_ethdev.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/net/netvsc/hn_ethdev.c
> b/drivers/net/netvsc/hn_ethdev.c
> index c79f924379fe..564620748daf 100644
> --- a/drivers/net/netvsc/hn_ethdev.c
> +++ b/drivers/net/netvsc/hn_ethdev.c
> @@ -823,6 +823,10 @@ hn_dev_start(struct rte_eth_dev *dev)
>  	if (error)
>  		hn_rndis_set_rxfilter(hv, 0);
>  
> +	/* Initialize Link state */
> +	if (error == 0)
> +		hn_dev_link_update(dev, 0);
> +
>  	return error;
>  }
>  

I tested this and I always get the link status as UP, regardless of
whether I start the interface on the guest in UP or DOWN state. Looking
at hn_dev_link_update() code, I see that the link status depends on the
NDIS status that the driver gets from the host if my understanding is
correct.
The question is whether if I use 'ip li set dev $IF_NAME down' on the
guest affects the status the host sees, or would the host set the state
to NDIS_MEDIA_STATE_CONNECTED of the device is physcially connected
regardless of what the guest tries to do?
  
Stephen Hemminger Feb. 7, 2020, 4:12 p.m. UTC | #2
On Fri, 07 Feb 2020 15:22:23 +0200
Mohammed Gamal <mgamal@redhat.com> wrote:

> On Thu, 2020-02-06 at 16:10 -0800, Stephen Hemminger wrote:
> > If application is using link state interrupt, the correct link state
> > needs to be filled in when device is started. This is similar to
> > how virtio updates link information.
> > 
> > Reported-by: Mohammed Gamal <mgamal@redhat.com>
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > This version marked RFT because am in airport without access to a
> > machine to test it.
> > 
> >  drivers/net/netvsc/hn_ethdev.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> > 
> > diff --git a/drivers/net/netvsc/hn_ethdev.c
> > b/drivers/net/netvsc/hn_ethdev.c
> > index c79f924379fe..564620748daf 100644
> > --- a/drivers/net/netvsc/hn_ethdev.c
> > +++ b/drivers/net/netvsc/hn_ethdev.c
> > @@ -823,6 +823,10 @@ hn_dev_start(struct rte_eth_dev *dev)
> >  	if (error)
> >  		hn_rndis_set_rxfilter(hv, 0);
> >  
> > +	/* Initialize Link state */
> > +	if (error == 0)
> > +		hn_dev_link_update(dev, 0);
> > +
> >  	return error;
> >  }
> >    
> 
> I tested this and I always get the link status as UP, regardless of
> whether I start the interface on the guest in UP or DOWN state. Looking
> at hn_dev_link_update() code, I see that the link status depends on the
> NDIS status that the driver gets from the host if my understanding is
> correct.
> The question is whether if I use 'ip li set dev $IF_NAME down' on the
> guest affects the status the host sees, or would the host set the state
> to NDIS_MEDIA_STATE_CONNECTED of the device is physcially connected
> regardless of what the guest tries to do?
> 

Are you confused about admin state vs link state?  Admin state is the
up/down state in software, and link state is the (virtual) hardware link
status.  In traditional Linux, admin state is controlled by ip link
set up/down; in DPDK the admin state is implied by whether the DPDK
device is started or stopped.  The link state for hardware devices is
determined by whether the hardware link has synchronized with the switch.
In virtual environments this is synchronized. In Linux link state
is reported as NOCARRIER (IFF_RUNNING). In DPDK it is reported in
via the link info get.

The device visible to the kernel is the accelerated networking (Mellanox)
device and is not related directly to the netvsc device.

To test link up/down is not easy on Azure. You would have to use Azure CLI
to disconnect the NIC from VM.  On native Hyper-V you can test by
setting up a virtual switch with an external network device; then
unplug the network device.
  
Mohammed Gamal Feb. 7, 2020, 4:26 p.m. UTC | #3
On Fri, 2020-02-07 at 08:12 -0800, Stephen Hemminger wrote:
> On Fri, 07 Feb 2020 15:22:23 +0200
> Mohammed Gamal <mgamal@redhat.com> wrote:
> 
> > On Thu, 2020-02-06 at 16:10 -0800, Stephen Hemminger wrote:
> > > If application is using link state interrupt, the correct link
> > > state
> > > needs to be filled in when device is started. This is similar to
> > > how virtio updates link information.
> > > 
> > > Reported-by: Mohammed Gamal <mgamal@redhat.com>
> > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > > ---
> > > This version marked RFT because am in airport without access to a
> > > machine to test it.
> > > 
> > >  drivers/net/netvsc/hn_ethdev.c | 4 ++++
> > >  1 file changed, 4 insertions(+)
> > > 
> > > diff --git a/drivers/net/netvsc/hn_ethdev.c
> > > b/drivers/net/netvsc/hn_ethdev.c
> > > index c79f924379fe..564620748daf 100644
> > > --- a/drivers/net/netvsc/hn_ethdev.c
> > > +++ b/drivers/net/netvsc/hn_ethdev.c
> > > @@ -823,6 +823,10 @@ hn_dev_start(struct rte_eth_dev *dev)
> > >  	if (error)
> > >  		hn_rndis_set_rxfilter(hv, 0);
> > >  
> > > +	/* Initialize Link state */
> > > +	if (error == 0)
> > > +		hn_dev_link_update(dev, 0);
> > > +
> > >  	return error;
> > >  }
> > >    
> > 
> > I tested this and I always get the link status as UP, regardless of
> > whether I start the interface on the guest in UP or DOWN state.
> > Looking
> > at hn_dev_link_update() code, I see that the link status depends on
> > the
> > NDIS status that the driver gets from the host if my understanding
> > is
> > correct.
> > The question is whether if I use 'ip li set dev $IF_NAME down' on
> > the
> > guest affects the status the host sees, or would the host set the
> > state
> > to NDIS_MEDIA_STATE_CONNECTED of the device is physcially connected
> > regardless of what the guest tries to do?
> > 
> 
> Are you confused about admin state vs link state?  Admin state is the
> up/down state in software, and link state is the (virtual) hardware
> link
> status.  In traditional Linux, admin state is controlled by ip link
> set up/down; in DPDK the admin state is implied by whether the DPDK
> device is started or stopped.  The link state for hardware devices is
> determined by whether the hardware link has synchronized with the
> switch.
> In virtual environments this is synchronized. In Linux link state
> is reported as NOCARRIER (IFF_RUNNING). In DPDK it is reported in
> via the link info get.
> 
> The device visible to the kernel is the accelerated networking
> (Mellanox)
> device and is not related directly to the netvsc device.
> 
> To test link up/down is not easy on Azure. You would have to use
> Azure CLI
> to disconnect the NIC from VM.  On native Hyper-V you can test by
> setting up a virtual switch with an external network device; then
> unplug the network device.
> 
> 

I see. Thanks for the explanation. In this case this does work as
expected.

Tested-by: Mohammed Gamal <mgamal@redhat.com>
  

Patch

diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
index c79f924379fe..564620748daf 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -823,6 +823,10 @@  hn_dev_start(struct rte_eth_dev *dev)
 	if (error)
 		hn_rndis_set_rxfilter(hv, 0);
 
+	/* Initialize Link state */
+	if (error == 0)
+		hn_dev_link_update(dev, 0);
+
 	return error;
 }