Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ca8cf73 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Paul Mackerras
Browse files

powerpc/mm: Rework context management for CPUs with no hash table



This reworks the context management code used by 4xx,8xx and
freescale BookE.  It adds support for SMP by implementing a
concept of stale context map to lazily flush the TLB on
processors where a context may have been invalidated.  This
also contains the ground work for generalizing such lazy TLB
flushing by just picking up a new PID and marking the old one
stale.  This will be implemented later.

This is a first implementation that uses a global spinlock.

Ideally, we should try to get at least the fast path (context ID
already assigned) lockless or limited to a per context lock,
but for now this will do.

I tried to keep the UP case reasonably simple to avoid adding
too much overhead to 8xx which does a lot of context stealing
since it effectively has only 16 PIDs available.

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: default avatarKumar Gala <galak@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 5e696617
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -54,7 +54,8 @@
#ifndef __ASSEMBLY__

typedef struct {
	unsigned long id;
	unsigned int	id;
	unsigned int	active;
	unsigned long	vdso_base;
} mm_context_t;

+3 −2
Original line number Diff line number Diff line
@@ -56,7 +56,8 @@
extern unsigned int tlb_44x_hwater;

typedef struct {
	unsigned long id;
	unsigned int	id;
	unsigned int	active;
	unsigned long	vdso_base;
} mm_context_t;

+2 −1
Original line number Diff line number Diff line
@@ -137,7 +137,8 @@

#ifndef __ASSEMBLY__
typedef struct {
	unsigned long id;
	unsigned int id;
	unsigned int active;
	unsigned long vdso_base;
} mm_context_t;
#endif /* !__ASSEMBLY__ */
+3 −2
Original line number Diff line number Diff line
@@ -76,7 +76,8 @@
#ifndef __ASSEMBLY__

typedef struct {
	unsigned long id;
	unsigned int	id;
	unsigned int	active;
	unsigned long	vdso_base;
} mm_context_t;
#endif /* !__ASSEMBLY__ */
+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@

#include <linux/mm.h>

#define MMU_NO_CONTEXT      	((unsigned int)-1)

extern void _tlbie(unsigned long address, unsigned int pid);
extern void _tlbil_all(void);
extern void _tlbil_pid(unsigned int pid);
Loading