Message ID | 1407165658-20146-2-git-send-email-zoltan.kiss@citrix.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Mon, Aug 04, 2014 at 04:20:57PM +0100, Zoltan Kiss wrote: > 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 > > diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h > index 28c9822..4a92fc1 100644 > --- a/drivers/net/xen-netback/common.h > +++ b/drivers/net/xen-netback/common.h > @@ -198,6 +198,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */ > struct xenvif_stats stats; > }; > > +enum state_bit_shift { > + /* This bit marks that the vif is connected */ > + VIF_STATUS_CONNECTED This bit shift applies to vif. In the following patch you introduce two more bits specifically for queues. IMHO we should avoid mixing things up. What about having two enums enum vif_state_bit_shift {} enum queue_state_bit_shift {} ? Wei. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/08/14 13:45, Wei Liu wrote: > On Mon, Aug 04, 2014 at 04:20:57PM +0100, Zoltan Kiss wrote: >> 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 >> >> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h >> index 28c9822..4a92fc1 100644 >> --- a/drivers/net/xen-netback/common.h >> +++ b/drivers/net/xen-netback/common.h >> @@ -198,6 +198,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */ >> struct xenvif_stats stats; >> }; >> >> +enum state_bit_shift { >> + /* This bit marks that the vif is connected */ >> + VIF_STATUS_CONNECTED > > This bit shift applies to vif. In the following patch you introduce two > more bits specifically for queues. IMHO we should avoid mixing things > up. What about having two enums > > enum vif_state_bit_shift {} > enum queue_state_bit_shift {} I think it would be a bit overdoing it, this enum type is never used in declaration. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h index 28c9822..4a92fc1 100644 --- a/drivers/net/xen-netback/common.h +++ b/drivers/net/xen-netback/common.h @@ -198,6 +198,11 @@ struct xenvif_queue { /* Per-queue data for xenvif */ struct xenvif_stats stats; }; +enum state_bit_shift { + /* This bit marks that the vif is connected */ + VIF_STATUS_CONNECTED +}; + struct xenvif { /* Unique identifier for this interface. */ domid_t domid; @@ -220,6 +225,7 @@ struct xenvif { * frontend is rogue. */ bool disabled; + unsigned long status; /* Queues */ struct xenvif_queue *queues; diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index bd59d9d..fbdadb3 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -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]; diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 769e553..6c4cc0f 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -1953,7 +1953,7 @@ int xenvif_kthread_guest_rx(void *data) * context so we defer it here, if this thread is * 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); if (kthread_should_stop())