|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] libxc/PM: Retry get_pxstat if data is incomplete
commit 1ff7f87e8f4ffff97901126927549ae7b7a7340d
Author: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
AuthorDate: Wed Jun 11 11:07:00 2025 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jun 11 11:07:00 2025 +0200
libxc/PM: Retry get_pxstat if data is incomplete
If the total returned by Xen is more than the number of elements
allocated, it means that the buffer was too small and so the data is
incomplete. Retry to get all the data.
Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
tools/misc/xenpm.c | 49 +++++++++++++++++++++++++++++++------------------
1 file changed, 31 insertions(+), 18 deletions(-)
diff --git a/tools/misc/xenpm.c b/tools/misc/xenpm.c
index de319329e6..d5387f5f06 100644
--- a/tools/misc/xenpm.c
+++ b/tools/misc/xenpm.c
@@ -312,29 +312,42 @@ static int get_pxstat_by_cpuid(xc_interface *xc_handle,
int cpuid, struct xc_px_
int ret = 0;
int max_px_num = 0;
- ret = xc_pm_get_max_px(xc_handle, cpuid, &max_px_num);
- if ( ret )
- return -errno;
-
if ( !pxstat)
return -EINVAL;
- pxstat->total = max_px_num;
- pxstat->trans_pt = malloc(max_px_num * max_px_num *
- sizeof(uint64_t));
- if ( !pxstat->trans_pt )
- return -ENOMEM;
- pxstat->pt = malloc(max_px_num * sizeof(struct xc_px_val));
- if ( !pxstat->pt )
+ for ( ; ; )
{
- free(pxstat->trans_pt);
- return -ENOMEM;
- }
+ ret = xc_pm_get_max_px(xc_handle, cpuid, &max_px_num);
+ if ( ret )
+ return -errno;
- ret = xc_pm_get_pxstat(xc_handle, cpuid, pxstat);
- if( ret )
- {
- ret = -errno;
+ pxstat->total = max_px_num;
+ pxstat->trans_pt = malloc(max_px_num * max_px_num *
+ sizeof(uint64_t));
+ if ( !pxstat->trans_pt )
+ return -ENOMEM;
+ pxstat->pt = malloc(max_px_num * sizeof(struct xc_px_val));
+ if ( !pxstat->pt )
+ {
+ free(pxstat->trans_pt);
+ return -ENOMEM;
+ }
+
+ ret = xc_pm_get_pxstat(xc_handle, cpuid, pxstat);
+ if ( ret )
+ {
+ ret = -errno;
+ free(pxstat->trans_pt);
+ free(pxstat->pt);
+ pxstat->trans_pt = NULL;
+ pxstat->pt = NULL;
+ break;
+ }
+
+ if ( pxstat->total <= max_px_num )
+ break;
+
+ /* get_max_px changed under our feet so the data is incomplete. */
free(pxstat->trans_pt);
free(pxstat->pt);
pxstat->trans_pt = NULL;
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |