powerpc: Add function to copy mm_context_t to the paca
PATCH 1/2 powerpc: Add function to copy mm_context_t to the paca
This adds a function to copy the mm->context to the paca. This is only a basic conversion for now but will be used more extensively in the next patch.
This also adds #ifdef CONFIG_PPC_BOOK3S around this code since it's not used elsewhere.
--- arch/powerpc/include/asm/paca.h | 11 +++++++++++ arch/powerpc/kernel/asm-offsets.c | 2 ++ arch/powerpc/mm/hash_utils_64.c | 5 +++-- arch/powerpc/mm/slb.c | 2 +- arch/powerpc/mm/slice.c | 3 +-- 5 files changed, 18 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/paca.h +11 -0
@@ -131,7 +131,9 @@ struct paca_struct {struct tlb_core_data tcd;#endif /* CONFIG_PPC_BOOK3E */ +#ifdef CONFIG_PPC_BOOK3S mm_context_t context; +#endif /* * then miscellaneous read-write fields
@@ -194,6 +196,15 @@ struct paca_struct {#endif }; +#ifdef CONFIG_PPC_BOOK3S +static inline void copy_mm_to_paca (mm_context_t *context) +{ +get_paca ()->context = *context; +} +#else +static inline void copy_mm_to_paca (mm_context_t *context){} +#endif +extern struct paca_struct *paca;extern void initialise_paca (struct paca_struct *new_paca,int cpu);extern void setup_paca (struct paca_struct *new_paca);
arch/powerpc/kernel/asm-offsets.c +2 -0
@@ -185,6 +185,7 @@ int main(void)DEFINE (PACAKMSR , offsetof(struct paca_struct , kernel_msr));DEFINE (PACASOFTIRQEN , offsetof(struct paca_struct , soft_enabled));DEFINE (PACAIRQHAPPENED , offsetof(struct paca_struct , irq_happened)); +#ifdef CONFIG_PPC_BOOK3S DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id));#ifdef CONFIG_PPC_MM_SLICES DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct,
@@ -193,6 +194,7 @@ int main(void) context.high_slices_psize));DEFINE (MMUPSIZEDEFSIZE ,sizeof (struct mmu_psize_def ));#endif /* CONFIG_PPC_MM_SLICES */ +#endif #ifdef CONFIG_PPC_BOOK3E DEFINE (PACAPGD , offsetof(struct paca_struct , pgd));
arch/powerpc/mm/hash_utils_64.c +3 -2
@@ -906,7 +906,8 @@ void demote_segment_4k(struct mm_struct *mm, unsigned long addr)slice_set_range_psize (mm, addr,1 ,MMU_PAGE_4K );copro_flush_all_slbs (mm);if ((get_paca_psize (addr) !=MMU_PAGE_4K ) && (current->mm == mm)) { -get_paca ()->context = mm->context; + +copy_mm_to_paca (&mm->context);slb_flush_and_rebolt (); } }
@@ -973,7 +974,7 @@ static void check_paca_psize(unsigned long ea, struct mm_struct *mm, {if (user_region) {if (psize !=get_paca_psize (ea)) { -get_paca ()->context = mm->context; +copy_mm_to_paca (&mm->context);slb_flush_and_rebolt (); } } else if (get_paca()->vmalloc_sllp !=
arch/powerpc/mm/slb.c +1 -1
@@ -223,7 +223,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) asmvolatile ("slbie %0" : :"r" (slbie_data));get_paca ()->slb_cache_ptr =0 ; -get_paca ()->context = mm->context; +copy_mm_to_paca (&mm->context);/* * preload some userspace segments into the SLB.
arch/powerpc/mm/slice.c +1 -2
@@ -185,8 +185,7 @@ static void slice_flush_segments(void *parm)if (mm != current->active_mm)return ; -/* update the paca copy of the context struct */ -get_paca ()->context = current->active_mm->context; +copy_mm_to_paca (¤t->active_mm->context);local_irq_save (flags);slb_flush_and_rebolt ();
Signature · 1 line
2.5.0
PATCH 2/2 powerpc: Copy only required pieces of the mm_context_t to the paca
Currently we copy the whole mm_context_t to the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.
This patch pulls in only the required bits from the mm_context_t to the paca and on context switch, copies only those.
Benchmarking this (On top of Anton's recent MSR context switching changes [1]) using processes and yield shows an improvement of almost 3% on POWER8:
http://ozlabs.org/~anton/junkcode/context_switch2.c ./context_switch2 --test=yield --process 0 0
1. https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-October/135700.html
--- arch/powerpc/include/asm/paca.h | 17 +++++++++++++++-- arch/powerpc/kernel/asm-offsets.c | 8 ++++---- arch/powerpc/mm/hash_utils_64.c | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-)
arch/powerpc/include/asm/paca.h +15 -2
@@ -132,7 +132,13 @@ struct paca_struct {#endif /* CONFIG_PPC_BOOK3E */ #ifdef CONFIG_PPC_BOOK3S -mm_context_t context; +mm_context_id_t context_id; +#ifdef CONFIG_PPC_MM_SLICES +u64 context_low_slices_psize; +unsigned char context_high_slices_psize[SLICE_ARRAY_SIZE ]; +#else +u16 context_sllp; +#endif #endif /*
@@ -199,7 +205,14 @@ struct paca_struct {#ifdef CONFIG_PPC_BOOK3S static inline void copy_mm_to_paca (mm_context_t *context) { -get_paca ()->context = *context; +get_paca ()->context_id = context->id; +#ifdef CONFIG_PPC_MM_SLICES +get_paca ()->context_low_slices_psize = context->low_slices_psize; +memcpy (&get_paca ()->context_high_slices_psize, + &context->high_slices_psize,SLICE_ARRAY_SIZE ); +#else +get_paca ()->context_sllp = context->sllp; +#endif }#else static inline void copy_mm_to_paca (mm_context_t *context){}
arch/powerpc/kernel/asm-offsets.c +4 -4
@@ -186,12 +186,12 @@ int main(void)DEFINE (PACASOFTIRQEN , offsetof(struct paca_struct , soft_enabled));DEFINE (PACAIRQHAPPENED , offsetof(struct paca_struct , irq_happened));#ifdef CONFIG_PPC_BOOK3S - DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); +DEFINE (PACACONTEXTID , offsetof(struct paca_struct , context_id));#ifdef CONFIG_PPC_MM_SLICES DEFINE (PACALOWSLICESPSIZE , offsetof(struct paca_struct , - context.low_slices_psize)); + context_low_slices_psize));DEFINE (PACAHIGHSLICEPSIZE , offsetof(struct paca_struct , - context.high_slices_psize)); + context_high_slices_psize));DEFINE (MMUPSIZEDEFSIZE ,sizeof (struct mmu_psize_def ));#endif /* CONFIG_PPC_MM_SLICES */ #endif
@@ -224,7 +224,7 @@ int main(void)#ifdef CONFIG_PPC_MM_SLICES DEFINE (MMUPSIZESLLP , offsetof(struct mmu_psize_def , sllp));#else - DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct, context.sllp)); +DEFINE (PACACONTEXTSLLP , offsetof(struct paca_struct , context_sllp));#endif /* CONFIG_PPC_MM_SLICES */ DEFINE (PACA_EXGEN , offsetof(struct paca_struct , exgen));DEFINE (PACA_EXMC , offsetof(struct paca_struct , exmc));
arch/powerpc/mm/hash_utils_64.c +2 -2
@@ -877,11 +877,11 @@ static unsigned int get_paca_psize(unsigned long addr)unsigned long index, mask_index;if (addr <SLICE_LOW_TOP ) { - lpsizes =get_paca ()->context.low_slices_psize; + lpsizes =get_paca ()->context_low_slices_psize; index =GET_LOW_SLICE_INDEX (addr);return (lpsizes >> (index *4 )) &0xF ; } - hpsizes =get_paca ()->context.high_slices_psize; + hpsizes =get_paca ()->context_high_slices_psize; index =GET_HIGH_SLICE_INDEX (addr); mask_index = index &0x1 ;return (hpsizes[index >>1 ] >> (mask_index *4 )) &0xF ;
Signature · 1 line
2.5.0
Re: [PATCH 2/2] powerpc: Copy only required pieces of the mm_context_t to the paca
Quoted 7 lines
Currently we copy the whole
mm_context_tto the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.This patch pulls in only the required bits from the
mm_context_tto the paca and on context switch, copies only those.
Quoted 6 lines
Benchmarking this (On top of Anton's recent MSR context switching changes [1]) using processes and yield shows an improvement of almost 3% on POWER8:
http://ozlabs.org/~anton/junkcode/context_switch2.c ./context_switch2 --test=yield --process 0 0
Now the context switch series is in, I tested this against powerpc-next and still see a ~3% improvement.
Anton
Quoted 98 lines
1.
https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-October/135700.htmlSigned-off-by Michael Neuling <[email protected]>--- arch/powerpc/include/asm/paca.h | 17 +++++++++++++++-- arch/powerpc/kernel/asm-offsets.c | 8 ++++---- arch/powerpc/mm/hash_utils_64.c | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-)(quoted diff) +0
-0
b/arch/powerpc/include/asm/paca.hindex 1cc6e08..1c0d9f4 100644arch/powerpc/include/asm/paca.h +15
-2@@ -132,7 +132,13 @@ struct paca_struct {#endif /* CONFIG_PPC_BOOK3E */ #ifdef CONFIG_PPC_BOOK3S -mm_context_t context; +mm_context_id_t context_id; +#ifdef CONFIG_PPC_MM_SLICES +u64 context_low_slices_psize; +unsigned char context_high_slices_psize[SLICE_ARRAY_SIZE ]; +#else +u16 context_sllp; +#endif #endif /* @@ -199,7 +205,14 @@ struct paca_struct {#ifdef CONFIG_PPC_BOOK3S static inline void copy_mm_to_paca (mm_context_t *context) { -get_paca ()->context = *context; +get_paca ()->context_id = context->id; +#ifdef CONFIG_PPC_MM_SLICES +get_paca ()->context_low_slices_psize = context->low_slices_psize; +memcpy (&get_paca ()->context_high_slices_psize, + &context->high_slices_psize,SLICE_ARRAY_SIZE ); +#else +get_paca ()->context_sllp = context->sllp; +#endif }#else static inline void
copy_mm_to_paca(mm_context_t *context){}(quoted diff) +0
-0
b/arch/powerpc/kernel/asm-offsets.cindex 9db7be2..d5903a9 100644arch/powerpc/kernel/asm-offsets.c +0
-0@@ -186,12 +186,12 @@ int main(void)DEFINE (PACASOFTIRQEN , offsetof(struct paca_struct , soft_enabled)); DEFINE(PACAIRQHAPPENED, offsetof(struct paca_struct,
irq_happened)); #ifdefCONFIG_PPC_BOOK3Sarch/powerpc/kernel/asm-offsets.c +0
-1- DEFINE(PACACONTEXTID, offsetof(struct paca_struct,context.id));
arch/powerpc/kernel/asm-offsets.c +1
-0+ DEFINE(PACACONTEXTID, offsetof(struct paca_struct,
context_id)); #ifdefCONFIG_PPC_MM_SLICESarch/powerpc/kernel/asm-offsets.c +0
-1DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, -context.low_slices_psize));
+context_low_slices_psize)); DEFINE(PACAHIGHSLICEPSIZE, offsetof(structpaca_struct,
-
context.high_slices_psize));
+context_high_slices_psize));DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); #endif /*CONFIG_PPC_MM_SLICES*/
#endifarch/powerpc/kernel/asm-offsets.c +1
-1@@ -224,7 +224,7 @@ int main(void)#ifdef CONFIG_PPC_MM_SLICES DEFINE (MMUPSIZESLLP , offsetof(struct mmu_psize_def , sllp));#else -DEFINE (PACACONTEXTSLLP , offsetof(struct paca_struct , context.sllp)); + DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct,
context_sllp)); #endif /*CONFIG_PPC_MM_SLICES*/arch/powerpc/kernel/asm-offsets.c +0
-0DEFINE (PACA_EXGEN , offsetof(struct paca_struct , exgen));DEFINE (PACA_EXMC , offsetof(struct paca_struct , exmc));(quoted diff) +0
-0
b/arch/powerpc/mm/hash_utils_64.cindex fa62eb0..0e087e4 100644arch/powerpc/mm/hash_utils_64.c +2
-2@@ -877,11 +877,11 @@ static unsigned int get_paca_psize(unsigned long addr) unsigned long index, mask_index;if (addr <SLICE_LOW_TOP ) { - lpsizes =get_paca ()->context.low_slices_psize; + lpsizes =get_paca ()->context_low_slices_psize; index =GET_LOW_SLICE_INDEX (addr);return (lpsizes >> (index *4 )) &0xF ; } - hpsizes =get_paca ()->context.high_slices_psize; + hpsizes =get_paca ()->context_high_slices_psize; index =GET_HIGH_SLICE_INDEX (addr); mask_index = index &0x1 ;return (hpsizes[index >>1 ] >> (mask_index *4 )) &0xF ;
PATCH v2 2/2 powerpc: Copy only required pieces of the mm_context_t to the paca
In reply to Michael NeulingCurrently we copy the whole mm_context_t to the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.
This patch pulls in only the required bits from the mm_context_t to the paca and on context switch, copies only those.
Benchmarking this (On top of Anton's recent MSR context switching changes [1]) using processes and yield shows an improvement of almost 3% on POWER8:
http://ozlabs.org/~anton/junkcode/context_switch2.c ./context_switch2 --test=3Dyield --process 0 0
1. https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-October/135700.
html
---
v2:
Added missing include which broke allmodconfig (noticed by anton)
include/asm/paca.h | 18 ++++++++++++++++-- kernel/asm-offsets.c | 8 ++++---- mm/hash_utils_64.c | 4 ++-- 3 files changed, 22 insertions(+), 8 deletions(-)
(quoted diff) +0 -0
b/arch/powerpc/include/asm/paca.h
index 1cc6e08..06cdaee 100644
arch/powerpc/include/asm/paca.h +0 -0
@@ -16,6 +16,7 @@
=20
#ifdef CONFIG_PPC64
=20
+#include <linux/string.h>
#include <asm/types.h>
#include <asm/lppaca.h>
#include <asm/mmu.h>
@@ -132,7 +133,13 @@ struct paca_struct {
#endif /* CONFIG_PPC_BOOK3E */
=20
#ifdef CONFIG_PPC_BOOK3S
- mm_context_t context;
+ mm_context_id_t context_id;
+#ifdef CONFIG_PPC_MM_SLICES
+ u64 context_low_slices_psize;
+ unsigned char context_high_slices_psize[SLICE_ARRAY_SIZE];
+#else
+ u16 context_sllp;
+#endif
#endif
=20
/*
@@ -199,7 +206,14 @@ struct paca_struct {
#ifdef CONFIG_PPC_BOOK3S
static inline void copy_mm_to_paca(mm_context_t *context) {
- get_paca()->context =3D *context;
+ get_paca()->context_id =3D context->id;
+#ifdef CONFIG_PPC_MM_SLICES
+ get_paca()->context_low_slices_psize =3D context
->low_slices_psize;
+ memcpy(&get_paca()->context_high_slices_psize,
+ &context->high_slices_psize, SLICE_ARRAY_SIZE);
+#else
+ get_paca()->context_sllp =3D context->sllp;
+#endif
}
#else
static inline void copy_mm_to_paca(mm_context_t *context){}
(quoted diff) +0 -0
b/arch/powerpc/kernel/asm-offsets.c
index 9db7be2..d5903a9 100644
arch/powerpc/kernel/asm-offsets.c +0 -0
@@ -186,12 +186,12 @@ int main(void) DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct,
soft_enabled));
DEFINE(PACAIRQHAPPENED, offsetof(struct paca_struct,irq_happened));
#ifdef CONFIG_PPC_BOOK3S
- DEFINE(PACACONTEXTID, offsetof(struct paca_struct,
context.id));
+ DEFINE(PACACONTEXTID, offsetof(struct paca_struct,context_id));
#ifdef CONFIG_PPC_MM_SLICES
DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct,
- =20
context.low_slices_psize));
+ =20
context_low_slices_psize));
DEFINE(PACAHIGHSLICEPSIZE, offsetof(struct paca_struct,
- =20
context.high_slices_psize));
+ =20
context_high_slices_psize));
DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def));
#endif /* CONFIG_PPC_MM_SLICES */
#endif
@@ -224,7 +224,7 @@ int main(void)
#ifdef CONFIG_PPC_MM_SLICES
DEFINE(MMUPSIZESLLP, offsetof(struct mmu_psize_def, sllp));
#else
- DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct,
context.sllp));
+ DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct,context_sllp));
#endif /* CONFIG_PPC_MM_SLICES */
DEFINE(PACA_EXGEN, offsetof(struct paca_struct, exgen)); DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc));
(quoted diff) +0 -0
b/arch/powerpc/mm/hash_utils_64.c
index 0aa526e..ae98d58 100644
arch/powerpc/mm/hash_utils_64.c +0 -0
@@ -877,11 +877,11 @@ static unsigned int get_paca_psize(unsigned long
addr)
unsigned long index, mask_index;
=20
if (addr < SLICE_LOW_TOP) {
- lpsizes =3D get_paca()->context.low_slices_psize;
+ lpsizes =3D get_paca()->context_low_slices_psize;
index =3D GET_LOW_SLICE_INDEX(addr); return (lpsizes >> (index * 4)) & 0xF;
}
- hpsizes =3D get_paca()->context.high_slices_psize;
+ hpsizes =3D get_paca()->context_high_slices_psize;
index =3D GET_HIGH_SLICE_INDEX(addr); mask_index =3D index & 0x1;
return (hpsizes[index >> 1] >> (mask_index * 4)) & 0xF;
Michael Ellerman
reviewerRe: [PATCH v2 2/2] powerpc: Copy only required pieces of the mm_context_t to the paca
Quoted 10 lines · Michael Neuling
Currently we copy the whole
mm_context_tto the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.arch/powerpc/include/asm/paca.h +0
-0
arch/powerpc/include/asm/paca.h struct paca_struct { · line 203
Quoted 8 lines
arch/powerpc/include/asm/paca.h +3
-2@@ -199,7 +206,14 @@ struct paca_struct {#ifdef CONFIG_PPC_BOOK3S static inline void copy_mm_to_paca (mm_context_t *context) { -get_paca ()->context = *context; +get_paca ()->context_id = context->id; +#ifdef CONFIG_PPC_MM_SLICES +get_paca ()->context_low_slices_psize = context ->low_slices_psize;
Patch is wrapped ^
And so on.
cheers
PATCH v3 2/2 powerpc: Copy only required pieces of the mm_context_t to the paca
Currently we copy the whole mm_context_t to the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.
This patch pulls in only the required bits from the mm_context_t to the paca and on context switch, copies only those.
Benchmarking this (On top of Anton's recent MSR context switching changes [1]) using processes and yield shows an improvement of almost 3% on POWER8:
http://ozlabs.org/~anton/junkcode/context_switch2.c ./context_switch2 --test=3Dyield --process 0 0
1. https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-October/135700.html
--
v3:
Fix line wrapping (WTF sorry!?!)
v2:
Added missing include which broke allmodconfig (noticed by anton)
arch/powerpc/include/asm/pac= renamed from arch/powerpc/include/asm/paca.h +0 -0
a.h
index 1cc6e08..06cdaee 100644
arch/powerpc/include/asm/paca.h +0 -0
@@ -16,6 +16,7 @@
=20
#ifdef CONFIG_PPC64
=20
+#include <linux/string.h>
#include <asm/types.h>
#include <asm/lppaca.h>
#include <asm/mmu.h>
@@ -132,7 +133,13 @@ struct paca_struct {
#endif /* CONFIG_PPC_BOOK3E */
=20
#ifdef CONFIG_PPC_BOOK3S
- mm_context_t context;
+ mm_context_id_t context_id;
+#ifdef CONFIG_PPC_MM_SLICES
+ u64 context_low_slices_psize;
+ unsigned char context_high_slices_psize[SLICE_ARRAY_SIZE];
+#else
+ u16 context_sllp;
+#endif
#endif
=20
/*
@@ -199,7 +206,14 @@ struct paca_struct {
#ifdef CONFIG_PPC_BOOK3S
static inline void copy_mm_to_paca(mm_context_t *context) {
- get_paca()->context =3D *context;
+ get_paca()->context_id =3D context->id;
+#ifdef CONFIG_PPC_MM_SLICES
+ get_paca()->context_low_slices_psize =3D context->low_slices_psize;
+ memcpy(&get_paca()->context_high_slices_psize,
+ &context->high_slices_psize, SLICE_ARRAY_SIZE);
+#else
+ get_paca()->context_sllp =3D context->sllp;
+#endif
}
#else
static inline void copy_mm_to_paca(mm_context_t *context){}
arch/powerpc/kernel/asm-of= renamed from arch/powerpc/kernel/asm-offsets.c +0 -0
fsets.c
index 9db7be2..d5903a9 100644
arch/powerpc/kernel/asm-offsets.c +4 -4
@@ -186,12 +186,12 @@ int main(void)DEFINE (PACASOFTIRQEN , offsetof(struct paca_struct , soft_enabled));DEFINE (PACAIRQHAPPENED , offsetof(struct paca_struct , irq_happened));#ifdef CONFIG_PPC_BOOK3S - DEFINE(PACACONTEXTID, offsetof(struct paca_struct, context.id)); +DEFINE (PACACONTEXTID , offsetof(struct paca_struct , context_id));#ifdef CONFIG_PPC_MM_SLICES DEFINE (PACALOWSLICESPSIZE , offsetof(struct paca_struct , - context.low_slices_psize)); + context_low_slices_psize));DEFINE (PACAHIGHSLICEPSIZE , offsetof(struct paca_struct , - context.high_slices_psize)); + context_high_slices_psize));DEFINE (MMUPSIZEDEFSIZE ,sizeof (struct mmu_psize_def ));#endif /* CONFIG_PPC_MM_SLICES */ #endif
@@ -224,7 +224,7 @@ int main(void)#ifdef CONFIG_PPC_MM_SLICES DEFINE (MMUPSIZESLLP , offsetof(struct mmu_psize_def , sllp));#else - DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct, context.sllp)); +DEFINE (PACACONTEXTSLLP , offsetof(struct paca_struct , context_sllp));#endif /* CONFIG_PPC_MM_SLICES */ DEFINE (PACA_EXGEN , offsetof(struct paca_struct , exgen));DEFINE (PACA_EXMC , offsetof(struct paca_struct , exmc));
arch/powerpc/mm/hash_utils_6= renamed from arch/powerpc/mm/hash_utils_64.c +0 -0
4.c
index 0aa526e..ae98d58 100644
arch/powerpc/mm/hash_utils_64.c +0 -0
@@ -877,11 +877,11 @@ static unsigned int get_paca_psize(unsigned long addr=
)
unsigned long index, mask_index;
=20
if (addr < SLICE_LOW_TOP) {
- lpsizes =3D get_paca()->context.low_slices_psize;
+ lpsizes =3D get_paca()->context_low_slices_psize;
index =3D GET_LOW_SLICE_INDEX(addr); return (lpsizes >> (index * 4)) & 0xF;
}
- hpsizes =3D get_paca()->context.high_slices_psize;
+ hpsizes =3D get_paca()->context_high_slices_psize;
index =3D GET_HIGH_SLICE_INDEX(addr); mask_index =3D index & 0x1;
return (hpsizes[index >> 1] >> (mask_index * 4)) & 0xF;
Re: [v3, 2/2] powerpc: Copy only required pieces of the mm_context_t to the paca
Quoted 11 lines · Michael Neuling
Currently we copy the whole
mm_context_tto the paca but only access a few bits of it. This is wasteful of space paca and also takes quite some time in the hot path of context switching.This patch pulls in only the required bits from the
mm_context_tto the paca and on context switch, copies only those.Benchmarking this (On top of Anton's recent MSR context switching changes [1]) using processes and yield shows an improvement of almost 3% on POWER8:
Quoted 6 lines
http://ozlabs.org/~anton/junkcode/context_switch2.c ./context_switch2 --test=yield --process 0 01. https://lists.ozlabs.org/pipermail/linuxppc-dev/2015-October/135700.html
Signed-off-by Michael Neuling <[email protected]>
Applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/2fc251a8dda56b71ec491bee4c
cheers
Quoted 8 lines · Michael Neuling
This adds a function to copy the
mm->contextto the paca. This is only a basic conversion for now but will be used more extensively in the next patch.This also adds #ifdef
CONFIG_PPC_BOOK3Saround this code since it's not used elsewhere.Signed-off-by Michael Neuling <[email protected]>
Applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/c395465da68bfc3a238d5bc15f
cheers