[PATCH v4 2/7] migration/dirtyrate: set up framwork of domainGetDirtyRateInfo API
Hao Wang
wanghao232 at huawei.com
Mon Nov 16 12:01:15 UTC 2020
Great thanks for these helpful suggestions. I'll introduce them into my next version.
On 2020/11/11 4:11, Michal Privoznik wrote:
> On 11/7/20 10:41 AM, Hao Wang wrote:
>> Introduce DomainGetDirtyRateInfo API for domain's memory dirty rate
>> calculation and query.
>>
>> Signed-off-by: Hao Wang <wanghao232 at huawei.com>
>> Signed-off-by: Zhou Yimin <zhouyimin at huawei.com>
>> Reviewed-by: Chuan Zheng <zhengchuan at huawei.com>
>> ---
>> include/libvirt/libvirt-domain.h | 5 ++++
>> src/driver-hypervisor.h | 7 +++++
>> src/libvirt-domain.c | 46 ++++++++++++++++++++++++++++++++
>> src/libvirt_public.syms | 5 ++++
>> src/remote/remote_driver.c | 1 +
>> src/remote/remote_protocol.x | 21 ++++++++++++++-
>> 6 files changed, 84 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
>> index 145f517068..b950736b67 100644
>> --- a/include/libvirt/libvirt-domain.h
>> +++ b/include/libvirt/libvirt-domain.h
>> @@ -5120,4 +5120,9 @@ struct _virDomainDirtyRateInfo {
>> typedef virDomainDirtyRateInfo *virDomainDirtyRateInfoPtr;
>> +int virDomainGetDirtyRateInfo(virDomainPtr domain,
>> + virDomainDirtyRateInfoPtr info,
>> + long long sec,
>> + unsigned int flags);
>> +
>> #endif /* LIBVIRT_DOMAIN_H */
>> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
>> index bce023017d..a77c29de54 100644
>> --- a/src/driver-hypervisor.h
>> +++ b/src/driver-hypervisor.h
>> @@ -1387,6 +1387,12 @@ typedef char *
>> (*virDrvDomainBackupGetXMLDesc)(virDomainPtr domain,
>> unsigned int flags);
>> +typedef int
>> +(*virDrvDomainGetDirtyRateInfo)(virDomainPtr domain,
>> + virDomainDirtyRateInfoPtr info,
>> + long long sec,
>> + unsigned int flags);
>> +
>> typedef struct _virHypervisorDriver virHypervisorDriver;
>> typedef virHypervisorDriver *virHypervisorDriverPtr;
>> @@ -1650,4 +1656,5 @@ struct _virHypervisorDriver {
>> virDrvDomainAgentSetResponseTimeout domainAgentSetResponseTimeout;
>> virDrvDomainBackupBegin domainBackupBegin;
>> virDrvDomainBackupGetXMLDesc domainBackupGetXMLDesc;
>> + virDrvDomainGetDirtyRateInfo domainGetDirtyRateInfo;
>> };
>> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
>> index 3c5f55176a..ce3c40edf8 100644
>> --- a/src/libvirt-domain.c
>> +++ b/src/libvirt-domain.c
>> @@ -12758,3 +12758,49 @@ virDomainBackupGetXMLDesc(virDomainPtr domain,
>> virDispatchError(conn);
>> return NULL;
>> }
>> +
>> +
>> +/**
>> + * virDomainGetDirtyRateInfo:
>> + * @domain: a domain object.
>> + * @info: return value of current domain's memory dirty rate info.
>> + * @sec: show dirty rate within specified seconds.
>> + * @flags: the flags of getdirtyrate action -- calculate and/or query.
>
> What are the flags? Which enum should I look at?
>
>> + *
>> + * Get the current domain's memory dirty rate (in MB/s).
>
> Can you expand on this a bit? Look at description to other APIs for inspiration.
>
>> + *
>> + * Returns 0 in case of success, -1 otherwise.
>> + */
>> +int
>> +virDomainGetDirtyRateInfo(virDomainPtr domain,
>> + virDomainDirtyRateInfoPtr info,
>> + long long sec,
>
> Do we really need long long? That's more than 2.9*10^11 years. I don't think any virtual machine will ever run for so long (considering that the age of the universe is ~1.38*10^10 years)
>
>> + unsigned int flags)
>> +{
>> + virConnectPtr conn;
>> +
>> + VIR_DOMAIN_DEBUG(domain, "info = %p, seconds=%lld", info, sec);
>
> @flags should also be logged.
>
>> +
>> + virResetLastError();
>> +
>> + virCheckDomainReturn(domain, -1);
>> + conn = domain->conn;
>> +
>> + virCheckNonNullArgGoto(info, error);
>> + virCheckReadOnlyGoto(conn->flags, error);
>> +
>> + if (info)
>> + memset(info, 0, sizeof(*info));
>
> @info was checked for NULL just two lines above.
>
>> +
>> + if (conn->driver->domainGetDirtyRateInfo) {
>> + if (conn->driver->domainGetDirtyRateInfo(domain, info, sec, flags) < 0)
>> + goto error;
>> + VIR_DOMAIN_DEBUG(domain, "info = %p, seconds=%lld", info, sec);
>
> This is not very useful debug log.
>
>> + return 0;
>> + }
>> +
>> + virReportUnsupportedError();
>> + error:
>> + virDispatchError(conn);
>> + return -1;
>> +}
>> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
>> index 539d2e3943..11864f48b1 100644
>> --- a/src/libvirt_public.syms
>> +++ b/src/libvirt_public.syms
>> @@ -873,4 +873,9 @@ LIBVIRT_6.0.0 {
>> virDomainBackupGetXMLDesc;
>> } LIBVIRT_5.10.0;
>> +LIBVIRT_6.9.0 {
>> + global:
>> + virDomainGetDirtyRateInfo;
>> +} LIBVIRT_6.0.0;
>> +
>
> Unfortunately, this missed 6.9.0 so this must be 6.10.0 instead.
>
>> # .... define new API here using predicted next version number ....
>> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
>> index 9cd2fd36ae..325968a22b 100644
>> --- a/src/remote/remote_driver.c
>> +++ b/src/remote/remote_driver.c
>> @@ -8458,6 +8458,7 @@ static virHypervisorDriver hypervisor_driver = {
>> .domainAgentSetResponseTimeout = remoteDomainAgentSetResponseTimeout, /* 5.10.0 */
>> .domainBackupBegin = remoteDomainBackupBegin, /* 6.0.0 */
>> .domainBackupGetXMLDesc = remoteDomainBackupGetXMLDesc, /* 6.0.0 */
>> + .domainGetDirtyRateInfo = remoteDomainGetDirtyRateInfo, /* 6.9.0 */
>
> Same here.
>
>> };
>> static virNetworkDriver network_driver = {
>
>
> I think the following should be squashed in:
>
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index e8bd890b29..594d7a2790 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -5096,28 +5096,18 @@ int virDomainBackupBegin(virDomainPtr domain,
> char *virDomainBackupGetXMLDesc(virDomainPtr domain,
> unsigned int flags);
>
> -/**
> - * virDomainDirtyRateFlags:
> - *
> - * Details on the flags used by getdirtyrate api.
> - */
> -
> -typedef enum {
> - VIR_DOMAIN_DIRTYRATE_CALC = 1 << 0, /* calculate domain's dirtyrate */
> - VIR_DOMAIN_DIRTYRATE_QUERY = 1 << 1, /* query domain's dirtyrate */
> -} virDomainDirtyRateFlags;
> -
> /**
> * virDomainDirtyRateStatus:
> *
> - * Details on the cause of a dirtyrate calculation status.
> + * Details on the cause of a dirty rate calculation status.
> */
> -
> typedef enum {
> - VIR_DOMAIN_DIRTYRATE_UNSTARTED = 0, /* the dirtyrate calculation has not been started */
> - VIR_DOMAIN_DIRTYRATE_MEASURING = 1, /* the dirtyrate calculation is measuring */
> + VIR_DOMAIN_DIRTYRATE_UNSTARTED = 0, /* the dirtyrate calculation has not
> + been started */
> + VIR_DOMAIN_DIRTYRATE_MEASURING = 1, /* the dirtyrate calculation is
> + measuring */
> VIR_DOMAIN_DIRTYRATE_MEASURED = 2, /* the dirtyrate calculation is
> -completed */
> + completed */
>
> # ifdef VIR_ENUM_SENTINELS
> VIR_DOMAIN_DIRTYRATE_LAST
> @@ -5133,12 +5123,23 @@ completed */
> typedef struct _virDomainDirtyRateInfo virDomainDirtyRateInfo;
> typedef virDomainDirtyRateInfo *virDomainDirtyRateInfoPtr;
> struct _virDomainDirtyRateInfo {
> - int status; /* the status of dirty rate calculation */
> + int status; /* the status of dirty rate calculation, one of
> + virDomainDirtyRateStatus */
> long long dirtyRate; /* the dirty rate in MB/s */
> long long startTime; /* the start time of dirty rate calculation */
> long long calcTime; /* the period of dirty rate calculation */
> };
>
> +/**
> + * virDomainDirtyRateFlags:
> + *
> + * Details on the flags used by getdirtyrate api.
> + */
> +typedef enum {
> + VIR_DOMAIN_DIRTYRATE_CALC = 1 << 0, /* calculate domain's dirty rate */
> + VIR_DOMAIN_DIRTYRATE_QUERY = 1 << 1, /* query domain's dirty rate */
> +} virDomainGetDirtyRateInfoFlags;
> +
> int virDomainGetDirtyRateInfo(virDomainPtr domain,
> virDomainDirtyRateInfoPtr info,
> long long sec,
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index ce3c40edf8..75029b0a4b 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -12762,10 +12762,10 @@ virDomainBackupGetXMLDesc(virDomainPtr domain,
>
> /**
> * virDomainGetDirtyRateInfo:
> - * @domain: a domain object.
> - * @info: return value of current domain's memory dirty rate info.
> - * @sec: show dirty rate within specified seconds.
> - * @flags: the flags of getdirtyrate action -- calculate and/or query.
> + * @domain: a domain object
> + * @info: pointer to current domain's memory dirty rate info
> + * @sec: show dirty rate within specified seconds
> + * @flags: extra flags; binary-OR of virDomainGetDirtyRateInfoFlags
> *
> * Get the current domain's memory dirty rate (in MB/s).
> *
> @@ -12779,7 +12779,8 @@ virDomainGetDirtyRateInfo(virDomainPtr domain,
> {
> virConnectPtr conn;
>
> - VIR_DOMAIN_DEBUG(domain, "info = %p, seconds=%lld", info, sec);
> + VIR_DOMAIN_DEBUG(domain, "info=%p, sec=%lld, flags=0x%x",
> + info, sec, flags);
>
> virResetLastError();
>
> @@ -12789,14 +12790,14 @@ virDomainGetDirtyRateInfo(virDomainPtr domain,
> virCheckNonNullArgGoto(info, error);
> virCheckReadOnlyGoto(conn->flags, error);
>
> - if (info)
> - memset(info, 0, sizeof(*info));
> + memset(info, 0, sizeof(*info));
>
> if (conn->driver->domainGetDirtyRateInfo) {
> - if (conn->driver->domainGetDirtyRateInfo(domain, info, sec, flags) < 0)
> + int ret;
> + ret = conn->driver->domainGetDirtyRateInfo(domain, info, sec, flags);
> + if (ret < 0)
> goto error;
> - VIR_DOMAIN_DEBUG(domain, "info = %p, seconds=%lld", info, sec);
> - return 0;
> + return ret;
> }
>
> virReportUnsupportedError();
>
> Michal
>
> .
More information about the libvir-list
mailing list