All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: Michael Roth <mdroth@linux.vnet.ibm.com>,
	qemu-devel@nongnu.org, Gavin Shan <gwshan@linux.vnet.ibm.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	qemu-ppc@nongnu.org, David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH qemu v10 10/14] spapr_pci: Enable vfio-pci hotplug
Date: Mon, 6 Jul 2015 23:31:49 +0200	[thread overview]
Message-ID: <20150706233149.74e6af40@thh440s> (raw)
In-Reply-To: <1436148670-6592-11-git-send-email-aik@ozlabs.ru>

On Mon,  6 Jul 2015 12:11:06 +1000
Alexey Kardashevskiy <aik@ozlabs.ru> wrote:

> sPAPR IOMMU is managing two copies of an TCE table:
> 1) a guest view of the table - this is what emulated devices use and
> this is where H_GET_TCE reads from;
> 2) a hardware TCE table - only present if there is at least one vfio-pci
> device on a PHB; it is updated via a memory listener on a PHB address
> space which forwards map/unmap requests to vfio-pci IOMMU host driver.
> 
> At the moment presence of vfio-pci devices on a bus affect the way
> the guest view table is allocated. If there is no vfio-pci on a PHB
> and the host kernel supports KVM acceleration of H_PUT_TCE, a table
> is allocated in KVM. However, if there is vfio-pci and we do yet not
> support KVM acceleration for these, the table has to be allocated
> by the userspace.
> 
> When vfio-pci device is hotplugged and there were no vfio-pci devices
> already, the guest view table could have been allocated by KVM which
> means that H_PUT_TCE is handled by the host kernel and since we
> do not support vfio-pci in KVM, the hardware table will not be updated.
> 
> This reallocates the guest view table in QEMU if the first vfio-pci
> device has just been plugged. spapr_tce_realloc_userspace() handles this.

I wonder whether it would help to improve the readability of the code
later if you put the description of the function into the code instead
of the commit message?

> This replays all the mappings to make sure that the tables are in sync.
> This will not have a visible effect though as for a new device
> the guest kernel will allocate-and-map new addresses and therefore
> existing mappings from emulated devices will not be used by vfio-pci
> devices.
> 
> This adds calls to spapr_phb_dma_capabilities_update() in PCI hotplug
> hooks.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
...
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index 76c988f..d1fa157 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -827,6 +827,43 @@ int spapr_phb_dma_reset(sPAPRPHBState *sphb)
>      return 0;
>  }
>  
> +static int spapr_phb_hotplug_dma_sync(sPAPRPHBState *sphb)
> +{
> +    int ret = 0, i;
> +    bool had_vfio = sphb->has_vfio;
> +    sPAPRTCETable *tcet;
> +
> +    spapr_phb_dma_capabilities_update(sphb);
> +
> +    if (!had_vfio && sphb->has_vfio) {

    if (had_vfio || !sphb->has_vfio) {
        return 0;
    }

... and then you can save one level of indentation for the following
for-loop.

> +        for (i = 0; i < SPAPR_PCI_DMA_MAX_WINDOWS; ++i) {
> +            tcet = spapr_tce_find_by_liobn(SPAPR_PCI_LIOBN(sphb->index, i));
> +            if (!tcet || !tcet->enabled) {
> +                continue;
> +            }
> +            if (tcet->fd >= 0) {
> +                /*
> +                 * We got first vfio-pci device on accelerated table.
> +                 * VFIO acceleration is not possible.
> +                 * Reallocate table in userspace and replay mappings.
> +                 */
> +                ret = spapr_tce_realloc_userspace(tcet, true);
> +                trace_spapr_pci_dma_realloc_update(tcet->liobn, ret);
> +            } else {
> +                /* There was no acceleration, so just replay mappings. */
> +                ret = spapr_tce_replay(tcet);
> +                trace_spapr_pci_dma_update(tcet->liobn, ret);
> +            }
> +            if (ret) {
> +                break;
> +            }
> +        }
> +        return ret;
> +    }
> +
> +    return 0;
> +}
> +
>  /* Macros to operate with address in OF binding to PCI */
>  #define b_x(x, p, l)    (((x) & ((1<<(l))-1)) << (p))
>  #define b_n(x)          b_x((x), 31, 1) /* 0 if relocatable */
...
> @@ -1130,6 +1174,9 @@ static void spapr_phb_remove_pci_device_cb(DeviceState *dev, void *opaque)
>       */
>      pci_device_reset(PCI_DEVICE(dev));
>      object_unparent(OBJECT(dev));
> +
> +    /* Actual VFIO device release happens from RCU so postpone DMA update */
> +    call_rcu1(&((sPAPRPHBState *)opaque)->rcu, spapr_phb_remove_sync_dma);

Too much brackets again for my taste ;-)

>  }
>  

 Thomas

  parent reply	other threads:[~2015-07-06 21:32 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-06  2:10 [Qemu-devel] [PATCH qemu v10 00/14] spapr: vfio: Enable Dynamic DMA windows (DDW) Alexey Kardashevskiy
2015-07-06  2:10 ` [Qemu-devel] [PATCH qemu v10 01/14] linux-headers: Update to 4.2-rc1 Alexey Kardashevskiy
2015-07-06 11:18   ` Paolo Bonzini
2015-07-06  2:10 ` [Qemu-devel] [PATCH qemu v10 02/14] vmstate: Define VARRAY with VMS_ALLOC Alexey Kardashevskiy
2015-07-06 14:21   ` Thomas Huth
2015-07-06  2:10 ` [Qemu-devel] [PATCH qemu v10 03/14] spapr_pci: Convert finish_realize() to dma_capabilities_update()+dma_init_window() Alexey Kardashevskiy
2015-07-06 16:41   ` Laurent Vivier
2015-07-07  0:28     ` Alexey Kardashevskiy
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 04/14] spapr_iommu: Move table allocation to helpers Alexey Kardashevskiy
2015-07-06 15:14   ` Thomas Huth
2015-07-06 15:43     ` Alexey Kardashevskiy
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 05/14] spapr_iommu: Introduce "enabled" state for TCE table Alexey Kardashevskiy
2015-07-06 10:07   ` David Gibson
2015-07-06 17:04   ` Thomas Huth
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 06/14] spapr_iommu: Remove vfio_accel flag from sPAPRTCETable Alexey Kardashevskiy
2015-07-06 16:45   ` Laurent Vivier
2015-07-06 17:11   ` Thomas Huth
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 07/14] spapr_iommu: Add root memory region Alexey Kardashevskiy
2015-07-06 19:15   ` Thomas Huth
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 08/14] spapr_pci: Do complete reset of DMA config when resetting PHB Alexey Kardashevskiy
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 09/14] spapr_vfio_pci: Remove redundant spapr-pci-vfio-host-bridge Alexey Kardashevskiy
2015-07-06 21:13   ` Thomas Huth
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 10/14] spapr_pci: Enable vfio-pci hotplug Alexey Kardashevskiy
2015-07-06 10:27   ` David Gibson
2015-07-06 21:31   ` Thomas Huth [this message]
2015-07-07  9:28     ` Alexey Kardashevskiy
2015-07-10 21:33   ` Michael Roth
2015-07-12  4:59     ` Alexey Kardashevskiy
2015-07-12 14:41       ` Michael Roth
2015-07-13  1:10         ` David Gibson
2015-07-13  7:06         ` Alexey Kardashevskiy
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 11/14] spapr_pci_vfio: Enable multiple groups per container Alexey Kardashevskiy
2015-07-07  7:02   ` Thomas Huth
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 12/14] vfio: Unregister IOMMU notifiers when container is destroyed Alexey Kardashevskiy
2015-07-06 10:33   ` David Gibson
2015-07-06 12:49     ` Alex Williamson
2015-07-06 12:59       ` Alexey Kardashevskiy
2015-07-06 13:45         ` Alex Williamson
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 13/14] vfio: spapr: Add SPAPR IOMMU v2 support (DMA memory preregistering) Alexey Kardashevskiy
2015-07-06 13:42   ` Alex Williamson
2015-07-06 15:34     ` Alexey Kardashevskiy
2015-07-06 16:13       ` Alex Williamson
2015-07-07  0:29         ` David Gibson
2015-07-07  0:36           ` Alexey Kardashevskiy
2015-07-07 12:11         ` Alexey Kardashevskiy
2015-07-07 16:24           ` Alex Williamson
2015-07-08  6:26             ` Alexey Kardashevskiy
2015-07-08 14:51               ` Alex Williamson
2015-07-07  7:23   ` Thomas Huth
2015-07-07 10:05     ` Alexey Kardashevskiy
2015-07-07 10:21       ` Thomas Huth
2015-07-07 11:05         ` Alexey Kardashevskiy
2015-07-08  4:30           ` David Gibson
2015-07-08  6:24             ` Thomas Huth
2015-07-08  6:50               ` David Gibson
2015-07-08  7:07             ` Alexey Kardashevskiy
2015-07-08 14:47             ` Alex Williamson
2015-07-06  2:11 ` [Qemu-devel] [PATCH qemu v10 14/14] spapr_pci/spapr_pci_vfio: Support Dynamic DMA Windows (DDW) Alexey Kardashevskiy
2015-07-06 11:06   ` David Gibson
2015-07-06 11:27     ` Alexey Kardashevskiy
2015-07-07  9:46     ` Alexey Kardashevskiy
2015-07-07  4:58   ` David Gibson
2015-07-07  9:33   ` Thomas Huth
2015-07-07 10:43     ` Alexey Kardashevskiy
2015-07-07 11:35       ` Thomas Huth
2015-07-07 11:53         ` Alexey Kardashevskiy
2015-07-06 11:13 ` [Qemu-devel] [PATCH qemu v10 00/14] spapr: vfio: Enable Dynamic DMA windows (DDW) David Gibson
2015-07-06 15:54 ` Thomas Huth
2015-07-06 16:07   ` Alexey Kardashevskiy
2015-07-06 16:13     ` Thomas Huth
2015-07-08  4:34   ` 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=20150706233149.74e6af40@thh440s \
    --to=thuth@redhat.com \
    --cc=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=gwshan@linux.vnet.ibm.com \
    --cc=mdroth@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.