All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] virtio_net: add link status handling
@ 2008-12-09 10:19 Mark McLoughlin
  2008-12-09 21:32 ` Anthony Liguori
  2008-12-09 23:56 ` Rusty Russell
  0 siblings, 2 replies; 9+ messages in thread
From: Mark McLoughlin @ 2008-12-09 10:19 UTC (permalink / raw)
  To: Rusty Russell; +Cc: netdev, kvm

Allow the host to inform us that the link is down by adding
a VIRTIO_NET_F_STATUS which indicates that device status is
available in virtio_net config.

This is currently useful for simulating link down conditions
(e.g. using proposed qemu 'set_link' monitor command) but
would also be needed if we were to support device assignment
via virtio.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 drivers/net/virtio_net.c   |   40 +++++++++++++++++++++++++++++++++++++++-
 include/linux/virtio_net.h |    5 +++++
 2 files changed, 44 insertions(+), 1 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 71ca29c..128c38d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -42,6 +42,7 @@ struct virtnet_info
 	struct virtqueue *rvq, *svq;
 	struct net_device *dev;
 	struct napi_struct napi;
+	unsigned int status;
 
 	/* The skb we couldn't send because buffers were full. */
 	struct sk_buff *last_xmit_skb;
@@ -611,6 +612,7 @@ static struct ethtool_ops virtnet_ethtool_ops = {
 	.set_tx_csum = virtnet_set_tx_csum,
 	.set_sg = ethtool_op_set_sg,
 	.set_tso = ethtool_op_set_tso,
+	.get_link = ethtool_op_get_link,
 };
 
 #define MIN_MTU 68
@@ -624,6 +626,38 @@ static int virtnet_change_mtu(struct net_device *dev, int new_mtu)
 	return 0;
 }
 
+static void virtnet_update_status(struct virtnet_info *vi)
+{
+	u16 v;
+
+	if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS))
+		return;
+
+        vi->vdev->config->get(vi->vdev,
+                              offsetof(struct virtio_net_config, status),
+                              &v, sizeof(v));
+
+	if (vi->status == v)
+		return;
+
+	vi->status = v;
+
+	if (vi->status & VIRTIO_NET_S_LINK_UP) {
+		netif_carrier_on(vi->dev);
+		netif_wake_queue(vi->dev);
+	} else {
+		netif_carrier_off(vi->dev);
+		netif_stop_queue(vi->dev);
+	}
+}
+
+static void virtnet_config_changed(struct virtio_device *vdev)
+{
+	struct virtnet_info *vi = vdev->priv;
+
+	virtnet_update_status(vi);
+}
+
 static int virtnet_probe(struct virtio_device *vdev)
 {
 	int err;
@@ -732,6 +766,9 @@ static int virtnet_probe(struct virtio_device *vdev)
 		goto unregister;
 	}
 
+	vi->status = VIRTIO_NET_S_LINK_UP;
+	virtnet_update_status(vi);
+
 	pr_debug("virtnet: registered device %s\n", dev->name);
 	return 0;
 
@@ -787,7 +824,7 @@ static unsigned int features[] = {
 	VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
 	VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
 	VIRTIO_NET_F_GUEST_ECN, /* We don't yet handle UFO input. */
-	VIRTIO_NET_F_MRG_RXBUF,
+	VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS,
 	VIRTIO_F_NOTIFY_ON_EMPTY,
 };
 
@@ -799,6 +836,7 @@ static struct virtio_driver virtio_net = {
 	.id_table =	id_table,
 	.probe =	virtnet_probe,
 	.remove =	__devexit_p(virtnet_remove),
+	.config_changed = virtnet_config_changed,
 };
 
 static int __init init(void)
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index 5cdd0aa..f76bd4a 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -21,11 +21,16 @@
 #define VIRTIO_NET_F_HOST_ECN	13	/* Host can handle TSO[6] w/ ECN in. */
 #define VIRTIO_NET_F_HOST_UFO	14	/* Host can handle UFO in. */
 #define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */
+#define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */
+
+#define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
 
 struct virtio_net_config
 {
 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
 	__u8 mac[6];
+	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
+	__u16 status;
 } __attribute__((packed));
 
 /* This is the first element of the scatter-gather list.  If you don't
-- 
1.6.0.3


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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-09 10:19 [PATCH] virtio_net: add link status handling Mark McLoughlin
@ 2008-12-09 21:32 ` Anthony Liguori
  2008-12-09 23:53   ` Rusty Russell
  2008-12-09 23:56 ` Rusty Russell
  1 sibling, 1 reply; 9+ messages in thread
From: Anthony Liguori @ 2008-12-09 21:32 UTC (permalink / raw)
  To: Mark McLoughlin; +Cc: Rusty Russell, netdev, kvm

Mark McLoughlin wrote:
> Allow the host to inform us that the link is down by adding
> a VIRTIO_NET_F_STATUS which indicates that device status is
> available in virtio_net config.
> 
> This is currently useful for simulating link down conditions
> (e.g. using proposed qemu 'set_link' monitor command) but
> would also be needed if we were to support device assignment
> via virtio.

It would be nice if the virtio-net card wrote some acknowledgement that 
it has received the link status down/up events.

I'm thinking along the lines of doing live migration between two end 
points that are not on the same subnet.  It would be nice to be able to 
signal link status down, have the guest acknowledge that it received it, 
do the live migration, then do link status up so the guest reconnects 
it's networking.

Regards,

Anthony Liguori

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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-09 21:32 ` Anthony Liguori
@ 2008-12-09 23:53   ` Rusty Russell
  2008-12-10  3:11     ` Anthony Liguori
  0 siblings, 1 reply; 9+ messages in thread
From: Rusty Russell @ 2008-12-09 23:53 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Mark McLoughlin, netdev, kvm

On Wednesday 10 December 2008 08:02:14 Anthony Liguori wrote:
> Mark McLoughlin wrote:
> > Allow the host to inform us that the link is down by adding
> > a VIRTIO_NET_F_STATUS which indicates that device status is
> > available in virtio_net config.
> > 
> > This is currently useful for simulating link down conditions
> > (e.g. using proposed qemu 'set_link' monitor command) but
> > would also be needed if we were to support device assignment
> > via virtio.
> 
> It would be nice if the virtio-net card wrote some acknowledgement that 
> it has received the link status down/up events.

How about of every status change event? ie. a generic virtio_pci solution?

Rusty.

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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-09 10:19 [PATCH] virtio_net: add link status handling Mark McLoughlin
  2008-12-09 21:32 ` Anthony Liguori
@ 2008-12-09 23:56 ` Rusty Russell
  1 sibling, 0 replies; 9+ messages in thread
From: Rusty Russell @ 2008-12-09 23:56 UTC (permalink / raw)
  To: Mark McLoughlin; +Cc: netdev, kvm

On Tuesday 09 December 2008 20:49:33 Mark McLoughlin wrote:
> Allow the host to inform us that the link is down by adding
> a VIRTIO_NET_F_STATUS which indicates that device status is
> available in virtio_net config.

This has been a TODO for a while, thanks!

> +	if (vi->status == v)
> +		return;
> +
> +	vi->status = v;
> +
> +	if (vi->status & VIRTIO_NET_S_LINK_UP) {
> +		netif_carrier_on(vi->dev);
> +		netif_wake_queue(vi->dev);
> +	} else {
> +		netif_carrier_off(vi->dev);
> +		netif_stop_queue(vi->dev);
> +	}

New status bits will screw this logic unless we count
on the host not to set them.  I suggest:

	/* Ignore unknown (future) status bits */
	v &= VIRTIO_NET_S_LINK_UP;

Cheers,
Rusty.

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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-09 23:53   ` Rusty Russell
@ 2008-12-10  3:11     ` Anthony Liguori
  2008-12-10 18:34       ` Mark McLoughlin
  0 siblings, 1 reply; 9+ messages in thread
From: Anthony Liguori @ 2008-12-10  3:11 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Mark McLoughlin, netdev, kvm

Rusty Russell wrote:
> On Wednesday 10 December 2008 08:02:14 Anthony Liguori wrote:
>   
>> Mark McLoughlin wrote:
>>     
>>> Allow the host to inform us that the link is down by adding
>>> a VIRTIO_NET_F_STATUS which indicates that device status is
>>> available in virtio_net config.
>>>
>>> This is currently useful for simulating link down conditions
>>> (e.g. using proposed qemu 'set_link' monitor command) but
>>> would also be needed if we were to support device assignment
>>> via virtio.
>>>       
>> It would be nice if the virtio-net card wrote some acknowledgement that 
>> it has received the link status down/up events.
>>     
>
> How about of every status change event? ie. a generic virtio_pci solution?
>   

A really simple way to do it would just be to have another status field 
that was the guest's status (verses the host requested status which the 
current field is).  All config reads/writes result in exits so it's easy 
to track.

Adding YA virtio event may be a little overkill.

Regards,

Anthony Liguori

> Rusty.
>   


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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-10  3:11     ` Anthony Liguori
@ 2008-12-10 18:34       ` Mark McLoughlin
  2008-12-12  8:04         ` Rusty Russell
  0 siblings, 1 reply; 9+ messages in thread
From: Mark McLoughlin @ 2008-12-10 18:34 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Rusty Russell, netdev, kvm

On Tue, 2008-12-09 at 21:11 -0600, Anthony Liguori wrote:
> Rusty Russell wrote:
> > On Wednesday 10 December 2008 08:02:14 Anthony Liguori wrote:
> >   
> >> Mark McLoughlin wrote:
> >>     
> >>> Allow the host to inform us that the link is down by adding
> >>> a VIRTIO_NET_F_STATUS which indicates that device status is
> >>> available in virtio_net config.
> >>>
> >>> This is currently useful for simulating link down conditions
> >>> (e.g. using proposed qemu 'set_link' monitor command) but
> >>> would also be needed if we were to support device assignment
> >>> via virtio.
> >>>       
> >> It would be nice if the virtio-net card wrote some acknowledgement that 
> >> it has received the link status down/up events.
> >>     
> >
> > How about of every status change event? ie. a generic virtio_pci solution?
> >   
> 
> A really simple way to do it would just be to have another status field 
> that was the guest's status (verses the host requested status which the 
> current field is).  All config reads/writes result in exits so it's easy 
> to track.
> 
> Adding YA virtio event may be a little overkill.

Sounds very reasonable; that and Rusty's "mask out unknown bits"
suggestion in the version below.

Cheers,
Mark.

From: Mark McLoughlin <markmc@redhat.com>
Subject: [PATCH] virtio_net: add link status handling

Allow the host to inform us that the link is down by adding
a VIRTIO_NET_F_STATUS which indicates that device status is
available in virtio_net config.

This is currently useful for simulating link down conditions
(e.g. using proposed qemu 'set_link' monitor command) but
would also be needed if we were to support device assignment
via virtio.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 drivers/net/virtio_net.c   |   49 +++++++++++++++++++++++++++++++++++++++++++-
 include/linux/virtio_net.h |    8 +++++++
 2 files changed, 56 insertions(+), 1 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 71ca29c..40f02a1 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -42,6 +42,7 @@ struct virtnet_info
 	struct virtqueue *rvq, *svq;
 	struct net_device *dev;
 	struct napi_struct napi;
+	unsigned int status;
 
 	/* The skb we couldn't send because buffers were full. */
 	struct sk_buff *last_xmit_skb;
@@ -611,6 +612,7 @@ static struct ethtool_ops virtnet_ethtool_ops = {
 	.set_tx_csum = virtnet_set_tx_csum,
 	.set_sg = ethtool_op_set_sg,
 	.set_tso = ethtool_op_set_tso,
+	.get_link = ethtool_op_get_link,
 };
 
 #define MIN_MTU 68
@@ -624,6 +626,47 @@ static int virtnet_change_mtu(struct net_device *dev, int new_mtu)
 	return 0;
 }
 
+static void virtnet_update_status(struct virtnet_info *vi)
+{
+	u16 v;
+
+	if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS))
+		return;
+
+        vi->vdev->config->get(vi->vdev,
+                              offsetof(struct virtio_net_config, status),
+                              &v, sizeof(v));
+
+	/* Ignore unknown (future) status bits */
+	v &= VIRTIO_NET_S_LINK_UP;
+
+	if (vi->status == v)
+		return;
+
+	vi->status = v;
+
+	if (vi->status & VIRTIO_NET_S_LINK_UP) {
+		netif_carrier_on(vi->dev);
+		netif_wake_queue(vi->dev);
+	} else {
+		netif_carrier_off(vi->dev);
+		netif_stop_queue(vi->dev);
+	}
+
+	/* acknowledge the status change */
+        vi->vdev->config->set(vi->vdev,
+                              offsetof(struct virtio_net_config, status_ack),
+                              &vi->status, sizeof(vi->status));
+
+}
+
+static void virtnet_config_changed(struct virtio_device *vdev)
+{
+	struct virtnet_info *vi = vdev->priv;
+
+	virtnet_update_status(vi);
+}
+
 static int virtnet_probe(struct virtio_device *vdev)
 {
 	int err;
@@ -732,6 +775,9 @@ static int virtnet_probe(struct virtio_device *vdev)
 		goto unregister;
 	}
 
+	vi->status = VIRTIO_NET_S_LINK_UP;
+	virtnet_update_status(vi);
+
 	pr_debug("virtnet: registered device %s\n", dev->name);
 	return 0;
 
@@ -787,7 +833,7 @@ static unsigned int features[] = {
 	VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
 	VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
 	VIRTIO_NET_F_GUEST_ECN, /* We don't yet handle UFO input. */
-	VIRTIO_NET_F_MRG_RXBUF,
+	VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS,
 	VIRTIO_F_NOTIFY_ON_EMPTY,
 };
 
@@ -799,6 +845,7 @@ static struct virtio_driver virtio_net = {
 	.id_table =	id_table,
 	.probe =	virtnet_probe,
 	.remove =	__devexit_p(virtnet_remove),
+	.config_changed = virtnet_config_changed,
 };
 
 static int __init init(void)
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index 5cdd0aa..67a37f8 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -21,11 +21,19 @@
 #define VIRTIO_NET_F_HOST_ECN	13	/* Host can handle TSO[6] w/ ECN in. */
 #define VIRTIO_NET_F_HOST_UFO	14	/* Host can handle UFO in. */
 #define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */
+#define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */
+
+#define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
 
 struct virtio_net_config
 {
 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
 	__u8 mac[6];
+	/* Status supplied by host; see VIRTIO_NET_F_STATUS and VIRTIO_NET_S_*
+	 * bits above */
+	__u16 status;
+	/* The guest acks the status by writing it back here */
+	__u16 status_ack;
 } __attribute__((packed));
 
 /* This is the first element of the scatter-gather list.  If you don't
-- 
1.6.0.3


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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-10 18:34       ` Mark McLoughlin
@ 2008-12-12  8:04         ` Rusty Russell
  2009-01-07 18:18           ` Mark McLoughlin
  0 siblings, 1 reply; 9+ messages in thread
From: Rusty Russell @ 2008-12-12  8:04 UTC (permalink / raw)
  To: Mark McLoughlin; +Cc: Anthony Liguori, netdev, kvm

On Thursday 11 December 2008 05:04:44 Mark McLoughlin wrote:
> On Tue, 2008-12-09 at 21:11 -0600, Anthony Liguori wrote:
> > Rusty Russell wrote:
> > > On Wednesday 10 December 2008 08:02:14 Anthony Liguori wrote:    
> > >> It would be nice if the virtio-net card wrote some acknowledgement that 
> > >> it has received the link status down/up events.
> > >
> > > How about of every status change event? ie. a generic virtio_pci solution?
> > 
> > A really simple way to do it would just be to have another status field 
> > that was the guest's status (verses the host requested status which the 
> > current field is).  All config reads/writes result in exits so it's easy 
> > to track.
> > 
> > Adding YA virtio event may be a little overkill.
> 
> Sounds very reasonable; that and Rusty's "mask out unknown bits"
> suggestion in the version below.

Not quite what I was after.  I've taken the original patch, added the
masking change.  I'll test here and feed to DaveM.

As far as Anthony's live migrate race, I've decided to declare with
Canutian arrogance that it Will Never Happen.

Cheers,
Rusty.

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

* Re: [PATCH] virtio_net: add link status handling
  2008-12-12  8:04         ` Rusty Russell
@ 2009-01-07 18:18           ` Mark McLoughlin
  2009-01-09 11:51             ` Mark McLoughlin
  0 siblings, 1 reply; 9+ messages in thread
From: Mark McLoughlin @ 2009-01-07 18:18 UTC (permalink / raw)
  To: Rusty Russell; +Cc: Anthony Liguori, netdev, kvm

Hi Rusty,

On Fri, 2008-12-12 at 18:34 +1030, Rusty Russell wrote:
> On Thursday 11 December 2008 05:04:44 Mark McLoughlin wrote:
> > On Tue, 2008-12-09 at 21:11 -0600, Anthony Liguori wrote:
> > > Rusty Russell wrote:
> > > > On Wednesday 10 December 2008 08:02:14 Anthony Liguori wrote:    
> > > >> It would be nice if the virtio-net card wrote some acknowledgement that 
> > > >> it has received the link status down/up events.
> > > >
> > > > How about of every status change event? ie. a generic virtio_pci solution?
> > > 
> > > A really simple way to do it would just be to have another status field 
> > > that was the guest's status (verses the host requested status which the 
> > > current field is).  All config reads/writes result in exits so it's easy 
> > > to track.
> > > 
> > > Adding YA virtio event may be a little overkill.
> > 
> > Sounds very reasonable; that and Rusty's "mask out unknown bits"
> > suggestion in the version below.
> 
> Not quite what I was after.  I've taken the original patch, added the
> masking change.  I'll test here and feed to DaveM.

This never got pushed to davem, did it? What you've got in your queue
looks fine to me ...

Cheers,
Mark.


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

* Re: [PATCH] virtio_net: add link status handling
  2009-01-07 18:18           ` Mark McLoughlin
@ 2009-01-09 11:51             ` Mark McLoughlin
  0 siblings, 0 replies; 9+ messages in thread
From: Mark McLoughlin @ 2009-01-09 11:51 UTC (permalink / raw)
  To: David Miller; +Cc: Anthony Liguori, netdev, kvm, Rusty Russell

Hi Dave,

On Wed, 2009-01-07 at 18:18 +0000, Mark McLoughlin wrote:
> On Fri, 2008-12-12 at 18:34 +1030, Rusty Russell wrote:
> > Not quite what I was after.  I've taken the original patch, added the
> > masking change.  I'll test here and feed to DaveM.
> 
> This never got pushed to davem, did it? What you've got in your queue
> looks fine to me ...

Here's a virtio-net patch from Rusty's queue which appears just to have
fallen through the cracks.

Thanks,
Mark.

Subject: virtio_net: add link status handling
Date: Tue, 09 Dec 2008 10:19:33 +0000
From: Mark McLoughlin <markmc@redhat.com>

Allow the host to inform us that the link is down by adding
a VIRTIO_NET_F_STATUS which indicates that device status is
available in virtio_net config.

This is currently useful for simulating link down conditions
(e.g. using proposed qemu 'set_link' monitor command) but
would also be needed if we were to support device assignment
via virtio.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (added future masking)
---
 drivers/net/virtio_net.c   |   43 ++++++++++++++++++++++++++++++++++++++++++-
 include/linux/virtio_net.h |    5 +++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 71ca29c..128c38d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -42,6 +42,7 @@ struct virtnet_info
 	struct virtqueue *rvq, *svq;
 	struct net_device *dev;
 	struct napi_struct napi;
+	unsigned int status;
 
 	/* The skb we couldn't send because buffers were full. */
 	struct sk_buff *last_xmit_skb;
@@ -611,6 +612,7 @@ static struct ethtool_ops virtnet_ethtool_ops = {
 	.set_tx_csum = virtnet_set_tx_csum,
 	.set_sg = ethtool_op_set_sg,
 	.set_tso = ethtool_op_set_tso,
+	.get_link = ethtool_op_get_link,
 };
 
 #define MIN_MTU 68
@@ -624,6 +626,41 @@ static int virtnet_change_mtu(struct net_device *dev, int new_mtu)
 	return 0;
 }
 
+static void virtnet_update_status(struct virtnet_info *vi)
+{
+	u16 v;
+
+	if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS))
+		return;
+
+	vi->vdev->config->get(vi->vdev,
+			      offsetof(struct virtio_net_config, status),
+			      &v, sizeof(v));
+
+	/* Ignore unknown (future) status bits */
+	v &= VIRTIO_NET_S_LINK_UP;
+
+	if (vi->status == v)
+		return;
+
+	vi->status = v;
+
+	if (vi->status & VIRTIO_NET_S_LINK_UP) {
+		netif_carrier_on(vi->dev);
+		netif_wake_queue(vi->dev);
+	} else {
+		netif_carrier_off(vi->dev);
+		netif_stop_queue(vi->dev);
+	}
+}
+
+static void virtnet_config_changed(struct virtio_device *vdev)
+{
+	struct virtnet_info *vi = vdev->priv;
+
+	virtnet_update_status(vi);
+}
+
 static int virtnet_probe(struct virtio_device *vdev)
 {
 	int err;
@@ -732,6 +766,9 @@ static int virtnet_probe(struct virtio_device *vdev)
 		goto unregister;
 	}
 
+	vi->status = VIRTIO_NET_S_LINK_UP;
+	virtnet_update_status(vi);
+
 	pr_debug("virtnet: registered device %s\n", dev->name);
 	return 0;
 
@@ -787,7 +824,7 @@ static unsigned int features[] = {
 	VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
 	VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
 	VIRTIO_NET_F_GUEST_ECN, /* We don't yet handle UFO input. */
-	VIRTIO_NET_F_MRG_RXBUF,
+	VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS,
 	VIRTIO_F_NOTIFY_ON_EMPTY,
 };
 
@@ -799,6 +836,7 @@ static struct virtio_driver virtio_net = {
 	.id_table =	id_table,
 	.probe =	virtnet_probe,
 	.remove =	__devexit_p(virtnet_remove),
+	.config_changed = virtnet_config_changed,
 };
 
 static int __init init(void)
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index 5cdd0aa..f76bd4a 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -21,11 +21,16 @@
 #define VIRTIO_NET_F_HOST_ECN	13	/* Host can handle TSO[6] w/ ECN in. */
 #define VIRTIO_NET_F_HOST_UFO	14	/* Host can handle UFO in. */
 #define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */
+#define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */
+
+#define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
 
 struct virtio_net_config
 {
 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
 	__u8 mac[6];
+	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
+	__u16 status;
 } __attribute__((packed));
 
 /* This is the first element of the scatter-gather list.  If you don't



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

end of thread, other threads:[~2009-01-09 11:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-12-09 10:19 [PATCH] virtio_net: add link status handling Mark McLoughlin
2008-12-09 21:32 ` Anthony Liguori
2008-12-09 23:53   ` Rusty Russell
2008-12-10  3:11     ` Anthony Liguori
2008-12-10 18:34       ` Mark McLoughlin
2008-12-12  8:04         ` Rusty Russell
2009-01-07 18:18           ` Mark McLoughlin
2009-01-09 11:51             ` Mark McLoughlin
2008-12-09 23:56 ` Rusty Russell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.