Hi Teo, Still: s/programatically/programmatically On Mon, Feb 06, 2023 at 05:54:28PM +0000, Teo Couprie Diaz wrote:
In some distributions, the two files used in lib/tst_pid.c are not available, but cgroups still imposes a task limit far smaller than the kernel pid_max. If the cgroup sysfs is mounted, we can use it to retrieve the current task limit imposed to the process. Implement the retrieval of this limit.
This can be done by first checking /proc/self/cgroup to get the cgroup the process is in, which will be a path under the cgroup sysfs. To get the path to the cgroup sysfs, check /proc/self/mountinfo. Finally, concatenate those two paths with pid.max to get the full path to the file containing the limit.
This patch changes the way read_session_pids_limit is called, not passing a format string to be completed anymore, but is still used the same way. A following patch will update this function.
This fixes failures for msgstress04.
Signed-off-by: Teo Couprie Diaz teo.coupriediaz@arm.com
lib/tst_pid.c | 53 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-)
diff --git a/lib/tst_pid.c b/lib/tst_pid.c index 21cadef2a..f140acbc0 100644 --- a/lib/tst_pid.c +++ b/lib/tst_pid.c @@ -31,8 +31,6 @@ #include "tst_safe_macros.h" #define PID_MAX_PATH "/proc/sys/kernel/pid_max" -#define CGROUPS_V1_SLICE_FMT "/sys/fs/cgroup/pids/user.slice/user-%d.slice/pids.max" -#define CGROUPS_V2_SLICE_FMT "/sys/fs/cgroup/user.slice/user-%d.slice/pids.max" /* Leave some available processes for the OS */ #define PIDS_RESERVE 50 @@ -96,18 +94,53 @@ static int read_session_pids_limit(const char *path_fmt, int uid, static int get_session_pids_limit(void (*cleanup_fn) (void)) {
- int max_pids, uid;
- char path[PATH_MAX + 1];
- char cgroup_pids[PATH_MAX + 1];
- char catchall;
- int uid, ret = 0;
uid = get_session_uid();
- max_pids = read_session_pids_limit(CGROUPS_V2_SLICE_FMT, uid, cleanup_fn);
- if (max_pids < 0)
max_pids = read_session_pids_limit(CGROUPS_V1_SLICE_FMT, uid,
cleanup_fn);
- /* Check for generic cgroup v1 pid.max */
- ret = FILE_LINES_SCANF(cleanup_fn, "/proc/self/cgroup",
"%*d:pids:%s\n", cgroup_pids);
- /*
* This is a bit of a hack of scanf format strings. Indeed, if all
* conversion specifications have been matched the return of scanf will be
* the same whether any outstanding literal characters match or not.
* As we want to match the literal part, we can add a catchall after it
* so that it won't be counted if the literal part doesn't match.
* This makes the macro go to the next line until the catchall, thus
* the literal parts, is matched.
s/parts/part or s/is matched/are matched
I can make both changes when applying the patch so no need of respin, if you are ok with that.
*
* Assume that the root of the mount is '/'. It can be anything,
* but it should be '/' on any normal system.
*/
- if (!ret)
ret = FILE_LINES_SCANF(cleanup_fn, "/proc/self/mountinfo",
"%*s %*s %*s %*s %s %*s %*s - %*s cgroup %*[rw],pid%c",
path, &catchall);
I think here we need to swap the "%*s cgroup": as per the mountinfo docs: the first filed after the '-' separator is the filesystem type, being cgroup in our case, followed by filesystem specific information, which may or may not be 'cgroup'. While testing cgroup v1 this filed will actually be 'pids' (see below) which means with the current state there will be no match: 23 22 0:21 / /sys/fs/cgroup/pids rw,relatime - cgroup pids rw,pids
I can make that change as well, though I'd like the confirmation from your side before I apply the patches.
--- BR B.
- if (!ret) {
strncat(path, cgroup_pids, PATH_MAX);
strncat(path, "/pids.max", PATH_MAX);
return read_session_pids_limit(path, uid, cleanup_fn);
- }
- if (max_pids < 0)
return -1;
- /* Check for generic cgroup v2 pid.max */
- ret = FILE_LINES_SCANF(cleanup_fn, "/proc/self/cgroup",
"%*d::%s\n", cgroup_pids);
- if (!ret)
ret = FILE_LINES_SCANF(cleanup_fn, "/proc/self/mountinfo",
"%*s %*s %*s %*s %s %*s %*s - cgroup2 %c",
path, &catchall);
- if (!ret) {
strncat(path, cgroup_pids, PATH_MAX);
strncat(path, "/pids.max", PATH_MAX);
return read_session_pids_limit(path, uid, cleanup_fn);
- }
- return max_pids;
- return -1;
} int tst_get_free_pids_(void (*cleanup_fn) (void)) -- 2.25.1
linux-morello-ltp mailing list -- linux-morello-ltp@op-lists.linaro.org To unsubscribe send an email to linux-morello-ltp-leave@op-lists.linaro.org