|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] netback: fix shutting down the ring if it contains garbage
# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1361176894 -3600
# Node ID ff0befcaac096534fba1c17410367740ed4b1d5f
# Parent a56b12b91c25fc922ce7eee18fb4576b23e5fdb6
netback: fix shutting down the ring if it contains garbage
Using rtnl_lock() in tasklet context is not permitted.
This undoes the part of 1219:5108c6901b30 that split off
xenvif_carrier_off() from netif_disconnect().
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
diff -r a56b12b91c25 -r ff0befcaac09 drivers/xen/netback/common.h
--- a/drivers/xen/netback/common.h Fri Feb 15 09:51:33 2013 +0100
+++ b/drivers/xen/netback/common.h Mon Feb 18 09:41:34 2013 +0100
@@ -78,6 +78,8 @@ typedef struct netif_st {
u8 can_queue:1; /* can queue packets for receiver? */
u8 copying_receiver:1; /* copy packets to receiver? */
+ u8 busted:1;
+
/* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */
RING_IDX rx_req_cons_peek;
@@ -195,7 +197,8 @@ int netif_map(struct backend_info *be, g
void netif_xenbus_init(void);
#define netif_schedulable(netif) \
- (netif_running((netif)->dev) && netback_carrier_ok(netif))
+ (likely(!(netif)->busted) && \
+ netif_running((netif)->dev) && netback_carrier_ok(netif))
void netif_schedule_work(netif_t *netif);
void netif_deschedule_work(netif_t *netif);
@@ -204,9 +207,6 @@ int netif_be_start_xmit(struct sk_buff *
struct net_device_stats *netif_be_get_stats(struct net_device *dev);
irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-/* Prevent the device from generating any further traffic. */
-void xenvif_carrier_off(netif_t *netif);
-
static inline int netbk_can_queue(struct net_device *dev)
{
netif_t *netif = netdev_priv(dev);
diff -r a56b12b91c25 -r ff0befcaac09 drivers/xen/netback/interface.c
--- a/drivers/xen/netback/interface.c Fri Feb 15 09:51:33 2013 +0100
+++ b/drivers/xen/netback/interface.c Mon Feb 18 09:41:34 2013 +0100
@@ -56,6 +56,10 @@ module_param_named(queue_length, netbk_q
static void __netif_up(netif_t *netif)
{
+ if (netif->busted) {
+ netif->busted = 0;
+ enable_irq(netif->irq);
+ }
enable_irq(netif->irq);
netif_schedule_work(netif);
}
@@ -347,23 +351,19 @@ err_rx:
return err;
}
-void xenvif_carrier_off(netif_t *netif)
-{
- rtnl_lock();
- netback_carrier_off(netif);
- netif_carrier_off(netif->dev); /* discard queued packets */
- if (netif_running(netif->dev))
- __netif_down(netif);
- rtnl_unlock();
- netif_put(netif);
-}
-
void netif_disconnect(struct backend_info *be)
{
netif_t *netif = be->netif;
- if (netback_carrier_ok(netif))
- xenvif_carrier_off(netif);
+ if (netback_carrier_ok(netif)) {
+ rtnl_lock();
+ netback_carrier_off(netif);
+ netif_carrier_off(netif->dev); /* discard queued packets */
+ if (netif_running(netif->dev))
+ __netif_down(netif);
+ rtnl_unlock();
+ netif_put(netif);
+ }
atomic_dec(&netif->refcnt);
wait_event(netif->waiting_to_free, atomic_read(&netif->refcnt) == 0);
diff -r a56b12b91c25 -r ff0befcaac09 drivers/xen/netback/netback.c
--- a/drivers/xen/netback/netback.c Fri Feb 15 09:51:33 2013 +0100
+++ b/drivers/xen/netback/netback.c Mon Feb 18 09:41:34 2013 +0100
@@ -845,7 +845,7 @@ void netif_schedule_work(netif_t *netif)
RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, more_to_do);
#endif
- if (more_to_do) {
+ if (more_to_do && likely(!netif->busted)) {
add_to_net_schedule_list_tail(netif);
maybe_schedule_tx_action();
}
@@ -1024,7 +1024,9 @@ static void netbk_fatal_tx_err(netif_t *
{
printk(KERN_ERR "%s: fatal error; disabling device\n",
netif->dev->name);
- xenvif_carrier_off(netif);
+ netif->busted = 1;
+ disable_irq(netif->irq);
+ netif_deschedule_work(netif);
netif_put(netif);
}
@@ -1292,6 +1294,11 @@ static void net_tx_action(unsigned long
if (!netif)
continue;
+ if (unlikely(netif->busted)) {
+ netif_put(netif);
+ continue;
+ }
+
if (netif->tx.sring->req_prod - netif->tx.req_cons >
NET_TX_RING_SIZE) {
printk(KERN_ERR "%s: Impossible number of requests. "
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |