Commit c395465d authored by Michael Neuling's avatar Michael Neuling Committed by Michael Ellerman

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.
Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1b855e16
...@@ -131,7 +131,9 @@ struct paca_struct { ...@@ -131,7 +131,9 @@ struct paca_struct {
struct tlb_core_data tcd; struct tlb_core_data tcd;
#endif /* CONFIG_PPC_BOOK3E */ #endif /* CONFIG_PPC_BOOK3E */
#ifdef CONFIG_PPC_BOOK3S
mm_context_t context; mm_context_t context;
#endif
/* /*
* then miscellaneous read-write fields * then miscellaneous read-write fields
...@@ -194,6 +196,15 @@ struct paca_struct { ...@@ -194,6 +196,15 @@ struct paca_struct {
#endif #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 struct paca_struct *paca;
extern void initialise_paca(struct paca_struct *new_paca, int cpu); extern void initialise_paca(struct paca_struct *new_paca, int cpu);
extern void setup_paca(struct paca_struct *new_paca); extern void setup_paca(struct paca_struct *new_paca);
......
...@@ -185,6 +185,7 @@ int main(void) ...@@ -185,6 +185,7 @@ int main(void)
DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr)); DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr));
DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled)); DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled));
DEFINE(PACAIRQHAPPENED, offsetof(struct paca_struct, irq_happened)); 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 #ifdef CONFIG_PPC_MM_SLICES
DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct,
...@@ -193,6 +194,7 @@ int main(void) ...@@ -193,6 +194,7 @@ int main(void)
context.high_slices_psize)); context.high_slices_psize));
DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def));
#endif /* CONFIG_PPC_MM_SLICES */ #endif /* CONFIG_PPC_MM_SLICES */
#endif
#ifdef CONFIG_PPC_BOOK3E #ifdef CONFIG_PPC_BOOK3E
DEFINE(PACAPGD, offsetof(struct paca_struct, pgd)); DEFINE(PACAPGD, offsetof(struct paca_struct, pgd));
......
...@@ -882,7 +882,8 @@ void demote_segment_4k(struct mm_struct *mm, unsigned long addr) ...@@ -882,7 +882,8 @@ void demote_segment_4k(struct mm_struct *mm, unsigned long addr)
slice_set_range_psize(mm, addr, 1, MMU_PAGE_4K); slice_set_range_psize(mm, addr, 1, MMU_PAGE_4K);
copro_flush_all_slbs(mm); copro_flush_all_slbs(mm);
if ((get_paca_psize(addr) != MMU_PAGE_4K) && (current->mm == 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(); slb_flush_and_rebolt();
} }
} }
...@@ -949,7 +950,7 @@ static void check_paca_psize(unsigned long ea, struct mm_struct *mm, ...@@ -949,7 +950,7 @@ static void check_paca_psize(unsigned long ea, struct mm_struct *mm,
{ {
if (user_region) { if (user_region) {
if (psize != get_paca_psize(ea)) { if (psize != get_paca_psize(ea)) {
get_paca()->context = mm->context; copy_mm_to_paca(&mm->context);
slb_flush_and_rebolt(); slb_flush_and_rebolt();
} }
} else if (get_paca()->vmalloc_sllp != } else if (get_paca()->vmalloc_sllp !=
......
...@@ -228,7 +228,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) ...@@ -228,7 +228,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
asm volatile("slbie %0" : : "r" (slbie_data)); asm volatile("slbie %0" : : "r" (slbie_data));
get_paca()->slb_cache_ptr = 0; get_paca()->slb_cache_ptr = 0;
get_paca()->context = mm->context; copy_mm_to_paca(&mm->context);
/* /*
* preload some userspace segments into the SLB. * preload some userspace segments into the SLB.
......
...@@ -185,8 +185,7 @@ static void slice_flush_segments(void *parm) ...@@ -185,8 +185,7 @@ static void slice_flush_segments(void *parm)
if (mm != current->active_mm) if (mm != current->active_mm)
return; return;
/* update the paca copy of the context struct */ copy_mm_to_paca(&current->active_mm->context);
get_paca()->context = current->active_mm->context;
local_irq_save(flags); local_irq_save(flags);
slb_flush_and_rebolt(); slb_flush_and_rebolt();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment