|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v2 09/12] xen: arm: implement platform hypercall
>>> On 16.10.14 at 13:27, <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx> wrote:
> +long arch_do_platform_op(struct xen_platform_op *platform_op,
> + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t)
> u_xenpf_op)
> +{
> + long ret = 0;
> + struct xen_platform_op *op = platform_op;
> +
> + switch ( op->cmd )
> + {
> + case XENPF_set_processor_pminfo:
> + switch ( op->u.set_pminfo.type )
> + {
> + case XEN_PM_PX:
> + if ( !(xen_processor_pmbits & XEN_PROCESSOR_PM_PX) )
> + {
> + ret = -ENOSYS;
> + break;
> + }
> +#ifdef HAS_CPUFREQ
> + ret = set_px_pminfo(op->u.set_pminfo.id,
> &op->u.set_pminfo.u.perf);
This cannot possibly be HAS_CPUFREQ, since ->u.set_pminfo
specifically uses ACPI notation for e.g. the CPU numbering. And
with that it becomes questionable whether the whole series is
doing right in abstracting away ACPI.
> @@ -37,6 +38,7 @@ CHECK_pf_enter_acpi_sleep;
> #define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t)
> typedef int ret_t;
>
> +#include "../../../common/platform_hypercall.c"
> #include "../platform_hypercall.c"
This needs to be done properly in common/.
> +extern ret_t
> +arch_do_platform_op(
> + struct xen_platform_op *platform_op,
> + XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op);
Declarations belong in header files except in very special cases
(which this is none of).
> +ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
> +{
> + ret_t ret = 0;
> + struct xen_platform_op curop, *op = &curop;
> +
> + if ( copy_from_guest(op, u_xenpf_op, 1) )
> + return -EFAULT;
> +
> + if ( op->interface_version != XENPF_INTERFACE_VERSION )
> + return -EACCES;
> +
> + ret = xsm_platform_op(XSM_PRIV, op->cmd);
> + if ( ret )
> + return ret;
> +
> + /*
> + * Trylock here avoids deadlock with an existing platform critical
> section
> + * which might (for some current or future reason) want to synchronise
> + * with this vcpu.
> + */
> + while ( !spin_trylock(&xenpf_lock) )
> + if ( hypercall_preempt_check() )
> + return hypercall_create_continuation(
> + __HYPERVISOR_platform_op, "h", u_xenpf_op);
> +
> + ret = arch_do_platform_op(op, u_xenpf_op);
> +
> + spin_unlock(&xenpf_lock);
And seeing this I really wonder whether making this common is
really worthwhile.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |