From 1ce403452135581a039edb83918892fdd8973e9e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 12 Feb 2019 08:29:55 +0100 Subject: 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. --- freebsd/sys/sys/pcpu.h | 10 ++++------ rtemsbsd/include/machine/counter.h | 4 ++-- 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 . */ 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 -- cgit v1.2.3