svn commit: r242218 - in head/sys/ia64: ia64 include
Konstantin Belousov
kib at FreeBSD.org
Sun Oct 28 11:53:56 UTC 2012
Author: kib
Date: Sun Oct 28 11:53:54 2012
New Revision: 242218
URL: http://svn.freebsd.org/changeset/base/242218
Log:
Fix compilation on ia64 when page size is configured for 16KB.
Reviewed by: alc, marcel
Modified:
head/sys/ia64/ia64/pmap.c
head/sys/ia64/include/pmap.h
Modified: head/sys/ia64/ia64/pmap.c
==============================================================================
--- head/sys/ia64/ia64/pmap.c Sun Oct 28 11:27:54 2012 (r242217)
+++ head/sys/ia64/ia64/pmap.c Sun Oct 28 11:53:54 2012 (r242218)
@@ -140,6 +140,29 @@ extern uint64_t ia64_gateway_page[];
#define pmap_set_wired(lpte) (lpte)->pte |= PTE_WIRED
/*
+ * Individual PV entries are stored in per-pmap chunks. This saves
+ * space by eliminating the need to record the pmap within every PV
+ * entry.
+ */
+#if PAGE_SIZE == 8192
+#define _NPCM 6
+#define _NPCPV 337
+#define _NPCS 2
+#elif PAGE_SIZE == 16384
+#define _NPCM 11
+#define _NPCPV 677
+#define _NPCS 1
+#endif
+struct pv_chunk {
+ pmap_t pc_pmap;
+ TAILQ_ENTRY(pv_chunk) pc_list;
+ u_long pc_map[_NPCM]; /* bitmap; 1 = free */
+ TAILQ_ENTRY(pv_chunk) pc_lru;
+ u_long pc_spare[_NPCS];
+ struct pv_entry pc_pventry[_NPCPV];
+};
+
+/*
* The VHPT bucket head structure.
*/
struct ia64_bucket {
@@ -693,8 +716,6 @@ pmap_growkernel(vm_offset_t addr)
***************************************************/
CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
-CTASSERT(_NPCM == 6);
-CTASSERT(_NPCPV == 337);
static __inline struct pv_chunk *
pv_to_chunk(pv_entry_t pv)
@@ -705,13 +726,23 @@ pv_to_chunk(pv_entry_t pv)
#define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
-#define PC_FREE0_4 0xfffffffffffffffful
-#define PC_FREE5 0x000000000001fffful
+#define PC_FREE_FULL 0xfffffffffffffffful
+#define PC_FREE_PARTIAL \
+ ((1UL << (_NPCPV - sizeof(u_long) * 8 * (_NPCM - 1))) - 1)
+#if PAGE_SIZE == 8192
static const u_long pc_freemask[_NPCM] = {
- PC_FREE0_4, PC_FREE0_4, PC_FREE0_4,
- PC_FREE0_4, PC_FREE0_4, PC_FREE5
+ PC_FREE_FULL, PC_FREE_FULL, PC_FREE_FULL,
+ PC_FREE_FULL, PC_FREE_FULL, PC_FREE_PARTIAL
};
+#elif PAGE_SIZE == 16384
+static const u_long pc_freemask[_NPCM] = {
+ PC_FREE_FULL, PC_FREE_FULL, PC_FREE_FULL,
+ PC_FREE_FULL, PC_FREE_FULL, PC_FREE_FULL,
+ PC_FREE_FULL, PC_FREE_FULL, PC_FREE_FULL,
+ PC_FREE_FULL, PC_FREE_PARTIAL
+};
+#endif
static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
Modified: head/sys/ia64/include/pmap.h
==============================================================================
--- head/sys/ia64/include/pmap.h Sun Oct 28 11:27:54 2012 (r242217)
+++ head/sys/ia64/include/pmap.h Sun Oct 28 11:53:54 2012 (r242218)
@@ -105,21 +105,6 @@ typedef struct pv_entry {
TAILQ_ENTRY(pv_entry) pv_list;
} *pv_entry_t;
-/*
- * pv_entries are allocated in chunks per-process. This avoids the
- * need to track per-pmap assignments.
- */
-#define _NPCM 6
-#define _NPCPV 337
-struct pv_chunk {
- pmap_t pc_pmap;
- TAILQ_ENTRY(pv_chunk) pc_list;
- u_long pc_map[_NPCM]; /* bitmap; 1 = free */
- TAILQ_ENTRY(pv_chunk) pc_lru;
- u_long pc_spare[2];
- struct pv_entry pc_pventry[_NPCPV];
-};
-
#ifdef _KERNEL
extern vm_paddr_t phys_avail[];
More information about the svn-src-head
mailing list