From nobody Tue Oct 19 20:35:13 2021 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 BBF9018066E9; Tue, 19 Oct 2021 20:35:22 +0000 (UTC) (envelope-from cy.schubert@cschubert.com) Received: from omta001.cacentral1.a.cloudfilter.net (omta001.cacentral1.a.cloudfilter.net [3.97.99.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "Client", Issuer "CA" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4HYlqZ4Jjxz4qgJ; Tue, 19 Oct 2021 20:35:22 +0000 (UTC) (envelope-from cy.schubert@cschubert.com) Received: from shw-obgw-4004a.ext.cloudfilter.net ([10.228.9.227]) by cmsmtp with ESMTP id cmw0m9mfqczbLcvpMmsRma; Tue, 19 Oct 2021 20:35:16 +0000 Received: from spqr.komquats.com ([70.66.148.124]) by cmsmtp with ESMTPA id cvpKmIiiDa8XRcvpLmrMdE; Tue, 19 Oct 2021 20:35:16 +0000 X-Authority-Analysis: v=2.4 cv=Ov8sdwzt c=1 sm=1 tr=0 ts=616f2c04 a=Cwc3rblV8FOMdVN/wOAqyQ==:117 a=Cwc3rblV8FOMdVN/wOAqyQ==:17 a=kj9zAlcOel0A:10 a=8gfv0ekSlNoA:10 a=6I5d2MoRAAAA:8 a=YxBL1-UpAAAA:8 a=EkcXrb_YAAAA:8 a=hKvH7l_OExtEQXvJCF4A:9 a=CjuIK1q_8ugA:10 a=IjZwj45LgO3ly-622nXo:22 a=Ia-lj3WSrqcvXOmTRaiG:22 a=LK5xJRSDVpKd5WXXoEvA:22 Received: from slippy.cwsent.com (slippy [10.1.1.91]) by spqr.komquats.com (Postfix) with ESMTPS id 90EB2590; Tue, 19 Oct 2021 13:35:13 -0700 (PDT) Received: from slippy (localhost [127.0.0.1]) by slippy.cwsent.com (8.16.1/8.16.1) with ESMTP id 19JKZDqM026085; Tue, 19 Oct 2021 13:35:13 -0700 (PDT) (envelope-from Cy.Schubert@cschubert.com) Message-Id: <202110192035.19JKZDqM026085@slippy.cwsent.com> X-Mailer: exmh version 2.9.0 11/07/2018 with nmh-1.7.1 Reply-to: Cy Schubert From: Cy Schubert X-os: FreeBSD X-Sender: cy@cwsent.com X-URL: http://www.cschubert.com/ To: Konstantin Belousov cc: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: Re: git: 7ae879b14a20 - main - kern_procctl(): convert the function to be table-driven In-reply-to: <202110192004.19JK4jN3069844@gitrepo.freebsd.org> References: <202110192004.19JK4jN3069844@gitrepo.freebsd.org> Comments: In-reply-to Konstantin Belousov message dated "Tue, 19 Oct 2021 20:04:45 +0000." 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Tue, 19 Oct 2021 13:35:13 -0700 X-CMAE-Envelope: MS4xfAy3Wl8Knz7fpbJbwbPhs97kltqAw7sLhEHxv+Igmu1XiqOph3mdIFT/4u6WbX06/hIWu0Vy+TTnQVF0FSiYlVGr0+t3LmdHgCAHe70XrvRFU8GH8OqV 7xfbuvBK2nKIf8u0JkcWKpDnUF5k3V98PijcmkMQpGicvdfssgXa50kVKmjrKgULiAY4kdUH4ZF39L6dpxkJiDHirXVfNfEtAo2zpEOhAZpPq4P7ZV641UxZ KY0vJj1YTzz0FXjLfj0odTY/fQGrd1mTJJSRku4HUfoziEepwoGvSyDtoRrABbYT151a41lJitDbsssIjwObJ0wF7UMA13/bQLYTcXFma3Y= X-Rspamd-Queue-Id: 4HYlqZ4Jjxz4qgJ X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[] X-ThisMailContainsUnwantedMimeParts: N In message <202110192004.19JK4jN3069844@gitrepo.freebsd.org>, Konstantin Belous ov writes: > The branch main has been updated by kib: > > URL: https://cgit.FreeBSD.org/src/commit/?id=7ae879b14a2086df521c59c4a379d3a0 > 72e08bc6 > > commit 7ae879b14a2086df521c59c4a379d3a072e08bc6 > Author: Konstantin Belousov > AuthorDate: 2021-10-15 18:57:17 +0000 > Commit: Konstantin Belousov > CommitDate: 2021-10-19 20:04:34 +0000 > > kern_procctl(): convert the function to be table-driven > > Reviewed by: emaste, markj > Sponsored by: The FreeBSD Foundation > MFC after: 1 week > Differential revision: https://reviews.freebsd.org/D32513 > --- > sys/kern/kern_procctl.c | 123 +++++++++++++++++++++++++++------------------- > -- > 1 file changed, 69 insertions(+), 54 deletions(-) > > diff --git a/sys/kern/kern_procctl.c b/sys/kern/kern_procctl.c > index eb36f0822938..90c5e63c7219 100644 > --- a/sys/kern/kern_procctl.c > +++ b/sys/kern/kern_procctl.c > @@ -656,6 +656,57 @@ wxmap_status(struct thread *td, struct proc *p, int *dat > a) > return (0); > } > > +struct procctl_cmd_info { > + int lock_tree; > + bool one_proc : 1; > +}; > +static const struct procctl_cmd_info procctl_cmds_info[] = { > + [PROC_SPROTECT] = > + { .lock_tree = SA_SLOCKED, .one_proc = false, }, > + [PROC_REAP_ACQUIRE] = > + { .lock_tree = SA_XLOCKED, .one_proc = true, }, > + [PROC_REAP_RELEASE] = > + { .lock_tree = SA_XLOCKED, .one_proc = true, }, > + [PROC_REAP_STATUS] = > + { .lock_tree = SA_SLOCKED, .one_proc = true, }, > + [PROC_REAP_GETPIDS] = > + { .lock_tree = SA_SLOCKED, .one_proc = true, }, > + [PROC_REAP_KILL] = > + { .lock_tree = SA_SLOCKED, .one_proc = true, }, > + [PROC_TRACE_CTL] = > + { .lock_tree = SA_SLOCKED, .one_proc = false, }, > + [PROC_TRACE_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_TRAPCAP_CTL] = > + { .lock_tree = SA_SLOCKED, .one_proc = false, }, > + [PROC_TRAPCAP_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_PDEATHSIG_CTL] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_PDEATHSIG_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_ASLR_CTL] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_ASLR_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_PROTMAX_CTL] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_PROTMAX_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_STACKGAP_CTL] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_STACKGAP_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_NO_NEW_PRIVS_CTL] = > + { .lock_tree = SA_SLOCKED, .one_proc = true, }, > + [PROC_NO_NEW_PRIVS_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_WXMAP_CTL] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > + [PROC_WXMAP_STATUS] = > + { .lock_tree = SA_UNLOCKED, .one_proc = true, }, > +}; > + > int > sys_procctl(struct thread *td, struct procctl_args *uap) > { > @@ -812,33 +863,14 @@ kern_procctl(struct thread *td, idtype_t idtype, id_t i > d, int com, void *data) > { > struct pgrp *pg; > struct proc *p; > + const struct procctl_cmd_info *cmd_info; > int error, first_error, ok; > int signum; > - bool tree_locked; > > - switch (com) { > - case PROC_ASLR_CTL: > - case PROC_ASLR_STATUS: > - case PROC_PROTMAX_CTL: > - case PROC_PROTMAX_STATUS: > - case PROC_REAP_ACQUIRE: > - case PROC_REAP_RELEASE: > - case PROC_REAP_STATUS: > - case PROC_REAP_GETPIDS: > - case PROC_REAP_KILL: > - case PROC_STACKGAP_CTL: > - case PROC_STACKGAP_STATUS: > - case PROC_TRACE_STATUS: > - case PROC_TRAPCAP_STATUS: > - case PROC_PDEATHSIG_CTL: > - case PROC_PDEATHSIG_STATUS: > - case PROC_NO_NEW_PRIVS_CTL: > - case PROC_NO_NEW_PRIVS_STATUS: > - case PROC_WXMAP_CTL: > - case PROC_WXMAP_STATUS: > - if (idtype != P_PID) > - return (EINVAL); > - } > + MPASS(com > 0 && com < nitems(procctl_cmds_info)); > + cmd_info = &procctl_cmds_info[com]; > + if (idtype != P_PID && cmd_info->one_proc) > + return (EINVAL); > > switch (com) { > case PROC_PDEATHSIG_CTL: > @@ -861,37 +893,13 @@ kern_procctl(struct thread *td, idtype_t idtype, id_t i > d, int com, void *data) > return (0); > } > > - switch (com) { > - case PROC_SPROTECT: > - case PROC_REAP_STATUS: > - case PROC_REAP_GETPIDS: > - case PROC_REAP_KILL: > - case PROC_TRACE_CTL: > - case PROC_TRAPCAP_CTL: > - case PROC_NO_NEW_PRIVS_CTL: > - sx_slock(&proctree_lock); > - tree_locked = true; > - break; > - case PROC_REAP_ACQUIRE: > - case PROC_REAP_RELEASE: > + switch (cmd_info->lock_tree) { > + case SA_XLOCKED: > sx_xlock(&proctree_lock); > - tree_locked = true; > break; > - case PROC_ASLR_CTL: > - case PROC_ASLR_STATUS: > - case PROC_PROTMAX_CTL: > - case PROC_PROTMAX_STATUS: > - case PROC_STACKGAP_CTL: > - case PROC_STACKGAP_STATUS: > - case PROC_TRACE_STATUS: > - case PROC_TRAPCAP_STATUS: > - case PROC_NO_NEW_PRIVS_STATUS: > - case PROC_WXMAP_CTL: > - case PROC_WXMAP_STATUS: > - tree_locked = false; > + case SA_SLOCKED: > + sx_slock(&proctree_lock); > break; > - default: > - return (EINVAL); > } > > switch (idtype) { > @@ -949,7 +957,14 @@ kern_procctl(struct thread *td, idtype_t idtype, id_t id > , int com, void *data) > error = EINVAL; > break; > } > - if (tree_locked) > - sx_unlock(&proctree_lock); > + > + switch (cmd_info->lock_tree) { > + case SA_XLOCKED: > + sx_xunlock(&proctree_lock); > + break; > + case SA_SLOCKED: > + sx_sunlock(&proctree_lock); > + break; > + } > return (error); > } > Should SA_* in fact be LA_*? SA_* in sys/sx.h assumes INVARIANTS whereas LA_* in sys/lock.h has no such requirement. -- Cheers, Cy Schubert FreeBSD UNIX: Web: https://FreeBSD.org NTP: Web: https://nwtime.org The need of the many outweighs the greed of the few.