[libvirt PATCH 04/17] util: Introduce virProcess{Get,Set}Limit()

Michal Privoznik mprivozn at redhat.com
Mon Mar 8 10:31:03 UTC 2021


On 3/5/21 8:13 PM, Andrea Bolognani wrote:
> These functions abstract part of the existing logic, which is
> the same in all virProcessSetMax*() functions, and changes it
> so that which underlying syscall is used depends on their
> availability rather than on the context in which they are
> called: since prlimit() and {g,s}etrlimit() have slightly
> different requirements, using the same one every single time
> should make for a more consistent experience.
> 
> As part of the change, we also remove the special case for
> passing zero to virProcessSetMax*() functions: we have removed
> all callers that depended on that functionality in the previous
> commit, so this is now safe to do and makes the semantics
> simpler.
> 
> This commit is better viewed with 'git show -w'.
> 
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>
> ---
>   src/util/virprocess.c | 175 +++++++++++++++++++++++-------------------
>   1 file changed, 95 insertions(+), 80 deletions(-)
> 
> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
> index e01ff25540..38b248217e 100644
> --- a/src/util/virprocess.c
> +++ b/src/util/virprocess.c
> @@ -738,10 +738,66 @@ virProcessPrLimit(pid_t pid G_GNUC_UNUSED,
>   }
>   #endif
>   
> +#if WITH_GETRLIMIT
> +static int
> +virProcessGetRLimit(int resource,
> +                    struct rlimit *old_limit)
> +{
> +    return getrlimit(resource, old_limit);
> +}
> +#endif /* WITH_GETRLIMIT */
> +
> +#if WITH_SETRLIMIT
> +static int
> +virProcessSetRLimit(int resource,
> +                    const struct rlimit *new_limit)
> +{
> +    return setrlimit(resource, new_limit);
> +}
> +#endif /* WITH_SETRLIMIT */
> +
> +#if WITH_GETRLIMIT

Question of preference. I'd rather have these two WITH_GETRLIMIT 
sections joined together.... [1]

> +static int
> +virProcessGetLimit(pid_t pid,
> +                   int resource,
> +                   struct rlimit *old_limit)
> +{
> +    pid_t current_pid = getpid();
> +    bool same_process = (pid == current_pid);
> +
> +    if (virProcessPrLimit(pid, resource, NULL, old_limit) == 0)
> +        return 0;
> +
> +    if (same_process && virProcessGetRLimit(resource, old_limit) == 0)
> +        return 0;
> +
> +    return -1;
> +}
> +#endif /* WITH_GETRLIMIT */
> +
> +#if WITH_SETRLIMIT

1: ... just like these two WITH_SETRLIMIT. But it's matter of taste, I 
agree.

> +static int
> +virProcessSetLimit(pid_t pid,
> +                   int resource,
> +                   const struct rlimit *new_limit)
> +{
> +    pid_t current_pid = getpid();
> +    bool same_process = (pid == current_pid);
> +
> +    if (virProcessPrLimit(pid, resource, new_limit, NULL) == 0)
> +        return 0;
> +
> +    if (same_process && virProcessSetRLimit(resource, new_limit) == 0)
> +        return 0;
> +
> +    return -1;
> +}
> +#endif /* WITH_SETRLIMIT */
> +

Michal




More information about the libvir-list mailing list