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

[Xen-devel] Re: [PATCH] xend: fix options for assigned pci

To: Qing He <qing.he@xxxxxxxxx>
Subject: [Xen-devel] Re: [PATCH] xend: fix options for assigned pci
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Mon, 11 Jan 2010 18:16:39 +1100
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, stefano.stabellini@xxxxxxxxxxxxx
Delivery-date: Sun, 10 Jan 2010 23:17:07 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20100108082904.GA31397@ub-qhe2>
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: <20100108082904.GA31397@ub-qhe2>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.20 (2009-06-14)
On Fri, Jan 08, 2010 at 04:29:04PM +0800, Qing He wrote:
> pci global options and per-device options for HVM device model have
> been broken for some time, the patch tries to fix the problem. It:
>     * maintains global options in xend, and merge it into
>       per-device option when creating the backend
>     * merge the global options also into the parameter of pci-ins
>       dm-command
> 
> The second one is there because the backend is effectively skipped
> in ioemu at present, ioemu solely relies on the parameter string to
> create the device.
> 
> Cc: Simon Horman <horms@xxxxxxxxxxxx>
> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> Signed-off-by: Qing He <qing.he@xxxxxxxxx>
> ---
> diff -r 683bf4ce2e93 tools/python/xen/util/pci.py
> --- a/tools/python/xen/util/pci.py    Mon Jan 04 10:35:16 2010 +0000
> +++ b/tools/python/xen/util/pci.py    Fri Jan 08 16:01:55 2010 +0800
> @@ -158,6 +158,10 @@
>      return map(lambda x: x.split('='),
>                 filter(lambda x: x != '', opts.split(',')))
>  
> +def append_default_pci_opts(opts, defopts):
> +    optsdict = dict(opts)
> +    return opts + filter(lambda (k, v): not optsdict.has_key(k), defopts)
> +
>  def pci_opts_list_to_sxp(list):
>      return dev_dict_to_sxp({'opts': list})
>  
> @@ -328,7 +332,7 @@
>      template['domain'] = "0x%04x" % domain
>      template['bus']    = "0x%02x" % int(pci_dev_info['bus'], 16)
>      template['slot']   = "0x%02x" % int(pci_dev_info['slot'], 16)
> -    template['key']    = pci_dev_str
> +    template['key']    = pci_dev_str.split(',')[0]

Splitting on a comma won't work as desired here, as the function
portion of multi-function devices may include comas.

Leaving the key as pci_dev_str, is probably ok. Otherwise I suggest
constructing the key from template['domain'], template['bus'],
template['slot'], pci_dev_infom['func'] and conditionally
pci_dev_infom['vdevfn'].

IIRC, it doesn't really matter what the key is, as long as it
is unique for a device. Which is why I think that leaving it
as pci_dev_str should be ok.

>      if pci_dev_info['opts'] != '':
>          template['opts'] = split_pci_opts(pci_dev_info['opts'])
>          check_pci_opts(template['opts'])
> diff -r 683bf4ce2e93 tools/python/xen/xend/XendDomainInfo.py
> --- a/tools/python/xen/xend/XendDomainInfo.py Mon Jan 04 10:35:16 2010 +0000
> +++ b/tools/python/xen/xend/XendDomainInfo.py Fri Jan 08 16:01:55 2010 +0800
> @@ -42,6 +42,7 @@
>  from xen.util import xsconstants
>  from xen.util import mkdir
>  from xen.util.pci import serialise_pci_opts, pci_opts_list_to_sxp, \
> +                         append_default_pci_opts, \
>                           pci_dict_to_bdf_str, pci_dict_to_xc_str, \
>                           pci_convert_sxp_to_dict, pci_convert_dict_to_sxp, \
>                           pci_dict_cmp, PCI_DEVFN, PCI_SLOT, PCI_FUNC, 
> parse_hex
> @@ -766,8 +767,20 @@
>  
>          if self.domid is not None:
>              opts = ''
> +            optslist = []
> +            pci_defopts = []
> +            if 'pci_msitranslate' in self.info['platform']:
> +                pci_defopts.append(['msitranslate',
> +                        str(self.info['platform']['pci_msitranslate'])])
> +            if 'pci_power_mgmt' in self.info['platform']:
> +                pci_defopts.append(['power_mgmt',
> +                        str(self.info['platform']['pci_power_mgmt'])])
>              if new_dev.has_key('opts'):
> -                opts = ',' + serialise_pci_opts(new_dev['opts'])
> +                optslist += new_dev['opts']
> +
> +            if optslist or pci_defopts:
> +                opts = ',' + serialise_pci_opts(
> +                       append_default_pci_opts(optslist, pci_defopts))
>  
>              bdf_str = "%s@%02x%s" % (pci_dict_to_bdf_str(new_dev),
>                                       int(new_dev['vdevfn'], 16), opts)
> diff -r 683bf4ce2e93 tools/python/xen/xend/server/pciif.py
> --- a/tools/python/xen/xend/server/pciif.py   Mon Jan 04 10:35:16 2010 +0000
> +++ b/tools/python/xen/xend/server/pciif.py   Fri Jan 08 16:01:55 2010 +0800
> @@ -97,6 +97,15 @@
>          """@see DevController.getDeviceDetails"""
>          back = {}
>          pcidevid = 0
> +        pci_defopts = []
> +
> +        if 'pci_msitranslate' in self.vm.info['platform']:
> +            pci_defopts.append(['msitranslate',
> +                    str(self.vm.info['platform']['pci_msitranslate'])])
> +        if 'pci_power_mgmt' in self.vm.info['platform']:
> +            pci_defopts.append(['power_mgmt',
> +                    str(self.vm.info['platform']['pci_power_mgmt'])])
> +
>          for pci_config in config.get('devs', []):
>              domain = parse_hex(pci_config.get('domain', 0))
>              bus = parse_hex(pci_config.get('bus', 0))
> @@ -105,8 +114,12 @@
>              vdevfn = parse_hex(pci_config.get('vdevfn', \
>                                                '0x%02x' % AUTO_PHP_SLOT))
>  
> +            optslist = []
>              if pci_config.has_key('opts'):
> -                opts = serialise_pci_opts(pci_config['opts'])
> +                optslist += pci_config['opts']
> +            if optslist or pci_defopts:
> +                opts = serialise_pci_opts(
> +                       append_default_pci_opts(optslist, pci_defopts))
>                  back['opts-%i' % pcidevid] = opts
>  
>              back['dev-%i' % pcidevid] = "%04x:%02x:%02x.%01x" % \
> @@ -118,10 +131,6 @@
>  
>          back['num_devs']=str(pcidevid)
>          back['uuid'] = config.get('uuid','')
> -        if 'pci_msitranslate' in self.vm.info['platform']:
> -            
> back['msitranslate']=str(self.vm.info['platform']['pci_msitranslate'])
> -        if 'pci_power_mgmt' in self.vm.info['platform']:
> -            
> back['power_mgmt']=str(self.vm.info['platform']['pci_power_mgmt'])
>  
>          return (0, back, {})
>  

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