The function didn't comply with libvirt's error reporting scheme as it
reported libvirt errors only sometimes. As callers may want to ignore
errors convert it to returning -errno on failure instead.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_driver.c | 6 +++++-
src/util/virperf.c | 19 ++++++++++---------
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index efb6e2c454..e5d5c8c484 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -17581,9 +17581,13 @@ qemuDomainGetStatsPerfOneEvent(virPerf *perf,
virTypedParamList *params)
{
uint64_t value = 0;
+ int rv;
- if (virPerfReadEvent(perf, type, &value) < 0)
+ if ((rv = virPerfReadEvent(perf, type, &value)) < 0) {
+ virReportSystemError(-rv, "%s",
+ _("Unable to read cache data"));
return -1;
+ }
virTypedParamListAddULLong(params, value, "perf.%s",
virPerfEventTypeToString(type));
diff --git a/src/util/virperf.c b/src/util/virperf.c
index 91f2ca632a..7f0253d5b2 100644
--- a/src/util/virperf.c
+++ b/src/util/virperf.c
@@ -290,6 +290,12 @@ bool virPerfEventIsEnabled(virPerf *perf,
return perf && perf->events[type].enabled;
}
+
+/**
+ * virPerfReadEvent:
+ *
+ * Returns 0 on success -ERRNO on failure.
+ */
int
virPerfReadEvent(virPerf *perf,
virPerfEventType type,
@@ -297,13 +303,10 @@ virPerfReadEvent(virPerf *perf,
{
struct virPerfEvent *event = &perf->events[type];
if (!event->enabled)
- return -1;
+ return -EINVAL;
- if (saferead(event->fd, value, sizeof(uint64_t)) < 0) {
- virReportSystemError(errno, "%s",
- _("Unable to read cache data"));
- return -1;
- }
+ if (saferead(event->fd, value, sizeof(uint64_t)) < 0)
+ return -errno;
if (type == VIR_PERF_EVENT_CMT)
*value *= event->efields.cmt.scale;
@@ -350,9 +353,7 @@ virPerfReadEvent(virPerf *perf G_GNUC_UNUSED,
virPerfEventType type G_GNUC_UNUSED,
uint64_t *value G_GNUC_UNUSED)
{
- virReportSystemError(ENXIO, "%s",
- _("Perf not supported on this platform"));
- return -1;
+ return -ENOSYS;
}
#endif
--
2.48.1