From 9a63f94c7d88667c9111225270f664c894c1fe82 Mon Sep 17 00:00:00 2001 From: visa Date: Fri, 18 Mar 2022 14:45:39 +0000 Subject: [PATCH] Use the refcnt API with struct plimit. OK bluhm@ dlg@ --- sys/kern/kern_resource.c | 14 +++++++------- sys/sys/resourcevar.h | 5 +++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 3133d2b7edc..f8d418ac526 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_resource.c,v 1.71 2021/02/08 10:51:01 mpi Exp $ */ +/* $OpenBSD: kern_resource.c,v 1.72 2022/03/18 14:45:39 visa Exp $ */ /* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */ /*- @@ -582,7 +582,7 @@ lim_startup(struct plimit *limit0) limit0->pl_rlimit[RLIMIT_RSS].rlim_max = lim; limit0->pl_rlimit[RLIMIT_MEMLOCK].rlim_max = lim; limit0->pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = lim / 3; - limit0->pl_refcnt = 1; + refcnt_init(&limit0->pl_refcnt); } /* @@ -598,14 +598,14 @@ lim_copy(struct plimit *lim) newlim = pool_get(&plimit_pool, PR_WAITOK); memcpy(newlim->pl_rlimit, lim->pl_rlimit, sizeof(struct rlimit) * RLIM_NLIMITS); - newlim->pl_refcnt = 1; + refcnt_init(&newlim->pl_refcnt); return (newlim); } void lim_free(struct plimit *lim) { - if (atomic_dec_int_nv(&lim->pl_refcnt) > 0) + if (refcnt_rele(&lim->pl_refcnt) == 0) return; pool_put(&plimit_pool, lim); } @@ -617,7 +617,7 @@ lim_fork(struct process *parent, struct process *child) mtx_enter(&parent->ps_mtx); limit = parent->ps_limit; - atomic_inc_int(&limit->pl_refcnt); + refcnt_take(&limit->pl_refcnt); mtx_leave(&parent->ps_mtx); child->ps_limit = limit; @@ -650,7 +650,7 @@ lim_write_begin(void) */ limit = p->p_p->ps_limit; - if (P_HASSIBLING(p) || limit->pl_refcnt > 1) + if (P_HASSIBLING(p) || refcnt_shared(&limit->pl_refcnt)) limit = lim_copy(limit); return (limit); @@ -703,7 +703,7 @@ lim_read_enter(void) if (limit != pr->ps_limit) { mtx_enter(&pr->ps_mtx); limit = pr->ps_limit; - atomic_inc_int(&limit->pl_refcnt); + refcnt_take(&limit->pl_refcnt); mtx_leave(&pr->ps_mtx); if (p->p_limit != NULL) lim_free(p->p_limit); diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index 4200758bd04..74b994e4db3 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: resourcevar.h,v 1.24 2019/06/21 09:39:48 visa Exp $ */ +/* $OpenBSD: resourcevar.h,v 1.25 2022/03/18 14:45:39 visa Exp $ */ /* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */ /* @@ -35,6 +35,7 @@ #ifndef _SYS_RESOURCEVAR_H_ #define _SYS_RESOURCEVAR_H_ +#include #include /* @@ -44,7 +45,7 @@ */ struct plimit { struct rlimit pl_rlimit[RLIM_NLIMITS]; - u_int pl_refcnt; /* number of references */ + struct refcnt pl_refcnt; }; /* add user profiling from AST */ -- 2.20.1