> Date: Tue, 5 Apr 2011 18:42:47 +0200 > From: Ariane van der Steldt <ari...@stack.nl> > > Hi, > > So it turns out that my allocator is not capable of handling the pmap_prefer > horror. This diff exports the actual parameters of pmap_prefer, so I can > make the allocator deal with this intelligently. > > I need compile tests on: > - arm > - hppa > - hppa64 > - m68k > - mips64 > - sh > - sparc > - sparc64 > Since the code is not actually called, it should not affect running of > kernels. > > Ok?
Fine with me. With this, can't we completely get rid of the PMAP_PREFER? > Index: arch//arm/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/arm/include/pmap.h,v > retrieving revision 1.17 > diff -u -d -p -r1.17 pmap.h > --- arch//arm/include/pmap.h 23 Mar 2011 16:54:34 -0000 1.17 > +++ arch//arm/include/pmap.h 5 Apr 2011 16:30:58 -0000 > @@ -620,6 +620,14 @@ vaddr_t pmap_prefer(vaddr_t, vaddr_t); > > extern uint32_t pmap_alias_dist; > extern uint32_t pmap_alias_bits; > + > +/* pmap prefer alias alignment. */ > +#define PMAP_PREFER_ALIGN() (pmap_alias_dist) > +/* pmap prefer offset withing alignment. */ > +#define PMAP_PREFER_OFFSET(of) > \ > + (PMAP_PREFER_ALIGN() == 0 ? 0 : ((of) & (PMAP_PREFER_ALIGN() - 1))) > + > + > #endif /* _LOCORE */ > > #endif /* _KERNEL */ > Index: arch//hppa/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/include/pmap.h,v > retrieving revision 1.40 > diff -u -d -p -r1.40 pmap.h > --- arch//hppa/include/pmap.h 26 Dec 2010 15:40:59 -0000 1.40 > +++ arch//hppa/include/pmap.h 5 Apr 2011 16:30:59 -0000 > @@ -101,6 +101,11 @@ pmap_prefer(vaddr_t offs, vaddr_t hint) > return pmap_prefer_hint; > } > > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() (HPPA_PGALIAS) > +/* pmap prefer offset within alignment */ > +#define PMAP_PREFER_OFFSET(of) ((of) & HPPA_PGAOFF) > + > #define pmap_sid2pid(s) (((s) + 1) << 1) > #define pmap_kernel() (&kernel_pmap_store) > #define pmap_resident_count(pmap) > ((pmap)->pm_stats.resident_count) > Index: arch//hppa64/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/hppa64/include/pmap.h,v > retrieving revision 1.4 > diff -u -d -p -r1.4 pmap.h > --- arch//hppa64/include/pmap.h 26 Dec 2010 15:40:59 -0000 1.4 > +++ arch//hppa64/include/pmap.h 5 Apr 2011 16:30:59 -0000 > @@ -68,6 +68,11 @@ pmap_prefer(vaddr_t offs, vaddr_t hint) > return pmap_prefer_hint; > } > > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() (HPPA_PGALIAS) > +/* pmap prefer offset within alignment */ > +#define PMAP_PREFER_OFFSET(of) ((of) & HPPA_PGAOFF) > + > #define PMAP_GROWKERNEL > #define PMAP_STEAL_MEMORY > > Index: arch//m68k/include/pmap_motorola.h > =================================================================== > RCS file: /cvs/src/sys/arch/m68k/include/pmap_motorola.h,v > retrieving revision 1.22 > diff -u -d -p -r1.22 pmap_motorola.h > --- arch//m68k/include/pmap_motorola.h 23 Mar 2011 16:54:35 -0000 > 1.22 > +++ arch//m68k/include/pmap_motorola.h 5 Apr 2011 16:30:59 -0000 > @@ -139,6 +139,12 @@ void pmap_kenter_cache(vaddr_t, paddr_t, > #ifdef M68K_MMU_HP > vaddr_t pmap_prefer(vaddr_t, vaddr_t); > #define PMAP_PREFER(foff, va) pmap_prefer((foff), (va)) > + > +extern int pmap_aliasmask; /* separation at which VA aliasing is ok */ > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() (pmap_aliasmask ? pmap_aliasmask + 1 : 0) > +/* pmap prefer offset */ > +#define PMAP_PREFER_OFFSET(of) ((of) & pmap_aliasmask) > #endif > > #endif /* _KERNEL */ > Index: arch//m68k/m68k/pmap_motorola.c > =================================================================== > RCS file: /cvs/src/sys/arch/m68k/m68k/pmap_motorola.c,v > retrieving revision 1.59 > diff -u -d -p -r1.59 pmap_motorola.c > --- arch//m68k/m68k/pmap_motorola.c 6 Dec 2010 20:57:16 -0000 1.59 > +++ arch//m68k/m68k/pmap_motorola.c 5 Apr 2011 16:30:59 -0000 > @@ -276,9 +276,6 @@ vaddr_t virtual_end; /* VA of last avai > TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist; > int pv_nfree; > > -#if defined(M68K_MMU_HP) > -extern int pmap_aliasmask; /* separation at which VA aliasing is ok */ > -#endif > #if defined(M68040) || defined(M68060) > int protostfree; /* prototype (default) free ST map */ > #endif > Index: arch//mips64/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/mips64/include/pmap.h,v > retrieving revision 1.25 > diff -u -d -p -r1.25 pmap.h > --- arch//mips64/include/pmap.h 23 Mar 2011 16:54:36 -0000 1.25 > +++ arch//mips64/include/pmap.h 5 Apr 2011 16:30:59 -0000 > @@ -125,6 +125,13 @@ extern struct pmap *const kernel_pmap_pt > > #define PMAP_PREFER(pa, va) pmap_prefer(pa, va) > > +extern vaddr_t CpuCacheAliasMask; /* from mips64/mips64/cpu.c */ > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() \ > + (CpuCacheAliasMask ? CpuCacheAliasMask + 1 : 0) > +/* pmap prefer offset in alignment */ > +#define PMAP_PREFER_OFFSET(of) ((of) & CpuCacheAliasMask) > + > #define pmap_update(x) do { /* nothing */ } while (0) > > void pmap_bootstrap(void); > Index: arch//sh/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/sh/include/pmap.h,v > retrieving revision 1.9 > diff -u -d -p -r1.9 pmap.h > --- arch//sh/include/pmap.h 26 Dec 2010 15:41:00 -0000 1.9 > +++ arch//sh/include/pmap.h 5 Apr 2011 16:31:00 -0000 > @@ -81,6 +81,13 @@ pmap_remove_all(struct pmap *pmap) > #ifdef SH4 > #define PMAP_PREFER(pa, va) pmap_prefer((pa), (va)) > vaddr_t pmap_prefer(vaddr_t, vaddr_t); > +vaddr_t pmap_prefer_align(); > +vaddr_t pmap_prefer_offset(vaddr_t); > + > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() pmap_prefer_align() > +/* pmap prefer offset in alignment */ > +#define PMAP_PREFER_OFFSET(of) pmap_prefer_offset(of) > #endif /* SH4 */ > > #define __HAVE_PMAP_DIRECT > Index: arch//sh/sh/pmap.c > =================================================================== > RCS file: /cvs/src/sys/arch/sh/sh/pmap.c,v > retrieving revision 1.17 > diff -u -d -p -r1.17 pmap.c > --- arch//sh/sh/pmap.c 14 Dec 2010 20:24:25 -0000 1.17 > +++ arch//sh/sh/pmap.c 5 Apr 2011 16:31:00 -0000 > @@ -903,6 +903,28 @@ pmap_prefer(vaddr_t foff, vaddr_t va) > > return va; > } > + > +/* > + * pmap_prefer_align() > + * > + * Return virtual cache alignment. > + */ > +vaddr_t > +pmap_prefer_align(void) > +{ > + return SH_HAS_VIRTUAL_ALIAS ? sh_cache_prefer_mask + 1 : 0; > +} > + > +/* > + * pmap_prefer_offset(vaddr_t of) > + * > + * Calculate offset in virtual cache. > + */ > +vaddr_t > +pmap_prefer_offset(vaddr_t of) > +{ > + return of & (SH_HAS_VIRTUAL_ALIAS ? sh_cache_prefer_mask : 0); > +} > #endif /* SH4 */ > > /* > Index: arch//sparc/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/sparc/include/pmap.h,v > retrieving revision 1.51 > diff -u -d -p -r1.51 pmap.h > --- arch//sparc/include/pmap.h 23 Mar 2011 16:54:37 -0000 1.51 > +++ arch//sparc/include/pmap.h 5 Apr 2011 16:31:00 -0000 > @@ -263,6 +263,13 @@ int pmap_dumpmmu(int (*)(dev > > #define PMAP_PREFER(fo, ap) pmap_prefer((fo), (ap)) > > +extern int cache_alias_dist; > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN() cache_alias_dist > +/* pmap prefer offset in alignment */ > +#define PMAP_PREFER_OFFSET(of) > \ > + ((of) & (cache_alias_dist ? cache_alias_dist - 1 : 0)) > + > #define PMAP_EXCLUDE_DECLS /* tells MI pmap.h *not* to include decls */ > > /* FUNCTION DECLARATIONS FOR COMMON PMAP MODULE */ > Index: arch//sparc/sparc/pmap.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc/sparc/pmap.c,v > retrieving revision 1.158 > diff -u -d -p -r1.158 pmap.c > --- arch//sparc/sparc/pmap.c 6 Dec 2010 20:57:18 -0000 1.158 > +++ arch//sparc/sparc/pmap.c 5 Apr 2011 16:31:00 -0000 > @@ -6259,6 +6259,9 @@ pmap_prefer(vaddr_t foff, vaddr_t va) > return va; > } > > +/* For PMAP_PREFER_ALIGN */ > +int cache_alias_dist = CACHE_ALIAS_DIST; > + > void > pmap_remove_holes(struct vm_map *map) > { > Index: arch//sparc64/include/pmap.h > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/include/pmap.h,v > retrieving revision 1.19 > diff -u -d -p -r1.19 pmap.h > --- arch//sparc64/include/pmap.h 26 Dec 2010 15:41:00 -0000 1.19 > +++ arch//sparc64/include/pmap.h 5 Apr 2011 16:31:00 -0000 > @@ -169,6 +169,11 @@ void pmap_bootstrap(u_long, u_long, u_in > /* make sure all page mappings are modulo 16K to prevent d$ aliasing */ > #define PMAP_PREFER(pa, va) ((va) + (((va) ^ (pa)) & VA_ALIAS_MASK)) > > +/* pmap prefer alignment */ > +#define PMAP_PREFER_ALIGN (VA_ALIAS_MASK + 1) > +/* pmap prefer offset in alignment */ > +#define PMAP_PREFER_OFFSET(of) ((of) & VA_ALIAS_MASK) > + > #define PMAP_GROWKERNEL /* turn on pmap_growkernel interface */ > > /* SPARC specific? */