svn commit: r356120 - head/sys/security/mac
Ronald Klop
ronald-lists at klop.ws
Fri Dec 27 11:35:16 UTC 2019
On Fri, 27 Dec 2019 12:23:32 +0100, Mateusz Guzik <mjg at freebsd.org> wrote:
> Author: mjg
> Date: Fri Dec 27 11:23:32 2019
> New Revision: 356120
> URL: https://svnweb.freebsd.org/changeset/base/356120
>
> Log:
> mac: use a sleepable rmlock instead of an sx lock
> If any non-static modules are loaded (and mac_ntpd tends to be), the
> lock is
> taken all the time al over the kernel. On platforms like arm64 this
> results in
> an avoidable significant performance degradation. Since write-locking
> is almost
> never needed, use a primitive optimized towards read-locking.
> Sample result of building the kernel on tmpfs 11 times:
> stock 11142.80s user 6704.44s system 4924% cpu 6:02.42 total
> patched 11118.95s user 2374.94s system 4547% cpu 4:56.71 total
Wow, this looks like a winner.
Ronald.
>
> Modified:
> head/sys/security/mac/mac_framework.c
>
> Modified: head/sys/security/mac/mac_framework.c
> ==============================================================================
> --- head/sys/security/mac/mac_framework.c Fri Dec 27 11:19:57
> 2019 (r356119)
> +++ head/sys/security/mac/mac_framework.c Fri Dec 27 11:23:32
> 2019 (r356120)
> @@ -176,6 +176,7 @@ MALLOC_DEFINE(M_MACTEMP, "mactemp", "MAC temporary
> lab
> #ifndef MAC_STATIC
> static struct rmlock mac_policy_rm; /* Non-sleeping entry points. */
> static struct sx mac_policy_sx; /* Sleeping entry points. */
> +static struct rmslock mac_policy_rms;
> #endif
> struct mac_policy_list_head mac_policy_list;
> @@ -209,7 +210,7 @@ mac_policy_slock_sleep(void)
> if (!mac_late)
> return;
> - sx_slock(&mac_policy_sx);
> + rms_rlock(&mac_policy_rms);
> #endif
> }
> @@ -233,7 +234,7 @@ mac_policy_sunlock_sleep(void)
> if (!mac_late)
> return;
> - sx_sunlock(&mac_policy_sx);
> + rms_runlock(&mac_policy_rms);
> #endif
> }
> @@ -249,6 +250,7 @@ mac_policy_xlock(void)
> return;
> sx_xlock(&mac_policy_sx);
> + rms_wlock(&mac_policy_rms);
> rm_wlock(&mac_policy_rm);
> #endif
> }
> @@ -262,6 +264,7 @@ mac_policy_xunlock(void)
> return;
> rm_wunlock(&mac_policy_rm);
> + rms_wunlock(&mac_policy_rms);
> sx_xunlock(&mac_policy_sx);
> #endif
> }
> @@ -294,6 +297,7 @@ mac_init(void)
> rm_init_flags(&mac_policy_rm, "mac_policy_rm", RM_NOWITNESS |
> RM_RECURSE);
> sx_init_flags(&mac_policy_sx, "mac_policy_sx", SX_NOWITNESS);
> + rms_init(&mac_policy_rms, "mac_policy_rms");
> #endif
> }
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the svn-src-all
mailing list