I rewrite the patch, pls check.
Thanks,
-James
diff -r 0705efd9c69e tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Fri Oct 16 09:04:53 2009 +0100 +++ b/tools/python/xen/xend/XendDomain.py Mon Oct 19 10:15:06 2009 +0800 @@ -1522,6 +1522,45 @@ raise XendError("can't write guest state file %s: %s" % (dst, ex[1]))
+ def domain_usb_add(self, domid, dev_id): + dominfo = self.domain_lookup_nr(domid) + if not dominfo: + raise XendInvalidDomain(str(domid)) + + usb = dominfo.info['platform'].get('usb') + if not usb: + raise XendError("Can't add usb device to a guest with usb disabled in configure file") + + hvm = dominfo.info.is_hvm() + if not hvm: + raise XendError("Can't add usb device to a non-hvm guest") + + if dominfo._stateGet() != DOM_STATE_HALTED: + dominfo.image.signalDeviceModel("usb-add", + "usb-added", dev_id) + else: + log.debug("error: Domain is not running!") + + + def domain_usb_del(self, domid, dev_id): + dominfo = self.domain_lookup_nr(domid) + if not dominfo: + raise XendInvalidDomain(str(domid)) + + usb = dominfo.info['platform'].get('usb') + if not usb: + raise XendError("Can't add usb device to a guest with usb disabled in configure file") + + hvm = dominfo.info.is_hvm()
+ if not hvm: + raise XendError("Can't del usb to a non-hvm guest") + + if dominfo._stateGet() != DOM_STATE_HALTED: + dominfo.image.signalDeviceModel("usb-del", + "usb-deleted", dev_id) + else: + log.debug("error: Domain is not running!") + def domain_pincpu(self, domid, vcpu, cpumap): """Set which cpus vcpu can use
diff -r 0705efd9c69e tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Fri Oct 16 09:04:53 2009 +0100 +++ b/tools/python/xen/xend/server/SrvDomain.py Mon Oct 19 10:15:06 2009 +0800 @@ -225,6 +225,19 @@ self.acceptCommand(req) return self.xd.domain_reset(self.dom.getName())
+ def op_usb_add(self, op, req): + self.acceptCommand(req) + return req.threadRequest(self.do_usb_add, op, req) + + def do_usb_add(self, _, req): + return self.xd.domain_usb_add(self.dom.getName(), req) + + def op_usb_del(self, op, req): + self.acceptCommand(req) + return req.threadRequest(self.do_usb_add, op, req) + + def do_usb_del(self, _, req): + return self.xd.domain_usb_add(self.dom.getName(), req)
def render_POST(self, req): return self.perform(req) diff -r 0705efd9c69e tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Fri Oct 16 09:04:53 2009 +0100
+++ b/tools/python/xen/xm/main.py Mon Oct 19 10:15:06 2009 +0800 @@ -161,6 +161,9 @@ 'vcpu-set' : ('<Domain> <vCPUs>', 'Set the number of active VCPUs for allowed for the' ' domain.'), + #usb + 'usb-add' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'), + 'usb-del' : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'),
# device commands
@@ -350,6 +353,8 @@ "top", "unpause", "uptime", + "usb-add", + "usb-del", "vcpu-set", ]
@@ -382,6 +387,8 @@ "top", "unpause", "uptime", + "usb-add", + "usb-del", "vcpu-list", "vcpu-pin", "vcpu-set", @@ -1473,6 +1480,14 @@ else: mem_target = int_unit(args[1], 'm') server.xend.domain.setMemoryTarget(dom, mem_target) + +def xm_usb_add(args): + arg_check(args, "usb-add", 2) + server.xend.domain.usb_add(args[0],args[1])
+ +def xm_usb_del(args): + arg_check(args, "usb-del", 2) + server.xend.domain.usb_del(args[0],args[1])
def xm_vcpu_set(args): arg_check(args, "vcpu-set", 2) @@ -3311,6 +3326,9 @@ "tmem-set": xm_tmem_set, "tmem-freeable": xm_tmem_freeable_mb, "tmem-shared-auth": xm_tmem_shared_auth, + #usb + "usb-add": xm_usb_add, + "usb-del": xm_usb_del, }
## The commands supported by a separate argument parser in xend.xm.
--------------------------For qemu-xen-unstable -----------------------------------------------------
diff --git a/xenstore.c b/xenstore.c index da278f4..694152a 100644 --- a/xenstore.c +++ b/xenstore.c @@ -752,6 +752,34 @@ static void xenstore_process_dm_command_event(void) } else if (!strncmp(command, "continue", len)) { fprintf(logfile, "dm-command: continue after state save\n"); xen_pause_requested = 0; + } else if (!strncmp(command, "usb-add", len)) { + fprintf(logfile, "dm-command: usb-add a usb device\n"); + if (pasprintf(&path, + "/local/domain/0/device-model/%u/parameter", domid) == -1) { + fprintf(logfile, "out of memory reading dm command parameter\n"); + goto out; + } + par = xs_read(xsh, XBT_NULL, path, &len); + fprintf(logfile, "dm-command: usb-add a usb device: %s \n", par); + if (!par) + goto out; + do_usb_add(par); + xenstore_record_dm_state("usb-added"); + fprintf(logfile, "dm-command: finish usb-add a usb device:%s\n",par); + } else if (!strncmp(command, "usb-del", len)) { + fprintf(logfile, "dm-command: usb-del a usb device\n"); + if (pasprintf(&path, + "/local/domain/0/device-model/%u/parameter", domid) == -1) { + fprintf(logfile, "out of memory reading dm command parameter\n"); + goto out; + } + par = xs_read(xsh, XBT_NULL, path, &len); + fprintf(logfile, "dm-command: usb-del a usb device: %s \n", par); + if (!par) + goto out; + do_usb_del(par); + xenstore_record_dm_state("usb-deleted"); + fprintf(logfile, "dm-command: finish usb-del a usb device:%s\n",par); #ifdef CONFIG_PASSTHROUGH
} else if (!strncmp(command, "pci-rem", len)) { fprintf(logfile, "dm-command: hot remove pass-through pci dev \n");
>>> Keir Fraser <keir.fraser@xxxxxxxxxxxxx> 2009-10-15 16:46 >>> On 15/10/2009 09:12, "James Song" <jsong@xxxxxxxxxx> wrote:
> Add the two commands( "xm usb-add" and "xm usb-del") to add or delete the usb > device instead of do it in QEMU console. > > Signed-off-by: James Song Wei <jsong@xxxxxxxxxx>
Again, given the weird encoding of your email this patch will probably turn out to be corrupted. But also you cannot patch tools/iomu-remote/ -- ioemu patches are to be applied to the separate qemu-xen-unstable.git repository and sent to the list cc'ed to Ian Jackson who maintains that repository.
-- Keir
|