[LTP] [PATCH 1/2] syscalls/msgstress03: fix fork failure on small memory systems
Krzysztof Kozlowski
krzysztof.kozlowski@canonical.com
Wed Jun 23 13:27:41 CEST 2021
On 23/06/2021 12:36, Cyril Hrubis wrote:
> Hi!
>> +/*
>> + * Get the effective session UID - either one invoking current test via sudo
>> + * or the real UID.
>> + */
>> +int get_session_uid(void)
>> +{
>> + const char *sudo_uid;
>> +
>> + sudo_uid = getenv("SUDO_UID");
>> + if (sudo_uid) {
>> + int real_uid;
>> +
>> + TEST(sscanf(sudo_uid, "%u", &real_uid));
>> + if (TEST_RETURN != 1) {
>> +#ifdef DEBUG
>> + tst_resm(TINFO, "No SUDO_UID from env");
>> +#endif
>> + } else {
>> + return real_uid;
>> + }
>> + }
>> +
>> + return getuid();
>> +}
>> +
>> /*
>> * rm_shm() - removes a shared memory segment.
>> */
>> @@ -218,3 +243,36 @@ int get_max_msgqueues(void)
>> fclose(f);
>> return atoi(buff);
>> }
>> +
>> +/*
>> + * Get the limit of processes for current session configured by systemd user.slice.
>> + * This also applies to root user.
>> + */
>> +int get_pids_limit(void)
>> +{
>> + int real_uid, ret;
>> + char path[PATH_MAX];
>> + long unsigned int max_pids;
>> +
>> + real_uid = get_session_uid();
>> + if (TEST_RETURN != 1) {
>> + tst_resm(TINFO, "Cannot get UID");
>> + return -1;
>> + }
>> +
>> + ret = snprintf(path, sizeof(path),
>> + "/sys/fs/cgroup/pids/user.slice/user-%d.slice/pids.max",
>> + real_uid);
>> + if (ret < 0 || (size_t)ret >= sizeof(path))
>> + return -1;
>> +
>> + if (access(path, R_OK) != 0) {
>> + tst_resm(TINFO, "Cannot read session user limits from '%s'", path);
>> + return -1;
>> + }
>> +
>> + SAFE_FILE_SCANF(cleanup, path, "%lu", &max_pids);
>> + tst_resm(TINFO, "Found limit of processes %lu (from %s)", max_pids, path);
>> +
>> + return max_pids;
>> +}
>
> This is quite generic functionality so we may as well put it into the
> include/tst_pid.h and lib/tst_pid.c as tst_get_pids_limit().
Sure, I can move it there.
> And we do already have tst_get_free_pids_() in there so we can substract
> that as well if applicable to make it a bit more precise.
I can just merge the code into tst_get_free_pids_(). It's basically the
same purpose - how many processes can we have more.
>
> Also I think that it may make sense to put the part that substract some
> constant to leave room for the rest of the system to the library as
> well. There is no point in having this heuristic in each test.
Or pass it as argument to the tst_get_pids_limit()?
Best regards,
Krzysztof
More information about the ltp
mailing list