[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] Modified RTDS scheduler to use an event-driven model instead of polling.
>> Can you summarize the design discussion with Dario on the first >> version of the patch? The above information is ok, but it does not say >> much about the design. As you can see in our discussion with Dario, >> there exist several design choices to achieve this. Explicitly state >> it here can help people understand what this patch is doing. >> > Yes, that would be helpful. It's not required to summarize all the > various ML thread in the actual changelog(s), but, really, a summary and > maybe a few links and pointers in the cover letter, would be useful, to > give interested people that may join late the chance to get some > context. > > Note that, even for single patch and not only for series, it is ok to > include a cover letter (i.e., a [PATCH 0/x]), e.g., right for this > purpose. > > So, as I was saying, I like the architecture now. There are issues, or > at least I have some questions about specific decisions or code chunks, > but I think this is on the right track now. I'll strengthen the summary/cover letter on future patches. >> > + struct timer replenishment_timer; >> > + unsigned NUM_CPUS; >> >> First, it does not follow the convension of variable names. UPPER CASE >> should be the macro definition and a constant, which is not the case. >> You can use a more proper name, such as ncpus, here and add what it is >> used for. >> > Agreed. Will change. >> > cpumask_t tickled; /* cpus been tickled */ >> > }; >> > >> > @@ -178,6 +181,8 @@ struct rt_vcpu { >> > unsigned flags; /* mark __RTDS_scheduled, etc.. */ >> > }; >> > >> > +static void runq_tickle(const struct scheduler *, struct rt_vcpu *); >> >> Not sure if declaring the function is the best approach or having >> another patch to move the function forward. But anyway, we don't have >> to worry about this yet right now, considering there are more >> important issues to tackle for this patch. >> > Sure. > > Personally, I would like moving the function better (in a separate > patch). Forward declarations make it (slightly, yes, but still...) more > difficult to find (and switch, like in editors) between call sites and > where the actual code is. I'd like to move it, but as mentioned that can be a separate patch. >> > @@ -411,15 +422,77 @@ __runq_insert(const struct scheduler *ops, struct >> > rt_vcpu *svc) >> > struct rt_vcpu * iter_svc = __q_elem(iter); >> > if ( svc->cur_deadline <= iter_svc->cur_deadline ) >> > break; >> > + else >> > + ++inserted_index; >> > } >> > list_add_tail(&svc->q_elem, iter); >> > + return inserted_index; >> > } >> > else >> > { >> > - list_add(&svc->q_elem, &prv->depletedq); >> > + // If we are inserting into previously empty depletedq, rearm >> > + // rearm replenish timer. It will handle further scheduling >> > until >> > + // the depletedq is empty again (if ever) >> > + if( list_empty(depletedq) ) >> > + set_timer( &prv->replenishment_timer, svc->cur_deadline ); >> >> Hmm, can you handle the set_timer outside of this function? It should >> be possible and make this runq_insert() function serve for only one >> purpose. >> > TBH, I think I like it being here. I mean, __runq_insert is called in > many places (at least right now), and I wouldn't like to have the check > and the arming repeated everywhere. > > Then, that being said, I'm still hoping that some of these calls could > go away, and maybe there are call sites where we know that the timer > won't be armed in any case... So, we'll have to see about this. > > So, just take this comment as "I don't dislike the timer machinery to be > in here". :-) I thought it was an acceptable way of accomplishing this. We can focus on trimming more later if this doesn't seem ideal. >> > + // If we become one of top [# CPUs] in the runq, tickle it >> > + // TODO: make this work when multiple tickles are required >> >> Why do you need multiple tickles? >> > Because the loop above may have been done more than one replenishment, > which makes sense. > > While we are here. I've said that I don't like the fact that we have one > big spinlock for the whole scheduler. However, we do have it right now, > so let's make good use of it. > > So (but please double check what I'm about to say, and provide your > view), it should be safe to access the various svc->vc->processor from > inside here, since we're holding the big log. If that's the case, then > it should be fairly easy to figure out which are the pCPUs that needs to > reschedule (playing with the index, etc), and then use their > vc->processor to decide what pCPU to actually tickle, isn't this the > case? > > (let me know if I've explained myself...) >> > + // Replenishment timer, for now always on CPU 0 >> > + init_timer(&prv->replenishment_timer, replenishment_handler, ops, 0); >> > Oh, yes, I wanted to discuss about this! It is true that in Xen, timers > are bound to cpus (while, e.g., in Linux, but both the interface and the > implementation are different). > > So, for know, you're doing the right thing in just putting the > replenishment timer on one pCPU. We'll se how to improve this later on. I expected this would a be possible later improvement. >> > + // Calculate number of pCPUs present. >> > + // Note: assumes does not change online. >> >> Dario, is this a valid assumption? I'm not sure if Xen supports cpu >> hot plug and if cpu-hotplug (in case xen supports it) will invalidate >> this assumption. >> > It's not, but... > >> > + for_each_present_cpu(cpu) >> > + { >> > + ++(prv->NUM_CPUS); >> > + } >> > + >> >> This is incorrect. The for_each_present_cpu() list all cpus in the >> system. it enumerate the cpu_present_map. >> >> What you want here is the number of cpus for the scheduler in the >> current cpupool. You can increase this number when rt_alloc_pdata() >> is called. >> > ... yes, exactly, that's something rather easy to fix. Just use the pCPU > allocation and initialization routines (and the matching de-allocation > ones) to keep the count updated. Good idea. I knew it wasn't a purely valid assumption but wanted to get a working patch out. >> > - ret.time = MIN(snext->budget, MAX_SCHEDULE); /* sched quantum */ >> > + /* Use minimum from runq */ >> > + ret.time = MAX_SCHEDULE; >> >> why it is not snext->budget? The budget enforcement only need to be >> invoked when the VCPU scheduled to run runs out of budget; >> > Yep, I was thinking to make right the same comment. :-) I believe I put that there with the intention of having some invocations even with an empty queue, but this may be a bug. I don't think we should need a minimum invocation period so I may remove this and the associated constant. Regards ~Dagaen Golomb _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |