接着昨天的寫,由於detach,attach,重新建立後端和前端握手,對於Linux來說無所謂,windows的話,有點問題。所以採用第二種方法,register xenwatch,callback裏面去重新read rate limit。廢話少說,直接貼代碼。
--- ../dom0_kernel_netback_rate/drivers/xen/netback/xenbus.c 2010-10-26 18:50:33.000000000 +0800
+++ ../dom0_kernel_398819_20101019/drivers/xen/netback/xenbus.c 2010-04-03 05:29:40.000000000 +0800
@@ -33,8 +33,6 @@
static void connect(struct backend_info *);
static void backend_create_netif(struct backend_info *be);
static void unregister_hotplug_status_watch(struct backend_info *be);
-static void unregister_rate_watch(struct backend_info *be);
-
static int netback_remove(struct xenbus_device *dev)
{
@@ -43,7 +41,6 @@
//netback_remove_accelerators(be, dev);
unregister_hotplug_status_watch(be);
- unregister_rate_watch(be);
if (be->netif) {
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
@@ -355,15 +350,6 @@
be->have_hotplug_status_watch = 0;
}
-static void unregister_rate_watch(struct backend_info *be)
-{
- if (be->have_rate_watch) {
- unregister_xenbus_watch(&be->rate_watch);
- kfree(be->rate_watch.node);
- }
- be->have_rate_watch = 0;
-}
-
static void hotplug_status_changed(struct xenbus_watch *watch,
const char **vec,
unsigned int vec_size)
@@ -385,17 +371,6 @@
kfree(str);
}
-static void rate_changed(struct xenbus_watch *watch,
- const char **vec, unsigned int len)
-{
-
- struct backend_info *be=container_of(watch,struct backend_info, rate_watch);
-
- IPRINTK("rate changed/n");
- xen_net_read_rate(be->dev, &be->netif->credit_bytes,
- &be->netif->credit_usec);
-}
-
static void connect(struct backend_info *be)
{
int err;
@@ -426,16 +401,7 @@
be->have_hotplug_status_watch = 1;
}
- unregister_rate_watch(be);
- err=xenbus_watch_pathfmt(dev, &be->rate_watch,
- rate_changed,"%s/%s", dev->nodename, "rate");
-
- if(!err){
- be->have_rate_watch=1;
- }
-
}
重新編譯內核之後,調用xenstore write /local/domain/0/backend/vif/id/0/rate "xxx,xxx",之後進入虛擬機,scp一個文件發現,果然重新限速了。Bingo!