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

Re: [Xen-devel] PVH CPU hotplug design document



>>> On 18.01.17 at 11:34, <roger.pau@xxxxxxxxxx> wrote:
> On Tue, Jan 17, 2017 at 01:50:14PM -0500, Boris Ostrovsky wrote:
>> On 01/17/2017 12:45 PM, Roger Pau Monné wrote:
>> > On Tue, Jan 17, 2017 at 10:50:44AM -0500, Boris Ostrovsky wrote:
>> >> Part of confusion I think is because PV hotplug is not hotplug, really,
>> >> as far as Linux kernel is concerned.
>> > Hm, I'm not really sure I'm following, but I think that we could translate 
>> > this
>> > Dom0 PV hotplug mechanism to PVH as:
>> >
>> >  - Dom0 is provided with up to HVM_MAX_VCPUS local APIC entries in the 
>> > MADT, and
>> >    the entries > dom0_max_vcpus are marked as disabled.
>> >  - Dom0 has HVM_MAX_VCPUS vCPUs ready to be started, either by using the 
>> > local
>> >    APIC or an hypercall.
>> >
>> > Would that match what's done for classic PV Dom0?
>> 
>> To match what we have for PV dom0 I believe you'd provide MADT with
>> opt_dom0_max_vcpus_max entries and mark all of them enabled.
>> 
>> dom0 brings up all opt_dom0_max_vcpus_max VCPUs, and then offlines
>> (opt_dom0_max_vcpus_min+1)..opt_dom0_max_vcpus_max. See
>> drivers/xen/cpu_hotplug.c:setup_cpu_watcher(). That's why I said it's
>> not a hotplug but rather on/off-lining.
> 
> But how does Dom0 get the value of opt_dom0_max_vcpus_min? It doesn't seem to
> be propagated anywhere from domain_build.

I'm afraid Boris has given a meaning to that (Xen) command line
option which it doesn't have. Please see that option's description
in xen-command-line.markdown. How many vCPU-s should be
offlined is - iirc - being established by a system boot setting
inside Dom0.

> Also the logic in cpu_hotplug.c is weird IMHO:
> 
> static int vcpu_online(unsigned int cpu)
> {
>         int err;
>         char dir[16], state[16];
> 
>         sprintf(dir, "cpu/%u", cpu);
>         err = xenbus_scanf(XBT_NIL, dir, "availability", "%15s", state);
>         if (err != 1) {
>                 if (!xen_initial_domain())
>                         pr_err("Unable to read cpu state\n");
>                 return err;
>         }
> 
>         if (strcmp(state, "online") == 0)
>                 return 1;
>         else if (strcmp(state, "offline") == 0)
>                 return 0;
> 
>         pr_err("unknown state(%s) on CPU%d\n", state, cpu);
>         return -EINVAL;
> }
> [...]
> static int setup_cpu_watcher(struct notifier_block *notifier,
>                               unsigned long event, void *data)
> {
>         int cpu;
>         static struct xenbus_watch cpu_watch = {
>                 .node = "cpu",
>                 .callback = handle_vcpu_hotplug_event};
> 
>         (void)register_xenbus_watch(&cpu_watch);
> 
>         for_each_possible_cpu(cpu) {
>                 if (vcpu_online(cpu) == 0) {
>                         (void)cpu_down(cpu);
>                         set_cpu_present(cpu, false);
>                 }
>         }
> 
>         return NOTIFY_DONE;
> }
> 
> xenbus_scanf should return ENOENT for Dom0, because those paths don't exist,
> and the all vcpus are going to be left enabled? I'm quite sure I'm missing
> something here...

Well, the watch ought to trigger once the paths appear, at which
point the offlining should be happening. The explicit check in
setup_cpu_watcher() is indeed useful only for DomU.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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