[libvirt] [PATCH v2 1/2] Add virProcessGetPids to get all tasks of a process

John Ferlan jferlan at redhat.com
Tue Jun 16 13:16:50 UTC 2015



On 06/16/2015 05:18 AM, Cédric Bosdonnat wrote:
> This function gets all the PIDs listed in /proc/PID/task. This will be
> needed at least to move all qmeu-nbd tasks to the container cgroup.
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virprocess.c    | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/virprocess.h    |  2 ++
>  3 files changed, 50 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6a95fb9..780cfbb 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1986,6 +1986,7 @@ virProcessAbort;
>  virProcessExitWithStatus;
>  virProcessGetAffinity;
>  virProcessGetNamespaces;
> +virProcessGetPids;
>  virProcessGetStartTime;
>  virProcessKill;
>  virProcessKillPainfully;
> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
> index 7a79970..ce5e106 100644
> --- a/src/util/virprocess.c
> +++ b/src/util/virprocess.c
> @@ -608,6 +608,53 @@ int virProcessGetAffinity(pid_t pid ATTRIBUTE_UNUSED,
>  #endif /* HAVE_SCHED_GETAFFINITY */
>  
>  
> +int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids)
> +{
> +    int ret = -1;
> +    char *taskPath = NULL;
> +    DIR *dir = NULL;
> +    int value;
> +    struct dirent *ent;
> +
> +    *npids = 0;
> +    *pids = NULL;
> +
> +    if (virAsprintf(&taskPath, "/proc/%llu/task",
> +                    (unsigned long long)pid) < 0)
> +        goto cleanup;
> +
> +    if (!(dir = opendir(taskPath)))
> +        goto cleanup;
> +
> +    while ((value = virDirRead(dir, &ent, taskPath)) > 0) {
> +        pid_t tmp_pid;
> +
> +        /* Skip . and .. */
> +        if (STRPREFIX(ent->d_name, "."))
> +            continue;
> +
> +        if (virStrToLong_i(ent->d_name, NULL, 10, &tmp_pid) < 0)
> +            goto cleanup;
> +
> +        if (VIR_APPEND_ELEMENT(*pids, *npids, tmp_pid) < 0)
> +            goto cleanup;
> +    }
> +
> +    if (value < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +
> + cleanup:
> +    if (!dir)
> +        closedir(dir);

^^
Coverity got grumpy about a RESOURCE_LEAK here.

I'll fix and push the obvious 1 character less patch

John
> +    VIR_FREE(taskPath);
> +    if (ret < 0)
> +        VIR_FREE(*pids);
> +    return ret;
> +}
> +
> +
>  int virProcessGetNamespaces(pid_t pid,
>                              size_t *nfdlist,
>                              int **fdlist)
> diff --git a/src/util/virprocess.h b/src/util/virprocess.h
> index c812882..86a633d 100644
> --- a/src/util/virprocess.h
> +++ b/src/util/virprocess.h
> @@ -62,6 +62,8 @@ int virProcessGetAffinity(pid_t pid,
>                            virBitmapPtr *map,
>                            int maxcpu);
>  
> +int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids);
> +
>  int virProcessGetStartTime(pid_t pid,
>                             unsigned long long *timestamp);
>  
> 




More information about the libvir-list mailing list