From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56788) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZEfAp-0004r1-4i for qemu-devel@nongnu.org; Mon, 13 Jul 2015 10:57:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZEfAk-0004im-Lz for qemu-devel@nongnu.org; Mon, 13 Jul 2015 10:57:39 -0400 Received: from e23smtp06.au.ibm.com ([202.81.31.148]:51154) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZEfAj-0004fr-Pr for qemu-devel@nongnu.org; Mon, 13 Jul 2015 10:57:34 -0400 Received: from /spool/local by e23smtp06.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 14 Jul 2015 00:57:28 +1000 From: Alexey Kardashevskiy Date: Tue, 14 Jul 2015 00:56:17 +1000 Message-Id: <1436799381-16150-2-git-send-email-aik@ozlabs.ru> In-Reply-To: <1436799381-16150-1-git-send-email-aik@ozlabs.ru> References: <1436799381-16150-1-git-send-email-aik@ozlabs.ru> Subject: [Qemu-devel] [RFC PATCH qemu v2 1/5] vfio: Switch from TARGET_PAGE_MASK to qemu_real_host_page_mask List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexey Kardashevskiy , Alex Williamson , qemu-ppc@nongnu.org, Michael Roth , David Gibson These started switching from TARGET_PAGE_MASK (hardcoded as 4K) to a real host page size: 4e51361d7 "cpu-all: complete "real" host page size API" and f7ceed190 "vfio: cpu: Use "real" page size API" This finished the transition by: - %s/TARGET_PAGE_MASK/qemu_real_host_page_mask/ - %s/TARGET_PAGE_ALIGN/REAL_HOST_PAGE_ALIGN/ - removing bitfield length for offsets in VFIOQuirk::data as qemu_real_host_page_mask is not a macro This keeps using TARGET_PAGE_MASK for IOMMU regions though as it is the minimum page size which IOMMU regions may be using and at the moment memory regions do not carry the actual page size. Signed-off-by: Alexey Kardashevskiy --- In reality DMA windows are always a lot bigger than a single 4K page and aligned to 32/64MB, may be only use here qemu_real_host_page_mask? --- hw/vfio/common.c | 26 ++++++++++++++++---------- hw/vfio/pci.c | 30 +++++++++++++++--------------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 85ee9b0..d115ec9 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -321,6 +321,9 @@ static void vfio_listener_region_add(MemoryListener *listener, Int128 llend; void *vaddr; int ret; + const bool is_iommu = memory_region_is_iommu(section->mr); + const hwaddr page_mask = + is_iommu ? TARGET_PAGE_MASK : qemu_real_host_page_mask; if (vfio_listener_skipped_section(section)) { trace_vfio_listener_region_add_skip( @@ -330,16 +333,16 @@ static void vfio_listener_region_add(MemoryListener *listener, return; } - if (unlikely((section->offset_within_address_space & ~TARGET_PAGE_MASK) != - (section->offset_within_region & ~TARGET_PAGE_MASK))) { + if (unlikely((section->offset_within_address_space & ~page_mask) != + (section->offset_within_region & ~page_mask))) { error_report("%s received unaligned region", __func__); return; } - iova = TARGET_PAGE_ALIGN(section->offset_within_address_space); + iova = ROUND_UP(section->offset_within_address_space, ~page_mask + 1); llend = int128_make64(section->offset_within_address_space); llend = int128_add(llend, section->size); - llend = int128_and(llend, int128_exts64(TARGET_PAGE_MASK)); + llend = int128_and(llend, int128_exts64(page_mask)); if (int128_ge(int128_make64(iova), llend)) { return; @@ -347,7 +350,7 @@ static void vfio_listener_region_add(MemoryListener *listener, memory_region_ref(section->mr); - if (memory_region_is_iommu(section->mr)) { + if (is_iommu) { VFIOGuestIOMMU *giommu; trace_vfio_listener_region_add_iommu(iova, @@ -423,6 +426,9 @@ static void vfio_listener_region_del(MemoryListener *listener, iommu_data.type1.listener); hwaddr iova, end; int ret; + const bool is_iommu = memory_region_is_iommu(section->mr); + const hwaddr page_mask = + is_iommu ? TARGET_PAGE_MASK : qemu_real_host_page_mask; if (vfio_listener_skipped_section(section)) { trace_vfio_listener_region_del_skip( @@ -432,13 +438,13 @@ static void vfio_listener_region_del(MemoryListener *listener, return; } - if (unlikely((section->offset_within_address_space & ~TARGET_PAGE_MASK) != - (section->offset_within_region & ~TARGET_PAGE_MASK))) { + if (unlikely((section->offset_within_address_space & ~page_mask) != + (section->offset_within_region & ~page_mask))) { error_report("%s received unaligned region", __func__); return; } - if (memory_region_is_iommu(section->mr)) { + if (is_iommu) { VFIOGuestIOMMU *giommu; QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) { @@ -459,9 +465,9 @@ static void vfio_listener_region_del(MemoryListener *listener, */ } - iova = TARGET_PAGE_ALIGN(section->offset_within_address_space); + iova = REAL_HOST_PAGE_ALIGN(section->offset_within_address_space); end = (section->offset_within_address_space + int128_get64(section->size)) & - TARGET_PAGE_MASK; + page_mask; if (iova >= end) { return; diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 2ed877f..7694afe 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -50,16 +50,16 @@ typedef struct VFIOQuirk { struct VFIOPCIDevice *vdev; QLIST_ENTRY(VFIOQuirk) next; struct { - uint32_t base_offset:TARGET_PAGE_BITS; - uint32_t address_offset:TARGET_PAGE_BITS; + uint32_t base_offset; + uint32_t address_offset; uint32_t address_size:3; uint32_t bar:3; uint32_t address_match; uint32_t address_mask; - uint32_t address_val:TARGET_PAGE_BITS; - uint32_t data_offset:TARGET_PAGE_BITS; + uint32_t address_val; + uint32_t data_offset; uint32_t data_size:3; uint8_t flags; @@ -1319,8 +1319,8 @@ static uint64_t vfio_generic_quirk_read(void *opaque, { VFIOQuirk *quirk = opaque; VFIOPCIDevice *vdev = quirk->vdev; - hwaddr base = quirk->data.address_match & TARGET_PAGE_MASK; - hwaddr offset = quirk->data.address_match & ~TARGET_PAGE_MASK; + hwaddr base = quirk->data.address_match & qemu_real_host_page_mask; + hwaddr offset = quirk->data.address_match & ~qemu_real_host_page_mask; uint64_t data; if (vfio_flags_enabled(quirk->data.flags, quirk->data.read_flags) && @@ -1349,8 +1349,8 @@ static void vfio_generic_quirk_write(void *opaque, hwaddr addr, { VFIOQuirk *quirk = opaque; VFIOPCIDevice *vdev = quirk->vdev; - hwaddr base = quirk->data.address_match & TARGET_PAGE_MASK; - hwaddr offset = quirk->data.address_match & ~TARGET_PAGE_MASK; + hwaddr base = quirk->data.address_match & qemu_real_host_page_mask; + hwaddr offset = quirk->data.address_match & ~qemu_real_host_page_mask; if (vfio_flags_enabled(quirk->data.flags, quirk->data.write_flags) && ranges_overlap(addr, size, offset, quirk->data.address_mask + 1)) { @@ -1650,9 +1650,9 @@ static void vfio_probe_ati_bar2_4000_quirk(VFIOPCIDevice *vdev, int nr) memory_region_init_io(&quirk->mem, OBJECT(vdev), &vfio_generic_quirk, quirk, "vfio-ati-bar2-4000-quirk", - TARGET_PAGE_ALIGN(quirk->data.address_mask + 1)); + REAL_HOST_PAGE_ALIGN(quirk->data.address_mask + 1)); memory_region_add_subregion_overlap(&vdev->bars[nr].region.mem, - quirk->data.address_match & TARGET_PAGE_MASK, + quirk->data.address_match & qemu_real_host_page_mask, &quirk->mem, 1); QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); @@ -1888,7 +1888,7 @@ static void vfio_nvidia_88000_quirk_write(void *opaque, hwaddr addr, VFIOQuirk *quirk = opaque; VFIOPCIDevice *vdev = quirk->vdev; PCIDevice *pdev = &vdev->pdev; - hwaddr base = quirk->data.address_match & TARGET_PAGE_MASK; + hwaddr base = quirk->data.address_match & qemu_real_host_page_mask; vfio_generic_quirk_write(opaque, addr, data, size); @@ -1943,9 +1943,9 @@ static void vfio_probe_nvidia_bar0_88000_quirk(VFIOPCIDevice *vdev, int nr) memory_region_init_io(&quirk->mem, OBJECT(vdev), &vfio_nvidia_88000_quirk, quirk, "vfio-nvidia-bar0-88000-quirk", - TARGET_PAGE_ALIGN(quirk->data.address_mask + 1)); + REAL_HOST_PAGE_ALIGN(quirk->data.address_mask + 1)); memory_region_add_subregion_overlap(&vdev->bars[nr].region.mem, - quirk->data.address_match & TARGET_PAGE_MASK, + quirk->data.address_match & qemu_real_host_page_mask, &quirk->mem, 1); QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); @@ -1980,9 +1980,9 @@ static void vfio_probe_nvidia_bar0_1800_quirk(VFIOPCIDevice *vdev, int nr) memory_region_init_io(&quirk->mem, OBJECT(vdev), &vfio_generic_quirk, quirk, "vfio-nvidia-bar0-1800-quirk", - TARGET_PAGE_ALIGN(quirk->data.address_mask + 1)); + REAL_HOST_PAGE_ALIGN(quirk->data.address_mask + 1)); memory_region_add_subregion_overlap(&vdev->bars[nr].region.mem, - quirk->data.address_match & TARGET_PAGE_MASK, + quirk->data.address_match & qemu_real_host_page_mask, &quirk->mem, 1); QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next); -- 2.4.0.rc3.8.gfb3e7d5