Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Jan 2017 13:46:53 +0100
From:      Mateusz Guzik <mjguzik@gmail.com>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: __read_only in the kernel
Message-ID:  <20170116124653.GB30475@dft-labs.eu>
In-Reply-To: <20170113130942.E1016@besplex.bde.org>
References:  <20161127212503.GA23218@dft-labs.eu> <20161130011033.GA20999@dft-labs.eu> <20161201070246.S1023@besplex.bde.org> <20161229114554.GA29676@dft-labs.eu> <20161229153138.GC29676@dft-labs.eu> <20170113130942.E1016@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Jan 13, 2017 at 01:10:33PM +1100, Bruce Evans wrote:
> On Thu, 29 Dec 2016, Mateusz Guzik wrote:
> >Scratch the previous patch. I extended it with __exclusive_cache_line
> >(happy with ideas for a better name) - to be used for something which
> >has to be alone in the cacheline, e.g. an atomic counter.
> >
> >diff --git a/sys/compat/linuxkpi/common/include/linux/compiler.h b/sys/compat/linuxkpi/common/include/linux/compiler.h
> >index c780abc..c32f1fa 100644
> >--- a/sys/compat/linuxkpi/common/include/linux/compiler.h
> >+++ b/sys/compat/linuxkpi/common/include/linux/compiler.h
> >@@ -67,7 +67,6 @@
> >#define typeof(x)			__typeof(x)
> >
> >#define	uninitialized_var(x)		x = x
> >-#define	__read_mostly __attribute__((__section__(".data.read_mostly")))
> >#define	__always_unused			__unused
> >#define	__must_check			__result_use_check
> >
> >diff --git a/sys/conf/ldscript.amd64 b/sys/conf/ldscript.amd64
> >index 5d86b03..45685a4 100644
> >--- a/sys/conf/ldscript.amd64
> >+++ b/sys/conf/ldscript.amd64
> >@@ -150,6 +150,17 @@ SECTIONS
> >    *(.data .data.* .gnu.linkonce.d.*)
> >    KEEP (*(.gnu.linkonce.d.*personality*))
> >  }
> >+  . = ALIGN(64);
> >+  .data.read_mostly :
> >+  {
> >+    *(.data.read_mostly)
> >+  }
> >+  . = ALIGN(64);
> >+  .data.exclusive_cache_line :
> >+  {
> >+    *(.data.exclusive_cache_line)
> >+  }
> >+  . = ALIGN(64);
> >  .data1          : { *(.data1) }
> >  _edata = .; PROVIDE (edata = .);
> >  __bss_start = .;
> 
> I don't really understand this.  Is it still needed?  I forget if you
> need separate sections to keep things together for more than the
> purpose of aligning them.  I think objects aligned to the cache line
> size or larger can live almost anywhere in the address space without
> making much difference to cache effectiveness on most arches including
> amd64.
> 

Without the above, while variables are aligned, they can end up with
unaligned ones added just after them in the same cacheline.

> >diff --git a/sys/dev/drm2/drm_os_freebsd.h b/sys/dev/drm2/drm_os_freebsd.h
> >index dc01c6a..11c9feb 100644
> >--- a/sys/dev/drm2/drm_os_freebsd.h
> >+++ b/sys/dev/drm2/drm_os_freebsd.h
> >@@ -80,7 +80,6 @@ typedef void			irqreturn_t;
> >
> >#define	__init
> >#define	__exit
> >-#define	__read_mostly
> >
> >#define	BUILD_BUG_ON(x)		CTASSERT(!(x))
> >#define	BUILD_BUG_ON_NOT_POWER_OF_2(x)
> >diff --git a/sys/sys/systm.h b/sys/sys/systm.h
> >index a1ce9b4..719e063 100644
> >--- a/sys/sys/systm.h
> >+++ b/sys/sys/systm.h
> >@@ -445,4 +445,8 @@ extern void (*softdep_ast_cleanup)(void);
> >
> >void counted_warning(unsigned *counter, const char *msg);
> >
> >+#define	__read_mostly		__section(".data.read_mostly")
> >+#define	__exclusive_cache_line	__aligned(CACHE_LINE_SIZE) \
> >+				    __section(".data.exclusive_cache_line")
> >+
> >#endif /* !_SYS_SYSTM_H_ */
> 
> systm.h is better for the kernel, but will we want this for userland?
> 

imho userspace may have their own variants which should not interfere with.

> systm.h is randomly ordered, and appending to it with the new definitions
> inversely ordered improves its randomness.  Similarly for style.  Indentation
> for multi-line #define's is more random now.
> 

Where do you propose moving this? I'm completely indifferent with the
location. Fixed the indentation below.

diff --git a/sys/compat/linuxkpi/common/include/linux/compiler.h b/sys/compat/linuxkpi/common/include/linux/compiler.h
index c780abc..c32f1fa 100644
--- a/sys/compat/linuxkpi/common/include/linux/compiler.h
+++ b/sys/compat/linuxkpi/common/include/linux/compiler.h
@@ -67,7 +67,6 @@
 #define typeof(x)			__typeof(x)
 
 #define	uninitialized_var(x)		x = x
-#define	__read_mostly __attribute__((__section__(".data.read_mostly")))
 #define	__always_unused			__unused
 #define	__must_check			__result_use_check
 
diff --git a/sys/conf/ldscript.amd64 b/sys/conf/ldscript.amd64
index 5d86b03..e64a957 100644
--- a/sys/conf/ldscript.amd64
+++ b/sys/conf/ldscript.amd64
@@ -145,6 +145,17 @@ SECTIONS
   .got            : { *(.got) }
   . = DATA_SEGMENT_RELRO_END (24, .);
   .got.plt        : { *(.got.plt) }
+  . = ALIGN(64);
+  .data.read_mostly :
+  {
+    *(.data.read_mostly)
+  }
+  . = ALIGN(64);
+  .data.exclusive_cache_line :
+  {
+    *(.data.exclusive_cache_line)
+  }
+  . = ALIGN(64);
   .data           :
   {
     *(.data .data.* .gnu.linkonce.d.*)
diff --git a/sys/dev/drm2/drm_os_freebsd.h b/sys/dev/drm2/drm_os_freebsd.h
index dc01c6a..11c9feb 100644
--- a/sys/dev/drm2/drm_os_freebsd.h
+++ b/sys/dev/drm2/drm_os_freebsd.h
@@ -80,7 +80,6 @@ typedef void			irqreturn_t;
 
 #define	__init
 #define	__exit
-#define	__read_mostly
 
 #define	BUILD_BUG_ON(x)		CTASSERT(!(x))
 #define	BUILD_BUG_ON_NOT_POWER_OF_2(x)
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index a1ce9b4..418998e 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -445,4 +445,8 @@ extern void (*softdep_ast_cleanup)(void);
 
 void counted_warning(unsigned *counter, const char *msg);
 
+#define	__read_mostly		__section(".data.read_mostly")
+#define	__exclusive_cache_line	__aligned(CACHE_LINE_SIZE) \
+	    __section(".data.exclusive_cache_line")
+
 #endif /* !_SYS_SYSTM_H_ */
-- 
Mateusz Guzik <mjguzik gmail.com>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170116124653.GB30475>