Module Name: src Committed By: christos Date: Sun May 12 17:22:29 UTC 2024
Modified Files: src/sys/miscfs/procfs: procfs.h procfs_limit.c procfs_subr.c procfs_vfsops.c procfs_vnops.c Log Message: PR/58240: Ricardo Branco: Add support for proc/self/limits as used by Linux To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/miscfs/procfs/procfs.h cvs rdiff -u -r1.4 -r1.5 src/sys/miscfs/procfs/procfs_limit.c cvs rdiff -u -r1.117 -r1.118 src/sys/miscfs/procfs/procfs_subr.c cvs rdiff -u -r1.114 -r1.115 src/sys/miscfs/procfs/procfs_vfsops.c cvs rdiff -u -r1.230 -r1.231 src/sys/miscfs/procfs/procfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/procfs/procfs.h diff -u src/sys/miscfs/procfs/procfs.h:1.84 src/sys/miscfs/procfs/procfs.h:1.85 --- src/sys/miscfs/procfs/procfs.h:1.84 Wed Jan 17 05:20:12 2024 +++ src/sys/miscfs/procfs/procfs.h Sun May 12 13:22:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs.h,v 1.84 2024/01/17 10:20:12 hannken Exp $ */ +/* $NetBSD: procfs.h,v 1.85 2024/05/12 17:22:29 christos Exp $ */ /* * Copyright (c) 1993 @@ -97,6 +97,7 @@ typedef enum { PFSfpregs, /* the process's FP register set */ PFSloadavg, /* load average (if -o linux) */ PFSlimit, /* resource limits */ + PFSlimits, /* resource limits, Linux style (if -o linux) */ PFSmap, /* memory map */ PFSmaps, /* memory map, Linux style (if -o linux) */ PFSmem, /* the process's memory image */ @@ -269,6 +270,8 @@ int procfs_doauxv(struct lwp *, struct p struct uio *); int procfs_dolimit(struct lwp *, struct proc *, struct pfsnode *, struct uio *); +int procfs_dolimits(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); void procfs_hashrem(struct pfsnode *); int procfs_getfp(struct pfsnode *, struct proc *, struct file **); Index: src/sys/miscfs/procfs/procfs_limit.c diff -u src/sys/miscfs/procfs/procfs_limit.c:1.4 src/sys/miscfs/procfs/procfs_limit.c:1.5 --- src/sys/miscfs/procfs/procfs_limit.c:1.4 Sat May 23 19:42:43 2020 +++ src/sys/miscfs/procfs/procfs_limit.c Sun May 12 13:22:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_limit.c,v 1.4 2020/05/23 23:42:43 ad Exp $ */ +/* $NetBSD: procfs_limit.c,v 1.5 2024/05/12 17:22:29 christos Exp $ */ /*- * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -30,7 +30,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_limit.c,v 1.4 2020/05/23 23:42:43 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_limit.c,v 1.5 2024/05/12 17:22:29 christos Exp $"); + +#if defined(_KERNEL_OPT) +#include "opt_sysv.h" +#endif #include <sys/param.h> #include <sys/systm.h> @@ -38,8 +42,35 @@ __KERNEL_RCSID(0, "$NetBSD: procfs_limit #include <sys/malloc.h> #include <sys/resource.h> #include <miscfs/procfs/procfs.h> - -#define MAXBUFFERSIZE (256 * 1024) +#include <compat/linux/common/linux_misc.h> +#ifdef SYSVMSG +#include <sys/msg.h> +#endif + +/* Taken from FreeBSD sys/compat/linprocfs/linprocfs.c */ +static const struct linux_rlimit_ident { + const char *desc; + const char *unit; + unsigned int rlim_id; +} linux_rlimits_ident[] = { + { "Max cpu time", "seconds", RLIMIT_CPU }, + { "Max file size", "bytes", RLIMIT_FSIZE }, + { "Max data size", "bytes", RLIMIT_DATA }, + { "Max stack size", "bytes", RLIMIT_STACK }, + { "Max core file size", "bytes", RLIMIT_CORE }, + { "Max resident set", "bytes", RLIMIT_RSS }, + { "Max processes", "processes", RLIMIT_NPROC }, + { "Max open files", "files", RLIMIT_NOFILE }, + { "Max locked memory", "bytes", RLIMIT_MEMLOCK }, + { "Max address space", "bytes", RLIMIT_AS }, + { "Max file locks", "locks", LINUX_RLIMIT_LOCKS }, + { "Max pending signals", "signals", LINUX_RLIMIT_SIGPENDING }, + { "Max msgqueue size", "bytes", LINUX_RLIMIT_MSGQUEUE }, + { "Max nice priority", "", LINUX_RLIMIT_NICE }, + { "Max realtime priority", "", LINUX_RLIMIT_RTPRIO }, + { "Max realtime timeout", "us", LINUX_RLIMIT_RTTIME }, + { 0, 0, 0 } +}; static size_t prl(char *buf, size_t len, intmax_t lim, char sep) @@ -92,3 +123,72 @@ procfs_dolimit(struct lwp *curl, struct return error; } + +int +procfs_dolimits(struct lwp *curl, struct proc *p, struct pfsnode *pfs, + struct uio *uio) +{ + const struct linux_rlimit_ident *li; + int error; + char *buffer; + size_t bufsize, pos; + struct rlimit rl, rlimits[RLIM_NLIMITS]; + + if (uio->uio_rw != UIO_READ) + return EOPNOTSUPP; + + mutex_enter(&proc_lock); + mutex_enter(p->p_lock); + memcpy(rlimits, p->p_rlimit, sizeof(rlimits)); + mutex_exit(p->p_lock); + mutex_exit(&proc_lock); + + error = 0; + + bufsize = (64 * 3) * __arraycount(linux_rlimits_ident); + buffer = malloc(bufsize, M_TEMP, M_WAITOK); + pos = snprintf(buffer, bufsize, "%-26s%-21s%-21s%-21s\n", + "Limit", "Soft Limit", "Hard Limit", "Units"); + for (li = linux_rlimits_ident; li->desc != NULL; ++li) { + switch (li->rlim_id) + { + case LINUX_RLIMIT_LOCKS: + case LINUX_RLIMIT_RTTIME: + case LINUX_RLIMIT_SIGPENDING: + rl.rlim_cur = RLIM_INFINITY; + break; + case LINUX_RLIMIT_MSGQUEUE: +#ifdef SYSVMSG + rl.rlim_cur = rl.rlim_max = msginfo.msgmnb; + break; +#endif + case LINUX_RLIMIT_NICE: + case LINUX_RLIMIT_RTPRIO: + rl.rlim_cur = rl.rlim_max = 0; + break; + default: + rl = rlimits[li->rlim_id]; + break; + } + if (rl.rlim_cur == RLIM_INFINITY) + pos += snprintf(buffer + pos, bufsize - pos, + "%-26s%-21s%-21s%-10s\n", + li->desc, "unlimited", "unlimited", li->unit); + else + pos += snprintf(buffer + pos, bufsize - pos, + "%-26s%-21llu%-21llu%-10s\n", + li->desc, (unsigned long long)rl.rlim_cur, + (unsigned long long)rl.rlim_max, li->unit); + } + + if ((uintmax_t)uio->uio_offset < pos) + error = uiomove(buffer + uio->uio_offset, + pos - uio->uio_offset, uio); + else + error = 0; + + if (buffer != NULL) + free(buffer, M_TEMP); + + return error; +} Index: src/sys/miscfs/procfs/procfs_subr.c diff -u src/sys/miscfs/procfs/procfs_subr.c:1.117 src/sys/miscfs/procfs/procfs_subr.c:1.118 --- src/sys/miscfs/procfs/procfs_subr.c:1.117 Wed Jan 17 05:20:12 2024 +++ src/sys/miscfs/procfs/procfs_subr.c Sun May 12 13:22:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_subr.c,v 1.117 2024/01/17 10:20:12 hannken Exp $ */ +/* $NetBSD: procfs_subr.c,v 1.118 2024/05/12 17:22:29 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.117 2024/01/17 10:20:12 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.118 2024/05/12 17:22:29 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -215,6 +215,10 @@ procfs_rw(void *v) error = procfs_dolimit(curl, p, pfs, uio); break; + case PFSlimits: + error = procfs_dolimits(curl, p, pfs, uio); + break; + case PFSmap: error = procfs_domap(curl, p, pfs, uio, 0); break; Index: src/sys/miscfs/procfs/procfs_vfsops.c diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.114 src/sys/miscfs/procfs/procfs_vfsops.c:1.115 --- src/sys/miscfs/procfs/procfs_vfsops.c:1.114 Wed Jan 17 05:21:01 2024 +++ src/sys/miscfs/procfs/procfs_vfsops.c Sun May 12 13:22:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vfsops.c,v 1.114 2024/01/17 10:21:01 hannken Exp $ */ +/* $NetBSD: procfs_vfsops.c,v 1.115 2024/05/12 17:22:29 christos Exp $ */ /* * Copyright (c) 1993 @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.114 2024/01/17 10:21:01 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.115 2024/05/12 17:22:29 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -431,7 +431,8 @@ procfs_loadvnode(struct mount *mp, struc case PFSloadavg: /* /proc/loadavg = -r--r--r-- */ case PFSstatm: /* /proc/N/statm = -r--r--r-- */ case PFSversion: /* /proc/version = -r--r--r-- */ - case PFSlimit: /* /proc/limit = -r--r--r-- */ + case PFSlimit: /* /proc/N/limit = -r--r--r-- */ + case PFSlimits: /* /proc/N/limits = -r--r--r-- */ pfs->pfs_mode = S_IRUSR|S_IRGRP|S_IROTH; vp->v_type = VREG; break; Index: src/sys/miscfs/procfs/procfs_vnops.c diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.230 src/sys/miscfs/procfs/procfs_vnops.c:1.231 --- src/sys/miscfs/procfs/procfs_vnops.c:1.230 Wed Jan 17 05:19:21 2024 +++ src/sys/miscfs/procfs/procfs_vnops.c Sun May 12 13:22:29 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vnops.c,v 1.230 2024/01/17 10:19:21 hannken Exp $ */ +/* $NetBSD: procfs_vnops.c,v 1.231 2024/05/12 17:22:29 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc. @@ -105,7 +105,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.230 2024/01/17 10:19:21 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.231 2024/05/12 17:22:29 christos Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -171,6 +171,7 @@ static const struct proc_target { { DT_REG, N("file"), PFSfile, procfs_validfile }, { DT_REG, N("fpregs"), PFSfpregs, procfs_validfpregs }, { DT_REG, N("limit"), PFSlimit, NULL }, + { DT_REG, N("limits"), PFSlimits, procfs_validfile_linux }, { DT_REG, N("map"), PFSmap, procfs_validmap }, { DT_REG, N("maps"), PFSmaps, procfs_validmap }, { DT_REG, N("mem"), PFSmem, NULL }, @@ -704,6 +705,7 @@ procfs_getattr(void *v) case PFSmap: case PFSmaps: case PFSlimit: + case PFSlimits: case PFSauxv: vap->va_nlink = 1; vap->va_uid = kauth_cred_geteuid(procp->p_cred); @@ -844,6 +846,7 @@ procfs_getattr(void *v) vap->va_bytes = vap->va_size = 0; break; case PFSlimit: + case PFSlimits: case PFSmap: case PFSmaps: /*