Message ID | 1434716511-25657-1-git-send-email-imrep.amz@gmail.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, Jun 19, 2015 at 02:21:51PM +0200, Imre Palik wrote: > From: "Palik, Imre" <imrep@amazon.de> > > Commit edafc132baac ("xen-netback: making the bandwidth limiter runtime settable") > introduced the capability to change the bandwidth rate limit at runtime. > But it also introduced a possible crashing bug. > > If netback receives two XenbusStateConnected without getting the > hotplug-status watch firing in between, then it will try to register the > watches for the rate limiter again. But this triggers a BUG() in the watch > registration code. > > The fix modifies connect() to remove the possibly existing packet-rate > watches before trying to install those watches. This behaviour is in line > with how connect() deals with the hotplug-status watch. > > Signed-off-by: Imre Palik <imrep@amazon.de> > Cc: Matt Wilson <msw@amazon.com> Acked-by: Wei Liu <wei.liu2@citrix.com> > --- > drivers/net/xen-netback/xenbus.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c > index 968787a..ec383b0 100644 > --- a/drivers/net/xen-netback/xenbus.c > +++ b/drivers/net/xen-netback/xenbus.c > @@ -681,6 +681,9 @@ static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif) > char *node; > unsigned maxlen = strlen(dev->nodename) + sizeof("/rate"); > > + if (vif->credit_watch.node) > + return -EADDRINUSE; > + > node = kmalloc(maxlen, GFP_KERNEL); > if (!node) > return -ENOMEM; > @@ -770,6 +773,7 @@ static void connect(struct backend_info *be) > } > > xen_net_read_rate(dev, &credit_bytes, &credit_usec); > + xen_unregister_watchers(be->vif); > xen_register_watchers(dev, be->vif); > read_xenbus_vif_flags(be); > > -- > 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe netdev" in
From: Imre Palik <imrep.amz@gmail.com> Date: Fri, 19 Jun 2015 14:21:51 +0200 > From: "Palik, Imre" <imrep@amazon.de> > > Commit edafc132baac ("xen-netback: making the bandwidth limiter runtime settable") > introduced the capability to change the bandwidth rate limit at runtime. > But it also introduced a possible crashing bug. > > If netback receives two XenbusStateConnected without getting the > hotplug-status watch firing in between, then it will try to register the > watches for the rate limiter again. But this triggers a BUG() in the watch > registration code. > > The fix modifies connect() to remove the possibly existing packet-rate > watches before trying to install those watches. This behaviour is in line > with how connect() deals with the hotplug-status watch. > > Signed-off-by: Imre Palik <imrep@amazon.de> > Cc: Matt Wilson <msw@amazon.com> Applied, thank you. -- 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/xenbus.c b/drivers/net/xen-netback/xenbus.c index 968787a..ec383b0 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -681,6 +681,9 @@ static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif) char *node; unsigned maxlen = strlen(dev->nodename) + sizeof("/rate"); + if (vif->credit_watch.node) + return -EADDRINUSE; + node = kmalloc(maxlen, GFP_KERNEL); if (!node) return -ENOMEM; @@ -770,6 +773,7 @@ static void connect(struct backend_info *be) } xen_net_read_rate(dev, &credit_bytes, &credit_usec); + xen_unregister_watchers(be->vif); xen_register_watchers(dev, be->vif); read_xenbus_vif_flags(be);