From: David Gibson <david@gibson.dropbear.id.au>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
Alexander Graf <agraf@suse.de>,
Alex Williamson <alex.williamson@redhat.com>
Subject: Re: [Qemu-devel] [PATCH qemu v17 06/12] memory: Add reporting of supported page sizes
Date: Wed, 8 Jun 2016 16:00:06 +1000 [thread overview]
Message-ID: <20160608060006.GY9226@voom.fritz.box> (raw)
In-Reply-To: <3901766f-6adc-b04d-f498-00bbbd0a3724@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 8111 bytes --]
On Mon, Jun 06, 2016 at 03:31:04PM +0200, Paolo Bonzini wrote:
>
>
> On 02/06/2016 05:35, David Gibson wrote:
> > On Wed, Jun 01, 2016 at 06:57:37PM +1000, Alexey Kardashevskiy wrote:
> >> > Every IOMMU has some granularity which MemoryRegionIOMMUOps::translate
> >> > uses when translating, however this information is not available outside
> >> > the translate context for various checks.
> >> >
> >> > This adds a get_page_sizes callback to MemoryRegionIOMMUOps and
> >> > a wrapper for it so IOMMU users (such as VFIO) can know the actual
> >> > page size(s) used by an IOMMU.
> >> >
> >> > As IOMMU MR represents a guest IOMMU, this uses TARGET_PAGE_SIZE
> >> > as fallback.
> >> >
> >> > This removes vfio_container_granularity() and uses new helper in
> >> > memory_region_iommu_replay() when replaying IOMMU mappings on added
> >> > IOMMU memory region.
> >> >
> >> > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> >> > Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
> > Paolo,
> >
> > Looks like you were left off the CC for this one.
> >
> > I think this is ready to go - do you want to merge, comment or ack and
> > we'll take it either through my tree or Alex's?
>
> It's okay for you to merge, but the callback should be called
> "get_page_size" or "get_replay_granularity". The plural is weird.
Hm, no, it really could return multiple page sizes if the logical
(guest side) IOMMU supports them. That might be useful at some point
in the future. For now, it's sufficient for the replay to use the
smallest pagesize.
>
> Thanks,
>
> Paolo
>
>
> >> > ---
> >> > Changes:
> >> > v16:
> >> > * used memory_region_iommu_get_page_sizes() instead of
> >> > mr->iommu_ops->get_page_sizes() in memory_region_iommu_replay()
> >> >
> >> > v15:
> >> > * s/qemu_real_host_page_size/TARGET_PAGE_SIZE/ in memory_region_iommu_get_page_sizes
> >> >
> >> > v14:
> >> > * removed vfio_container_granularity(), changed memory_region_iommu_replay()
> >> >
> >> > v4:
> >> > * s/1<<TARGET_PAGE_BITS/qemu_real_host_page_size/
> >> > ---
> >> > hw/ppc/spapr_iommu.c | 8 ++++++++
> >> > hw/vfio/common.c | 6 ------
> >> > include/exec/memory.h | 18 ++++++++++++++----
> >> > memory.c | 16 +++++++++++++---
> >> > 4 files changed, 35 insertions(+), 13 deletions(-)
> >> >
> >> > diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
> >> > index a3cc572..90a45c0 100644
> >> > --- a/hw/ppc/spapr_iommu.c
> >> > +++ b/hw/ppc/spapr_iommu.c
> >> > @@ -149,6 +149,13 @@ static void spapr_tce_table_pre_save(void *opaque)
> >> > tcet->bus_offset, tcet->page_shift);
> >> > }
> >> >
> >> > +static uint64_t spapr_tce_get_page_sizes(MemoryRegion *iommu)
> >> > +{
> >> > + sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu);
> >> > +
> >> > + return 1ULL << tcet->page_shift;
> >> > +}
> >> > +
> >> > static int spapr_tce_table_post_load(void *opaque, int version_id)
> >> > {
> >> > sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
> >> > @@ -228,6 +235,7 @@ static const VMStateDescription vmstate_spapr_tce_table = {
> >> >
> >> > static MemoryRegionIOMMUOps spapr_iommu_ops = {
> >> > .translate = spapr_tce_translate_iommu,
> >> > + .get_page_sizes = spapr_tce_get_page_sizes,
> >> > };
> >> >
> >> > static int spapr_tce_table_realize(DeviceState *dev)
> >> > diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> >> > index e51ed3a..f1a12b0 100644
> >> > --- a/hw/vfio/common.c
> >> > +++ b/hw/vfio/common.c
> >> > @@ -322,11 +322,6 @@ out:
> >> > rcu_read_unlock();
> >> > }
> >> >
> >> > -static hwaddr vfio_container_granularity(VFIOContainer *container)
> >> > -{
> >> > - return (hwaddr)1 << ctz64(container->iova_pgsizes);
> >> > -}
> >> > -
> >> > static void vfio_listener_region_add(MemoryListener *listener,
> >> > MemoryRegionSection *section)
> >> > {
> >> > @@ -394,7 +389,6 @@ static void vfio_listener_region_add(MemoryListener *listener,
> >> >
> >> > memory_region_register_iommu_notifier(giommu->iommu, &giommu->n);
> >> > memory_region_iommu_replay(giommu->iommu, &giommu->n,
> >> > - vfio_container_granularity(container),
> >> > false);
> >> >
> >> > return;
> >> > diff --git a/include/exec/memory.h b/include/exec/memory.h
> >> > index f649697..bd9625f 100644
> >> > --- a/include/exec/memory.h
> >> > +++ b/include/exec/memory.h
> >> > @@ -149,6 +149,8 @@ typedef struct MemoryRegionIOMMUOps MemoryRegionIOMMUOps;
> >> > struct MemoryRegionIOMMUOps {
> >> > /* Return a TLB entry that contains a given address. */
> >> > IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, bool is_write);
> >> > + /* Returns supported page sizes */
> >> > + uint64_t (*get_page_sizes)(MemoryRegion *iommu);
> >> > };
> >> >
> >> > typedef struct CoalescedMemoryRange CoalescedMemoryRange;
> >> > @@ -571,6 +573,15 @@ static inline bool memory_region_is_iommu(MemoryRegion *mr)
> >> >
> >> >
> >> > /**
> >> > + * memory_region_iommu_get_page_sizes: get supported page sizes in an iommu
> >> > + *
> >> > + * Returns %bitmap of supported page sizes for an iommu.
> >> > + *
> >> > + * @mr: the memory region being queried
> >> > + */
> >> > +uint64_t memory_region_iommu_get_page_sizes(MemoryRegion *mr);
> >> > +
> >> > +/**
> >> > * memory_region_notify_iommu: notify a change in an IOMMU translation entry.
> >> > *
> >> > * @mr: the memory region that was changed
> >> > @@ -594,16 +605,15 @@ void memory_region_register_iommu_notifier(MemoryRegion *mr, Notifier *n);
> >> >
> >> > /**
> >> > * memory_region_iommu_replay: replay existing IOMMU translations to
> >> > - * a notifier
> >> > + * a notifier with the minimum page granularity returned by
> >> > + * mr->iommu_ops->get_page_sizes().
> >> > *
> >> > * @mr: the memory region to observe
> >> > * @n: the notifier to which to replay iommu mappings
> >> > - * @granularity: Minimum page granularity to replay notifications for
> >> > * @is_write: Whether to treat the replay as a translate "write"
> >> > * through the iommu
> >> > */
> >> > -void memory_region_iommu_replay(MemoryRegion *mr, Notifier *n,
> >> > - hwaddr granularity, bool is_write);
> >> > +void memory_region_iommu_replay(MemoryRegion *mr, Notifier *n, bool is_write);
> >> >
> >> > /**
> >> > * memory_region_unregister_iommu_notifier: unregister a notifier for
> >> > diff --git a/memory.c b/memory.c
> >> > index 4e3cda8..761ae92 100644
> >> > --- a/memory.c
> >> > +++ b/memory.c
> >> > @@ -1500,12 +1500,22 @@ void memory_region_register_iommu_notifier(MemoryRegion *mr, Notifier *n)
> >> > notifier_list_add(&mr->iommu_notify, n);
> >> > }
> >> >
> >> > -void memory_region_iommu_replay(MemoryRegion *mr, Notifier *n,
> >> > - hwaddr granularity, bool is_write)
> >> > +uint64_t memory_region_iommu_get_page_sizes(MemoryRegion *mr)
> >> > {
> >> > - hwaddr addr;
> >> > + assert(memory_region_is_iommu(mr));
> >> > + if (mr->iommu_ops && mr->iommu_ops->get_page_sizes) {
> >> > + return mr->iommu_ops->get_page_sizes(mr);
> >> > + }
> >> > + return TARGET_PAGE_SIZE;
> >> > +}
> >> > +
> >> > +void memory_region_iommu_replay(MemoryRegion *mr, Notifier *n, bool is_write)
> >> > +{
> >> > + hwaddr addr, granularity;
> >> > IOMMUTLBEntry iotlb;
> >> >
> >> > + granularity = (hwaddr)1 << ctz64(memory_region_iommu_get_page_sizes(mr));
> >> > +
> >> > for (addr = 0; addr < memory_region_size(mr); addr += granularity) {
>
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-06-08 6:02 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1464771463-37214-1-git-send-email-aik@ozlabs.ru>
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 01/12] vmstate: Define VARRAY with VMS_ALLOC Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 02/12] spapr_iommu: Introduce "enabled" state for TCE table Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 03/12] spapr_iommu: Migrate full state Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 04/12] spapr_iommu: Add root memory region Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 05/12] spapr_pci: Reset DMA config on PHB reset Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 06/12] memory: Add reporting of supported page sizes Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 07/12] vfio: spapr: Add DMA memory preregistering (SPAPR IOMMU v2) Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 08/12] spapr_pci: Add and export DMA resetting helper Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 09/12] vfio: Add host side DMA window capabilities Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 10/12] vfio/spapr: Create DMA window dynamically (SPAPR IOMMU v2) Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 11/12] spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) Alexey Kardashevskiy
2016-06-01 8:57 ` [Qemu-devel] [PATCH qemu v17 12/12] spapr_iommu, vfio, memory: Notify IOMMU about starting/stopping listening Alexey Kardashevskiy
[not found] ` <201606010902.u518wwmb029353@mx0a-001b2d01.pphosted.com>
2016-06-02 3:35 ` [Qemu-devel] [PATCH qemu v17 06/12] memory: Add reporting of supported page sizes David Gibson
2016-06-06 13:31 ` Paolo Bonzini
2016-06-07 3:42 ` Alexey Kardashevskiy
2016-06-08 6:00 ` David Gibson [this message]
2016-06-08 6:05 ` Alexey Kardashevskiy
2016-06-14 21:41 ` Alexey Kardashevskiy
2016-06-15 6:15 ` David Gibson
[not found] ` <201606010900.u518wvH7046287@mx0a-001b2d01.pphosted.com>
2016-06-02 4:18 ` [Qemu-devel] [PATCH qemu v17 07/12] vfio: spapr: Add DMA memory preregistering (SPAPR IOMMU v2) David Gibson
[not found] ` <201606010902.u518x15j023604@mx0a-001b2d01.pphosted.com>
2016-06-02 4:19 ` [Qemu-devel] [PATCH qemu v17 08/12] spapr_pci: Add and export DMA resetting helper David Gibson
[not found] ` <201606010901.u518wwEL029369@mx0a-001b2d01.pphosted.com>
2016-06-03 7:23 ` [Qemu-devel] [PATCH qemu v17 09/12] vfio: Add host side DMA window capabilities David Gibson
[not found] ` <201606011012.u51A9A6i023070@mx0a-001b2d01.pphosted.com>
2016-06-03 7:37 ` [Qemu-devel] [PATCH qemu v17 10/12] vfio/spapr: Create DMA window dynamically (SPAPR IOMMU v2) David Gibson
2016-06-06 6:45 ` Alexey Kardashevskiy
2016-06-08 5:56 ` David Gibson
[not found] ` <201606010902.u51902Zl007699@mx0a-001b2d01.pphosted.com>
2016-06-03 15:37 ` [Qemu-devel] [PATCH qemu v17 06/12] memory: Add reporting of supported page sizes Alex Williamson
[not found] ` <201606010900.u51900Om007391@mx0a-001b2d01.pphosted.com>
2016-06-03 16:13 ` [Qemu-devel] [PATCH qemu v17 07/12] vfio: spapr: Add DMA memory preregistering (SPAPR IOMMU v2) Alex Williamson
2016-06-06 6:04 ` Alexey Kardashevskiy
2016-06-06 17:20 ` Alex Williamson
2016-06-07 3:10 ` Alexey Kardashevskiy
[not found] ` <201606010901.u518x843001647@mx0a-001b2d01.pphosted.com>
2016-06-03 16:32 ` [Qemu-devel] [PATCH qemu v17 09/12] vfio: Add host side DMA window capabilities Alex Williamson
[not found] ` <201606010901.u518x7AQ001537@mx0a-001b2d01.pphosted.com>
2016-06-03 16:50 ` [Qemu-devel] [PATCH qemu v17 10/12] vfio/spapr: Create DMA window dynamically (SPAPR IOMMU v2) Alex Williamson
[not found] ` <201606011013.u51A9ALx023064@mx0a-001b2d01.pphosted.com>
2016-06-03 16:59 ` [Qemu-devel] [PATCH qemu v17 12/12] spapr_iommu, vfio, memory: Notify IOMMU about starting/stopping listening Alex Williamson
[not found] ` <201606010901.u518x1wF023568@mx0a-001b2d01.pphosted.com>
2016-06-06 5:57 ` [Qemu-devel] [PATCH qemu v17 11/12] spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) David Gibson
2016-06-06 8:12 ` Alexey Kardashevskiy
2016-06-08 5:57 ` David Gibson
2016-06-08 6:09 ` Alexey Kardashevskiy
2016-06-09 4:28 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160608060006.GY9226@voom.fritz.box \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).