diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2010-10-22 15:14:51 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2010-10-22 15:14:51 +0100 |
commit | 4513025a87902aa4469b15e8097beb7590da7b78 (patch) | |
tree | 6639b374163076d128b6a5e54a124404b45e8b04 /tools/libxc/xc_pm.c | |
parent | 231c3160913a957cb9aeb693a7966ac3f8ecc780 (diff) | |
download | xen-4513025a87902aa4469b15e8097beb7590da7b78.tar.gz xen-4513025a87902aa4469b15e8097beb7590da7b78.tar.bz2 xen-4513025a87902aa4469b15e8097beb7590da7b78.zip |
libxc: convert sysctl interfaces over to hypercall buffers
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxc/xc_pm.c')
-rw-r--r-- | tools/libxc/xc_pm.c | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/tools/libxc/xc_pm.c b/tools/libxc/xc_pm.c index da99b6e27e..36e0a9fa08 100644 --- a/tools/libxc/xc_pm.c +++ b/tools/libxc/xc_pm.c @@ -45,6 +45,10 @@ int xc_pm_get_max_px(xc_interface *xch, int cpuid, int *max_px) int xc_pm_get_pxstat(xc_interface *xch, int cpuid, struct xc_px_stat *pxpt) { DECLARE_SYSCTL; + /* Sizes unknown until xc_pm_get_max_px */ + DECLARE_NAMED_HYPERCALL_BOUNCE(trans, &pxpt->trans_pt, 0, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + DECLARE_NAMED_HYPERCALL_BOUNCE(pt, &pxpt->pt, 0, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + int max_px, ret; if ( !pxpt || !(pxpt->trans_pt) || !(pxpt->pt) ) @@ -53,14 +57,15 @@ int xc_pm_get_pxstat(xc_interface *xch, int cpuid, struct xc_px_stat *pxpt) if ( (ret = xc_pm_get_max_px(xch, cpuid, &max_px)) != 0) return ret; - if ( (ret = lock_pages(xch, pxpt->trans_pt, - max_px * max_px * sizeof(uint64_t))) != 0 ) + HYPERCALL_BOUNCE_SET_SIZE(trans, max_px * max_px * sizeof(uint64_t)); + HYPERCALL_BOUNCE_SET_SIZE(pt, max_px * sizeof(struct xc_px_val)); + + if ( xc_hypercall_bounce_pre(xch, trans) ) return ret; - if ( (ret = lock_pages(xch, pxpt->pt, - max_px * sizeof(struct xc_px_val))) != 0 ) + if ( xc_hypercall_bounce_pre(xch, pt) ) { - unlock_pages(xch, pxpt->trans_pt, max_px * max_px * sizeof(uint64_t)); + xc_hypercall_bounce_post(xch, trans); return ret; } @@ -68,15 +73,14 @@ int xc_pm_get_pxstat(xc_interface *xch, int cpuid, struct xc_px_stat *pxpt) sysctl.u.get_pmstat.type = PMSTAT_get_pxstat; sysctl.u.get_pmstat.cpuid = cpuid; sysctl.u.get_pmstat.u.getpx.total = max_px; - set_xen_guest_handle(sysctl.u.get_pmstat.u.getpx.trans_pt, pxpt->trans_pt); - set_xen_guest_handle(sysctl.u.get_pmstat.u.getpx.pt, - (pm_px_val_t *)pxpt->pt); + xc_set_xen_guest_handle(sysctl.u.get_pmstat.u.getpx.trans_pt, trans); + xc_set_xen_guest_handle(sysctl.u.get_pmstat.u.getpx.pt, pt); ret = xc_sysctl(xch, &sysctl); if ( ret ) { - unlock_pages(xch, pxpt->trans_pt, max_px * max_px * sizeof(uint64_t)); - unlock_pages(xch, pxpt->pt, max_px * sizeof(struct xc_px_val)); + xc_hypercall_bounce_post(xch, trans); + xc_hypercall_bounce_post(xch, pt); return ret; } @@ -85,8 +89,8 @@ int xc_pm_get_pxstat(xc_interface *xch, int cpuid, struct xc_px_stat *pxpt) pxpt->last = sysctl.u.get_pmstat.u.getpx.last; pxpt->cur = sysctl.u.get_pmstat.u.getpx.cur; - unlock_pages(xch, pxpt->trans_pt, max_px * max_px * sizeof(uint64_t)); - unlock_pages(xch, pxpt->pt, max_px * sizeof(struct xc_px_val)); + xc_hypercall_bounce_post(xch, trans); + xc_hypercall_bounce_post(xch, pt); return ret; } @@ -120,6 +124,8 @@ int xc_pm_get_max_cx(xc_interface *xch, int cpuid, int *max_cx) int xc_pm_get_cxstat(xc_interface *xch, int cpuid, struct xc_cx_stat *cxpt) { DECLARE_SYSCTL; + DECLARE_NAMED_HYPERCALL_BOUNCE(triggers, &cxpt->triggers, 0, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + DECLARE_NAMED_HYPERCALL_BOUNCE(residencies, &cxpt->residencies, 0, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); int max_cx, ret; if( !cxpt || !(cxpt->triggers) || !(cxpt->residencies) ) @@ -128,22 +134,23 @@ int xc_pm_get_cxstat(xc_interface *xch, int cpuid, struct xc_cx_stat *cxpt) if ( (ret = xc_pm_get_max_cx(xch, cpuid, &max_cx)) ) goto unlock_0; - if ( (ret = lock_pages(xch, cxpt, sizeof(struct xc_cx_stat))) ) + HYPERCALL_BOUNCE_SET_SIZE(triggers, max_cx * sizeof(uint64_t)); + HYPERCALL_BOUNCE_SET_SIZE(residencies, max_cx * sizeof(uint64_t)); + + ret = -1; + if ( xc_hypercall_bounce_pre(xch, triggers) ) goto unlock_0; - if ( (ret = lock_pages(xch, cxpt->triggers, max_cx * sizeof(uint64_t))) ) + if ( xc_hypercall_bounce_pre(xch, residencies) ) goto unlock_1; - if ( (ret = lock_pages(xch, cxpt->residencies, max_cx * sizeof(uint64_t))) ) - goto unlock_2; sysctl.cmd = XEN_SYSCTL_get_pmstat; sysctl.u.get_pmstat.type = PMSTAT_get_cxstat; sysctl.u.get_pmstat.cpuid = cpuid; - set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.triggers, cxpt->triggers); - set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.residencies, - cxpt->residencies); + xc_set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.triggers, triggers); + xc_set_xen_guest_handle(sysctl.u.get_pmstat.u.getcx.residencies, residencies); if ( (ret = xc_sysctl(xch, &sysctl)) ) - goto unlock_3; + goto unlock_2; cxpt->nr = sysctl.u.get_pmstat.u.getcx.nr; cxpt->last = sysctl.u.get_pmstat.u.getcx.last; @@ -154,12 +161,10 @@ int xc_pm_get_cxstat(xc_interface *xch, int cpuid, struct xc_cx_stat *cxpt) cxpt->cc3 = sysctl.u.get_pmstat.u.getcx.cc3; cxpt->cc6 = sysctl.u.get_pmstat.u.getcx.cc6; -unlock_3: - unlock_pages(xch, cxpt->residencies, max_cx * sizeof(uint64_t)); unlock_2: - unlock_pages(xch, cxpt->triggers, max_cx * sizeof(uint64_t)); + xc_hypercall_bounce_post(xch, residencies); unlock_1: - unlock_pages(xch, cxpt, sizeof(struct xc_cx_stat)); + xc_hypercall_bounce_post(xch, triggers); unlock_0: return ret; } @@ -186,13 +191,20 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid, DECLARE_SYSCTL; int ret = 0; struct xen_get_cpufreq_para *sys_para = &sysctl.u.pm_op.u.get_para; + DECLARE_NAMED_HYPERCALL_BOUNCE(affected_cpus, + user_para->affected_cpus, + user_para->cpu_num * sizeof(uint32_t), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + DECLARE_NAMED_HYPERCALL_BOUNCE(scaling_available_frequencies, + user_para->scaling_available_frequencies, + user_para->freq_num * sizeof(uint32_t), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + DECLARE_NAMED_HYPERCALL_BOUNCE(scaling_available_governors, + user_para->scaling_available_governors, + user_para->gov_num * CPUFREQ_NAME_LEN * sizeof(char), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + bool has_num = user_para->cpu_num && user_para->freq_num && user_para->gov_num; - if ( (xch < 0) || !user_para ) - return -EINVAL; - if ( has_num ) { if ( (!user_para->affected_cpus) || @@ -200,22 +212,16 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid, (!user_para->scaling_available_governors) ) return -EINVAL; - if ( (ret = lock_pages(xch, user_para->affected_cpus, - user_para->cpu_num * sizeof(uint32_t))) ) + if ( xc_hypercall_bounce_pre(xch, affected_cpus) ) goto unlock_1; - if ( (ret = lock_pages(xch, user_para->scaling_available_frequencies, - user_para->freq_num * sizeof(uint32_t))) ) + if ( xc_hypercall_bounce_pre(xch, scaling_available_frequencies) ) goto unlock_2; - if ( (ret = lock_pages(xch, user_para->scaling_available_governors, - user_para->gov_num * CPUFREQ_NAME_LEN * sizeof(char))) ) + if ( xc_hypercall_bounce_pre(xch, scaling_available_governors) ) goto unlock_3; - set_xen_guest_handle(sys_para->affected_cpus, - user_para->affected_cpus); - set_xen_guest_handle(sys_para->scaling_available_frequencies, - user_para->scaling_available_frequencies); - set_xen_guest_handle(sys_para->scaling_available_governors, - user_para->scaling_available_governors); + xc_set_xen_guest_handle(sys_para->affected_cpus, affected_cpus); + xc_set_xen_guest_handle(sys_para->scaling_available_frequencies, scaling_available_frequencies); + xc_set_xen_guest_handle(sys_para->scaling_available_governors, scaling_available_governors); } sysctl.cmd = XEN_SYSCTL_pm_op; @@ -250,7 +256,7 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid, user_para->scaling_min_freq = sys_para->scaling_min_freq; user_para->turbo_enabled = sys_para->turbo_enabled; - memcpy(user_para->scaling_driver, + memcpy(user_para->scaling_driver, sys_para->scaling_driver, CPUFREQ_NAME_LEN); memcpy(user_para->scaling_governor, sys_para->scaling_governor, CPUFREQ_NAME_LEN); @@ -263,14 +269,11 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid, } unlock_4: - unlock_pages(xch, user_para->scaling_available_governors, - user_para->gov_num * CPUFREQ_NAME_LEN * sizeof(char)); + xc_hypercall_bounce_post(xch, scaling_available_governors); unlock_3: - unlock_pages(xch, user_para->scaling_available_frequencies, - user_para->freq_num * sizeof(uint32_t)); + xc_hypercall_bounce_post(xch, scaling_available_frequencies); unlock_2: - unlock_pages(xch, user_para->affected_cpus, - user_para->cpu_num * sizeof(uint32_t)); + xc_hypercall_bounce_post(xch, affected_cpus); unlock_1: return ret; } |