Re: [PATCH v3 1/2] util: Add virGetCpuHaltPollTime

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

 



On Fri, Jul 16, 2021 at 18:42:22 +0800, Yang Fei wrote:
> Add helper function virGetCpuHaltPollTime to obtain halt polling
> time. If the kernel support halt polling time statistic, and mount
> debugfs. This function will take effect on KVM VMs.
> 
> Signed-off-by: Yang Fei <yangfei85@xxxxxxxxxx>
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virutil.c       | 43 ++++++++++++++++++++++++++++++++++++++++
>  src/util/virutil.h       |  4 ++++
>  3 files changed, 48 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 68e4b6aab8..64aff4eca4 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -3479,6 +3479,7 @@ virDoesUserExist;
>  virDoubleToStr;
>  virFormatIntDecimal;
>  virFormatIntPretty;
> +virGetCpuHaltPollTime;
>  virGetDeviceID;
>  virGetDeviceUnprivSGIO;
>  virGetGroupID;
> diff --git a/src/util/virutil.c b/src/util/virutil.c
> index 311cbbf93a..f5304644c0 100644
> --- a/src/util/virutil.c
> +++ b/src/util/virutil.c
> @@ -1936,3 +1936,46 @@ virPipeNonBlock(int fds[2])
>  {
>      return virPipeImpl(fds, true, true);
>  }
> +
> +int
> +virGetCpuHaltPollTime(pid_t pid,
> +                      unsigned long long *haltPollSuccess,
> +                      unsigned long long *haltPollFail)
> +{
> +    g_autofree char *pidToStr = NULL;
> +    g_autofree char *debugFsPath = NULL;
> +    g_autofree char *completePath = NULL;
> +    struct dirent *ent = NULL;
> +    g_autoptr(DIR) dir = NULL;
> +    int ret = -1;
> +    bool found = false;
> +
> +    if (!(debugFsPath = virFileFindMountPoint("debugfs")))
> +        return ret;

Here '-1' is returned, but no libvirt error is reported ...

> +
> +    completePath = g_strdup_printf("%s/%s", debugFsPath, "kvm");
> +    if (virDirOpenIfExists(&dir, completePath) != 1)
> +        return ret;

While here -1 is reported and an error may be reported (e.g on EACCESS).
We generally avoid this pattern because the caller cant properly handle
that.

> +
> +    pidToStr = g_strdup_printf("%d%c", pid, '-');

I'm fairly certain this will fail to compile on mingw since %d isn't the
proper formatting modifier for pid_t.

> +    while (virDirRead(dir, &ent, NULL) > 0) {
> +        if (STRPREFIX(ent->d_name, pidToStr)) {

Any idea what the suffix after '-' in the debugfs entry is? If we can
figure it out we won't have to look up the correct file.

> +            found = true;
> +            break;
> +        }
> +    }
> +
> +    if (!found)
> +        return ret;
> +
> +    if (virFileReadValueUllong(haltPollSuccess, "%s/%s/%s", completePath,
> +                               ent->d_name, "halt_poll_success_ns") < 0
> +        || virFileReadValueUllong(haltPollFail, "%s/%s/%s", completePath,
> +                                  ent->d_name, "halt_poll_fail_ns") < 0) {

As you can see here, this is one of the functions having terrible
semantics. It sometimes does set the libvirt error object and sometimes
doesn't, thats why we try to avoid those.

> +        return ret;
> +    }
> +
> +    ret = 0;
> +
> +    return ret;
> +}




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux