WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Add new control messages for vcpu hotplug events. Via th

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Add new control messages for vcpu hotplug events. Via the
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Tue, 21 Jun 2005 10:53:51 +0000
Cc: james@xxxxxxxxxxxxx
Delivery-date: Wed, 22 Jun 2005 15:01:55 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1726, 2005/06/21 11:53:51+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        Add new control messages for vcpu hotplug events.  Via the
        xm vcpu-hotplug sub-program, vcpus in domains can be enabled/disabled
        when CONFIG_HOTPLUG_CPU is enabled in the target domain's kernel.
        Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c |   80 +++++++++++++++++
 tools/python/xen/lowlevel/xu/xu.c                      |   16 +++
 tools/python/xen/xend/XendClient.py                    |    6 +
 tools/python/xen/xend/XendDomain.py                    |   12 ++
 tools/python/xen/xend/XendDomainInfo.py                |   12 ++
 tools/python/xen/xend/server/SrvDomain.py              |    8 +
 tools/python/xen/xend/server/messages.py               |   18 +++
 tools/python/xen/xm/main.py                            |   37 +++++++
 xen/include/public/io/domain_controller.h              |   20 ++++
 9 files changed, 207 insertions(+), 2 deletions(-)


diff -Nru a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c 
b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c    2005-06-22 
11:03:05 -04:00
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/smpboot.c    2005-06-22 
11:03:05 -04:00
@@ -1303,6 +1303,14 @@
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
+#include <asm-xen/ctrl_if.h>
+
+/* hotplug down/up funtion pointer and target vcpu */
+struct vcpu_hotplug_handler_t {
+       void (*fn)();
+       u32 vcpu;
+};
+static struct vcpu_hotplug_handler_t vcpu_hotplug_handler;
 
 /* must be called with the cpucontrol mutex held */
 static int __devinit cpu_enable(unsigned int cpu)
@@ -1374,6 +1382,78 @@
        }
        printk(KERN_ERR "CPU %u didn't die...\n", cpu);
 }
+
+static int vcpu_hotplug_cpu_process(void *unused)
+{
+       struct vcpu_hotplug_handler_t *handler = &vcpu_hotplug_handler;
+
+       if (handler->fn) {
+               (*(handler->fn))(handler->vcpu);
+               handler->fn = NULL;
+       }
+       return 0;
+}
+
+static void __vcpu_hotplug_handler(void *unused)
+{
+       int err;
+
+       err = kernel_thread(vcpu_hotplug_cpu_process, 
+                           NULL, CLONE_FS | CLONE_FILES);
+       if (err < 0)
+               printk(KERN_ALERT "Error creating hotplug_cpu process!\n");
+
+}
+
+static void vcpu_hotplug_event_handler(ctrl_msg_t *msg, unsigned long id)
+{
+       static DECLARE_WORK(vcpu_hotplug_work, __vcpu_hotplug_handler, NULL);
+       vcpu_hotplug_t *req = (vcpu_hotplug_t *)&msg->msg[0];
+       struct vcpu_hotplug_handler_t *handler = &vcpu_hotplug_handler;
+       ssize_t ret;
+
+       if (msg->length != sizeof(vcpu_hotplug_t))
+               goto parse_error;
+
+       /* grab target vcpu from msg */
+       handler->vcpu = req->vcpu;
+
+       /* determine which function to call based on msg subtype */
+       switch (msg->subtype) {
+        case CMSG_VCPU_HOTPLUG_OFF:
+               handler->fn = (void *)&cpu_down;
+               ret = schedule_work(&vcpu_hotplug_work);
+               req->status = (u32) ret;
+               break;
+        case CMSG_VCPU_HOTPLUG_ON:
+               handler->fn = (void *)&cpu_up;
+               ret = schedule_work(&vcpu_hotplug_work);
+               req->status = (u32) ret;
+               break;
+        default:
+               goto parse_error;
+       }
+
+       ctrl_if_send_response(msg);
+       return;
+ parse_error:
+       msg->length = 0;
+       ctrl_if_send_response(msg);
+}
+
+static int __init setup_vcpu_hotplug_event(void)
+{
+       struct vcpu_hotplug_handler_t *handler = &vcpu_hotplug_handler;
+
+       handler->fn = NULL;
+       ctrl_if_register_receiver(CMSG_VCPU_HOTPLUG,
+                                 vcpu_hotplug_event_handler, 0);
+
+       return 0;
+}
+
+__initcall(setup_vcpu_hotplug_event);
+
 #else /* ... !CONFIG_HOTPLUG_CPU */
 int __cpu_disable(void)
 {
diff -Nru a/tools/python/xen/lowlevel/xu/xu.c 
b/tools/python/xen/lowlevel/xu/xu.c
--- a/tools/python/xen/lowlevel/xu/xu.c 2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/lowlevel/xu/xu.c 2005-06-22 11:03:05 -04:00
@@ -744,6 +744,14 @@
         C2P(mem_request_t, target, Int, Long);
         C2P(mem_request_t, status, Int, Long);
         return dict;
+    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF):
+        C2P(vcpu_hotplug_t, vcpu, Int, Long);
+        C2P(vcpu_hotplug_t, status, Int, Long);
+        return dict;
+    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON):
+        C2P(vcpu_hotplug_t, vcpu, Int, Long);
+        C2P(vcpu_hotplug_t, status, Int, Long);
+        return dict;
     }
 
     return PyString_FromStringAndSize((char *)xum->msg.msg, xum->msg.length);
@@ -908,6 +916,14 @@
         break;
     case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
         P2C(mem_request_t, target, u32);
+        break;
+    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF):
+        P2C(vcpu_hotplug_t, vcpu, u32);
+        P2C(vcpu_hotplug_t, status, u32);
+        break;
+    case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON):
+        P2C(vcpu_hotplug_t, vcpu, u32);
+        P2C(vcpu_hotplug_t, status, u32);
         break;
     case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED):
         P2C(usbif_fe_interface_status_changed_t, status, u32);
diff -Nru a/tools/python/xen/xend/XendClient.py 
b/tools/python/xen/xend/XendClient.py
--- a/tools/python/xen/xend/XendClient.py       2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xend/XendClient.py       2005-06-22 11:03:05 -04:00
@@ -271,6 +271,12 @@
                              'target'    : mem_target })
         return val
 
+    def xend_domain_vcpu_hotplug(self, id, vcpu, state):
+        return self.xendPost(self.domainurl(id),
+                            {'op'         : 'vcpu_hotplug',
+                             'vcpu'       : vcpu,
+                             'state'      : state })
+
     def xend_domain_vif_limit(self, id, vif, credit, period):
         return self.xendPost(self.domainurl(id),
                             { 'op'      : 'vif_limit_set',
diff -Nru a/tools/python/xen/xend/XendDomain.py 
b/tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xend/XendDomain.py       2005-06-22 11:03:05 -04:00
@@ -710,6 +710,18 @@
         dominfo = self.domain_lookup(id)
         return dominfo.mem_target_set(mem)
 
+    def domain_vcpu_hotplug(self, id, vcpu, state):
+        """Enable or disable VCPU vcpu in DOM id
+
+        @param id: domain
+        @param vcpu: target VCPU in domain
+        @param state: which state VCPU will become
+        @return: 0 on success, -1 on error
+        """
+
+        dominfo = self.domain_lookup(id)
+        return dominfo.vcpu_hotplug(vcpu, state)
+
     def domain_dumpcore(self, id):
         """Save a core dump for a crashed domain.
 
diff -Nru a/tools/python/xen/xend/XendDomainInfo.py 
b/tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xend/XendDomainInfo.py   2005-06-22 11:03:05 -04:00
@@ -956,6 +956,18 @@
             msg = messages.packMsg('mem_request_t', { 'target' : target * (1 
<< 8)} )
             self.channel.writeRequest(msg)
 
+    def vcpu_hotplug(self, vcpu, state):
+        """Disable or enable VCPU in domain.
+        """
+        log.error("Holly Shit! %d %d\n" % (vcpu, state))
+        if self.channel:
+            if int(state) == 0:
+                msg = messages.packMsg('vcpu_hotplug_off_t', { 'vcpu' : vcpu} )
+            else:
+                msg = messages.packMsg('vcpu_hotplug_on_t',  { 'vcpu' : vcpu} )
+
+            self.channel.writeRequest(msg)
+
     def shutdown(self, reason, key=0):
         msgtype = shutdown_messages.get(reason)
         if not msgtype:
diff -Nru a/tools/python/xen/xend/server/SrvDomain.py 
b/tools/python/xen/xend/server/SrvDomain.py
--- a/tools/python/xen/xend/server/SrvDomain.py 2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xend/server/SrvDomain.py 2005-06-22 11:03:05 -04:00
@@ -180,6 +180,14 @@
         val = fn(req.args, {'dom': self.dom.id})
         return val
 
+    def op_vcpu_hotplug(self, op, req):
+        fn = FormFn(self.xd.domain_vcpu_hotplug,
+                    [['dom', 'int'],
+                     ['vcpu', 'int'],
+                     ['state', 'int']])
+        val = fn(req.args, {'dom': self.dom.id})
+        return val
+
     def render_POST(self, req):
         return self.perform(req)
         
diff -Nru a/tools/python/xen/xend/server/messages.py 
b/tools/python/xen/xend/server/messages.py
--- a/tools/python/xen/xend/server/messages.py  2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xend/server/messages.py  2005-06-22 11:03:05 -04:00
@@ -309,6 +309,24 @@
 msg_formats.update(mem_request_formats)
 
 #============================================================================
+# Domain vcpu hotplug message.
+#============================================================================
+
+CMSG_VCPU_HOTPLUG     = 10
+CMSG_VCPU_HOTPLUG_OFF = 0
+CMSG_VCPU_HOTPLUG_ON  = 1
+
+vcpu_hotplug_formats = {
+    'vcpu_hotplug_off_t':
+    (CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF),
+
+    'vcpu_hotplug_on_t':
+    (CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON)
+    }
+
+msg_formats.update(vcpu_hotplug_formats)
+
+#============================================================================
 class Msg:
     pass
 
diff -Nru a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       2005-06-22 11:03:05 -04:00
+++ b/tools/python/xen/xm/main.py       2005-06-22 11:03:05 -04:00
@@ -410,7 +410,8 @@
         print 'Name              Id  VCPU  CPU  CPUMAP'
         for dom in doms:
             info = server.xend_domain(dom)
-            vcpu_to_cpu = sxp.child_value(info, 'vcpu_to_cpu', 
'?').replace('-','')
+            # XXX this is quite broken for cpu's > 9
+            vcpu_to_cpu = sxp.child_value(info, 'vcpu_to_cpu', 
'?').replace('-1','#')
             cpumap = sxp.child_value(info, 'cpumap', [])
             mask = ((int(sxp.child_value(info, 'vcpus', '0')))**2) - 1
             count = 0
@@ -419,7 +420,10 @@
                 d['name']   = sxp.child_value(info, 'name', '??')
                 d['dom']    = int(sxp.child_value(info, 'id', '-1'))
                 d['vcpu']   = int(count)
-                d['cpu']    = int(cpu)
+                if cpu == "#":
+                    d['cpu']    = int("-1")
+                else:
+                    d['cpu']    = int(cpu)
                 d['cpumap'] = int(cpumap[count])&mask
                 count = count + 1
                 print ("%(name)-16s %(dom)3d  %(vcpu)4d  %(cpu)3d  
0x%(cpumap)x" % d)
@@ -571,6 +575,35 @@
         server.xend_domain_mem_target_set(dom, mem_target)
 
 xm.prog(ProgBalloon)
+
+class ProgVcpuhotplug(Prog):
+    group = 'domain'
+    name  = 'vcpu-hotplug'
+    info  = """Enable or disable a VCPU in a domain."""
+
+    def help(self, args):
+        print args[0], "DOM VCPU [0|1]"
+        print """\nRequest virtual processor VCPU to be disabled or enabled in
+domain DOM"""
+
+    def main(self, args):
+        if len(args) != 4: self.err("%s: Invalid arguments(s)" % args[0])
+        name = args[1]
+        vcpu = int(args[2])
+        state = int(args[3])
+        dom = server.xend_domain(name)
+        id = sxp.child_value(dom, 'id')
+        vcpu_to_cpu = sxp.child_value(dom, 'vcpu_to_cpu', '-1')
+        # only send state change if states differ 
+        try:
+            # (down going up) or (up going down)
+            if (vcpu_to_cpu[vcpu] == "-1" and state == 1) or \
+               (vcpu_to_cpu[vcpu] != "-1" and state == 0):
+                server.xend_domain_vcpu_hotplug(id, vcpu, state)
+        except IndexError:
+            print "Invalid VCPU(%d)"%(vcpu)
+
+xm.prog(ProgVcpuhotplug)
 
 class ProgDomid(Prog):
     group = 'domain'
diff -Nru a/xen/include/public/io/domain_controller.h 
b/xen/include/public/io/domain_controller.h
--- a/xen/include/public/io/domain_controller.h 2005-06-22 11:03:05 -04:00
+++ b/xen/include/public/io/domain_controller.h 2005-06-22 11:03:05 -04:00
@@ -61,6 +61,7 @@
 #define CMSG_MEM_REQUEST    7  /* Memory reservation reqs */
 #define CMSG_USBIF_BE       8  /* USB controller backend  */
 #define CMSG_USBIF_FE       9  /* USB controller frontend */
+#define CMSG_VCPU_HOTPLUG  10  /* Hotplug VCPU messages   */
 
 /******************************************************************************
  * CONSOLE DEFINITIONS
@@ -756,6 +757,25 @@
     char key;      /* 0: sysrq key */
     char __pad[3]; /* 1: */
 } PACKED shutdown_sysrq_t; /* 4 bytes */
+
+/******************************************************************************
+ * VCPU HOTPLUG CONTROLS
+ */
+
+/*
+ * Subtypes for shutdown messages.
+ */
+#define CMSG_VCPU_HOTPLUG_OFF   0   /* turn vcpu off */
+#define CMSG_VCPU_HOTPLUG_ON    1   /* turn vcpu on  */
+
+/*
+ * CMSG_VCPU_HOTPLUG:
+ *  Indicate which vcpu's state should change
+ */
+typedef struct {
+    u32 vcpu;         /* 0: VCPU's whose state will change */
+    u32 status;       /* 4: Return code indicates success or failure. */
+} PACKED vcpu_hotplug_t;
 
 /******************************************************************************
  * MEMORY CONTROLS

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Add new control messages for vcpu hotplug events. Via the, BitKeeper Bot <=