From nobody Sat Oct 05 07:11:24 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4XLGmY074Mz5XrQ3; Sat, 05 Oct 2024 07:11:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4XLGmX1W5xz4NVb; Sat, 5 Oct 2024 07:11:24 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1728112284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=oic9JqzOrVEb0IAkdeSvIRgRXWLe+FegaWq7hSov1kc=; b=xtQs1kIcJY76f5Aj0USD9fRRWN0HK2WOiThRieERaQa74HgT0aHg/3C4fl6+E9+Tw6Ljg7 mTkl5iuVa4lOSd7/CVTFKoXQdII5Mfe6A9PX8d0ZjYInWLDeRBoRMoi5NzxidUeCzSeZJN Pe3NxGho/RhEwn7U3LU8NnsGV6FQPngWaCD+xludaGjj9JDAATBzGW2vhko5WxpqE1PlxZ R4nAZpL1v0aEYuo+/oSHd+aT6g83o6szJh4J5GLojW7ExvmFhbKED7VgFud8HbMzbQwLtL CQRPDEHlYjkeRLfRiLGJECTzRS00zZsTmxjxXn8W91iJsPa3AqrIdt49U5RlIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1728112284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=oic9JqzOrVEb0IAkdeSvIRgRXWLe+FegaWq7hSov1kc=; b=jf7bdfSfXUi6uyd8MUBYeZAA8MbfnZv3wz+89mSLtioAxJ2Dw4iB2Bn/49b1O1LTatgMKp JJHGOxUQWlBTmsq9678cwmW3U+iaBkSBDSnDsr5wZH6+ggBc3My9aW0Xr1GtvuuN7Ho8L6 bLV28GgttjnKlIv/IVel4Rmw+WSEehyyQiRNEVz+imJT2L61+RVkuRrU0DQDHbeSXYMWOt x/YQxFMORcKswrkgPjl18xnFtDbHQJ3m/bT1PRkc13tFFR7Cs/pDwkwvaqDjKbI7CjC3UL 7fwwA4x71aUfTB4iJpPQpa5zSiFaKVdb9WQazL1N+g1DhDq86WAGB/Jom1QLZw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1728112284; a=rsa-sha256; cv=none; b=J3zndI6lfxYVIGYTaD7ayDGxrzlY7qyPmvoGkWuKu//c3aLkLVMnawrgFmCVOh0flBCeuZ 0IR3CgDEpwQ2g+Sox5x9ZFNzxhM1LoifM8rEFaI3sOkRBOidMJa4yjrVCLP8d59fv9RDlM lgxnp4ze+P8d3BqPtHCi9Oh6+g7EOYTMUR55gdvIXcm3qz79bFRVD5txReHCJ0HwcYcXz4 f/5cEUaE+hKw9FynkS2mz6LYTnfIF8P8uq7qjF0GC+o6SnYbXyyQ40Ya4ezgDM1Wuf6v2A sZzNuqKQlCwEEww9ul82w/7G+tGvxJZhB5Xv3I96yKpL1Eyx6nYAQFVdBEAvwA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4XLGmX15xfz17j8; Sat, 5 Oct 2024 07:11:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 4957BO9Q001432; Sat, 5 Oct 2024 07:11:24 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 4957BO82001429; Sat, 5 Oct 2024 07:11:24 GMT (envelope-from git) Date: Sat, 5 Oct 2024 07:11:24 GMT Message-Id: <202410050711.4957BO82001429@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 7c41d08320a1 - stable/14 - Add getrlimitusage(2) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 7c41d08320a18634a32bba727dc5f9f78086e746 Auto-Submitted: auto-generated The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=7c41d08320a18634a32bba727dc5f9f78086e746 commit 7c41d08320a18634a32bba727dc5f9f78086e746 Author: Konstantin Belousov AuthorDate: 2024-09-20 15:18:38 +0000 Commit: Konstantin Belousov CommitDate: 2024-10-05 07:08:55 +0000 Add getrlimitusage(2) (cherry picked from commit f028f44ef3cb10aafadf8b9f29954ed58bd88c70) --- sys/kern/kern_resource.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ sys/kern/syscalls.master | 7 +++ sys/sys/resource.h | 3 ++ 3 files changed, 125 insertions(+) diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 6b9930962859..b4548b38f633 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,7 @@ #include #include #include +#include static MALLOC_DEFINE(M_PLIMIT, "plimit", "plimit structures"); static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures"); @@ -807,6 +809,119 @@ sys_getrlimit(struct thread *td, struct getrlimit_args *uap) return (error); } +static int +getrlimitusage_one(struct proc *p, u_int which, int flags, rlim_t *res) +{ + struct thread *td; + struct uidinfo *ui; + struct vmspace *vm; + uid_t uid; + int error; + + error = 0; + PROC_LOCK(p); + uid = (flags & GETRLIMITUSAGE_EUID) == 0 ? p->p_ucred->cr_ruid : + p->p_ucred->cr_uid; + PROC_UNLOCK(p); + + ui = uifind(uid); + vm = vmspace_acquire_ref(p); + + switch (which) { + case RLIMIT_CPU: + PROC_LOCK(p); + PROC_STATLOCK(p); + FOREACH_THREAD_IN_PROC(p, td) + ruxagg(p, td); + *res = p->p_rux.rux_runtime; + PROC_STATUNLOCK(p); + PROC_UNLOCK(p); + *res /= cpu_tickrate(); + break; + case RLIMIT_FSIZE: + error = ENXIO; + break; + case RLIMIT_DATA: + if (vm == NULL) + error = ENXIO; + else + *res = vm->vm_dsize * PAGE_SIZE; + break; + case RLIMIT_STACK: + if (vm == NULL) + error = ENXIO; + else + *res = vm->vm_ssize * PAGE_SIZE; + break; + case RLIMIT_CORE: + error = ENXIO; + break; + case RLIMIT_RSS: + if (vm == NULL) + error = ENXIO; + else + *res = vmspace_resident_count(vm) * PAGE_SIZE; + break; + case RLIMIT_MEMLOCK: + if (vm == NULL) + error = ENXIO; + else + *res = pmap_wired_count(vmspace_pmap(vm)) * PAGE_SIZE; + break; + case RLIMIT_NPROC: + *res = ui->ui_proccnt; + break; + case RLIMIT_NOFILE: + *res = proc_nfiles(p); + break; + case RLIMIT_SBSIZE: + *res = ui->ui_sbsize; + break; + case RLIMIT_VMEM: + if (vm == NULL) + error = ENXIO; + else + *res = vm->vm_map.size; + break; + case RLIMIT_NPTS: + *res = ui->ui_ptscnt; + break; + case RLIMIT_SWAP: + *res = ui->ui_vmsize; + break; + case RLIMIT_KQUEUES: + *res = ui->ui_kqcnt; + break; + case RLIMIT_UMTXP: + *res = ui->ui_umtxcnt; + break; + case RLIMIT_PIPEBUF: + *res = ui->ui_pipecnt; + break; + default: + error = EINVAL; + break; + } + + vmspace_free(vm); + uifree(ui); + return (error); +} + +int +sys_getrlimitusage(struct thread *td, struct getrlimitusage_args *uap) +{ + rlim_t res; + int error; + + if ((uap->flags & ~(GETRLIMITUSAGE_EUID)) != 0) + return (EINVAL); + error = getrlimitusage_one(curproc, uap->which, uap->flags, &res); + if (error == 0) + error = copyout(&res, uap->res, sizeof(res)); + return (error); +} + /* * Transform the running time and tick information for children of proc p * into user and system time usage. diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 47b67e4dbaa7..825ab1a4536c 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -3347,5 +3347,12 @@ uintptr_t idx2 ); } +589 AUE_NULL STD|CAPENABLED { + int getrlimitusage( + u_int which, + int flags, + _Out_ rlim_t *res + ); + } ; vim: syntax=off diff --git a/sys/sys/resource.h b/sys/sys/resource.h index 0c6b34f7ca0f..77119a1e5302 100644 --- a/sys/sys/resource.h +++ b/sys/sys/resource.h @@ -173,6 +173,9 @@ struct loadavg { #define CP_IDLE 4 #define CPUSTATES 5 +/* getrlimitusage flags */ +#define GETRLIMITUSAGE_EUID 0x0001 + #endif /* __BSD_VISIBLE */ #ifdef _KERNEL