From: Andrew Cooper Date: Fri, 29 Mar 2019 12:14:37 +0000 (+0000) Subject: x86/sysctl: Clean up XEN_SYSCTL_cpu_hotplug X-Git-Tag: 4.13.0-rc1~1098 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=dbe55b5d6a03c72c80d9f6df502927c7dc8db03f;p=xen.git x86/sysctl: Clean up XEN_SYSCTL_cpu_hotplug A future change is going to introduce two more cases. Instead of opcoding the XSM checks and contine_hypercall logic, collect the data into local variables. Switch the default return value to -EOPNOTSUPP to distinguish a bad op from a bad cpu index. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index 1916a3de1b..cff4415ded 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -137,27 +137,35 @@ long arch_do_sysctl( case XEN_SYSCTL_cpu_hotplug: { unsigned int cpu = sysctl->u.cpu_hotplug.cpu; + bool plug; + long (*fn)(void *); + void *hcpu; switch ( sysctl->u.cpu_hotplug.op ) { case XEN_SYSCTL_CPU_HOTPLUG_ONLINE: - ret = xsm_resource_plug_core(XSM_HOOK); - if ( ret ) - break; - ret = continue_hypercall_on_cpu( - 0, cpu_up_helper, (void *)(unsigned long)cpu); + plug = true; + fn = cpu_up_helper; + hcpu = _p(cpu); break; + case XEN_SYSCTL_CPU_HOTPLUG_OFFLINE: - ret = xsm_resource_unplug_core(XSM_HOOK); - if ( ret ) - break; - ret = continue_hypercall_on_cpu( - 0, cpu_down_helper, (void *)(unsigned long)cpu); + plug = false; + fn = cpu_down_helper; + hcpu = _p(cpu); break; + default: - ret = -EINVAL; + ret = -EOPNOTSUPP; break; } + + if ( !ret ) + ret = plug ? xsm_resource_plug_core(XSM_HOOK) + : xsm_resource_unplug_core(XSM_HOOK); + + if ( !ret ) + ret = continue_hypercall_on_cpu(0, fn, hcpu); } break;