[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.