Re: [PATCH 08/15] memory: introduce PhysMap to present snapshot of toploygy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Aug 9, 2012 at 3:18 AM, Blue Swirl <blauwirbel@xxxxxxxxx> wrote:
> On Wed, Aug 8, 2012 at 6:25 AM, Liu Ping Fan <qemulist@xxxxxxxxx> wrote:
>> From: Liu Ping Fan <pingfank@xxxxxxxxxxxxxxxxxx>
>>
>> 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 <pingfank@xxxxxxxxxxxxxxxxxx>
>> ---
>>  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.  */
>
> Please copy this comment to the header file.
>
OK, thanks.
pingfan

>> -#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
>>   *
>> --
>> 1.7.4.4
>>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux