[PATCH v3 1/2] util: Add virGetCpuHaltPollTime
Michal Prívozník
mprivozn at redhat.com
Tue Jul 20 08:56:03 UTC 2021
On 7/20/21 4:55 AM, Yang Fei wrote:
>
>
> On 2021/7/19 17:05, Peter Krempa wrote:
>> 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 at huawei.com>
>>> ---
>>> 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.
>>
>
> In the last version, I try to use %lld but failed in the ninja test.
> How about forcibly converts the variable pid to long long?
> Like this:
> g_strdup_printf("%lld%c", (long long)pid, '-')
> I find that this is used elsewhere in the code.
Yes, that works.
>
>>> + 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.
>>
>
> The full directory name format is "pid-fd", The fd is assigned during VM creation.
> As I know, we can find it in /proc/(qemu-kvm pid)/fd, but also need to look up which
> one points to "anon_inode:kvm-vm". That may not be any more efficient than look up
> it in the kvm directory.
Right. I tried to find that in the kernel sources, but wasn't
successful. In that case I think you can do what you're doing.
Michal
More information about the libvir-list
mailing list