From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org,
Paul Mackerras <paulus@samba.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 27/29] vfio: powerpc/spapr: powerpc/powernv/ioda2: Rework ownership
Date: Wed, 11 Mar 2015 11:29:18 +1100 [thread overview]
Message-ID: <54FF8C5E.60007@ozlabs.ru> (raw)
In-Reply-To: <1426032557.25026.95.camel@redhat.com>
On 03/11/2015 11:09 AM, Alex Williamson wrote:
> On Tue, 2015-03-10 at 01:07 +1100, Alexey Kardashevskiy wrote:
>> Before the IOMMU user would take control over the IOMMU table belonging to
>> a specific IOMMU group. This approach did not allow sharing tables between
>> IOMMU groups attached to the same container.
>>
>> This introduces a new IOMMU ownership flavour when the user can not
>> just control the existing IOMMU table but remove/create tables on demand.
>> If an IOMMU supports a set_ownership() callback, that lets the user have
>> full control over the IOMMU group. When the ownership is taken,
>> the platform code removes all the windows so the caller must create them.
>> Before returning the ownership back to the platform code, the user
>> has to unprogram and remove all the tables it created.
>
> We have no ability to enforce that requirement on the user. VFIO needs
> to do the cleanup if the user fails to.
Ah. Wrong commit log, VFIO always does cleanup (as I end my guests by c-a-x
most of the time :) ), will fix it.
>
>> Old-style ownership is still supported allowing VFIO to run on older
>> P5IOC2 and IODA IO controllers.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>> ---
>> arch/powerpc/platforms/powernv/pci-ioda.c | 30 +++++++++++++++---
>> drivers/vfio/vfio_iommu_spapr_tce.c | 51 ++++++++++++++++++++++++-------
>> 2 files changed, 66 insertions(+), 15 deletions(-)
>>
>> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
>> index 07857c4..afb6906 100644
>> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
>> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
>> @@ -1620,11 +1620,33 @@ static void pnv_ioda2_set_ownership(struct iommu_table_group *table_group,
>> {
>> struct pnv_ioda_pe *pe = container_of(table_group, struct pnv_ioda_pe,
>> table_group);
>> - if (enable)
>> - iommu_take_ownership(table_group);
>> - else
>> - iommu_release_ownership(table_group);
>> + if (enable) {
>> + pnv_pci_ioda2_unset_window(&pe->table_group, 0);
>> + pnv_pci_free_table(&pe->table_group.tables[0]);
>> + } else {
>> + struct iommu_table *tbl = &pe->table_group.tables[0];
>> + int64_t rc;
>>
>> + rc = pnv_pci_ioda2_create_table(&pe->table_group, 0,
>> + IOMMU_PAGE_SHIFT_4K,
>> + pe->phb->ioda.m32_pci_base,
>> + POWERNV_IOMMU_DEFAULT_LEVELS, tbl);
>> + if (rc) {
>> + pe_err(pe, "Failed to create 32-bit TCE table, err %ld",
>> + rc);
>> + return;
>> + }
>> +
>> + iommu_init_table(tbl, pe->phb->hose->node);
>> +
>> + rc = pnv_pci_ioda2_set_window(&pe->table_group, 0, tbl);
>> + if (rc) {
>> + pe_err(pe, "Failed to configure 32-bit TCE table, err %ld\n",
>> + rc);
>> + pnv_pci_free_table(tbl);
>> + return;
>> + }
>> + }
>> pnv_pci_ioda2_set_bypass(pe, !enable);
>> }
>>
>> diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c
>> index d665ddc..3bc0645 100644
>> --- a/drivers/vfio/vfio_iommu_spapr_tce.c
>> +++ b/drivers/vfio/vfio_iommu_spapr_tce.c
>> @@ -426,18 +426,11 @@ static int tce_iommu_clear(struct tce_container *container,
>> static void tce_iommu_release(void *iommu_data)
>> {
>> struct tce_container *container = iommu_data;
>> - struct iommu_table *tbl;
>> - struct iommu_table_group *table_group;
>>
>> WARN_ON(container->grp);
>>
>> - if (container->grp) {
>> - table_group = iommu_group_get_iommudata(container->grp);
>> - tbl = &table_group->tables[0];
>> - tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
>> -
>> + if (container->grp)
>> tce_iommu_detach_group(iommu_data, container->grp);
>> - }
>>
>> tce_mem_unregister_all(container);
>> tce_iommu_disable(container);
>> @@ -826,14 +819,24 @@ static int tce_iommu_attach_group(void *iommu_data,
>>
>> if (!table_group->ops || !table_group->ops->set_ownership) {
>> ret = iommu_take_ownership(table_group);
>> + } else if (!table_group->ops->create_table ||
>> + !table_group->ops->set_window) {
>> + WARN_ON_ONCE(1);
>> + ret = -EFAULT;
>> } else {
>> /*
>> * Disable iommu bypass, otherwise the user can DMA to all of
>> * our physical memory via the bypass window instead of just
>> * the pages that has been explicitly mapped into the iommu
>> */
>> + struct iommu_table tbltmp = { 0 }, *tbl = &tbltmp;
>> +
>> table_group->ops->set_ownership(table_group, true);
>> - ret = 0;
>> + ret = table_group->ops->create_table(table_group, 0,
>> + IOMMU_PAGE_SHIFT_4K,
>> + table_group->tce32_size, 1, tbl);
>> + if (!ret)
>> + ret = table_group->ops->set_window(table_group, 0, tbl);
>> }
>>
>> if (ret)
>> @@ -852,6 +855,7 @@ static void tce_iommu_detach_group(void *iommu_data,
>> {
>> struct tce_container *container = iommu_data;
>> struct iommu_table_group *table_group;
>> + long i;
>>
>> mutex_lock(&container->lock);
>> if (iommu_group != container->grp) {
>> @@ -875,10 +879,35 @@ static void tce_iommu_detach_group(void *iommu_data,
>> BUG_ON(!table_group);
>>
>> /* Kernel owns the device now, we can restore bypass */
>> - if (!table_group->ops || !table_group->ops->set_ownership)
>> + if (!table_group->ops || !table_group->ops->set_ownership) {
>> + for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
>> + struct iommu_table *tbl = &table_group->tables[i];
>> +
>> + if (!tbl->it_size)
>> + continue;
>> +
>> + if (!tbl->it_ops)
>> + goto unlock_exit;
>> + tce_iommu_clear(container, tbl,
>> + tbl->it_offset, tbl->it_size);
>> + }
>> iommu_release_ownership(table_group);
>> - else
>> + } else if (!table_group->ops->unset_window) {
>> + WARN_ON_ONCE(1);
>> + } else {
>> + for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
>> + struct iommu_table *tbl = &table_group->tables[i];
>> +
>> + table_group->ops->unset_window(table_group, i);
>> + tce_iommu_clear(container, tbl,
>> + tbl->it_offset, tbl->it_size);
>> +
>> + if (tbl->it_ops->free)
>> + tbl->it_ops->free(tbl);
>> + }
>> +
>> table_group->ops->set_ownership(table_group, false);
>> + }
>>
>> unlock_exit:
>>
>
>
>
--
Alexey
next prev parent reply other threads:[~2015-03-11 0:29 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-09 14:06 [PATCH v5 00/29] powerpc/iommu/vfio: Enable Dynamic DMA windows Alexey Kardashevskiy
2015-03-09 14:06 ` [PATCH v5 01/29] vfio: powerpc/spapr: Move page pinning from arch code to VFIO IOMMU driver Alexey Kardashevskiy
2015-03-09 14:06 ` [PATCH v5 02/29] vfio: powerpc/spapr: Do cleanup when releasing the group Alexey Kardashevskiy
2015-03-09 14:06 ` [PATCH v5 03/29] vfio: powerpc/spapr: Check that TCE page size is equal to it_page_size Alexey Kardashevskiy
2015-03-10 19:56 ` Alex Williamson
2015-03-10 22:57 ` Alexey Kardashevskiy
2015-03-10 23:03 ` Alex Williamson
2015-03-10 23:14 ` Benjamin Herrenschmidt
2015-03-10 23:34 ` Alex Williamson
2015-03-10 23:45 ` Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 04/29] vfio: powerpc/spapr: Use it_page_size Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 05/29] vfio: powerpc/spapr: Move locked_vm accounting to helpers Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 06/29] vfio: powerpc/spapr: Disable DMA mappings on disabled container Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 07/29] vfio: powerpc/spapr: Moving pinning/unpinning to helpers Alexey Kardashevskiy
2015-03-10 23:36 ` Alex Williamson
2015-03-09 14:07 ` [PATCH v5 08/29] vfio: powerpc/spapr: Register memory Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 09/29] vfio: powerpc/spapr: Rework attach/detach Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 10/29] powerpc/powernv: Do not set "read" flag if direction==DMA_NONE Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 11/29] powerpc/iommu: Move tce_xxx callbacks from ppc_md to iommu_table Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 12/29] powerpc/iommu: Introduce iommu_table_alloc() helper Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 13/29] powerpc/spapr: vfio: Switch from iommu_table to new iommu_table_group Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 14/29] vfio: powerpc/spapr: powerpc/iommu: Rework IOMMU ownership control Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 15/29] vfio: powerpc/spapr: powerpc/powernv/ioda2: " Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 16/29] powerpc/iommu: Fix IOMMU ownership control functions Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 17/29] powerpc/powernv/ioda/ioda2: Rework tce_build()/tce_free() Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 18/29] powerpc/iommu/powernv: Release replaced TCE Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 19/29] poweppc/powernv/ioda2: Rework iommu_table creation Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 20/29] powerpc/powernv/ioda2: Introduce pnv_pci_ioda2_create_table/pnc_pci_free_table Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 21/29] powerpc/powernv/ioda2: Introduce pnv_pci_ioda2_set_window Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 22/29] powerpc/iommu: Split iommu_free_table into 2 helpers Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 23/29] powerpc/powernv: Implement multilevel TCE tables Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 24/29] powerpc/powernv: Change prototypes to receive iommu Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 25/29] powerpc/powernv/ioda: Define and implement DMA table/window management callbacks Alexey Kardashevskiy
2015-03-11 8:54 ` Alexey Kardashevskiy
2015-03-11 9:31 ` Benjamin Herrenschmidt
2015-03-09 14:07 ` [PATCH v5 26/29] vfio: powerpc/spapr: Define v2 IOMMU Alexey Kardashevskiy
2015-03-11 0:00 ` Alex Williamson
2015-03-09 14:07 ` [PATCH v5 27/29] vfio: powerpc/spapr: powerpc/powernv/ioda2: Rework ownership Alexey Kardashevskiy
2015-03-11 0:09 ` Alex Williamson
2015-03-11 0:29 ` Alexey Kardashevskiy [this message]
2015-03-09 14:07 ` [PATCH v5 28/29] vfio: powerpc/spapr: Support multiple groups in one container if possible Alexey Kardashevskiy
2015-03-09 14:07 ` [PATCH v5 29/29] vfio: powerpc/spapr: Support Dynamic DMA windows Alexey Kardashevskiy
2015-03-11 1:10 ` Alex Williamson
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=54FF8C5E.60007@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=paulus@samba.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).