[libvirt] [PATCHv9 1/4] libvirt/qemu - persistent modification of devices.

KAMEZAWA Hiroyuki kamezawa.hiroyu at jp.fujitsu.com
Sun Apr 17 23:52:53 UTC 2011


On Fri, 15 Apr 2011 15:25:01 -0600
Eric Blake <eblake at redhat.com> wrote:

> On 04/12/2011 08:49 PM, KAMEZAWA Hiroyuki wrote:
> > 
> > Now, qemudDomainAttachDeviceFlags() and qemudDomainDetachDeviceFlags()
> > doesn't support VIR_DOMAIN_DEVICE_MODIFY_CONFIG. By this, virsh's
> > at(de)tatch-device --persistent cannot modify qemu config.
> > (Xen allows it.)
> > 
> > This patch is a base patch for adding support of devices in
> > step by step manner. Following patches will add some device
> > support.
> > 
> > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
> > 
> > Changelog: v8->v9
> >   - removed unnecessary comments.
> 
> It's taken quite a few iterations, but I've finally scheduled time to
> start reviewing it.
> 

Thank you.

> > +static int qemuDomainModifyDevicePersistent(virDomainPtr dom,
> > +                                            const char *xml,
> > +                                            unsigned int attach,
> 
> You missed one.  You changed attach and detach, but not update.  This
> parameter can usefully forward to all three types of updates.
> 
> In fact, I think I'd like to go one further, and refactor things further
> before we start adding persistent devices.
> 

Hmm.

> It seems like there are two steps in all three categories of functions -
> obtain the locks, then do the work.  I like how you've factored things
> into one function that obtains the locks then forwards on to other
> functions that do the work.  Furthermore, I don't see any reason why we
> can't support LIVE|CONFIG at once, provided we know for which devices we
> can make a successful CONFIG change.
>


ok.

 
> > +     * When both of MODIFY_CONFIG and MODIFY_LIVE are passed at the same time,
> > +     * return error for now. We should support this later.
> > +     */
> > +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
> > +        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> > +                        _("cannot modify active domain and its definition "
> > +                          "at the same time."));
> > +        return -1;
> > +    }
> 
> You are right that it's not implemented yet, but no worse than what we
> already have, so it's not a regression.  But I think it is doable, by
> rewriting this into one giant function:
> 
> 1. obtain lock
> 2. if CURRENT, convert to LIVE or CONFIG
> 3. if LIVE but not active, error
> 4. if CONFIG but not persistent, error
> 5. if CONFIG call, make temporary vmdef and modify that, or quit if that
> device is not supported yet
> 6. if LIVE, make live modification; if that errors out, quit
> 7. if CONFIG, make temporary vmdef permanent (hopefully it succeeds,
> because we don't roll back the LIVE portion of LIVE|CONFIG)
> 8. clean up locks
> 

Sure, I'll include that logic.



> I'll propose a followup patch that tries to capture this idiom in code.
> 
> > +static int qemudDomainAttachDeviceFlags(virDomainPtr dom,
> > +                                        const char *xml,
> > +                                        unsigned int flags)
> > +{
> > +    int ret = -1;
> > +
> > +    virCheckFlags((VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
> > +                   VIR_DOMAIN_DEVICE_MODIFY_LIVE), -1);
> 
> This causes a change in behavior.  Previously, we silently ignored
> VIR_DOMAIN_DEVICE_MODIFY_FORCE, now we error out.  But overall, that's a
> good change (FORCE only made sense for ModifyDevice, not Attach), and it
> goes to show that we don't use virCheckFlags on nearly enough APIs.
> 

will fix.


> > +
> > +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)
> > +        ret = qemuDomainModifyDevicePersistent(dom, xml, 1, flags);
> > +    else if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE)
> > +        ret = qemudDomainAttachDevice(dom, xml);
> 
> For example, here your logic is wrong.  You covered the CONFIG|LIVE case
> with qemuDomainModifyDevicePersistent (by erroring out), but you _don't_
> cover the CURRENT case (which should be either CONFIG or LIVE).  But to
> learn if the vm is active, you have to obtain the lock, and the way
> you've written this, you've already forwarded into one of the two
> routines.  Rather, all the public entries should forward into the one
> giant helper routine which grabs the locks, checks the flags, then calls
> into the right callbacks.
> 
> > @@ -4141,14 +4242,19 @@ cleanup:
> >  
> >  static int qemudDomainDetachDeviceFlags(virDomainPtr dom,
> >                                          const char *xml,
> > -                                        unsigned int flags) {
> > -    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> > -        qemuReportError(VIR_ERR_OPERATION_INVALID,
> > -                        "%s", _("cannot modify the persistent configuration of a domain"));
> > -        return -1;
> > -    }
> > +                                        unsigned int flags)
> > +{
> > +    int ret = -1;
> > +
> > +    virCheckFlags((VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
> > +                   VIR_DOMAIN_DEVICE_MODIFY_LIVE), -1);
> 
> Another change in noisily rejecting FORCE, but I think it's good.
> 

I'll learn your patch and merge it to mine. It seems longer way than I thought.

Thanks,
-Kame





More information about the libvir-list mailing list