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

Re: [Xen-devel] [PATCH] xend: passthrough: also do_FLR when a device is assigned



On Wed, Jan 06, 2010 at 01:48:52PM +0800, Cui, Dexuan wrote:
> Simon Horman wrote:
> >> xend: passthrough: also do_FLR when a device is assigned.
> >> 
> >> To workaround a race condition about guest hotplug, c/s
> >> 18338:7c10be016e4 
> >> disabled do_FLR when we create guest or 'xm pci-attach' device into
> >> guest, so 
> >> now we actually only do_FLR when a guest is destroyed or 'xm
> >> pci-detach'. 
> >> 
> >> By moving the FLR-related checking/do_FLR logic a little earlier,
> >> this patch re-enables do_FLR in these 2 cases disabled by 18338.
> 
> > I'm not sure that I've entirely got my head around this change.
> > But it does seem like a reasonable approach. Comments below.
> Hi Simon,
> Thanks for the review! Please see my replies below.
> 
> >> diff -r 4feec90815a0 tools/python/xen/xend/server/pciif.py
> >> --- a/tools/python/xen/xend/server/pciif.py        Tue Jan 05 08:40:18 2010
> >> +0000 +++ b/tools/python/xen/xend/server/pciif.py  Tue Jan 05
> >> 22:06:37 2010 +0800 @@ -274,8 +274,8 @@ class
> >> PciController(DevController):                  continue 
> >> 
> >>              if sdev.driver!='pciback' and sdev.driver!='pci-stub':
> >> -                raise VmError(("pci: PCI Backend and pci-stub
> >> don't\n "+ \ 
> >> -                    "own sibling device %s of device %s\n"\
> >> +                raise VmError(("pci: PCI Backend and pci-stub don't
> >> "+ \ +                    "own sibling device %s of device %s"\
> >>                      )%(sdev.name, dev.name))
> > 
> > Minor nit, and yes I realise many of the lines affected are my own.
> > '\' is not needed to continue a line if the element being continued is
> > enclosed in (). So if you are updating a multi-line error as above,
> > you 
> > might as well get rid of the trailing '\' at the same time. There are
> > a 
> > few other candidates below.
> > 
> > Also, "don't" should be "doesn't".
> My patch doesn't fix all the minor literal/format issues.  I just saw the
> obvious ones and fixed them in the patch.  I'm very glad if you can help
> to double check all the issues and send a patch. :-) At present I'm busy
> with some other more important bugs.

Understood.

> 
> >> @@ -363,12 +354,18 @@ class PciController(DevController):
> >>              raise VmError('pci: duplicate devices specified in
> >> guest config?') 
> >> 
> >>          strict_check = xoptions.get_pci_dev_assign_strict_check() +
> >>          devs = [] for pci_dev in pci_dev_list:
> >>              try:
> >>                  dev = PciDevice(pci_dev)
> >>              except Exception, e:
> >>                  raise VmError("pci: failed to locate device and "+
> >>                          "parse its resources - "+str(e))
> >> +            if dev.driver!='pciback' and dev.driver!='pci-stub':
> >> +                raise VmError(("pci: PCI Backend and pci-stub don't
> >> own device"\ +                    " %s") %(dev.name))
> >> +
> >> +            devs.append(dev)
> > 
> > I'm not sure that I understand why devs is needed. There seem to be
> > two cases: 
> > 
> >     1) An exception is thrown before devs is fully seeded
> >     2) devs is fully seeded as a copy of pci_dev_list
> > 
> > Can devs be removed and pci_dev_list be used directly below?
> No, we can't.
> An element in pci_dev_list is a python Dict object
> An element in the 'devs' is a python PciDevice object.
> 
> The intention of "devs" is to record the PciDevice objects generated at
> the beginning of dev_check_assignability_and_do_FLR(), so at the end of
> the function, we can simply use "for dev in devs:
> dev.do_FLR(self.vm.info.is_hvm(), strict_check)" without generating the
> PciDevice objects again.  This is only for programming convenience and
> slightly faster execution of code. :-)

Thanks for clarifying that, I missed the difference between
devs and pci_dev_list.

> 
> >> 
> >>              if dev.has_non_page_aligned_bar and strict_check:
> >>                  raise VmError("pci: %s: non-page-aligned MMIO BAR
> >> found." % dev.name) @@ -435,18 +432,16 @@ class
> >>                                  PciController(DevController):
> >>                                      err_msg = 'pci: %s must be
> >>                                  co-assigned to the'+\ ' same guest
> >> with %s' raise VmError(err_msg % (s, dev.name)) - 
> >> -        # Assigning device staticaly (namely, the pci string in
> >> guest config 
> >> -        # file) to PV guest needs this setupOneDevice().
> >> -        # Assigning device dynamically (namely, 'xm pci-attach') to
> >> PV guest 
> >> -        #  would go through reconfigureDevice().
> >> -        #
> >> -        # For hvm guest, (from c/s 19679 on) assigning device
> >> statically and 
> >> -        # dynamically both go through reconfigureDevice(), so HERE
> >> the 
> >> -        # setupOneDevice() is not necessary.
> >> -        if not self.vm.info.is_hvm():
> >> -            for d in pci_dev_list:
> >> -                self.setupOneDevice(d)
> >> +        # try to do FLR
> >> +        for dev in devs:
> >> +            dev.do_FLR(self.vm.info.is_hvm(), strict_check)
> > 
> > Not really part of this change, but can self.vm.info.is_hvm() just be
> > moved to inside do_FLR() ?
> I don't think we can. do_FLR() is a member function of the utility class 
> PciDevice in util/pci.py -- this file should not involve vm info.
> 
> >> +
> >> +    def setupDevice(self, config):
> >> +        """Setup devices from config
> >> +        """
> > 
> > Some logic seems to be lost from above. Is that intentional?
> No actual logic is lost. I just move the FLR-related checking logic ahead 
> into xend/XendDomainInfo.py: def _createDevices().
> What setupDevice() does is simply invoking "for each dev: 
> dev.setupOneDevice()".
> You could "hg checkout 18044" to see the very old version of setupDevice() 
> that is before my original FLR patches(c/s 18045~18047)
> 
> > 
> >> +        pci_dev_list = config.get('devs', [])
> > 
> >  -     if not self.vm.info.is_hvm(): <--- Should this be here?
>
> Here I removed the "if not" because I think we'd better also invoke
> setupOneDevice for hvm guest (however, I'm not sure this is a must as I
> haven't checked that very carefully; what I ses is in the bootup
> passthrough case, we do invoke it) in the case of dynamic
> assignment(namely, xm pci-attach).  You can verify: in the current code
> (e.g, 20756), after we create an hvm gust without any "pci" specified in
> guest config file and when we "xm pci-attach" the *first* device into
> guest, setupOneDevice() is not invoked at all!  Yes, I know after my
> patch is checked in, there would be redundant invokings of
> setupOneDevice. Anyway, this is a minor issue and dosesn't impact the
> correctness and we can further improve it in future.

I have no problem with duplicate invocations of setupOneDevice()
as long as the result is correct. Removing the logic above
seems to slightly simplify things. And thats good :-)

> BTW: actually I found the pci passthrough code in xend had become very
> complex and hacky now... Things are easily broken when new changes are
> made, e.g. Stefano added the pci passthrough support in the stubdomain
> case and the code broke non-stubdomain case for weeks and the
> msi-translate is still broken even till now.

Yes, I found that that too. It was very difficult for me to make changes too.

>
> It would be really great somebody can help to re-organize/cleanup the
> code some time. :-)

Is the ocaml replacement for xend still being worked on?
Refactoring the current (python) code is incredibly painful
in my experience.

> So I think for Xen 4.0, the patch should be fine, and after 4.0, hope
> somebody could do some cleanup. 
> 
> Thanks -- Dexuan _______________________________________________
> 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®.