[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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


 


Rackspace

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