|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/vpmu: add cpu hot unplug notifier for vpmu
>>> On 16.05.17 at 19:29, <luwei.kang@xxxxxxxxx> wrote:
> Currently, hot unplug a cpu with vpmu enabled may cause system
> hang due to send IPI to a die physical cpu. This patch add a
> cpu hot unplug notifer to save vpmu context before cpu offline.
>
> Consider one scene, hotplug physical cpu N with vpmu is enabled.
I think you mean "scenario" and "hot unplug".
> The vcpu which running on this physical cpu before will be switch
> to other online cpu. Before load the vpmu context to new physical
> cpu, a IPI will be send to cpu N to save the vpmu context.
> System will hang in function on_select_cpus because of that
> physical cpu is offline and can not do any response.
Doesn't this make clear that you would better also make sure
->last_pcpu doesn't hold to the then stale CPU anymore? For
example, vpmu_load() compares it with smp_processor_id()
(the subsequent use is guarded by a VPMU_CONTEXT_LOADED
flag check), allowing badness if the same or another CPU with
the same number comes up again quickly enough. Similarly
vpmu_arch_destroy() uses it without checking
VPMU_CONTEXT_LOADED.
> --- a/xen/arch/x86/cpu/vpmu.c
> +++ b/xen/arch/x86/cpu/vpmu.c
> @@ -35,6 +35,7 @@
> #include <asm/apic.h>
> #include <public/pmu.h>
> #include <xsm/xsm.h>
> +#include <xen/cpu.h>
Please place this in the group of other xen/ includes.
> +static int cpu_callback(struct notifier_block *nfb, unsigned long action,
> void *hcpu)
> +{
> + unsigned int cpu = (unsigned long)hcpu;
> + struct vcpu *vcpu = per_cpu(last_vcpu, cpu);
> + struct vpmu_struct *vpmu;
> +
> + if ( !vcpu )
> + return NOTIFY_DONE;
> +
> + vpmu = vcpu_vpmu(vcpu);
> + if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) )
> + return NOTIFY_DONE;
> +
> + switch ( action )
> + {
> + case CPU_DYING:
> + vpmu_save_force(vcpu);
> + vpmu_reset(vpmu, VPMU_CONTEXT_LOADED);
> + break;
> + default:
> + break;
Pointless default case.
> @@ -871,10 +902,11 @@ static int __init vpmu_init(void)
> break;
> }
>
> - if ( vpmu_mode != XENPMU_MODE_OFF )
> + if ( vpmu_mode != XENPMU_MODE_OFF ) {
> + register_cpu_notifier(&vpmu_cpu_nfb);
> printk(XENLOG_INFO "VPMU: version " __stringify(XENPMU_VER_MAJ) "."
> __stringify(XENPMU_VER_MIN) "\n");
> - else
> + } else
Coding style (brace placement).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |