Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 May 2021 12:16:54 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 9bb84c23e762 - main - accounting: explicitly mark the exiting thread as doing accounting
Message-ID:  <202105221216.14MCGsvi011717@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=9bb84c23e762e7d1b6154ef4afdcc80662692e76

commit 9bb84c23e762e7d1b6154ef4afdcc80662692e76
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-05-13 23:48:58 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-05-22 12:16:08 +0000

    accounting: explicitly mark the exiting thread as doing accounting
    
    and use the mark to stop applying file size limits on the write of
    the accounting record.  This allows to remove hack to clear process
    limits in acct_process(), and avoids the bug with the clearing being
    ineffective because limits are also cached in the thread structure.
    
    Reported and reviewed by:       markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D30257
---
 sys/kern/kern_acct.c | 26 +++++---------------------
 sys/kern/vfs_vnops.c |  3 ++-
 sys/sys/proc.h       |  1 +
 3 files changed, 8 insertions(+), 22 deletions(-)

diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 675113c6b2ba..4c1efada10da 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -141,7 +141,6 @@ static int		 acct_configured;
 static int		 acct_suspended;
 static struct vnode	*acct_vp;
 static struct ucred	*acct_cred;
-static struct plimit	*acct_limit;
 static int		 acct_flags;
 static struct sx	 acct_sx;
 
@@ -206,7 +205,7 @@ int
 sys_acct(struct thread *td, struct acct_args *uap)
 {
 	struct nameidata nd;
-	int error, flags, i, replacing;
+	int error, flags, replacing;
 
 	error = priv_check(td, PRIV_ACCT);
 	if (error)
@@ -276,15 +275,6 @@ sys_acct(struct thread *td, struct acct_args *uap)
 		return (error);
 	}
 
-	/*
-	 * Create our own plimit object without limits. It will be assigned
-	 * to exiting processes.
-	 */
-	acct_limit = lim_alloc();
-	for (i = 0; i < RLIM_NLIMITS; i++)
-		acct_limit->pl_rlimit[i].rlim_cur =
-		    acct_limit->pl_rlimit[i].rlim_max = RLIM_INFINITY;
-
 	/*
 	 * Save the new accounting file vnode, and schedule the new
 	 * free space watcher.
@@ -328,7 +318,6 @@ acct_disable(struct thread *td, int logging)
 	sx_assert(&acct_sx, SX_XLOCKED);
 	error = vn_close(acct_vp, acct_flags, acct_cred, td);
 	crfree(acct_cred);
-	lim_free(acct_limit);
 	acct_configured = 0;
 	acct_vp = NULL;
 	acct_cred = NULL;
@@ -349,7 +338,6 @@ acct_process(struct thread *td)
 {
 	struct acctv3 acct;
 	struct timeval ut, st, tmp;
-	struct plimit *oldlim;
 	struct proc *p;
 	struct rusage ru;
 	int t, ret;
@@ -374,6 +362,7 @@ acct_process(struct thread *td)
 	}
 
 	p = td->td_proc;
+	td->td_pflags2 |= TDP2_ACCT;
 
 	/*
 	 * Get process accounting information.
@@ -426,20 +415,14 @@ acct_process(struct thread *td)
 	/* (8) The boolean flags that tell how the process terminated, etc. */
 	acct.ac_flagx = p->p_acflag;
 
+	PROC_UNLOCK(p);
+
 	/* Setup ancillary structure fields. */
 	acct.ac_flagx |= ANVER;
 	acct.ac_zero = 0;
 	acct.ac_version = 3;
 	acct.ac_len = acct.ac_len2 = sizeof(acct);
 
-	/*
-	 * Eliminate rlimits (file size limit in particular).
-	 */
-	oldlim = p->p_limit;
-	p->p_limit = lim_hold(acct_limit);
-	PROC_UNLOCK(p);
-	lim_free(oldlim);
-
 	/*
 	 * Write the accounting information to the file.
 	 */
@@ -447,6 +430,7 @@ acct_process(struct thread *td)
 	    (off_t)0, UIO_SYSSPACE, IO_APPEND|IO_UNIT, acct_cred, NOCRED,
 	    NULL, td);
 	sx_sunlock(&acct_sx);
+	td->td_pflags2 &= ~TDP2_ACCT;
 	return (ret);
 }
 
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 6bf798cd73c5..69da69da19d4 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -2360,7 +2360,8 @@ vn_rlimit_fsize(const struct vnode *vp, const struct uio *uio,
     struct thread *td)
 {
 
-	if (vp->v_type != VREG || td == NULL)
+	if (vp->v_type != VREG || td == NULL ||
+	    (td->td_pflags2 & TDP2_ACCT) != 0)
 		return (0);
 	if ((uoff_t)uio->uio_offset + uio->uio_resid >
 	    lim_cur(td, RLIMIT_FSIZE)) {
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index ebd396b4aebe..d957412424aa 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -528,6 +528,7 @@ do {									\
 
 #define	TDP2_SBPAGES	0x00000001 /* Owns sbusy on some pages */
 #define	TDP2_COMPAT32RB	0x00000002 /* compat32 ABI for robust lists */
+#define	TDP2_ACCT	0x00000004 /* Doing accounting */
 
 /*
  * Reasons that the current thread can not be run yet.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202105221216.14MCGsvi011717>