svn commit: r335873 - in head: . sys/amd64/amd64 sys/amd64/include sys/conf sys/i386/i386 sys/i386/include sys/sys sys/vm

Matt Macy mmacy at FreeBSD.org
Mon Jul 2 19:48:41 UTC 2018


Author: mmacy
Date: Mon Jul  2 19:48:38 2018
New Revision: 335873
URL: https://svnweb.freebsd.org/changeset/base/335873

Log:
  inline atomics and allow tied modules to inline locks
  
  - inline atomics in modules on i386 and amd64 (they were always
    inline on other arches)
  - allow modules to opt in to inlining locks by specifying
    MODULE_TIED=1 in the makefile
  
  Reviewed by: kib
  Sponsored by: Limelight Networks
  Differential Revision: https://reviews.freebsd.org/D16079

Deleted:
  head/sys/amd64/amd64/atomic.c
  head/sys/i386/i386/atomic.c
Modified:
  head/UPDATING
  head/sys/amd64/include/atomic.h
  head/sys/conf/files.amd64
  head/sys/conf/files.i386
  head/sys/conf/kmod.mk
  head/sys/i386/include/atomic.h
  head/sys/sys/lock.h
  head/sys/sys/module.h
  head/sys/sys/mutex.h
  head/sys/sys/param.h
  head/sys/vm/vm_map.h
  head/sys/vm/vm_page.h

Modified: head/UPDATING
==============================================================================
--- head/UPDATING	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/UPDATING	Mon Jul  2 19:48:38 2018	(r335873)
@@ -31,6 +31,10 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12.x IS SLOW:
 	disable the most expensive debugging functionality run
 	"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
 
+20180702:
+	On i386 and amd64 atomics are now inlined. Out of tree modules using
+	atomics will need to be rebuilt.
+
 20180701:
 	The '%I' format in the kern.corefile sysctl limits the number of
 	core files that a process can generate to the number stored in the

Modified: head/sys/amd64/include/atomic.h
==============================================================================
--- head/sys/amd64/include/atomic.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/amd64/include/atomic.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -96,7 +96,7 @@
  * Kernel modules call real functions which are built into the kernel.
  * This allows kernel modules to be portable between UP and SMP systems.
  */
-#if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM)
+#if !defined(__GNUCLIKE_ASM)
 #define	ATOMIC_ASM(NAME, TYPE, OP, CONS, V)			\
 void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v);	\
 void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)

Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/conf/files.amd64	Mon Jul  2 19:48:38 2018	(r335873)
@@ -126,7 +126,6 @@ acpi_wakedata.h			optional	acpi			\
 	clean		"acpi_wakedata.h"
 #
 #amd64/amd64/apic_vector.S	standard
-amd64/amd64/atomic.c		standard
 amd64/amd64/bios.c		standard
 amd64/amd64/bpf_jit_machdep.c	optional	bpf_jitter
 amd64/amd64/cpu_switch.S	standard

Modified: head/sys/conf/files.i386
==============================================================================
--- head/sys/conf/files.i386	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/conf/files.i386	Mon Jul  2 19:48:38 2018	(r335873)
@@ -474,8 +474,6 @@ i386/bios/smapi.c		optional smapi
 i386/bios/smapi_bios.S		optional smapi
 i386/cloudabi32/cloudabi32_sysvec.c	optional compat_cloudabi32
 #i386/i386/apic_vector.s		optional apic
-i386/i386/atomic.c		standard		\
-	compile-with	"${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}"
 i386/i386/bios.c		standard
 i386/i386/bioscall.s		standard
 i386/i386/bpf_jit_machdep.c	optional bpf_jitter

Modified: head/sys/conf/kmod.mk
==============================================================================
--- head/sys/conf/kmod.mk	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/conf/kmod.mk	Mon Jul  2 19:48:38 2018	(r335873)
@@ -111,6 +111,9 @@ WERROR?=	-Werror
 CFLAGS+=	${WERROR}
 CFLAGS+=	-D_KERNEL
 CFLAGS+=	-DKLD_MODULE
+.if defined(MODULE_TIED)
+CFLAGS+=	-DKLD_TIED
+.endif
 
 # Don't use any standard or source-relative include directories.
 NOSTDINC=	-nostdinc

Modified: head/sys/i386/include/atomic.h
==============================================================================
--- head/sys/i386/include/atomic.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/i386/include/atomic.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -104,7 +104,7 @@ __mbu(void)
  * Kernel modules call real functions which are built into the kernel.
  * This allows kernel modules to be portable between UP and SMP systems.
  */
-#if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM)
+#if !defined(__GNUCLIKE_ASM)
 #define	ATOMIC_ASM(NAME, TYPE, OP, CONS, V)			\
 void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v);	\
 void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)

Modified: head/sys/sys/lock.h
==============================================================================
--- head/sys/sys/lock.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/sys/lock.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -127,7 +127,7 @@ struct lock_class {
  * calling conventions for this debugging code in modules so that modules can
  * work with both debug and non-debug kernels.
  */
-#if defined(KLD_MODULE) || defined(WITNESS) || defined(INVARIANTS) || \
+#if (defined(KLD_MODULE) && !defined(KLD_TIED)) || defined(WITNESS) || defined(INVARIANTS) || \
     defined(LOCK_PROFILING) || defined(KTR)
 #define	LOCK_DEBUG	1
 #else

Modified: head/sys/sys/module.h
==============================================================================
--- head/sys/sys/module.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/sys/module.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -146,8 +146,13 @@ struct mod_pnp_match_info 
 	SYSINIT(name##module, sub, order, module_register_init, &data);	\
 	struct __hack
 
+#ifdef KLD_TIED
 #define	DECLARE_MODULE(name, data, sub, order)				\
+	DECLARE_MODULE_WITH_MAXVER(name, data, sub, order, __FreeBSD_version)
+#else
+#define	DECLARE_MODULE(name, data, sub, order)							\
 	DECLARE_MODULE_WITH_MAXVER(name, data, sub, order, MODULE_KERNEL_MAXVER)
+#endif
 
 /*
  * The module declared with DECLARE_MODULE_TIED can only be loaded

Modified: head/sys/sys/mutex.h
==============================================================================
--- head/sys/sys/mutex.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/sys/mutex.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -138,7 +138,7 @@ void	_thread_lock(struct thread *td, int opts, const c
 void	_thread_lock(struct thread *);
 #endif
 
-#if defined(LOCK_PROFILING) || defined(KLD_MODULE)
+#if defined(LOCK_PROFILING) || (defined(KLD_MODULE) && !defined(KLD_TIED))
 #define	thread_lock(tdp)						\
 	thread_lock_flags_((tdp), 0, __FILE__, __LINE__)
 #elif LOCK_DEBUG > 0

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/sys/param.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -60,7 +60,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1200069	/* Master, propagated to newvers */
+#define __FreeBSD_version 1200070	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,

Modified: head/sys/vm/vm_map.h
==============================================================================
--- head/sys/vm/vm_map.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/vm/vm_map.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -206,7 +206,7 @@ struct vm_map {
 #define	MAP_BUSY_WAKEUP		0x02
 
 #ifdef	_KERNEL
-#ifdef KLD_MODULE
+#if defined(KLD_MODULE) && !defined(KLD_TIED)
 #define	vm_map_max(map)		vm_map_max_KBI((map))
 #define	vm_map_min(map)		vm_map_min_KBI((map))
 #define	vm_map_pmap(map)	vm_map_pmap_KBI((map))

Modified: head/sys/vm/vm_page.h
==============================================================================
--- head/sys/vm/vm_page.h	Mon Jul  2 19:33:26 2018	(r335872)
+++ head/sys/vm/vm_page.h	Mon Jul  2 19:48:38 2018	(r335873)
@@ -304,7 +304,7 @@ extern struct mtx_padalign pa_lock[];
 
 #define	PA_LOCK_ASSERT(pa, a)	mtx_assert(PA_LOCKPTR(pa), (a))
 
-#ifdef KLD_MODULE
+#if defined(KLD_MODULE) && !defined(KLD_TIED)
 #define	vm_page_lock(m)		vm_page_lock_KBI((m), LOCK_FILE, LOCK_LINE)
 #define	vm_page_unlock(m)	vm_page_unlock_KBI((m), LOCK_FILE, LOCK_LINE)
 #define	vm_page_trylock(m)	vm_page_trylock_KBI((m), LOCK_FILE, LOCK_LINE)
@@ -734,7 +734,7 @@ vm_page_dirty(vm_page_t m)
 {
 
 	/* Use vm_page_dirty_KBI() under INVARIANTS to save memory. */
-#if defined(KLD_MODULE) || defined(INVARIANTS)
+#if (defined(KLD_MODULE) && !defined(KLD_TIED)) || defined(INVARIANTS)
 	vm_page_dirty_KBI(m);
 #else
 	m->dirty = VM_PAGE_BITS_ALL;


More information about the svn-src-head mailing list