summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-12 08:29:55 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-12 09:17:36 +0100
commit1ce403452135581a039edb83918892fdd8973e9e (patch)
treeb442bacd79f15de9ef7fe4360c1d3016c15d479f
parentUpdate to FreeBSD stable/12 2019-02-11 (diff)
downloadrtems-libbsd-1ce403452135581a039edb83918892fdd8973e9e.tar.bz2
ZONE(9): Fix UMA_PCPU_ALLOC_SIZE
Using CACHE_LINE_SIZE for UMA_PCPU_ALLOC_SIZE was a huge memory waste since the backend memory allocator is page based.
-rw-r--r--freebsd/sys/sys/pcpu.h10
-rw-r--r--rtemsbsd/include/machine/counter.h4
2 files changed, 6 insertions, 8 deletions
diff --git a/freebsd/sys/sys/pcpu.h b/freebsd/sys/sys/pcpu.h
index 7aad9f2e..de5936f6 100644
--- a/freebsd/sys/sys/pcpu.h
+++ b/freebsd/sys/sys/pcpu.h
@@ -170,6 +170,7 @@ extern uintptr_t dpcpu_off[];
#endif /* _KERNEL */
+#ifndef __rtems__
/*
* This structure maps out the global data that needs to be kept on a
* per-cpu basis. The members are accessed via the PCPU_GET/SET/PTR
@@ -177,7 +178,6 @@ extern uintptr_t dpcpu_off[];
* defined in the PCPU_MD_FIELDS macro defined in <machine/pcpu.h>.
*/
struct pcpu {
-#ifndef __rtems__
struct thread *pc_curthread; /* Current thread */
struct thread *pc_idlethread; /* Idle thread */
struct thread *pc_fpcurthread; /* Fp state owner */
@@ -208,10 +208,10 @@ struct pcpu {
* if only to make kernel debugging easier.
*/
PCPU_MD_FIELDS;
+} __aligned(CACHE_LINE_SIZE);
#else /* __rtems__ */
- int pc_dummy;
+struct pcpu;
#endif /* __rtems__ */
-} __aligned(CACHE_LINE_SIZE);
#ifdef _KERNEL
@@ -227,9 +227,9 @@ extern struct pcpu *cpuid_to_pcpu[];
#endif
#define curvidata PCPU_GET(vidata)
-#ifndef __rtems__
#define UMA_PCPU_ALLOC_SIZE PAGE_SIZE
+#ifndef __rtems__
#ifdef CTASSERT
#if defined(__i386__) || defined(__amd64__)
/* Required for counters(9) to work on x86. */
@@ -242,8 +242,6 @@ CTASSERT(sizeof(struct pcpu) == UMA_PCPU_ALLOC_SIZE);
CTASSERT((PAGE_SIZE / sizeof(struct pcpu)) * sizeof(struct pcpu) == PAGE_SIZE);
#endif /* UMA_PCPU_ALLOC_SIZE && x86 */
#endif /* CTASSERT */
-#else /* __rtems__ */
-#define UMA_PCPU_ALLOC_SIZE sizeof(struct pcpu)
#endif /* __rtems__ */
/* Accessor to elements allocated via UMA_ZONE_PCPU zone. */
diff --git a/rtemsbsd/include/machine/counter.h b/rtemsbsd/include/machine/counter.h
index 2e38c00c..4afc9ee9 100644
--- a/rtemsbsd/include/machine/counter.h
+++ b/rtemsbsd/include/machine/counter.h
@@ -42,7 +42,7 @@ static inline uint64_t
counter_u64_read_one(uint64_t *p, int cpu)
{
- return (*((uint64_t *)((char *)p + sizeof(struct pcpu) * cpu)));
+ return (*((uint64_t *)((char *)p + UMA_PCPU_ALLOC_SIZE * cpu)));
}
static inline uint64_t
@@ -65,7 +65,7 @@ counter_u64_zero_inline(counter_u64_t c)
uint32_t cpu;
for (cpu = 0; cpu < _SMP_Get_processor_count(); ++cpu) {
- *((uint64_t *)((char *)c + sizeof(struct pcpu) * cpu)) = 0;
+ *((uint64_t *)((char *)c + UMA_PCPU_ALLOC_SIZE * cpu)) = 0;
}
}
#endif