Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/816301/?format=api
{ "id": 816301, "url": "http://patchwork.ozlabs.org/api/patches/816301/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170920114637.42004-7-aik@ozlabs.ru/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170920114637.42004-7-aik@ozlabs.ru>", "list_archive_url": null, "date": "2017-09-20T11:46:25", "name": "[qemu,v4,06/18] memory: Switch memory from using AddressSpace to FlatView", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "1c78720833a8be6311fc4002bb44f986bfadbb14", "submitter": { "id": 7621, "url": "http://patchwork.ozlabs.org/api/people/7621/?format=api", "name": "Alexey Kardashevskiy", "email": "aik@ozlabs.ru" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170920114637.42004-7-aik@ozlabs.ru/mbox/", "series": [ { "id": 4138, "url": "http://patchwork.ozlabs.org/api/series/4138/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=4138", "date": "2017-09-20T11:46:20", "name": "memory: Reduce memory use", "version": 4, "mbox": "http://patchwork.ozlabs.org/series/4138/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/816301/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/816301/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xy3Lq07PRz9s7B\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 21 Sep 2017 01:19:30 +1000 (AEST)", "from localhost ([::1]:48796 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dugme-0006s1-OF\n\tfor incoming@patchwork.ozlabs.org; Wed, 20 Sep 2017 11:19:28 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:56353)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <aik@ozlabs.ru>) id 1dufmG-0003O1-Lz\n\tfor qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:15:04 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <aik@ozlabs.ru>) id 1dufmC-00056q-L2\n\tfor qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:15:00 -0400", "from ozlabs.ru ([107.173.13.209]:59718)\n\tby eggs.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <aik@ozlabs.ru>) id 1dufmC-00056C-7i\n\tfor qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:14:56 -0400", "from vpl1.ozlabs.ibm.com (localhost [IPv6:::1])\n\tby ozlabs.ru (Postfix) with ESMTP id 429B53A60055;\n\tWed, 20 Sep 2017 07:48:04 -0400 (EDT)" ], "From": "Alexey Kardashevskiy <aik@ozlabs.ru>", "To": "qemu-devel@nongnu.org", "Date": "Wed, 20 Sep 2017 21:46:25 +1000", "Message-Id": "<20170920114637.42004-7-aik@ozlabs.ru>", "X-Mailer": "git-send-email 2.11.0", "In-Reply-To": "<20170920114637.42004-1-aik@ozlabs.ru>", "References": "<20170920114637.42004-1-aik@ozlabs.ru>", "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 3.x [fuzzy]", "X-Received-From": "107.173.13.209", "Subject": "[Qemu-devel] [PATCH qemu v4 06/18] memory: Switch memory from using\n\tAddressSpace to FlatView", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "Alexey Kardashevskiy <aik@ozlabs.ru>, Paolo Bonzini <pbonzini@redhat.com>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "FlatView's will be shared between AddressSpace's and subpage_t\nand MemoryRegionSection cannot store AS anymore, hence this change.\n\nIn particular, for:\n\n typedef struct subpage_t {\n MemoryRegion iomem;\n- AddressSpace *as;\n+ FlatView *fv;\n hwaddr base;\n uint16_t sub_section[];\n } subpage_t;\n\n struct MemoryRegionSection {\n MemoryRegion *mr;\n- AddressSpace *address_space;\n+ FlatView *fv;\n hwaddr offset_within_region;\n Int128 size;\n hwaddr offset_within_address_space;\n bool readonly;\n };\n\nThis should cause no behavioural change.\n\nSigned-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>\n---\nChanges:\nv4:\n* fixed compile warning/error about duplicated \"typedef struct FlatView\nFlatView\"\n---\n include/exec/memory-internal.h | 2 +-\n include/exec/memory.h | 51 ++++++++----\n exec.c | 180 ++++++++++++++++++++++++-----------------\n hw/intc/openpic_kvm.c | 2 +-\n memory.c | 29 +++----\n 5 files changed, 157 insertions(+), 107 deletions(-)", "diff": "diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h\nindex 6e08eda256..1cf8ad9869 100644\n--- a/include/exec/memory-internal.h\n+++ b/include/exec/memory-internal.h\n@@ -27,7 +27,7 @@ extern const MemoryRegionOps unassigned_mem_ops;\n bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,\n unsigned size, bool is_write);\n \n-void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section);\n+void mem_add(FlatView *fv, MemoryRegionSection *section);\n AddressSpaceDispatch *mem_begin(AddressSpace *as);\n void mem_commit(AddressSpaceDispatch *d);\n \ndiff --git a/include/exec/memory.h b/include/exec/memory.h\nindex 2346f8b863..7816e5d655 100644\n--- a/include/exec/memory.h\n+++ b/include/exec/memory.h\n@@ -48,6 +48,7 @@\n \n typedef struct MemoryRegionOps MemoryRegionOps;\n typedef struct MemoryRegionMmio MemoryRegionMmio;\n+typedef struct FlatView FlatView;\n \n struct MemoryRegionMmio {\n CPUReadMemoryFunc *read[3];\n@@ -320,6 +321,8 @@ struct AddressSpace {\n QTAILQ_ENTRY(AddressSpace) address_spaces_link;\n };\n \n+FlatView *address_space_to_flatview(AddressSpace *as);\n+\n /**\n * MemoryRegionSection: describes a fragment of a #MemoryRegion\n *\n@@ -333,7 +336,7 @@ struct AddressSpace {\n */\n struct MemoryRegionSection {\n MemoryRegion *mr;\n- AddressSpace *address_space;\n+ FlatView *fv;\n hwaddr offset_within_region;\n Int128 size;\n hwaddr offset_within_address_space;\n@@ -1842,9 +1845,17 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,\n * @len: pointer to length\n * @is_write: indicates the transfer direction\n */\n-MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,\n- hwaddr *xlat, hwaddr *len,\n- bool is_write);\n+MemoryRegion *flatview_translate(FlatView *fv,\n+ hwaddr addr, hwaddr *xlat,\n+ hwaddr *len, bool is_write);\n+\n+static inline MemoryRegion *address_space_translate(AddressSpace *as,\n+ hwaddr addr, hwaddr *xlat,\n+ hwaddr *len, bool is_write)\n+{\n+ return flatview_translate(address_space_to_flatview(as),\n+ addr, xlat, len, is_write);\n+}\n \n /* address_space_access_valid: check for validity of accessing an address\n * space range\n@@ -1895,12 +1906,13 @@ void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,\n \n \n /* Internal functions, part of the implementation of address_space_read. */\n-MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,\n- MemTxAttrs attrs, uint8_t *buf,\n- int len, hwaddr addr1, hwaddr l,\n-\t\t\t\t\tMemoryRegion *mr);\n-MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,\n- MemTxAttrs attrs, uint8_t *buf, int len);\n+MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf,\n+ int len, hwaddr addr1, hwaddr l,\n+ MemoryRegion *mr);\n+\n+MemTxResult flatview_read_full(FlatView *fv, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf, int len);\n void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr);\n \n static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)\n@@ -1927,8 +1939,8 @@ static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)\n * @buf: buffer with the data transferred\n */\n static inline __attribute__((__always_inline__))\n-MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,\n- uint8_t *buf, int len)\n+MemTxResult flatview_read(FlatView *fv, hwaddr addr, MemTxAttrs attrs,\n+ uint8_t *buf, int len)\n {\n MemTxResult result = MEMTX_OK;\n hwaddr l, addr1;\n@@ -1939,22 +1951,29 @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,\n if (len) {\n rcu_read_lock();\n l = len;\n- mr = address_space_translate(as, addr, &addr1, &l, false);\n+ mr = flatview_translate(fv, addr, &addr1, &l, false);\n if (len == l && memory_access_is_direct(mr, false)) {\n ptr = qemu_map_ram_ptr(mr->ram_block, addr1);\n memcpy(buf, ptr, len);\n } else {\n- result = address_space_read_continue(as, addr, attrs, buf, len,\n- addr1, l, mr);\n+ result = flatview_read_continue(fv, addr, attrs, buf, len,\n+ addr1, l, mr);\n }\n rcu_read_unlock();\n }\n } else {\n- result = address_space_read_full(as, addr, attrs, buf, len);\n+ result = flatview_read_full(fv, addr, attrs, buf, len);\n }\n return result;\n }\n \n+static inline MemTxResult address_space_read(AddressSpace *as, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf,\n+ int len)\n+{\n+ return flatview_read(address_space_to_flatview(as), addr, attrs, buf, len);\n+}\n+\n /**\n * address_space_read_cached: read from a cached RAM region\n *\ndiff --git a/exec.c b/exec.c\nindex a54dde7835..d2b9f60494 100644\n--- a/exec.c\n+++ b/exec.c\n@@ -198,7 +198,7 @@ struct AddressSpaceDispatch {\n #define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)\n typedef struct subpage_t {\n MemoryRegion iomem;\n- AddressSpace *as;\n+ FlatView *fv;\n hwaddr base;\n uint16_t sub_section[];\n } subpage_t;\n@@ -468,13 +468,13 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x\n }\n \n /* Called from RCU critical section */\n-static MemoryRegionSection address_space_do_translate(AddressSpace *as,\n- hwaddr addr,\n- hwaddr *xlat,\n- hwaddr *plen,\n- bool is_write,\n- bool is_mmio,\n- AddressSpace **target_as)\n+static MemoryRegionSection flatview_do_translate(FlatView *fv,\n+ hwaddr addr,\n+ hwaddr *xlat,\n+ hwaddr *plen,\n+ bool is_write,\n+ bool is_mmio,\n+ AddressSpace **target_as)\n {\n IOMMUTLBEntry iotlb;\n MemoryRegionSection *section;\n@@ -482,8 +482,9 @@ static MemoryRegionSection address_space_do_translate(AddressSpace *as,\n IOMMUMemoryRegionClass *imrc;\n \n for (;;) {\n- AddressSpaceDispatch *d = address_space_to_dispatch(as);\n- section = address_space_translate_internal(d, addr, &addr, plen, is_mmio);\n+ section = address_space_translate_internal(\n+ flatview_to_dispatch(fv), addr, &addr,\n+ plen, is_mmio);\n \n iommu_mr = memory_region_get_iommu(section->mr);\n if (!iommu_mr) {\n@@ -500,7 +501,7 @@ static MemoryRegionSection address_space_do_translate(AddressSpace *as,\n goto translate_fail;\n }\n \n- as = iotlb.target_as;\n+ fv = address_space_to_flatview(iotlb.target_as);\n *target_as = iotlb.target_as;\n }\n \n@@ -523,8 +524,8 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,\n plen = (hwaddr)-1;\n \n /* This can never be MMIO. */\n- section = address_space_do_translate(as, addr, &xlat, &plen,\n- is_write, false, &as);\n+ section = flatview_do_translate(address_space_to_flatview(as), addr,\n+ &xlat, &plen, is_write, false, &as);\n \n /* Illegal translation */\n if (section.mr == &io_mem_unassigned) {\n@@ -560,16 +561,15 @@ iotlb_fail:\n }\n \n /* Called from RCU critical section */\n-MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,\n- hwaddr *xlat, hwaddr *plen,\n- bool is_write)\n+MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,\n+ hwaddr *plen, bool is_write)\n {\n MemoryRegion *mr;\n MemoryRegionSection section;\n+ AddressSpace *as = NULL;\n \n /* This can be MMIO, so setup MMIO bit. */\n- section = address_space_do_translate(as, addr, xlat, plen, is_write, true,\n- &as);\n+ section = flatview_do_translate(fv, addr, xlat, plen, is_write, true, &as);\n mr = section.mr;\n \n if (xen_enabled() && memory_access_is_direct(mr, is_write)) {\n@@ -1219,7 +1219,7 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu,\n } else {\n AddressSpaceDispatch *d;\n \n- d = address_space_to_dispatch(section->address_space);\n+ d = flatview_to_dispatch(section->fv);\n iotlb = section - d->map.sections;\n iotlb += xlat;\n }\n@@ -1245,7 +1245,7 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu,\n \n static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,\n uint16_t section);\n-static subpage_t *subpage_init(AddressSpace *as, hwaddr base);\n+static subpage_t *subpage_init(FlatView *fv, hwaddr base);\n \n static void *(*phys_mem_alloc)(size_t size, uint64_t *align) =\n qemu_anon_ram_alloc;\n@@ -1302,7 +1302,7 @@ static void phys_sections_free(PhysPageMap *map)\n g_free(map->nodes);\n }\n \n-static void register_subpage(AddressSpace *as, AddressSpaceDispatch *d,\n+static void register_subpage(FlatView *fv, AddressSpaceDispatch *d,\n MemoryRegionSection *section)\n {\n subpage_t *subpage;\n@@ -1318,8 +1318,8 @@ static void register_subpage(AddressSpace *as, AddressSpaceDispatch *d,\n assert(existing->mr->subpage || existing->mr == &io_mem_unassigned);\n \n if (!(existing->mr->subpage)) {\n- subpage = subpage_init(as, base);\n- subsection.address_space = as;\n+ subpage = subpage_init(fv, base);\n+ subsection.fv = fv;\n subsection.mr = &subpage->iomem;\n phys_page_set(d, base >> TARGET_PAGE_BITS, 1,\n phys_section_add(&d->map, &subsection));\n@@ -1345,7 +1345,7 @@ static void register_multipage(AddressSpaceDispatch *d,\n phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_index);\n }\n \n-void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section)\n+void mem_add(FlatView *fv, MemoryRegionSection *section)\n {\n AddressSpaceDispatch *d = flatview_to_dispatch(fv);\n MemoryRegionSection now = *section, remain = *section;\n@@ -1356,7 +1356,7 @@ void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section)\n - now.offset_within_address_space;\n \n now.size = int128_min(int128_make64(left), now.size);\n- register_subpage(as, d, &now);\n+ register_subpage(fv, d, &now);\n } else {\n now.size = int128_zero();\n }\n@@ -1366,10 +1366,10 @@ void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section)\n remain.offset_within_region += int128_get64(now.size);\n now = remain;\n if (int128_lt(remain.size, page_size)) {\n- register_subpage(as, d, &now);\n+ register_subpage(fv, d, &now);\n } else if (remain.offset_within_address_space & ~TARGET_PAGE_MASK) {\n now.size = page_size;\n- register_subpage(as, d, &now);\n+ register_subpage(fv, d, &now);\n } else {\n now.size = int128_and(now.size, int128_neg(page_size));\n register_multipage(d, &now);\n@@ -2500,6 +2500,11 @@ static const MemoryRegionOps watch_mem_ops = {\n .endianness = DEVICE_NATIVE_ENDIAN,\n };\n \n+static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,\n+ const uint8_t *buf, int len);\n+static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,\n+ bool is_write);\n+\n static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,\n unsigned len, MemTxAttrs attrs)\n {\n@@ -2511,8 +2516,7 @@ static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,\n printf(\"%s: subpage %p len %u addr \" TARGET_FMT_plx \"\\n\", __func__,\n subpage, len, addr);\n #endif\n- res = address_space_read(subpage->as, addr + subpage->base,\n- attrs, buf, len);\n+ res = flatview_read(subpage->fv, addr + subpage->base, attrs, buf, len);\n if (res) {\n return res;\n }\n@@ -2561,8 +2565,7 @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,\n default:\n abort();\n }\n- return address_space_write(subpage->as, addr + subpage->base,\n- attrs, buf, len);\n+ return flatview_write(subpage->fv, addr + subpage->base, attrs, buf, len);\n }\n \n static bool subpage_accepts(void *opaque, hwaddr addr,\n@@ -2574,8 +2577,8 @@ static bool subpage_accepts(void *opaque, hwaddr addr,\n __func__, subpage, is_write ? 'w' : 'r', len, addr);\n #endif\n \n- return address_space_access_valid(subpage->as, addr + subpage->base,\n- len, is_write);\n+ return flatview_access_valid(subpage->fv, addr + subpage->base,\n+ len, is_write);\n }\n \n static const MemoryRegionOps subpage_ops = {\n@@ -2609,12 +2612,12 @@ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,\n return 0;\n }\n \n-static subpage_t *subpage_init(AddressSpace *as, hwaddr base)\n+static subpage_t *subpage_init(FlatView *fv, hwaddr base)\n {\n subpage_t *mmio;\n \n mmio = g_malloc0(sizeof(subpage_t) + TARGET_PAGE_SIZE * sizeof(uint16_t));\n- mmio->as = as;\n+ mmio->fv = fv;\n mmio->base = base;\n memory_region_init_io(&mmio->iomem, NULL, &subpage_ops, mmio,\n NULL, TARGET_PAGE_SIZE);\n@@ -2628,12 +2631,11 @@ static subpage_t *subpage_init(AddressSpace *as, hwaddr base)\n return mmio;\n }\n \n-static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as,\n- MemoryRegion *mr)\n+static uint16_t dummy_section(PhysPageMap *map, FlatView *fv, MemoryRegion *mr)\n {\n- assert(as);\n+ assert(fv);\n MemoryRegionSection section = {\n- .address_space = as,\n+ .fv = fv,\n .mr = mr,\n .offset_within_address_space = 0,\n .offset_within_region = 0,\n@@ -2672,16 +2674,17 @@ static void io_mem_init(void)\n \n AddressSpaceDispatch *mem_begin(AddressSpace *as)\n {\n+ FlatView *fv = address_space_to_flatview(as);\n AddressSpaceDispatch *d = g_new0(AddressSpaceDispatch, 1);\n uint16_t n;\n \n- n = dummy_section(&d->map, as, &io_mem_unassigned);\n+ n = dummy_section(&d->map, fv, &io_mem_unassigned);\n assert(n == PHYS_SECTION_UNASSIGNED);\n- n = dummy_section(&d->map, as, &io_mem_notdirty);\n+ n = dummy_section(&d->map, fv, &io_mem_notdirty);\n assert(n == PHYS_SECTION_NOTDIRTY);\n- n = dummy_section(&d->map, as, &io_mem_rom);\n+ n = dummy_section(&d->map, fv, &io_mem_rom);\n assert(n == PHYS_SECTION_ROM);\n- n = dummy_section(&d->map, as, &io_mem_watch);\n+ n = dummy_section(&d->map, fv, &io_mem_watch);\n assert(n == PHYS_SECTION_WATCH);\n \n d->phys_map = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .skip = 1 };\n@@ -2861,11 +2864,11 @@ static bool prepare_mmio_access(MemoryRegion *mr)\n }\n \n /* Called within RCU critical section. */\n-static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,\n- MemTxAttrs attrs,\n- const uint8_t *buf,\n- int len, hwaddr addr1,\n- hwaddr l, MemoryRegion *mr)\n+static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,\n+ MemTxAttrs attrs,\n+ const uint8_t *buf,\n+ int len, hwaddr addr1,\n+ hwaddr l, MemoryRegion *mr)\n {\n uint8_t *ptr;\n uint64_t val;\n@@ -2927,14 +2930,14 @@ static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,\n }\n \n l = len;\n- mr = address_space_translate(as, addr, &addr1, &l, true);\n+ mr = flatview_translate(fv, addr, &addr1, &l, true);\n }\n \n return result;\n }\n \n-MemTxResult address_space_write(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,\n- const uint8_t *buf, int len)\n+static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,\n+ const uint8_t *buf, int len)\n {\n hwaddr l;\n hwaddr addr1;\n@@ -2944,20 +2947,27 @@ MemTxResult address_space_write(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,\n if (len > 0) {\n rcu_read_lock();\n l = len;\n- mr = address_space_translate(as, addr, &addr1, &l, true);\n- result = address_space_write_continue(as, addr, attrs, buf, len,\n- addr1, l, mr);\n+ mr = flatview_translate(fv, addr, &addr1, &l, true);\n+ result = flatview_write_continue(fv, addr, attrs, buf, len,\n+ addr1, l, mr);\n rcu_read_unlock();\n }\n \n return result;\n }\n \n+MemTxResult address_space_write(AddressSpace *as, hwaddr addr,\n+ MemTxAttrs attrs,\n+ const uint8_t *buf, int len)\n+{\n+ return flatview_write(address_space_to_flatview(as), addr, attrs, buf, len);\n+}\n+\n /* Called within RCU critical section. */\n-MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,\n- MemTxAttrs attrs, uint8_t *buf,\n- int len, hwaddr addr1, hwaddr l,\n- MemoryRegion *mr)\n+MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf,\n+ int len, hwaddr addr1, hwaddr l,\n+ MemoryRegion *mr)\n {\n uint8_t *ptr;\n uint64_t val;\n@@ -3017,14 +3027,14 @@ MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,\n }\n \n l = len;\n- mr = address_space_translate(as, addr, &addr1, &l, false);\n+ mr = flatview_translate(fv, addr, &addr1, &l, false);\n }\n \n return result;\n }\n \n-MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,\n- MemTxAttrs attrs, uint8_t *buf, int len)\n+MemTxResult flatview_read_full(FlatView *fv, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf, int len)\n {\n hwaddr l;\n hwaddr addr1;\n@@ -3034,25 +3044,33 @@ MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,\n if (len > 0) {\n rcu_read_lock();\n l = len;\n- mr = address_space_translate(as, addr, &addr1, &l, false);\n- result = address_space_read_continue(as, addr, attrs, buf, len,\n- addr1, l, mr);\n+ mr = flatview_translate(fv, addr, &addr1, &l, false);\n+ result = flatview_read_continue(fv, addr, attrs, buf, len,\n+ addr1, l, mr);\n rcu_read_unlock();\n }\n \n return result;\n }\n \n-MemTxResult address_space_rw(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,\n- uint8_t *buf, int len, bool is_write)\n+static MemTxResult flatview_rw(FlatView *fv, hwaddr addr, MemTxAttrs attrs,\n+ uint8_t *buf, int len, bool is_write)\n {\n if (is_write) {\n- return address_space_write(as, addr, attrs, (uint8_t *)buf, len);\n+ return flatview_write(fv, addr, attrs, (uint8_t *)buf, len);\n } else {\n- return address_space_read(as, addr, attrs, (uint8_t *)buf, len);\n+ return flatview_read(fv, addr, attrs, (uint8_t *)buf, len);\n }\n }\n \n+MemTxResult address_space_rw(AddressSpace *as, hwaddr addr,\n+ MemTxAttrs attrs, uint8_t *buf,\n+ int len, bool is_write)\n+{\n+ return flatview_rw(address_space_to_flatview(as),\n+ addr, attrs, buf, len, is_write);\n+}\n+\n void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,\n int len, int is_write)\n {\n@@ -3210,7 +3228,8 @@ static void cpu_notify_map_clients(void)\n qemu_mutex_unlock(&map_client_list_lock);\n }\n \n-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write)\n+static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,\n+ bool is_write)\n {\n MemoryRegion *mr;\n hwaddr l, xlat;\n@@ -3218,7 +3237,7 @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_\n rcu_read_lock();\n while (len > 0) {\n l = len;\n- mr = address_space_translate(as, addr, &xlat, &l, is_write);\n+ mr = flatview_translate(fv, addr, &xlat, &l, is_write);\n if (!memory_access_is_direct(mr, is_write)) {\n l = memory_access_size(mr, l, addr);\n if (!memory_region_access_valid(mr, xlat, l, is_write)) {\n@@ -3234,8 +3253,16 @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_\n return true;\n }\n \n+bool address_space_access_valid(AddressSpace *as, hwaddr addr,\n+ int len, bool is_write)\n+{\n+ return flatview_access_valid(address_space_to_flatview(as),\n+ addr, len, is_write);\n+}\n+\n static hwaddr\n-address_space_extend_translation(AddressSpace *as, hwaddr addr, hwaddr target_len,\n+flatview_extend_translation(FlatView *fv, hwaddr addr,\n+ hwaddr target_len,\n MemoryRegion *mr, hwaddr base, hwaddr len,\n bool is_write)\n {\n@@ -3252,7 +3279,8 @@ address_space_extend_translation(AddressSpace *as, hwaddr addr, hwaddr target_le\n }\n \n len = target_len;\n- this_mr = address_space_translate(as, addr, &xlat, &len, is_write);\n+ this_mr = flatview_translate(fv, addr, &xlat,\n+ &len, is_write);\n if (this_mr != mr || xlat != base + done) {\n return done;\n }\n@@ -3275,6 +3303,7 @@ void *address_space_map(AddressSpace *as,\n hwaddr l, xlat;\n MemoryRegion *mr;\n void *ptr;\n+ FlatView *fv = address_space_to_flatview(as);\n \n if (len == 0) {\n return NULL;\n@@ -3282,7 +3311,7 @@ void *address_space_map(AddressSpace *as,\n \n l = len;\n rcu_read_lock();\n- mr = address_space_translate(as, addr, &xlat, &l, is_write);\n+ mr = flatview_translate(fv, addr, &xlat, &l, is_write);\n \n if (!memory_access_is_direct(mr, is_write)) {\n if (atomic_xchg(&bounce.in_use, true)) {\n@@ -3298,7 +3327,7 @@ void *address_space_map(AddressSpace *as,\n memory_region_ref(mr);\n bounce.mr = mr;\n if (!is_write) {\n- address_space_read(as, addr, MEMTXATTRS_UNSPECIFIED,\n+ flatview_read(fv, addr, MEMTXATTRS_UNSPECIFIED,\n bounce.buffer, l);\n }\n \n@@ -3309,7 +3338,8 @@ void *address_space_map(AddressSpace *as,\n \n \n memory_region_ref(mr);\n- *plen = address_space_extend_translation(as, addr, len, mr, xlat, l, is_write);\n+ *plen = flatview_extend_translation(fv, addr, len, mr, xlat,\n+ l, is_write);\n ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);\n rcu_read_unlock();\n \ndiff --git a/hw/intc/openpic_kvm.c b/hw/intc/openpic_kvm.c\nindex 0518e017c4..fa83420254 100644\n--- a/hw/intc/openpic_kvm.c\n+++ b/hw/intc/openpic_kvm.c\n@@ -124,7 +124,7 @@ static void kvm_openpic_region_add(MemoryListener *listener,\n uint64_t reg_base;\n int ret;\n \n- if (section->address_space != &address_space_memory) {\n+ if (section->fv != address_space_to_flatview(&address_space_memory)) {\n abort();\n }\n \ndiff --git a/memory.c b/memory.c\nindex 27d7aeffc2..1364500eb6 100644\n--- a/memory.c\n+++ b/memory.c\n@@ -154,7 +154,8 @@ enum ListenerDirection { Forward, Reverse };\n /* No need to ref/unref .mr, the FlatRange keeps it alive. */\n #define MEMORY_LISTENER_UPDATE_REGION(fr, as, dir, callback, _args...) \\\n do { \\\n- MemoryRegionSection mrs = section_from_flat_range(fr, as); \\\n+ MemoryRegionSection mrs = section_from_flat_range(fr, \\\n+ address_space_to_flatview(as)); \\\n MEMORY_LISTENER_CALL(as, callback, dir, &mrs, ##_args); \\\n } while(0)\n \n@@ -208,7 +209,6 @@ static bool memory_region_ioeventfd_equal(MemoryRegionIoeventfd a,\n }\n \n typedef struct FlatRange FlatRange;\n-typedef struct FlatView FlatView;\n \n /* Range of memory in the global map. Addresses are absolute. */\n struct FlatRange {\n@@ -238,11 +238,11 @@ typedef struct AddressSpaceOps AddressSpaceOps;\n for (var = (view)->ranges; var < (view)->ranges + (view)->nr; ++var)\n \n static inline MemoryRegionSection\n-section_from_flat_range(FlatRange *fr, AddressSpace *as)\n+section_from_flat_range(FlatRange *fr, FlatView *fv)\n {\n return (MemoryRegionSection) {\n .mr = fr->mr,\n- .address_space = as,\n+ .fv = fv,\n .offset_within_region = fr->offset_in_region,\n .size = fr->addr.size,\n .offset_within_address_space = int128_get64(fr->addr.start),\n@@ -312,7 +312,7 @@ static void flatview_unref(FlatView *view)\n }\n }\n \n-static FlatView *address_space_to_flatview(AddressSpace *as)\n+FlatView *address_space_to_flatview(AddressSpace *as)\n {\n return atomic_rcu_read(&as->current_map);\n }\n@@ -760,7 +760,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as,\n fds_new[inew]))) {\n fd = &fds_old[iold];\n section = (MemoryRegionSection) {\n- .address_space = as,\n+ .fv = address_space_to_flatview(as),\n .offset_within_address_space = int128_get64(fd->addr.start),\n .size = fd->addr.size,\n };\n@@ -773,7 +773,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as,\n fds_old[iold]))) {\n fd = &fds_new[inew];\n section = (MemoryRegionSection) {\n- .address_space = as,\n+ .fv = address_space_to_flatview(as),\n .offset_within_address_space = int128_get64(fd->addr.start),\n .size = fd->addr.size,\n };\n@@ -908,8 +908,8 @@ static void address_space_update_topology(AddressSpace *as)\n new_view->dispatch = mem_begin(as);\n for (i = 0; i < new_view->nr; i++) {\n MemoryRegionSection mrs =\n- section_from_flat_range(&new_view->ranges[i], as);\n- mem_add(as, new_view, &mrs);\n+ section_from_flat_range(&new_view->ranges[i], new_view);\n+ mem_add(new_view, &mrs);\n }\n mem_commit(new_view->dispatch);\n \n@@ -1865,7 +1865,7 @@ void memory_region_sync_dirty_bitmap(MemoryRegion *mr)\n view = address_space_get_flatview(as);\n FOR_EACH_FLAT_RANGE(fr, view) {\n if (fr->mr == mr) {\n- MemoryRegionSection mrs = section_from_flat_range(fr, as);\n+ MemoryRegionSection mrs = section_from_flat_range(fr, view);\n listener->log_sync(listener, &mrs);\n }\n }\n@@ -1968,7 +1968,7 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa\n FOR_EACH_FLAT_RANGE(fr, view) {\n if (fr->mr == mr) {\n section = (MemoryRegionSection) {\n- .address_space = as,\n+ .fv = view,\n .offset_within_address_space = int128_get64(fr->addr.start),\n .size = fr->addr.size,\n };\n@@ -2330,7 +2330,7 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr,\n }\n \n ret.mr = fr->mr;\n- ret.address_space = as;\n+ ret.fv = view;\n range = addrrange_intersection(range, fr->addr);\n ret.offset_within_region = fr->offset_in_region;\n ret.offset_within_region += int128_get64(int128_sub(range.start,\n@@ -2379,7 +2379,8 @@ void memory_global_dirty_log_sync(void)\n view = address_space_get_flatview(as);\n FOR_EACH_FLAT_RANGE(fr, view) {\n if (fr->dirty_log_mask) {\n- MemoryRegionSection mrs = section_from_flat_range(fr, as);\n+ MemoryRegionSection mrs = section_from_flat_range(fr, view);\n+\n listener->log_sync(listener, &mrs);\n }\n }\n@@ -2464,7 +2465,7 @@ static void listener_add_address_space(MemoryListener *listener,\n FOR_EACH_FLAT_RANGE(fr, view) {\n MemoryRegionSection section = {\n .mr = fr->mr,\n- .address_space = as,\n+ .fv = view,\n .offset_within_region = fr->offset_in_region,\n .size = fr->addr.size,\n .offset_within_address_space = int128_get64(fr->addr.start),\n", "prefixes": [ "qemu", "v4", "06/18" ] }