[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] 1/2: cpufreq/PowerNow! in Xen: Time and platform changes
Keir Fraser wrote: It's a misleading simplification. For example, the ondemand governor will build and run in a dom0 kernel but it's not actually going to do the rightthing, as it doesn't observe whole-machine load. Here is the missing piece of the puzzle. A platform hypercall operation to get system wide idle time. I believe Mark's changes, together with this little patch, are the way we can get cpufreq working on Xen with the minimal amount of code duplication. Duplicating code anywhere, whether it be inside the hypervisor or in some Xen-only userland package, will only lead to bit rot and make Xen maintenance more painful. Signed-off-by: Rik van Riel <riel@xxxxxxxxxx> -- Politics is the struggle between those who want to make their country the best in the world, and those who believe it already is. Each group calls the other unpatriotic. diff -r 81c9213b3d39 xen/include/public/platform.h --- a/xen/include/public/platform.h Tue Nov 28 18:41:42 2006 +0000 +++ b/xen/include/public/platform.h Thu Aug 30 14:18:04 2007 -0400 @@ -114,6 +114,19 @@ typedef struct xenpf_platform_quirk xenp typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); +typedef uint64_t cputime_t; +DEFINE_XEN_GUEST_HANDLE(cputime_t); +#define XENPF_getidletime 40 +struct xenpf_getidletime { + /* IN variables. */ + uint32_t max_cpus; + XEN_GUEST_HANDLE(uint64_t) buffer; + /* OUT variables. */ + uint32_t num_cpus; +}; +typedef struct xenpf_getidletime xenpf_getidletime_t; +DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); + struct xen_platform_op { uint32_t cmd; uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ @@ -124,6 +137,7 @@ struct xen_platform_op { struct xenpf_read_memtype read_memtype; struct xenpf_microcode_update microcode; struct xenpf_platform_quirk platform_quirk; + struct xenpf_getidletime getidletime; uint8_t pad[128]; } u; }; diff -r 81c9213b3d39 xen/arch/x86/platform_hypercall.c --- a/xen/arch/x86/platform_hypercall.c Tue Nov 28 18:41:42 2006 +0000 +++ b/xen/arch/x86/platform_hypercall.c Thu Aug 30 14:18:12 2007 -0400 @@ -138,6 +138,31 @@ long do_platform_op(XEN_GUEST_HANDLE(xen } break; + case XENPF_getidletime: + { + uint32_t cpu; + uint32_t max_cpus = op->u.getidletime.max_cpus; + uint64_t idletime; + + for_each_online_cpu (cpu) { + if ( cpu >= max_cpus ) + break; + + idletime = idle_vcpu[cpu]->runstate.time[RUNSTATE_running]; + + if ( copy_to_guest_offset(op->u.getidletime.buffer, cpu, &idletime, 1) ) { + ret = -EFAULT; + break; + } + } + + op->u.getidletime.num_cpus = cpu; + + if ( copy_to_guest(u_xenpf_op, op, 1) ) + ret = -EFAULT; + } + break; + default: ret = -ENOSYS; break; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |