[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/20] memory: remove first level of l1_phys_map
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [PATCH 06/20] memory: remove first level of l1_phys_map |
Date: |
Tue, 14 Feb 2012 11:27:36 +0200 |
L1 and the lower levels in l1_phys_map are equivalent, except that L1 has
a different size, and is always allocated. Simplify the code by removing
L1. This leaves us with a tree composed solely of L2 tables, but that
problem can be renamed away later.
Signed-off-by: Avi Kivity <address@hidden>
---
exec.c | 29 ++++++++---------------------
1 files changed, 8 insertions(+), 21 deletions(-)
diff --git a/exec.c b/exec.c
index b36c301..c541ee7 100644
--- a/exec.c
+++ b/exec.c
@@ -160,29 +160,21 @@
#define L2_BITS 10
#define L2_SIZE (1 << L2_BITS)
+#define P_L2_LEVELS \
+ (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1)
+
/* The bits remaining after N lower levels of page tables. */
-#define P_L1_BITS_REM \
- ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
#define V_L1_BITS_REM \
((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
-/* Size of the L1 page table. Avoid silly small sizes. */
-#if P_L1_BITS_REM < 4
-#define P_L1_BITS (P_L1_BITS_REM + L2_BITS)
-#else
-#define P_L1_BITS P_L1_BITS_REM
-#endif
-
#if V_L1_BITS_REM < 4
#define V_L1_BITS (V_L1_BITS_REM + L2_BITS)
#else
#define V_L1_BITS V_L1_BITS_REM
#endif
-#define P_L1_SIZE ((target_phys_addr_t)1 << P_L1_BITS)
#define V_L1_SIZE ((target_ulong)1 << V_L1_BITS)
-#define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
unsigned long qemu_real_host_page_size;
@@ -202,7 +194,7 @@
/* This is a multi-level map on the physical address space.
The bottom level has pointers to PhysPageDesc. */
-static void *l1_phys_map[P_L1_SIZE];
+static void *phys_map;
static void io_mem_init(void);
static void memory_map_init(void);
@@ -404,11 +396,10 @@ static PhysPageDesc
*phys_page_find_alloc(target_phys_addr_t index, int alloc)
void **lp;
int i;
- /* Level 1. Always allocated. */
- lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
+ lp = &phys_map;
- /* Level 2..N-1. */
- for (i = P_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
+ /* Level 1..N-1. */
+ for (i = P_L2_LEVELS - 1; i > 0; i--) {
void **p = *lp;
if (p == NULL) {
if (!alloc) {
@@ -2560,11 +2551,7 @@ static void destroy_l2_mapping(void **lp, unsigned level)
static void destroy_all_mappings(void)
{
- unsigned i;
-
- for (i = 0; i < P_L1_SIZE; ++i) {
- destroy_l2_mapping(&l1_phys_map[i], P_L1_SHIFT / L2_BITS - 1);
- }
+ destroy_l2_mapping(&phys_map, P_L2_LEVELS - 1);
}
/* register physical memory.
--
1.7.9
- [Qemu-devel] [PATCH 00/20] Reduce storage overhead of memory core, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 04/20] memory: support stateless memory listeners, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 06/20] memory: remove first level of l1_phys_map,
Avi Kivity <=
- [Qemu-devel] [PATCH 01/20] memory: allow MemoryListeners to observe a specific address space, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 11/20] memory: unify the two branches of cpu_register_physical_memory_log(), Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 10/20] memory: fix RAM subpages in newly initialized pages, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 17/20] memory: switch phys_page_set() to a recursive implementation, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 12/20] memory: move tlb flush to MemoryListener commit callback, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 07/20] memory: unify phys_map last level with intermediate levels, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 14/20] memory: give phys_page_find() its own tree search loop, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 03/20] memory: split memory listener for the two address spaces, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 18/20] memory: change phys_page_set() to set multiple pages, Avi Kivity, 2012/02/14
- [Qemu-devel] [PATCH 16/20] memory: replace phys_page_find_alloc() with phys_page_set(), Avi Kivity, 2012/02/14