[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] libxc/PM: correct (not just) error handling in xc_get_cpufreq_para()



commit cf1995fa8a24c7e51e781010680b042f49b38eda
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Apr 9 15:30:15 2025 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Apr 9 15:30:15 2025 +0200

    libxc/PM: correct (not just) error handling in xc_get_cpufreq_para()
    
    From their introduction all xc_hypercall_bounce_pre() uses, when they
    failed, would properly cause exit from the function including cleanup,
    yet without informing the caller of the failure. Purge the unlock_1
    label for being both pointless and mis-named.
    
    An earlier attempt to switch to the usual split between return value and
    errno wasn't quite complete.
    
    HWP work made the cleanup of the "available governors" array
    conditional, neglecting the fact that the condition used may not be the
    condition that was used to allocate the buffer (as the structure field
    is updated upon getting back EAGAIN). Since cleanup can be done even if
    no buffer was allocated, drop the conditional there again.
    
    Fixes: 4513025a8790 ("libxc: convert sysctl interfaces over to hypercall 
buffers")
    Amends: 73367cf3b4b4 ("libxc: Fix xc_pm API calls to return negative error 
and stash error in errno")
    Fixes: 31e264c672bc ("pmstat&xenpm: Re-arrage for cpufreq union")
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
    Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 tools/libs/ctrl/xc_pm.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/tools/libs/ctrl/xc_pm.c b/tools/libs/ctrl/xc_pm.c
index b27b45c3dc..ff7b5ada05 100644
--- a/tools/libs/ctrl/xc_pm.c
+++ b/tools/libs/ctrl/xc_pm.c
@@ -212,10 +212,7 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid,
     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;
+    bool has_num = user_para->cpu_num && user_para->freq_num;
 
     if ( has_num )
     {
@@ -226,12 +223,15 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid,
             errno = EINVAL;
             return -1;
         }
-        if ( xc_hypercall_bounce_pre(xch, affected_cpus) )
-            goto unlock_1;
-        if ( xc_hypercall_bounce_pre(xch, scaling_available_frequencies) )
+        ret = xc_hypercall_bounce_pre(xch, affected_cpus);
+        if ( ret )
+            return ret;
+        ret = xc_hypercall_bounce_pre(xch, scaling_available_frequencies);
+        if ( ret )
             goto unlock_2;
-        if ( user_para->gov_num &&
-             xc_hypercall_bounce_pre(xch, scaling_available_governors) )
+        if ( user_para->gov_num )
+            ret = xc_hypercall_bounce_pre(xch, scaling_available_governors);
+        if ( ret )
             goto unlock_3;
 
         set_xen_guest_handle(sys_para->affected_cpus, affected_cpus);
@@ -256,12 +256,11 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid,
             user_para->cpu_num  = sys_para->cpu_num;
             user_para->freq_num = sys_para->freq_num;
             user_para->gov_num  = sys_para->gov_num;
-            ret = -errno;
         }
 
         if ( has_num )
             goto unlock_4;
-        goto unlock_1;
+        return ret;
     }
     else
     {
@@ -298,13 +297,12 @@ int xc_get_cpufreq_para(xc_interface *xch, int cpuid,
     }
 
 unlock_4:
-    if ( user_para->gov_num )
-        xc_hypercall_bounce_post(xch, scaling_available_governors);
+    xc_hypercall_bounce_post(xch, scaling_available_governors);
 unlock_3:
     xc_hypercall_bounce_post(xch, scaling_available_frequencies);
 unlock_2:
     xc_hypercall_bounce_post(xch, affected_cpus);
-unlock_1:
+
     return ret;
 }
 
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.