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-devel

Re: [Xen-devel] add the two command to add or delete the usb device inst

To: James Song <jsong@xxxxxxxxxx>
Subject: Re: [Xen-devel] add the two command to add or delete the usb device instead of do it in QEMU console
From: Pasi Kärkkäinen <pasik@xxxxxx>
Date: Tue, 27 Oct 2009 17:23:09 +0200
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, ian.jackson@xxxxxxxxxxxxx
Delivery-date: Tue, 27 Oct 2009 08:24:19 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4ADE00CB020000200006F5E4@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <4ADE00CB020000200006F5E4@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.13 (2006-08-11)
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