|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 for Xen 4.7 1/4] xen: enable per-VCPU parameter settings for RTDS scheduler
On Mon, 2016-03-07 at 09:40 -0700, Jan Beulich wrote:
> > > > On 07.03.16 at 17:28, <lichong659@xxxxxxxxx> wrote:
> > On Mon, Mar 7, 2016 at 6:59 AM, Jan Beulich <JBeulich@xxxxxxxx>
> > wrote:
> > >
> > > > @@ -1163,6 +1173,96 @@ rt_dom_cntl(
> > > >
> > > > + case XEN_DOMCTL_SCHEDOP_getvcpuinfo:
> > > > + if ( guest_handle_is_null(op->u.v.vcpus) )
> > > > + {
> > > > + rc = -EINVAL;
> > > Perhaps rather -EFAULT? But then again - what is this check good
> > > for
> > > (considering that it doesn't cover other obviously bad handle
> > > values)?
> > Dario suggested this in the last post, because vcpus is a handle
> > and
> > needs to be validated.
>
> Well, as said - the handle being non-null doesn't make it a valid
> handle. Any validation can be left to copy_{to,from}_guest*()
> unless you mean to give a null handle some special meaning.
>
IIRC, I was looking at how XEN_SYSCTL_pcitopoinfo is handled, for
reference, and that has some guest_handle_is_null()==>EINVAL sainity
checking (in xen/common/sysctl.c), which, when I thought about it, made
sense to me.
My reasoning was, sort of:
1. if the handle is NULL, no point getting into the somewhat
complicated logic of the while,
2. more accurate error reporting: as being passed a NULL handler
looked something we could identify and call invalid, rather than
waiting for the copy to fault.
In any event, I've no problem at all with this being dropped.
> > > > + {
> > > > + rc = -EINVAL;
> > > > + break;
> > > > + }
> > > > +
> > > > + spin_lock_irqsave(&prv->lock, flags);
> > > > + svc = rt_vcpu(d->vcpu[local_sched.vcpuid]);
> > > > + local_sched.s.rtds.budget = svc->budget /
> > > > MICROSECS(1);
> > > > + local_sched.s.rtds.period = svc->period /
> > > > MICROSECS(1);
> > > > + spin_unlock_irqrestore(&prv->lock, flags);
> > > > +
> > > > + if ( __copy_to_guest_offset(op->u.v.vcpus, index,
> > > > + &local_sched, 1) )
> > > > + {
> > > > + rc = -EFAULT;
> > > > + break;
> > > > + }
> > > > + if ( (++index > 0x3f) && hypercall_preempt_check()
> > > > )
> > > > + break;
> > > So how is the caller going to be able to reliably read all vCPU-
> > > s'
> > > information for a guest with more than 64 vCPU-s?
> > In libxc, we re-issue hypercall if the current one is preempted.
> And with the current code - how does libxc know? (And anyway,
> this should only be a last resort, if the hypervisor can't by itself
> arrange for a continuation. If done this way, having a code
> comment referring to the required caller behavior would seem to
> be an absolute must.)
>
I definitely agree on commenting.
About the structure of the code, as said above, I do like
how XEN_SYSCTL_pcitopoinfo ended up being handled, I think it is a
great fit for this specific case and, comparing at both this and
previous version, I do think this one is (bugs apart) looking better.
I'm sure I said this --long ago-- when discussing v4 (and maybe even
previous versions), as well as more recently, when reviewing v5, and
that's why Chong (finally! :-D) did it.
So, with the comment in place (and with bugs fixed :-)), are you (Jan)
ok with this being done this way?
> > > > + }
> > > > +
> > > > + if ( !rc && (op->u.v.nr_vcpus != index) )
> > > > + op->u.v.nr_vcpus = index;
> > > I don't think the right side of the && is really necessary /
> > > useful.
> > The right side is to check whether the vcpus array is fully
> > processed.
> > When it is true and no error occurs (rc == 0), we
> > update op->u.v.nr_vcpus, which is returned to libxc, and helps xc
> > function figuring out how many un-processed vcpus should
> > be taken care of in the next hypercall.
> Just consider what the contents of op->u.v.nr_vcpus is after
> this piece of code was executed, once with the full conditional,
> and another time with the right side of the && omitted.
>
BTW, Chong, I'm not sure this has to do with what Jan is saying, but
looking again at XEN_SYSCTL_pcitopoinfo, it looks to me you're missing
copying nr_vcpus back up to the guest (which is actually what makes
libxc knows whether all vcpus have been processed or now).
Regards,
Dario
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |