mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
Xen core parking 1: hypercall
This patch implement hypercall through which dom0 send core parking request, and get core parking result. Due to the characteristic of continue_hypercall_on_cpu, dom0 seperately send/get core parking request/result. Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com> Committed-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
2579d22937
commit
2772618c6e
4 files changed
+59
No files matched your search
@@ -56,6 +56,10 @@ static long cpu_frequency_change_helper(void *data)
|
||||
long cpu_up_helper(void *data);
|
||||
long cpu_down_helper(void *data);
|
||||
|
||||
/* from core_parking.c */
|
||||
long core_parking_helper(void *data);
|
||||
uint32_t get_cur_idle_nums(void);
|
||||
|
||||
ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
|
||||
{
|
||||
ret_t ret = 0;
|
||||
@@ -609,6 +613,32 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
|
||||
op->u.mem_add.epfn,
|
||||
op->u.mem_add.pxm);
|
||||
break;
|
||||
|
||||
case XENPF_core_parking:
|
||||
{
|
||||
uint32_t idle_nums;
|
||||
|
||||
switch(op->u.core_parking.type)
|
||||
{
|
||||
case XEN_CORE_PARKING_SET:
|
||||
idle_nums = min_t(uint32_t,
|
||||
op->u.core_parking.idle_nums, num_present_cpus() - 1);
|
||||
ret = continue_hypercall_on_cpu(
|
||||
0, core_parking_helper, (void *)(unsigned long)idle_nums);
|
||||
break;
|
||||
|
||||
case XEN_CORE_PARKING_GET:
|
||||
op->u.core_parking.idle_nums = get_cur_idle_nums();
|
||||
ret = copy_to_guest(u_xenpf_op, op, 1) ? -EFAULT : 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -ENOSYS;
|
||||
break;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
obj-y += bitmap.o
|
||||
obj-y += core_parking.o
|
||||
obj-y += cpu.o
|
||||
obj-y += cpupool.o
|
||||
obj-$(HAS_DEVICE_TREE) += device_tree.o
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#include <xen/types.h>
|
||||
|
||||
static uint32_t cur_idle_nums;
|
||||
|
||||
long core_parking_helper(void *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t get_cur_idle_nums(void)
|
||||
{
|
||||
return cur_idle_nums;
|
||||
}
|
||||
@@ -490,6 +490,20 @@ struct xenpf_mem_hotadd
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
#define XENPF_core_parking 60
|
||||
|
||||
#define XEN_CORE_PARKING_SET 1
|
||||
#define XEN_CORE_PARKING_GET 2
|
||||
struct xenpf_core_parking {
|
||||
/* IN variables */
|
||||
uint32_t type;
|
||||
/* IN variables: set cpu nums expected to be idled */
|
||||
/* OUT variables: get cpu nums actually be idled */
|
||||
uint32_t idle_nums;
|
||||
};
|
||||
typedef struct xenpf_core_parking xenpf_core_parking_t;
|
||||
DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t);
|
||||
|
||||
struct xen_platform_op {
|
||||
uint32_t cmd;
|
||||
uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
|
||||
@@ -511,6 +525,7 @@ struct xen_platform_op {
|
||||
struct xenpf_cpu_ol cpu_ol;
|
||||
struct xenpf_cpu_hotadd cpu_add;
|
||||
struct xenpf_mem_hotadd mem_add;
|
||||
struct xenpf_core_parking core_parking;
|
||||
uint8_t pad[128];
|
||||
} u;
|
||||
};
|
||||
|
||||