Re: [PATCH v5 08/18] qemu: Refactor qemuDomainSetBlockIoTune to extract common methods

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

 



On Mon, Nov 18, 2024 at 19:24:16 +0530, Harikumar R wrote:
> From: Chun Feng Wu <danielwuwy@xxxxxxx>
> 
> extract common methods from "qemuDomainSetBlockIoTune" to be reused
> by throttle handling later, common methods include:
> * "qemuDomainValidateBlockIoTune", which is to validate that PARAMS
>   contains only recognized parameter names with correct types
> * "qemuDomainSetBlockIoTuneFields", which is to load parameters into
>   internal object virDomainBlockIoTuneInfo
> * "qemuDomainCheckBlockIoTuneMutualExclusion", which is to check rules
>   like "total and read/write of bytes_sec cannot be set at the same time"
> * "qemuDomainCheckBlockIoTuneMax", which is to check "max" rules within iotune
> 
> Signed-off-by: Chun Feng Wu <danielwuwy@xxxxxxx>
> ---
>  src/qemu/qemu_driver.c | 225 ++++++++++++++++++++++++++---------------
>  1 file changed, 142 insertions(+), 83 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index aa8a78da69..e80e5fc511 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -14989,35 +14989,8 @@ qemuDomainCheckBlockIoTuneReset(virDomainDiskDef *disk,
>  
>  
>  static int
> -qemuDomainSetBlockIoTune(virDomainPtr dom,
> -                         const char *path,
> -                         virTypedParameterPtr params,
> -                         int nparams,
> -                         unsigned int flags)
> +qemuDomainValidateBlockIoTune(virTypedParameterPtr params, int nparams)
>  {
> -    virQEMUDriver *driver = dom->conn->privateData;
> -    virDomainObj *vm = NULL;
> -    qemuDomainObjPrivate *priv;
> -    virDomainDef *def = NULL;
> -    virDomainDef *persistentDef = NULL;
> -    virDomainBlockIoTuneInfo info = { 0 };
> -    virDomainBlockIoTuneInfo conf_info = { 0 };
> -    int ret = -1;
> -    size_t i;
> -    virDomainDiskDef *conf_disk = NULL;
> -    virDomainDiskDef *disk;
> -    qemuBlockIoTuneSetFlags set_fields = 0;
> -    g_autoptr(virQEMUDriverConfig) cfg = NULL;
> -    virObjectEvent *event = NULL;
> -    virTypedParameterPtr eventParams = NULL;
> -    int eventNparams = 0;
> -    int eventMaxparams = 0;
> -    virDomainBlockIoTuneInfo *cur_info;
> -    virDomainBlockIoTuneInfo *conf_cur_info;
> -
> -
> -    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> -                  VIR_DOMAIN_AFFECT_CONFIG, -1);
>      if (virTypedParamsValidate(params, nparams,
>                                 VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC,
>                                 VIR_TYPED_PARAM_ULLONG,
> @@ -15062,32 +15035,28 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
>                                 NULL) < 0)
>          return -1;
>  
> -    if (!(vm = qemuDomainObjFromDomain(dom)))
> -        return -1;
> -
> -    if (virDomainSetBlockIoTuneEnsureACL(dom->conn, vm->def, flags) < 0)
> -        goto cleanup;
> -
> -    cfg = virQEMUDriverGetConfig(driver);
> -
> -    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
> -        goto cleanup;
> -
> -    priv = vm->privateData;
> +    return 0;
> +}
>  
> -    if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
> -        goto endjob;
>  
> -    if (virTypedParamsAddString(&eventParams, &eventNparams, &eventMaxparams,
> -                                VIR_DOMAIN_TUNABLE_BLKDEV_DISK, path) < 0)
> -        goto endjob;
> +static int
> +qemuDomainSetBlockIoTuneFields(virDomainBlockIoTuneInfo *info,
> +                               virTypedParameterPtr params,
> +                               int nparams,
> +                               qemuBlockIoTuneSetFlags *set_fields,
> +                               virTypedParameterPtr *eventParams,
> +                               int *eventNparams,
> +                               int *eventMaxparams)
> +{
> +    size_t i;
> +    int ret = -1;
>  
>  #define SET_IOTUNE_FIELD(FIELD, BOOL, CONST) \
>      if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_##CONST)) { \
> -        info.FIELD = param->value.ul; \
> -        set_fields |= QEMU_BLOCK_IOTUNE_SET_##BOOL; \
> -        if (virTypedParamsAddULLong(&eventParams, &eventNparams, \
> -                                    &eventMaxparams, \
> +        info->FIELD = param->value.ul; \
> +        *set_fields |= QEMU_BLOCK_IOTUNE_SET_##BOOL; \
> +        if (virTypedParamsAddULLong(eventParams, eventNparams, \
> +                                    eventMaxparams, \
>                                      VIR_DOMAIN_TUNABLE_BLKDEV_##CONST, \
>                                      param->value.ul) < 0) \
>              goto endjob; \
> @@ -15127,10 +15096,10 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
>  
>          /* NB: Cannot use macro since this is a value.s not a value.ul */
>          if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME)) {
> -            info.group_name = g_strdup(param->value.s);
> -            set_fields |= QEMU_BLOCK_IOTUNE_SET_GROUP_NAME;
> -            if (virTypedParamsAddString(&eventParams, &eventNparams,
> -                                        &eventMaxparams,
> +            info->group_name = g_strdup(param->value.s);
> +            *set_fields |= QEMU_BLOCK_IOTUNE_SET_GROUP_NAME;
> +            if (virTypedParamsAddString(eventParams, eventNparams,
> +                                        eventMaxparams,
>                                          VIR_DOMAIN_TUNABLE_BLKDEV_GROUP_NAME,
>                                          param->value.s) < 0)
>                  goto endjob;
> @@ -15153,56 +15122,56 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
>  
>  #undef SET_IOTUNE_FIELD
>  
> -    if ((info.total_bytes_sec && info.read_bytes_sec) ||
> -        (info.total_bytes_sec && info.write_bytes_sec)) {
> +    ret = 0;
> + endjob:
> +    return ret;


The 'endjob' label is reserved exclusively for jumping out of a code
block which has the VM object job taken. This would be either 'cleanup'
as there is no job in use here; but reallistically you don't need 'ret'
and can return directly from the helper.



> +}
> +
> +
> +static int
> +qemuDomainCheckBlockIoTuneMutualExclusion(virDomainBlockIoTuneInfo *info)
> +{
> +    if ((info->total_bytes_sec && info->read_bytes_sec) ||
> +        (info->total_bytes_sec && info->write_bytes_sec)) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("total and read/write of bytes_sec cannot be set at the same time"));
> -        goto endjob;
> +        return -1;


Like here.

>      }
>  
> -    if ((info.total_iops_sec && info.read_iops_sec) ||
> -        (info.total_iops_sec && info.write_iops_sec)) {
> +    if ((info->total_iops_sec && info->read_iops_sec) ||
> +        (info->total_iops_sec && info->write_iops_sec)) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("total and read/write of iops_sec cannot be set at the same time"));
> -        goto endjob;
> +        return -1;
>      }
>  
> -    if ((info.total_bytes_sec_max && info.read_bytes_sec_max) ||
> -        (info.total_bytes_sec_max && info.write_bytes_sec_max)) {
> +    if ((info->total_bytes_sec_max && info->read_bytes_sec_max) ||
> +        (info->total_bytes_sec_max && info->write_bytes_sec_max)) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("total and read/write of bytes_sec_max cannot be set at the same time"));
> -        goto endjob;
> +        return -1;
>      }
>  
> -    if ((info.total_iops_sec_max && info.read_iops_sec_max) ||
> -        (info.total_iops_sec_max && info.write_iops_sec_max)) {
> +    if ((info->total_iops_sec_max && info->read_iops_sec_max) ||
> +        (info->total_iops_sec_max && info->write_iops_sec_max)) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
>                         _("total and read/write of iops_sec_max cannot be set at the same time"));
> -        goto endjob;
> +        return -1;
>      }
>  
> -    virDomainBlockIoTuneInfoCopy(&info, &conf_info);
> -
> -    if (def) {
> -        if (!(disk = qemuDomainDiskByName(def, path)))
> -            goto endjob;
> -
> -        if (!qemuDomainDiskBlockIoTuneIsSupported(disk))
> -            goto endjob;
> -
> -        cur_info = qemuDomainFindGroupBlockIoTune(def, disk, &info);
> +    return 0;
> +}
>  
> -        if (qemuDomainSetBlockIoTuneDefaults(&info, cur_info,
> -                                             set_fields) < 0)
> -            goto endjob;
>  
> -        if (qemuDomainCheckBlockIoTuneReset(disk, &info) < 0)
> -            goto endjob;
> +static int
> +qemuDomainCheckBlockIoTuneMax(virDomainBlockIoTuneInfo *info)
> +{
> +    int ret = -1;
>  
>  #define CHECK_MAX(val, _bool) \
>          do { \
> -            if (info.val##_max) { \
> -                if (!info.val) { \
> +            if (info->val##_max) { \
> +                if (!info->val) { \
>                      if (QEMU_BLOCK_IOTUNE_SET_##_bool) { \
>                          virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \
>                                         _("cannot reset '%1$s' when '%2$s' is set"), \
> @@ -15214,7 +15183,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
>                      } \
>                      goto endjob; \
>                  } \
> -                if (info.val##_max < info.val) { \
> +                if (info->val##_max < info->val) { \
>                      virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \
>                                     _("value '%1$s' cannot be smaller than '%2$s'"), \
>                                     #val "_max", #val); \
> @@ -15232,6 +15201,96 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
>  
>  #undef CHECK_MAX
>  
> +    ret = 0;
> + endjob:
> +    return ret;

Same as above.


> +}
> +
> +
> +static int
> +qemuDomainSetBlockIoTune(virDomainPtr dom,
> +                         const char *path,
> +                         virTypedParameterPtr params,
> +                         int nparams,
> +                         unsigned int flags)
> +{
> +    virQEMUDriver *driver = dom->conn->privateData;
> +    virDomainObj *vm = NULL;
> +    qemuDomainObjPrivate *priv;
> +    virDomainDef *def = NULL;
> +    virDomainDef *persistentDef = NULL;
> +    virDomainBlockIoTuneInfo info = { 0 };
> +    virDomainBlockIoTuneInfo conf_info = { 0 };
> +    int ret = -1;
> +    virDomainDiskDef *conf_disk = NULL;
> +    virDomainDiskDef *disk;
> +    qemuBlockIoTuneSetFlags set_fields = 0;
> +    g_autoptr(virQEMUDriverConfig) cfg = NULL;
> +    virObjectEvent *event = NULL;
> +    virTypedParameterPtr eventParams = NULL;
> +    int eventNparams = 0;
> +    int eventMaxparams = 0;
> +    virDomainBlockIoTuneInfo *cur_info;
> +    virDomainBlockIoTuneInfo *conf_cur_info;
> +
> +
> +    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> +                  VIR_DOMAIN_AFFECT_CONFIG, -1);
> +    if (qemuDomainValidateBlockIoTune(params, nparams) < 0)
> +        return -1;
> +
> +    if (!(vm = qemuDomainObjFromDomain(dom)))
> +        return -1;
> +
> +    if (virDomainSetBlockIoTuneEnsureACL(dom->conn, vm->def, flags) < 0)
> +        goto cleanup;
> +
> +    cfg = virQEMUDriverGetConfig(driver);
> +
> +    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
> +    priv = vm->privateData;
> +
> +    if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
> +        goto endjob;
> +
> +    if (virTypedParamsAddString(&eventParams, &eventNparams, &eventMaxparams,
> +                                VIR_DOMAIN_TUNABLE_BLKDEV_DISK, path) < 0)
> +        goto endjob;
> +
> +    if (qemuDomainSetBlockIoTuneFields(&info,
> +                                       params,
> +                                       nparams,
> +                                       &set_fields,
> +                                       &eventParams,
> +                                       &eventNparams,
> +                                       &eventMaxparams) < 0)
> +        goto endjob;
> +
> +    if (qemuDomainCheckBlockIoTuneMutualExclusion(&info) < 0)
> +        goto endjob;
> +
> +    virDomainBlockIoTuneInfoCopy(&info, &conf_info);
> +
> +    if (def) {
> +        if (!(disk = qemuDomainDiskByName(def, path)))
> +            goto endjob;
> +
> +        if (!qemuDomainDiskBlockIoTuneIsSupported(disk))
> +            goto endjob;
> +
> +        cur_info = qemuDomainFindGroupBlockIoTune(def, disk, &info);
> +
> +        if (qemuDomainSetBlockIoTuneDefaults(&info, cur_info, set_fields) < 0)
> +            goto endjob;
> +
> +        if (qemuDomainCheckBlockIoTuneReset(disk, &info) < 0)
> +            goto endjob;
> +
> +        if (qemuDomainCheckBlockIoTuneMax(&info) < 0)
> +            goto endjob;
> +
>          /* blockdev-based qemu doesn't want to set the throttling when a cdrom
>           * is empty. Skip the monitor call here since we will set the throttling
>           * once new media is inserted */
> -- 
> 2.39.5 (Apple Git-154)
> 



[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