From patchwork Wed Aug 8 06:25:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfan liu X-Patchwork-Id: 175873 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 734142C0080 for ; Wed, 8 Aug 2012 17:11:00 +1000 (EST) Received: from localhost ([::1]:58977 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sz0Py-0006ag-63 for incoming@patchwork.ozlabs.org; Wed, 08 Aug 2012 03:10:58 -0400 Received: from eggs.gnu.org ([208.118.235.92]:43959) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SyzjF-0001FU-1u for qemu-devel@nongnu.org; Wed, 08 Aug 2012 02:26:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SyzjD-0002QC-E7 for qemu-devel@nongnu.org; Wed, 08 Aug 2012 02:26:48 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:62109) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SyzjD-0001sm-8g for qemu-devel@nongnu.org; Wed, 08 Aug 2012 02:26:47 -0400 Received: by mail-ob0-f173.google.com with SMTP id ta14so635077obb.4 for ; Tue, 07 Aug 2012 23:26:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=2E6nVD3h/NWimycfAX7WPuzgjwmh6s6dlqOdL3fjcm8=; b=PNLprqsBspFG/XpPJ01DOZnpW9iQSwiGsC/LNIjHpF7e73PW9tIaeIyG+Xv094BW1c t9FPVKppiediy45cVQyD5BLb/tjgjWI4KJe8leLA2B4FN7lWPfJ8oWgDx+RwlOWH5goh LAYsHyvy/cnjUoYyQEUj5lnQj0flP4xE8o2ABvoT8OqXo89jHRt+b27A/ZMnno3nScgK LRnG2TAkkCO6o7EfP2jRX7AIn91K798Ppw+SZA5/E18OFJGDjbn3eYK4efGh35Tyk7Qx s94i9NtV7Xeg1soBT4oMBtIrmS437YMvVQkCRfzjJEmsmMMJD5x7F0LKEug0iBu6t2vc 7n8w== Received: by 10.60.30.170 with SMTP id t10mr28573946oeh.10.1344407206980; Tue, 07 Aug 2012 23:26:46 -0700 (PDT) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPS id d6sm2240469obx.15.2012.08.07.23.26.45 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 07 Aug 2012 23:26:46 -0700 (PDT) From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Wed, 8 Aug 2012 14:25:49 +0800 Message-Id: <1344407156-25562-9-git-send-email-qemulist@gmail.com> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1344407156-25562-1-git-send-email-qemulist@gmail.com> References: <1344407156-25562-1-git-send-email-qemulist@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.214.173 Cc: kvm@vger.kernel.org, Stefan Hajnoczi , Marcelo Tosatti , qemulist@gmail.com, Blue Swirl , Avi Kivity , Anthony Liguori , Jan Kiszka , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PATCH 08/15] memory: introduce PhysMap to present snapshot of toploygy X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Liu Ping Fan PhysMap contain the flatview and radix-tree view, they are snapshot of system topology and should be consistent. With PhysMap, we can swap the pointer when updating and achieve the atomic. Signed-off-by: Liu Ping Fan --- exec.c | 8 -------- memory.c | 33 --------------------------------- memory.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 43 deletions(-) diff --git a/exec.c b/exec.c index 0e29ef9..01b91b0 100644 --- a/exec.c +++ b/exec.c @@ -156,8 +156,6 @@ typedef struct PageDesc { #endif /* Size of the L2 (and L3, etc) page tables. */ -#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) @@ -185,7 +183,6 @@ uintptr_t qemu_host_page_mask; static void *l1_map[V_L1_SIZE]; #if !defined(CONFIG_USER_ONLY) -typedef struct PhysPageEntry PhysPageEntry; static MemoryRegionSection *phys_sections; static unsigned phys_sections_nb, phys_sections_nb_alloc; @@ -194,11 +191,6 @@ static uint16_t phys_section_notdirty; static uint16_t phys_section_rom; static uint16_t phys_section_watch; -struct PhysPageEntry { - uint16_t is_leaf : 1; - /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ - uint16_t ptr : 15; -}; /* Simple allocator for PhysPageEntry nodes */ static PhysPageEntry (*phys_map_nodes)[L2_SIZE]; diff --git a/memory.c b/memory.c index 2eaa2fc..c7f2cfd 100644 --- a/memory.c +++ b/memory.c @@ -31,17 +31,6 @@ static bool global_dirty_log = false; static QTAILQ_HEAD(memory_listeners, MemoryListener) memory_listeners = QTAILQ_HEAD_INITIALIZER(memory_listeners); -typedef struct AddrRange AddrRange; - -/* - * Note using signed integers limits us to physical addresses at most - * 63 bits wide. They are needed for negative offsetting in aliases - * (large MemoryRegion::alias_offset). - */ -struct AddrRange { - Int128 start; - Int128 size; -}; static AddrRange addrrange_make(Int128 start, Int128 size) { @@ -197,28 +186,6 @@ static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a, && !memory_region_ioeventfd_before(b, a); } -typedef struct FlatRange FlatRange; -typedef struct FlatView FlatView; - -/* Range of memory in the global map. Addresses are absolute. */ -struct FlatRange { - MemoryRegion *mr; - target_phys_addr_t offset_in_region; - AddrRange addr; - uint8_t dirty_log_mask; - bool readable; - bool readonly; -}; - -/* Flattened global view of current active memory hierarchy. Kept in sorted - * order. - */ -struct FlatView { - FlatRange *ranges; - unsigned nr; - unsigned nr_allocated; -}; - typedef struct AddressSpace AddressSpace; typedef struct AddressSpaceOps AddressSpaceOps; diff --git a/memory.h b/memory.h index 740f018..357edd8 100644 --- a/memory.h +++ b/memory.h @@ -29,12 +29,72 @@ #include "qemu-thread.h" #include "qemu/reclaimer.h" +typedef struct AddrRange AddrRange; +typedef struct FlatRange FlatRange; +typedef struct FlatView FlatView; +typedef struct PhysPageEntry PhysPageEntry; +typedef struct PhysMap PhysMap; +typedef struct MemoryRegionSection MemoryRegionSection; typedef struct MemoryRegionOps MemoryRegionOps; typedef struct MemoryRegionLifeOps MemoryRegionLifeOps; typedef struct MemoryRegion MemoryRegion; typedef struct MemoryRegionPortio MemoryRegionPortio; typedef struct MemoryRegionMmio MemoryRegionMmio; +/* + * Note using signed integers limits us to physical addresses at most + * 63 bits wide. They are needed for negative offsetting in aliases + * (large MemoryRegion::alias_offset). + */ +struct AddrRange { + Int128 start; + Int128 size; +}; + +/* Range of memory in the global map. Addresses are absolute. */ +struct FlatRange { + MemoryRegion *mr; + target_phys_addr_t offset_in_region; + AddrRange addr; + uint8_t dirty_log_mask; + bool readable; + bool readonly; +}; + +/* Flattened global view of current active memory hierarchy. Kept in sorted + * order. + */ +struct FlatView { + FlatRange *ranges; + unsigned nr; + unsigned nr_allocated; +}; + +struct PhysPageEntry { + uint16_t is_leaf:1; + /* index into phys_sections (is_leaf) or phys_map_nodes (!is_leaf) */ + uint16_t ptr:15; +}; + +#define L2_BITS 10 +#define L2_SIZE (1 << L2_BITS) +/* This is a multi-level map on the physical address space. + The bottom level has pointers to MemoryRegionSections. */ +struct PhysMap { + Atomic ref; + PhysPageEntry root; + PhysPageEntry (*phys_map_nodes)[L2_SIZE]; + unsigned phys_map_nodes_nb; + unsigned phys_map_nodes_nb_alloc; + + MemoryRegionSection *phys_sections; + unsigned phys_sections_nb; + unsigned phys_sections_nb_alloc; + + /* FlatView */ + FlatView views[2]; +}; + /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic * registration. */ @@ -167,8 +227,6 @@ struct MemoryRegionPortio { #define PORTIO_END_OF_LIST() { } -typedef struct MemoryRegionSection MemoryRegionSection; - /** * MemoryRegionSection: describes a fragment of a #MemoryRegion *