svn commit: r241798 - in user/andre/tcp_workqueue/sys: kern sys
Andre Oppermann
andre at FreeBSD.org
Sun Oct 21 08:46:16 UTC 2012
Author: andre
Date: Sun Oct 21 08:46:15 2012
New Revision: 241798
URL: http://svn.freebsd.org/changeset/base/241798
Log:
Make sure that global locks have their own CPU cache line in
the .bss section of the kernel and do not end up sharing one
by chance or the place they are defined in.
Three new macros are added:
MTX_GLOBAL(name) defining the mutex
MTX_GLOBAL_STATIC(name) defining the mutex as static
MTX_GLB(name) accessing the mutex in mtx_lock()
This makes global locks cache deterministic. Changes to the
.bss layout and ordering due to differences in completely
unrelated parts of the kernel can no longer cause global
locks to share the same CPU cache line.
This is a proof of concept with only one global lock converted.
I'm open to suggestions and improvements on the macros and
their naming.
Modified:
user/andre/tcp_workqueue/sys/kern/uipc_socket.c
user/andre/tcp_workqueue/sys/sys/mutex.h
Modified: user/andre/tcp_workqueue/sys/kern/uipc_socket.c
==============================================================================
--- user/andre/tcp_workqueue/sys/kern/uipc_socket.c Sun Oct 21 08:38:55 2012 (r241797)
+++ user/andre/tcp_workqueue/sys/kern/uipc_socket.c Sun Oct 21 08:46:15 2012 (r241798)
@@ -215,8 +215,8 @@ MTX_SYSINIT(accept_mtx, &accept_mtx, "ac
* so_global_mtx protects so_gencnt, numopensockets, and the per-socket
* so_gencnt field.
*/
-static struct mtx so_global_mtx;
-MTX_SYSINIT(so_global_mtx, &so_global_mtx, "so_glabel", MTX_DEF);
+MTX_GLOBAL_STATIC(so_global_mtx);
+MTX_SYSINIT(so_global_mtx, MTX_GLB(so_global_mtx), "so_glabel", MTX_DEF);
/*
* General IPC sysctl name space, used by sockets and a variety of other IPC
@@ -324,7 +324,7 @@ soalloc(struct vnet *vnet)
sx_init(&so->so_snd.sb_sx, "so_snd_sx");
sx_init(&so->so_rcv.sb_sx, "so_rcv_sx");
TAILQ_INIT(&so->so_aiojobq);
- mtx_lock(&so_global_mtx);
+ mtx_lock(MTX_GLB(so_global_mtx));
so->so_gencnt = ++so_gencnt;
++numopensockets;
#ifdef VIMAGE
@@ -333,7 +333,7 @@ soalloc(struct vnet *vnet)
vnet->vnet_sockcnt++;
so->so_vnet = vnet;
#endif
- mtx_unlock(&so_global_mtx);
+ mtx_unlock(MTX_GLB(so_global_mtx));
return (so);
}
@@ -349,7 +349,7 @@ sodealloc(struct socket *so)
KASSERT(so->so_count == 0, ("sodealloc(): so_count %d", so->so_count));
KASSERT(so->so_pcb == NULL, ("sodealloc(): so_pcb != NULL"));
- mtx_lock(&so_global_mtx);
+ mtx_lock(MTX_GLB(so_global_mtx));
so->so_gencnt = ++so_gencnt;
--numopensockets; /* Could be below, but faster here. */
#ifdef VIMAGE
@@ -357,7 +357,7 @@ sodealloc(struct socket *so)
__func__, __LINE__, so));
so->so_vnet->vnet_sockcnt--;
#endif
- mtx_unlock(&so_global_mtx);
+ mtx_unlock(MTX_GLB(so_global_mtx));
if (so->so_rcv.sb_hiwat)
(void)chgsbsize(so->so_cred->cr_uidinfo,
&so->so_rcv.sb_hiwat, 0, RLIM_INFINITY);
Modified: user/andre/tcp_workqueue/sys/sys/mutex.h
==============================================================================
--- user/andre/tcp_workqueue/sys/sys/mutex.h Sun Oct 21 08:38:55 2012 (r241797)
+++ user/andre/tcp_workqueue/sys/sys/mutex.h Sun Oct 21 08:46:15 2012 (r241798)
@@ -411,6 +411,18 @@ struct mtx_args {
SYSUNINIT(name##_mtx_sysuninit, SI_SUB_LOCK, SI_ORDER_MIDDLE, \
mtx_destroy, (mtx))
+#define MTX_GLOBAL(name) \
+ struct { \
+ struct mtx (name); \
+ } __aligned(CACHE_LINE_SIZE) (name);
+
+#define MTX_GLOBAL_STATIC(name) \
+ static struct { \
+ struct mtx (name); \
+ } __aligned(CACHE_LINE_SIZE) (name);
+
+#define MTX_GLB(name) (&(name.name))
+
/*
* The INVARIANTS-enabled mtx_assert() functionality.
*
More information about the svn-src-user
mailing list