[libvirt] [PATCH 34/34] qemu: iothread: Reuse qemuProcessSetupIOThread in iothread hotplug

John Ferlan jferlan at redhat.com
Tue Jan 19 17:54:12 UTC 2016



On 01/14/2016 11:27 AM, Peter Krempa wrote:
> Since majority of the steps is shared, the function can be reused to
> simplify code.
> 
> Similarly to previous path doing this same for vCPUs this also fixes the
> a similar bug (which is not tracked).
> ---
>  src/qemu/qemu_driver.c | 101 +------------------------------------------------
>  1 file changed, 2 insertions(+), 99 deletions(-)
> 


> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 71a35e4..f996ede 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4563,70 +4563,6 @@ static void qemuProcessEventHandler(void *data, void *opaque)
>      VIR_FREE(processEvent);
>  }
> 
> -static virCgroupPtr
> -qemuDomainAddCgroupForThread(virCgroupPtr cgroup,
> -                             virCgroupThreadName nameval,
> -                             int idx,
> -                             char *mem_mask,
> -                             pid_t pid)
> -{
> -    virCgroupPtr new_cgroup = NULL;
> -    int rv = -1;
> -
> -    /* Create cgroup */
> -    if (virCgroupNewThread(cgroup, nameval, idx, true, &new_cgroup) < 0)
> -        return NULL;
> -
> -    if (mem_mask &&
> -        virCgroupHasController(cgroup, VIR_CGROUP_CONTROLLER_CPUSET) &&
> -        virCgroupSetCpusetMems(new_cgroup, mem_mask) < 0)
> -        goto error;
> -
> -    /* Add pid/thread to the cgroup */
> -    rv = virCgroupAddTask(new_cgroup, pid);
> -    if (rv < 0) {
> -        virCgroupRemove(new_cgroup);
> -        goto error;
> -    }
> -
> -    return new_cgroup;
> -
> - error:
> -    virCgroupFree(&new_cgroup);
> -    return NULL;
> -}
> -
> -
> -static int
> -qemuDomainHotplugPinThread(virBitmapPtr cpumask,
> -                           int idx,
> -                           pid_t pid,
> -                           virCgroupPtr cgroup)
> -{
> -    int ret = -1;
> -
> -    if (cgroup &&
> -        virCgroupHasController(cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
> -        if (qemuSetupCgroupCpusetCpus(cgroup, cpumask) < 0) {
> -            virReportError(VIR_ERR_OPERATION_INVALID,
> -                           _("failed to set cpuset.cpus in cgroup for id %d"),
> -                           idx);
> -            goto cleanup;
> -        }
> -    } else {
> -        if (virProcessSetAffinity(pid, cpumask) < 0) {
> -            virReportError(VIR_ERR_SYSTEM_ERROR,
> -                           _("failed to set cpu affinity for id %d"),
> -                           idx);
> -            goto cleanup;
> -        }
> -    }

Interesting the difference between the decision points here and setup
code with respect to this particular if/else.  The hotplug code will no
longer make this decision - at least overtly as both could be called.

I suppose this just became more apparent since it's being removed here.
 It's not something I noted in 32/34 though and now am wondering if it
should have been noted.

So as long as the possibility of calling both is correct, then it's an
ACK; otherwise, something will have to change here and in patch 32.

John

> -
> -    ret = 0;
> -
> - cleanup:
> -    return ret;
> -}
> 
>  static int
>  qemuDomainDelCgroupForThread(virCgroupPtr cgroup,
> @@ -5836,11 +5772,7 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
>      unsigned int exp_niothreads = vm->def->niothreadids;
>      int new_niothreads = 0;
>      qemuMonitorIOThreadInfoPtr *new_iothreads = NULL;
> -    virCgroupPtr cgroup_iothread = NULL;
> -    char *mem_mask = NULL;
> -    virDomainNumatuneMemMode mode;
>      virDomainIOThreadIDDefPtr iothrid;
> -    virBitmapPtr cpumask;
> 
>      if (virDomainIOThreadIDFind(vm->def, iothread_id)) {
>          virReportError(VIR_ERR_INVALID_ARG,
> @@ -5880,14 +5812,6 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
>      }
>      vm->def->iothreads = exp_niothreads;
> 
> -    if (virDomainNumatuneGetMode(vm->def->numa, -1, &mode) == 0 &&
> -        mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
> -        virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
> -                                            priv->autoNodeset,
> -                                            &mem_mask, -1) < 0)
> -        goto cleanup;
> -
> -
>      /*
>       * If we've successfully added an IOThread, find out where we added it
>       * in the QEMU IOThread list, so we can add it to our iothreadids list
> @@ -5909,27 +5833,8 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
> 
>      iothrid->thread_id = new_iothreads[idx]->thread_id;
> 
> -    /* Add IOThread to cgroup if present */
> -    if (priv->cgroup) {
> -        cgroup_iothread =
> -            qemuDomainAddCgroupForThread(priv->cgroup,
> -                                         VIR_CGROUP_THREAD_IOTHREAD,
> -                                         iothread_id, mem_mask,
> -                                         iothrid->thread_id);
> -        if (!cgroup_iothread)
> -            goto cleanup;
> -    }
> -
> -    if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
> -        cpumask = priv->autoCpuset;
> -    else
> -        cpumask = vm->def->cpumask;
> -
> -    if (cpumask) {
> -        if (qemuDomainHotplugPinThread(cpumask, iothread_id,
> -                                       iothrid->thread_id, cgroup_iothread) < 0)
> -            goto cleanup;
> -    }
> +    if (qemuProcessSetupIOThread(vm, iothrid) < 0)
> +        goto cleanup;
> 
>      ret = 0;
> 
> @@ -5939,10 +5844,8 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
>              VIR_FREE(new_iothreads[idx]);
>          VIR_FREE(new_iothreads);
>      }
> -    VIR_FREE(mem_mask);
>      virDomainAuditIOThread(vm, orig_niothreads, new_niothreads,
>                             "update", rc == 0);
> -    virCgroupFree(&cgroup_iothread);
>      VIR_FREE(alias);
>      return ret;
> 




More information about the libvir-list mailing list