[libvirt PATCH v2 1/4] util: Try to get limits from /proc
Michal Privoznik
mprivozn at redhat.com
Mon Mar 15 13:28:07 UTC 2021
On 3/15/21 12:22 PM, Andrea Bolognani wrote:
> On Mon, 2021-03-15 at 11:57 +0100, Andrea Bolognani wrote:
>> The changes you're suggesting are not trivial enough for me to feel
>> comfortable simply applying them locally and then pushing right away.
>> Would the diff below look reasonable squashed in?
>>
>> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
>> index 4fa854090d..cae0dabae3 100644
>> --- a/src/util/virprocess.c
>> +++ b/src/util/virprocess.c
>> @@ -799,16 +799,17 @@ virProcessGetLimitFromProc(pid_t pid,
>> size_t i;
>>
>> if (!(label = virProcessLimitResourceToLabel(resource))) {
>> + virReportSystemError(EINVAL, "%s", _("Invalid resource"));
>> return -1;
>> }
>>
>> procfile = g_strdup_printf("/proc/%lld/limits", (long long)pid);
>>
>> if (virFileReadAllQuiet(procfile, 2048, &buf) < 0)
>> - return -1;
>> + goto error;
>>
> [...]
>>
>> + error:
>> + virReportSystemError(EIO, "%s", _("Input/output error"));
>> + return -1;
>> }
>> # else /* !defined(__linux__) */
>> static int
>> @@ -846,6 +851,7 @@ virProcessGetLimitFromProc(pid_t pid G_GNUC_UNUSED,
>> int resource G_GNUC_UNUSED,
>> struct rlimit *limit G_GNUC_UNUSED)
>> {
>> + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
>> return -1;
>> }
>> # endif /* !defined(__linux__) */
>
> This probably makes more sense:
>
> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
> index 4fa854090d..b173856b7a 100644
> --- a/src/util/virprocess.c
> +++ b/src/util/virprocess.c
> @@ -799,16 +799,17 @@ virProcessGetLimitFromProc(pid_t pid,
> size_t i;
>
> if (!(label = virProcessLimitResourceToLabel(resource))) {
> + errno = EINVAL;
> return -1;
> }
>
> procfile = g_strdup_printf("/proc/%lld/limits", (long long)pid);
>
> if (virFileReadAllQuiet(procfile, 2048, &buf) < 0)
> - return -1;
> + goto error;
virFileReadAllQuiet() sets errno, this would just overwrite it with
something less specific.
>
> if (!(lines = g_strsplit(buf, "\n", 0)))
> - return -1;
> + goto error;
I think this check can be dropped. g_strsplit() doesn't ever return NULL
really, does it?
>
> for (i = 0; lines[i]; i++) {
> g_autofree char *softLimit = NULL;
> @@ -820,25 +821,29 @@ virProcessGetLimitFromProc(pid_t pid,
> continue;
>
> if (sscanf(line, "%ms %ms %*s", &softLimit, &hardLimit) < 2)
> - return -1;
> + goto error;
>
> if (STREQ(softLimit, "unlimited")) {
> limit->rlim_cur = RLIM_INFINITY;
> } else {
> if (virStrToLong_ull(softLimit, NULL, 10, &tmp) < 0)
> - return -1;
> + goto error;
> limit->rlim_cur = tmp;
> }
> if (STREQ(hardLimit, "unlimited")) {
> limit->rlim_max = RLIM_INFINITY;
> } else {
> if (virStrToLong_ull(hardLimit, NULL, 10, &tmp) < 0)
> - return -1;
> + goto error;
> limit->rlim_max = tmp;
> }
> }
>
> return 0;
> +
> + error:
> + errno = EIO;
> + return -1;
> }
> # else /* !defined(__linux__) */
> static int
> @@ -846,6 +851,7 @@ virProcessGetLimitFromProc(pid_t pid G_GNUC_UNUSED,
> int resource G_GNUC_UNUSED,
> struct rlimit *limit G_GNUC_UNUSED)
> {
> + errno = ENOSYS;
> return -1;
> }
> # endif /* !defined(__linux__) */
>
The rest looks good.
Michal
More information about the libvir-list
mailing list