remus: init sch_plug module based on kernel version
authorShriram Rajagopalan <rshriram@cs.ubc.ca>
Fri, 5 Apr 2013 15:16:05 +0000 (15:16 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 8 Apr 2013 15:05:56 +0000 (16:05 +0100)
remus: init sch_plug module based on kernel version

sch_plug module, for network buffering, is available as part of linux
kernel (from 3.4 onwards), as opposed to an out-of-tree module.
The netlink message format to talk to the in-kernel module is different from
that of the old version.  So, before initializing the Plug Qdisc, check
the kernel version and use the appropriate message format.

Also change the names of the constants to reflect the format used by the mainline
module [CHECKPOINT -> BUFFER , RELEASE -> RELEASE_ONE ].

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
tools/python/xen/remus/device.py
tools/python/xen/remus/qdisc.py

index debfaedb076e6cc50358df5f978e821a0fb2ff43..970e1ead5fd15c879ddfa4f4549bc5962514466e 100644 (file)
@@ -332,12 +332,12 @@ class BufferedNIC(CheckpointedDevice):
         if not self.installed:
             self.install()
 
-        self._sendqmsg(qdisc.TC_PLUG_CHECKPOINT)
+        self._sendqmsg(qdisc.TC_PLUG_BUFFER)
 
     def commit(self):
         '''Called when checkpoint has been acknowledged by
         the backup'''
-        self._sendqmsg(qdisc.TC_PLUG_RELEASE)
+        self._sendqmsg(qdisc.TC_PLUG_RELEASE_ONE)
 
     # private
     def _sendqmsg(self, action):
index e7d3b706a5fff9a34edc0cae02a5298e504ee650..4d54e015c39432e3719d01bf380aaa88a8d1e423 100644 (file)
@@ -1,6 +1,9 @@
 import socket, struct
 
 import netlink
+import platform
+
+kernelversion = platform.platform(terse=True).split("-")[1].split(".")
 
 qdisc_kinds = {}
 
@@ -146,13 +149,18 @@ class CfifoQdisc(Qdisc):
 
 qdisc_kinds['cfifo'] = CfifoQdisc
 
-TC_PLUG_CHECKPOINT = 0
-TC_PLUG_RELEASE = 1
+TC_PLUG_BUFFER = 0
+TC_PLUG_RELEASE_ONE = 1
 
 class PlugQdisc(Qdisc):
-    fmt = 'I'
 
     def __init__(self, qdict=None):
+        if int(kernelversion[0]) >= 3 and int(kernelversion[1]) >= 4:
+            self.fmt = 'iI'
+            self.limit = 10000
+        else:
+            self.fmt = 'I'
+
         if not qdict:
             qdict = {'kind': 'plug',
                      'handle': TC_H_ROOT}
@@ -161,7 +169,10 @@ class PlugQdisc(Qdisc):
         self.action = 0
 
     def pack(self):
-        return struct.pack(self.fmt, self.action)
+        if int(kernelversion[0]) >= 3 and int(kernelversion[1]) >= 4:
+            return struct.pack(self.fmt, self.action, self.limit)
+        else:
+            return struct.pack(self.fmt, self.action)
 
     def parse(self, args):
         if not args:
@@ -169,9 +180,9 @@ class PlugQdisc(Qdisc):
         arg = args[0]
 
         if arg == 'checkpoint':
-            self.action = TC_PLUG_CHECKPOINT
+            self.action = TC_PLUG_BUFFER
         elif arg == 'release':
-            self.action = TC_PLUG_RELEASE
+            self.action = TC_PLUG_RELEASE_ONE
         else:
             raise QdiscException('unknown action')