[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] add the two command to add or delete the usb device instead of do it in QEMU console
On Tue, Oct 20, 2009 at 01:26:19AM -0600, James Song wrote: > I rewrite the patch, pls check. I also put those as attachments. > I see this is committed to qemu-xen-unstable: http://xenbits.xen.org/ext/qemu-xen-unstable.hg?rev/df1b7da6e411 I guess this would be nice to have also in qemu-xen-3.4 -- Pasi > Thanks, > -James > > Signed-off-by: James Song Wei <[1]jsong@xxxxxxxxxx> > > 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. > > > > > > > This is another patch for qemu-xen-unstable > > > Signed-off-by: James Song Wei <[2]jsong@xxxxxxxxxx> > > 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"); > > References > > Visible links > 1. mailto:jsong@xxxxxxxxxx > 2. mailto:jsong@xxxxxxxxxx > 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. > 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"); > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |