Commit 3d1af1df authored by Zoltan Kiss's avatar Zoltan Kiss Committed by David S. Miller

xen-netback: Using a new state bit instead of carrier

This patch introduces a new state bit VIF_STATUS_CONNECTED to track whether the
vif is in a connected state. Using carrier will not work with the next patch
in this series, which aims to turn the carrier temporarily off if the guest
doesn't seem to be able to receive packets.
Signed-off-by: default avatarZoltan Kiss <zoltan.kiss@citrix.com>
Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: xen-devel@lists.xenproject.org

v2:
- rename the bitshift type to "enum state_bit_shift" here, not in the next patch
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aef4f5b6
...@@ -198,6 +198,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */ ...@@ -198,6 +198,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */
struct xenvif_stats stats; struct xenvif_stats stats;
}; };
enum state_bit_shift {
/* This bit marks that the vif is connected */
VIF_STATUS_CONNECTED
};
struct xenvif { struct xenvif {
/* Unique identifier for this interface. */ /* Unique identifier for this interface. */
domid_t domid; domid_t domid;
...@@ -220,6 +225,7 @@ struct xenvif { ...@@ -220,6 +225,7 @@ struct xenvif {
* frontend is rogue. * frontend is rogue.
*/ */
bool disabled; bool disabled;
unsigned long status;
/* Queues */ /* Queues */
struct xenvif_queue *queues; struct xenvif_queue *queues;
......
...@@ -55,7 +55,8 @@ static inline void xenvif_stop_queue(struct xenvif_queue *queue) ...@@ -55,7 +55,8 @@ static inline void xenvif_stop_queue(struct xenvif_queue *queue)
int xenvif_schedulable(struct xenvif *vif) int xenvif_schedulable(struct xenvif *vif)
{ {
return netif_running(vif->dev) && netif_carrier_ok(vif->dev); return netif_running(vif->dev) &&
test_bit(VIF_STATUS_CONNECTED, &vif->status);
} }
static irqreturn_t xenvif_tx_interrupt(int irq, void *dev_id) static irqreturn_t xenvif_tx_interrupt(int irq, void *dev_id)
...@@ -267,7 +268,7 @@ static void xenvif_down(struct xenvif *vif) ...@@ -267,7 +268,7 @@ static void xenvif_down(struct xenvif *vif)
static int xenvif_open(struct net_device *dev) static int xenvif_open(struct net_device *dev)
{ {
struct xenvif *vif = netdev_priv(dev); struct xenvif *vif = netdev_priv(dev);
if (netif_carrier_ok(dev)) if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
xenvif_up(vif); xenvif_up(vif);
netif_tx_start_all_queues(dev); netif_tx_start_all_queues(dev);
return 0; return 0;
...@@ -276,7 +277,7 @@ static int xenvif_open(struct net_device *dev) ...@@ -276,7 +277,7 @@ static int xenvif_open(struct net_device *dev)
static int xenvif_close(struct net_device *dev) static int xenvif_close(struct net_device *dev)
{ {
struct xenvif *vif = netdev_priv(dev); struct xenvif *vif = netdev_priv(dev);
if (netif_carrier_ok(dev)) if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
xenvif_down(vif); xenvif_down(vif);
netif_tx_stop_all_queues(dev); netif_tx_stop_all_queues(dev);
return 0; return 0;
...@@ -528,6 +529,7 @@ void xenvif_carrier_on(struct xenvif *vif) ...@@ -528,6 +529,7 @@ void xenvif_carrier_on(struct xenvif *vif)
if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN) if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
dev_set_mtu(vif->dev, ETH_DATA_LEN); dev_set_mtu(vif->dev, ETH_DATA_LEN);
netdev_update_features(vif->dev); netdev_update_features(vif->dev);
set_bit(VIF_STATUS_CONNECTED, &vif->status);
netif_carrier_on(vif->dev); netif_carrier_on(vif->dev);
if (netif_running(vif->dev)) if (netif_running(vif->dev))
xenvif_up(vif); xenvif_up(vif);
...@@ -625,9 +627,11 @@ void xenvif_carrier_off(struct xenvif *vif) ...@@ -625,9 +627,11 @@ void xenvif_carrier_off(struct xenvif *vif)
struct net_device *dev = vif->dev; struct net_device *dev = vif->dev;
rtnl_lock(); rtnl_lock();
netif_carrier_off(dev); /* discard queued packets */ if (test_and_clear_bit(VIF_STATUS_CONNECTED, &vif->status)) {
if (netif_running(dev)) netif_carrier_off(dev); /* discard queued packets */
xenvif_down(vif); if (netif_running(dev))
xenvif_down(vif);
}
rtnl_unlock(); rtnl_unlock();
} }
...@@ -656,8 +660,7 @@ void xenvif_disconnect(struct xenvif *vif) ...@@ -656,8 +660,7 @@ void xenvif_disconnect(struct xenvif *vif)
unsigned int num_queues = vif->num_queues; unsigned int num_queues = vif->num_queues;
unsigned int queue_index; unsigned int queue_index;
if (netif_carrier_ok(vif->dev)) xenvif_carrier_off(vif);
xenvif_carrier_off(vif);
for (queue_index = 0; queue_index < num_queues; ++queue_index) { for (queue_index = 0; queue_index < num_queues; ++queue_index) {
queue = &vif->queues[queue_index]; queue = &vif->queues[queue_index];
......
...@@ -1953,7 +1953,7 @@ int xenvif_kthread_guest_rx(void *data) ...@@ -1953,7 +1953,7 @@ int xenvif_kthread_guest_rx(void *data)
* context so we defer it here, if this thread is * context so we defer it here, if this thread is
* associated with queue 0. * associated with queue 0.
*/ */
if (unlikely(queue->vif->disabled && netif_carrier_ok(queue->vif->dev) && queue->id == 0)) if (unlikely(queue->vif->disabled && queue->id == 0))
xenvif_carrier_off(queue->vif); xenvif_carrier_off(queue->vif);
if (kthread_should_stop()) if (kthread_should_stop())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment