天天看點

動态修改Xen netback 的rate limit

http://blog.csdn.net/wanjia19870902/archive/2010/10/26/5967467.aspx

編譯Xen的話,如果需要從網上下載下傳的話就按照Readme裡面說的那樣make world,make install 。但是通常情況,我們都會自己搞好源碼包,那麼直接make xen make tools make install-xen make install-tools

編譯Dom0 kernel的話,有兩種方法,一種是Readme裡面說的,make linux-2.6-pvops build / install  我之前就這樣編的,不過有些不友善,需要把你dom0 kernel的檔案夾鍊到linux-2.6-pvops.git 。還有一種就是直接編譯kernel,拷貝.config檔案,make make modules_install make install。

最後重新mkinitrd -v -f --builtin=ehci-hcd --builtin=ohci-hcd --builtin=uhci-hcd --with=aacraid --with=sd_mod initrd-2.6.31.13-wj.img 2.6.31.13-wj,并修改grub檔案。

好的,現在環境算是弄好了,把之前的kernel全删了,幹淨多了。

由于現在有個問題是,如何動态修改xen裡面的rate limit。看了netback裡面的代碼,發現,是在前後端connect的時候,netback會去讀xenbus裡面的rate值,并在後面一段時間内的tx bytes進行監控,如果超出credit,則等待這段時間過去,重新計時監控。

目前貌似有兩種想法:一種是detach vif 在attach vif,這樣前後端會重新connect,讀新rate,還有一種是讓netback watch這個xenstore path被修改的事件,調用callback,改寫記憶體中的credit值。

今天初步試驗了下,由于還要趕回家寫自己的代碼,暫時寫到這。等确定方案了,在詳細講解

接着昨天的寫,由于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!

繼續閱讀