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: Zoltan Kiss <zoltan.kiss@citrix.com> Signed-off-by: David 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: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
aef4f5b6db
commit
3d1af1df97
@@ -55,7 +55,8 @@ static inline void xenvif_stop_queue(struct xenvif_queue *queue)
|
||||
|
||||
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)
|
||||
@@ -267,7 +268,7 @@ static void xenvif_down(struct xenvif *vif)
|
||||
static int xenvif_open(struct net_device *dev)
|
||||
{
|
||||
struct xenvif *vif = netdev_priv(dev);
|
||||
if (netif_carrier_ok(dev))
|
||||
if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
|
||||
xenvif_up(vif);
|
||||
netif_tx_start_all_queues(dev);
|
||||
return 0;
|
||||
@@ -276,7 +277,7 @@ static int xenvif_open(struct net_device *dev)
|
||||
static int xenvif_close(struct net_device *dev)
|
||||
{
|
||||
struct xenvif *vif = netdev_priv(dev);
|
||||
if (netif_carrier_ok(dev))
|
||||
if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
|
||||
xenvif_down(vif);
|
||||
netif_tx_stop_all_queues(dev);
|
||||
return 0;
|
||||
@@ -528,6 +529,7 @@ void xenvif_carrier_on(struct xenvif *vif)
|
||||
if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
|
||||
dev_set_mtu(vif->dev, ETH_DATA_LEN);
|
||||
netdev_update_features(vif->dev);
|
||||
set_bit(VIF_STATUS_CONNECTED, &vif->status);
|
||||
netif_carrier_on(vif->dev);
|
||||
if (netif_running(vif->dev))
|
||||
xenvif_up(vif);
|
||||
@@ -625,9 +627,11 @@ void xenvif_carrier_off(struct xenvif *vif)
|
||||
struct net_device *dev = vif->dev;
|
||||
|
||||
rtnl_lock();
|
||||
netif_carrier_off(dev); /* discard queued packets */
|
||||
if (netif_running(dev))
|
||||
xenvif_down(vif);
|
||||
if (test_and_clear_bit(VIF_STATUS_CONNECTED, &vif->status)) {
|
||||
netif_carrier_off(dev); /* discard queued packets */
|
||||
if (netif_running(dev))
|
||||
xenvif_down(vif);
|
||||
}
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
@@ -656,8 +660,7 @@ void xenvif_disconnect(struct xenvif *vif)
|
||||
unsigned int num_queues = vif->num_queues;
|
||||
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) {
|
||||
queue = &vif->queues[queue_index];
|
||||
|
Reference in New Issue
Block a user