static int read_xenbus_vif_flags(struct backend_info *be);
 static int backend_create_xenvif(struct backend_info *be);
 static void unregister_hotplug_status_watch(struct backend_info *be);
+static void xen_unregister_watchers(struct xenvif *vif);
 static void set_backend_state(struct backend_info *be,
                              enum xenbus_state state);
 
        unregister_hotplug_status_watch(be);
        if (be->vif) {
                kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
+               xen_unregister_watchers(be->vif);
                xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
                xenvif_free(be->vif);
                be->vif = NULL;
 static void backend_disconnect(struct backend_info *be)
 {
        if (be->vif) {
+               xen_unregister_watchers(be->vif);
 #ifdef CONFIG_DEBUG_FS
                xenvif_debugfs_delif(be->vif);
 #endif /* CONFIG_DEBUG_FS */
        return 0;
 }
 
+static void xen_net_rate_changed(struct xenbus_watch *watch,
+                               const char **vec, unsigned int len)
+{
+       struct xenvif *vif = container_of(watch, struct xenvif, credit_watch);
+       struct xenbus_device *dev = xenvif_to_xenbus_device(vif);
+       unsigned long   credit_bytes;
+       unsigned long   credit_usec;
+       unsigned int queue_index;
+
+       xen_net_read_rate(dev, &credit_bytes, &credit_usec);
+       for (queue_index = 0; queue_index < vif->num_queues; queue_index++) {
+               struct xenvif_queue *queue = &vif->queues[queue_index];
+
+               queue->credit_bytes = credit_bytes;
+               queue->credit_usec = credit_usec;
+               if (!mod_timer_pending(&queue->credit_timeout, jiffies) &&
+                       queue->remaining_credit > queue->credit_bytes) {
+                       queue->remaining_credit = queue->credit_bytes;
+               }
+       }
+}
+
+static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif)
+{
+       int err = 0;
+       char *node;
+       unsigned maxlen = strlen(dev->nodename) + sizeof("/rate");
+
+       node = kmalloc(maxlen, GFP_KERNEL);
+       if (!node)
+               return -ENOMEM;
+       snprintf(node, maxlen, "%s/rate", dev->nodename);
+       vif->credit_watch.node = node;
+       vif->credit_watch.callback = xen_net_rate_changed;
+       err = register_xenbus_watch(&vif->credit_watch);
+       if (err) {
+               pr_err("Failed to set watcher %s\n", vif->credit_watch.node);
+               kfree(node);
+               vif->credit_watch.node = NULL;
+               vif->credit_watch.callback = NULL;
+       }
+       return err;
+}
+
+static void xen_unregister_watchers(struct xenvif *vif)
+{
+       if (vif->credit_watch.node) {
+               unregister_xenbus_watch(&vif->credit_watch);
+               kfree(vif->credit_watch.node);
+               vif->credit_watch.node = NULL;
+       }
+}
+
 static void unregister_hotplug_status_watch(struct backend_info *be)
 {
        if (be->have_hotplug_status_watch) {
        }
 
        xen_net_read_rate(dev, &credit_bytes, &credit_usec);
+       xen_register_watchers(dev, be->vif);
        read_xenbus_vif_flags(be);
 
        /* Use the number of queues requested by the frontend */