All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: linuxppc-dev@lists.ozlabs.org, Paul Mackerras <paulus@samba.org>,
	Alex Williamson <alex.williamson@redhat.com>,
	kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH kernel 4/9] powerpc/powernv/iommu: Add real mode version of xchg()
Date: Mon, 07 Mar 2016 07:32:23 +0000	[thread overview]
Message-ID: <56DD2E87.1010504@ozlabs.ru> (raw)
In-Reply-To: <20160307060519.GM22546@voom.fritz.box>

On 03/07/2016 05:05 PM, David Gibson wrote:
> On Mon, Mar 07, 2016 at 02:41:12PM +1100, Alexey Kardashevskiy wrote:
>> In real mode, TCE tables are invalidated using different
>> cache-inhibited store instructions which is different from
>> the virtual mode.
>>
>> This defines and implements exchange_rm() callback. This does not
>> define set_rm/clear_rm/flush_rm callbacks as there is no user for those -
>> exchange/exchange_rm are only to be used by KVM for VFIO.
>>
>> The exchange_rm callback is defined for IODA1/IODA2 powernv platforms.
>>
>> This replaces list_for_each_entry_rcu with its lockless version as
>> from now on pnv_pci_ioda2_tce_invalidate() can be called in
>> the real mode too.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>> ---
>>   arch/powerpc/include/asm/iommu.h          |  7 +++++++
>>   arch/powerpc/kernel/iommu.c               | 15 +++++++++++++++
>>   arch/powerpc/platforms/powernv/pci-ioda.c | 28 +++++++++++++++++++++++++++-
>>   3 files changed, 49 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h
>> index 7b87bab..3ca877a 100644
>> --- a/arch/powerpc/include/asm/iommu.h
>> +++ b/arch/powerpc/include/asm/iommu.h
>> @@ -64,6 +64,11 @@ struct iommu_table_ops {
>>   			long index,
>>   			unsigned long *hpa,
>>   			enum dma_data_direction *direction);
>> +	/* Real mode */
>> +	int (*exchange_rm)(struct iommu_table *tbl,
>> +			long index,
>> +			unsigned long *hpa,
>> +			enum dma_data_direction *direction);
>>   #endif
>>   	void (*clear)(struct iommu_table *tbl,
>>   			long index, long npages);
>> @@ -208,6 +213,8 @@ extern void iommu_del_device(struct device *dev);
>>   extern int __init tce_iommu_bus_notifier_init(void);
>>   extern long iommu_tce_xchg(struct iommu_table *tbl, unsigned long entry,
>>   		unsigned long *hpa, enum dma_data_direction *direction);
>> +extern long iommu_tce_xchg_rm(struct iommu_table *tbl, unsigned long entry,
>> +		unsigned long *hpa, enum dma_data_direction *direction);
>>   #else
>>   static inline void iommu_register_group(struct iommu_table_group *table_group,
>>   					int pci_domain_number,
>> diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
>> index a8e3490..2fcc48b 100644
>> --- a/arch/powerpc/kernel/iommu.c
>> +++ b/arch/powerpc/kernel/iommu.c
>> @@ -1062,6 +1062,21 @@ void iommu_release_ownership(struct iommu_table *tbl)
>>   }
>>   EXPORT_SYMBOL_GPL(iommu_release_ownership);
>>
>> +long iommu_tce_xchg_rm(struct iommu_table *tbl, unsigned long entry,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret;
>> +
>> +	ret = tbl->it_ops->exchange_rm(tbl, entry, hpa, direction);
>> +
>> +	if (!ret && ((*direction = DMA_FROM_DEVICE) ||
>> +			(*direction = DMA_BIDIRECTIONAL)))
>> +		SetPageDirty(realmode_pfn_to_page(*hpa >> PAGE_SHIFT));
>> +
>> +	return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_tce_xchg_rm);
>
>>   int iommu_add_device(struct device *dev)
>>   {
>>   	struct iommu_table *tbl;
>> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
>> index c5baaf3..bed1944 100644
>> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
>> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
>> @@ -1791,6 +1791,18 @@ static int pnv_ioda1_tce_xchg(struct iommu_table *tbl, long index,
>>
>>   	return ret;
>>   }
>> +
>> +static int pnv_ioda1_tce_xchg_rm(struct iommu_table *tbl, long index,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret = pnv_tce_xchg(tbl, index, hpa, direction);
>> +
>> +	if (!ret && (tbl->it_type &
>> +			(TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE)))
>> +		pnv_pci_ioda1_tce_invalidate(tbl, index, 1, true);
>> +
>> +	return ret;
>> +}
>>   #endif
>
> Both your _rm variants are identical to the non _rm versions.  Why not
> just set the function poiinter to the same thing, rather than copying
> the whole function.


The last parameter - "rm" - to pnv_pci_ioda1_tce_invalidate() is different.


>
>>   static void pnv_ioda1_tce_free(struct iommu_table *tbl, long index,
>> @@ -1806,6 +1818,7 @@ static struct iommu_table_ops pnv_ioda1_iommu_ops = {
>>   	.set = pnv_ioda1_tce_build,
>>   #ifdef CONFIG_IOMMU_API
>>   	.exchange = pnv_ioda1_tce_xchg,
>> +	.exchange_rm = pnv_ioda1_tce_xchg_rm,
>>   #endif
>>   	.clear = pnv_ioda1_tce_free,
>>   	.get = pnv_tce_get,
>> @@ -1866,7 +1879,7 @@ static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl,
>>   {
>>   	struct iommu_table_group_link *tgl;
>>
>> -	list_for_each_entry_rcu(tgl, &tbl->it_group_list, next) {
>> +	list_for_each_entry_lockless(tgl, &tbl->it_group_list, next) {
>>   		struct pnv_ioda_pe *npe;
>>   		struct pnv_ioda_pe *pe = container_of(tgl->table_group,
>>   				struct pnv_ioda_pe, table_group);
>> @@ -1918,6 +1931,18 @@ static int pnv_ioda2_tce_xchg(struct iommu_table *tbl, long index,
>>
>>   	return ret;
>>   }
>> +
>> +static int pnv_ioda2_tce_xchg_rm(struct iommu_table *tbl, long index,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret = pnv_tce_xchg(tbl, index, hpa, direction);
>> +
>> +	if (!ret && (tbl->it_type &
>> +			(TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE)))
>> +		pnv_pci_ioda2_tce_invalidate(tbl, index, 1, true);
>> +
>> +	return ret;
>> +}
>>   #endif
>>
>>   static void pnv_ioda2_tce_free(struct iommu_table *tbl, long index,
>> @@ -1939,6 +1964,7 @@ static struct iommu_table_ops pnv_ioda2_iommu_ops = {
>>   	.set = pnv_ioda2_tce_build,
>>   #ifdef CONFIG_IOMMU_API
>>   	.exchange = pnv_ioda2_tce_xchg,
>> +	.exchange_rm = pnv_ioda2_tce_xchg_rm,
>>   #endif
>>   	.clear = pnv_ioda2_tce_free,
>>   	.get = pnv_tce_get,
>


-- 
Alexey

WARNING: multiple messages have this Message-ID (diff)
From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: linuxppc-dev@lists.ozlabs.org, Paul Mackerras <paulus@samba.org>,
	Alex Williamson <alex.williamson@redhat.com>,
	kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH kernel 4/9] powerpc/powernv/iommu: Add real mode version of xchg()
Date: Mon, 7 Mar 2016 18:32:23 +1100	[thread overview]
Message-ID: <56DD2E87.1010504@ozlabs.ru> (raw)
In-Reply-To: <20160307060519.GM22546@voom.fritz.box>

On 03/07/2016 05:05 PM, David Gibson wrote:
> On Mon, Mar 07, 2016 at 02:41:12PM +1100, Alexey Kardashevskiy wrote:
>> In real mode, TCE tables are invalidated using different
>> cache-inhibited store instructions which is different from
>> the virtual mode.
>>
>> This defines and implements exchange_rm() callback. This does not
>> define set_rm/clear_rm/flush_rm callbacks as there is no user for those -
>> exchange/exchange_rm are only to be used by KVM for VFIO.
>>
>> The exchange_rm callback is defined for IODA1/IODA2 powernv platforms.
>>
>> This replaces list_for_each_entry_rcu with its lockless version as
>> from now on pnv_pci_ioda2_tce_invalidate() can be called in
>> the real mode too.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>> ---
>>   arch/powerpc/include/asm/iommu.h          |  7 +++++++
>>   arch/powerpc/kernel/iommu.c               | 15 +++++++++++++++
>>   arch/powerpc/platforms/powernv/pci-ioda.c | 28 +++++++++++++++++++++++++++-
>>   3 files changed, 49 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h
>> index 7b87bab..3ca877a 100644
>> --- a/arch/powerpc/include/asm/iommu.h
>> +++ b/arch/powerpc/include/asm/iommu.h
>> @@ -64,6 +64,11 @@ struct iommu_table_ops {
>>   			long index,
>>   			unsigned long *hpa,
>>   			enum dma_data_direction *direction);
>> +	/* Real mode */
>> +	int (*exchange_rm)(struct iommu_table *tbl,
>> +			long index,
>> +			unsigned long *hpa,
>> +			enum dma_data_direction *direction);
>>   #endif
>>   	void (*clear)(struct iommu_table *tbl,
>>   			long index, long npages);
>> @@ -208,6 +213,8 @@ extern void iommu_del_device(struct device *dev);
>>   extern int __init tce_iommu_bus_notifier_init(void);
>>   extern long iommu_tce_xchg(struct iommu_table *tbl, unsigned long entry,
>>   		unsigned long *hpa, enum dma_data_direction *direction);
>> +extern long iommu_tce_xchg_rm(struct iommu_table *tbl, unsigned long entry,
>> +		unsigned long *hpa, enum dma_data_direction *direction);
>>   #else
>>   static inline void iommu_register_group(struct iommu_table_group *table_group,
>>   					int pci_domain_number,
>> diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
>> index a8e3490..2fcc48b 100644
>> --- a/arch/powerpc/kernel/iommu.c
>> +++ b/arch/powerpc/kernel/iommu.c
>> @@ -1062,6 +1062,21 @@ void iommu_release_ownership(struct iommu_table *tbl)
>>   }
>>   EXPORT_SYMBOL_GPL(iommu_release_ownership);
>>
>> +long iommu_tce_xchg_rm(struct iommu_table *tbl, unsigned long entry,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret;
>> +
>> +	ret = tbl->it_ops->exchange_rm(tbl, entry, hpa, direction);
>> +
>> +	if (!ret && ((*direction == DMA_FROM_DEVICE) ||
>> +			(*direction == DMA_BIDIRECTIONAL)))
>> +		SetPageDirty(realmode_pfn_to_page(*hpa >> PAGE_SHIFT));
>> +
>> +	return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_tce_xchg_rm);
>
>>   int iommu_add_device(struct device *dev)
>>   {
>>   	struct iommu_table *tbl;
>> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
>> index c5baaf3..bed1944 100644
>> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
>> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
>> @@ -1791,6 +1791,18 @@ static int pnv_ioda1_tce_xchg(struct iommu_table *tbl, long index,
>>
>>   	return ret;
>>   }
>> +
>> +static int pnv_ioda1_tce_xchg_rm(struct iommu_table *tbl, long index,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret = pnv_tce_xchg(tbl, index, hpa, direction);
>> +
>> +	if (!ret && (tbl->it_type &
>> +			(TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE)))
>> +		pnv_pci_ioda1_tce_invalidate(tbl, index, 1, true);
>> +
>> +	return ret;
>> +}
>>   #endif
>
> Both your _rm variants are identical to the non _rm versions.  Why not
> just set the function poiinter to the same thing, rather than copying
> the whole function.


The last parameter - "rm" - to pnv_pci_ioda1_tce_invalidate() is different.


>
>>   static void pnv_ioda1_tce_free(struct iommu_table *tbl, long index,
>> @@ -1806,6 +1818,7 @@ static struct iommu_table_ops pnv_ioda1_iommu_ops = {
>>   	.set = pnv_ioda1_tce_build,
>>   #ifdef CONFIG_IOMMU_API
>>   	.exchange = pnv_ioda1_tce_xchg,
>> +	.exchange_rm = pnv_ioda1_tce_xchg_rm,
>>   #endif
>>   	.clear = pnv_ioda1_tce_free,
>>   	.get = pnv_tce_get,
>> @@ -1866,7 +1879,7 @@ static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl,
>>   {
>>   	struct iommu_table_group_link *tgl;
>>
>> -	list_for_each_entry_rcu(tgl, &tbl->it_group_list, next) {
>> +	list_for_each_entry_lockless(tgl, &tbl->it_group_list, next) {
>>   		struct pnv_ioda_pe *npe;
>>   		struct pnv_ioda_pe *pe = container_of(tgl->table_group,
>>   				struct pnv_ioda_pe, table_group);
>> @@ -1918,6 +1931,18 @@ static int pnv_ioda2_tce_xchg(struct iommu_table *tbl, long index,
>>
>>   	return ret;
>>   }
>> +
>> +static int pnv_ioda2_tce_xchg_rm(struct iommu_table *tbl, long index,
>> +		unsigned long *hpa, enum dma_data_direction *direction)
>> +{
>> +	long ret = pnv_tce_xchg(tbl, index, hpa, direction);
>> +
>> +	if (!ret && (tbl->it_type &
>> +			(TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE)))
>> +		pnv_pci_ioda2_tce_invalidate(tbl, index, 1, true);
>> +
>> +	return ret;
>> +}
>>   #endif
>>
>>   static void pnv_ioda2_tce_free(struct iommu_table *tbl, long index,
>> @@ -1939,6 +1964,7 @@ static struct iommu_table_ops pnv_ioda2_iommu_ops = {
>>   	.set = pnv_ioda2_tce_build,
>>   #ifdef CONFIG_IOMMU_API
>>   	.exchange = pnv_ioda2_tce_xchg,
>> +	.exchange_rm = pnv_ioda2_tce_xchg_rm,
>>   #endif
>>   	.clear = pnv_ioda2_tce_free,
>>   	.get = pnv_tce_get,
>


-- 
Alexey

  reply	other threads:[~2016-03-07  7:32 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-07  3:41 [PATCH kernel 0/9] KVM, PPC, VFIO: Enable in-kernel acceleration Alexey Kardashevskiy
2016-03-07  3:41 ` Alexey Kardashevskiy
2016-03-07  3:41 ` [PATCH kernel 1/9] KVM: PPC: Reserve KVM_CAP_SPAPR_TCE_VFIO capability number Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  4:58   ` David Gibson
2016-03-07  4:58     ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 2/9] powerpc/mmu: Add real mode support for IOMMU preregistered memory Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  5:30   ` David Gibson
2016-03-07  5:30     ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 3/9] KVM: PPC: Use preregistered memory API to access TCE list Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  6:00   ` David Gibson
2016-03-07  6:00     ` David Gibson
2016-03-08  5:47     ` Alexey Kardashevskiy
2016-03-08  5:47       ` Alexey Kardashevskiy
2016-03-08  6:30       ` David Gibson
2016-03-08  6:30         ` David Gibson
2016-03-09  8:55         ` Alexey Kardashevskiy
2016-03-09  8:55           ` Alexey Kardashevskiy
2016-03-09 23:46           ` David Gibson
2016-03-09 23:46             ` David Gibson
2016-03-10  8:33     ` Paul Mackerras
2016-03-10  8:33       ` Paul Mackerras
2016-03-10 23:42       ` David Gibson
2016-03-10 23:42         ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 4/9] powerpc/powernv/iommu: Add real mode version of xchg() Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  6:05   ` David Gibson
2016-03-07  6:05     ` David Gibson
2016-03-07  7:32     ` Alexey Kardashevskiy [this message]
2016-03-07  7:32       ` Alexey Kardashevskiy
2016-03-08  4:50       ` David Gibson
2016-03-08  4:50         ` David Gibson
2016-03-10  8:43   ` Paul Mackerras
2016-03-10  8:43     ` Paul Mackerras
2016-03-10  8:46   ` Paul Mackerras
2016-03-10  8:46     ` Paul Mackerras
2016-03-07  3:41 ` [PATCH kernel 5/9] KVM: PPC: Enable IOMMU_API for KVM_BOOK3S_64 permanently Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  3:41 ` [PATCH kernel 6/9] KVM: PPC: Associate IOMMU group with guest view of TCE table Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-07  6:25   ` David Gibson
2016-03-07  6:25     ` David Gibson
2016-03-07  9:38     ` Alexey Kardashevskiy
2016-03-07  9:38       ` Alexey Kardashevskiy
2016-03-08  4:55       ` David Gibson
2016-03-08  4:55         ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 7/9] KVM: PPC: Create a virtual-mode only TCE table handlers Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-08  6:32   ` David Gibson
2016-03-08  6:32     ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 8/9] KVM: PPC: Add in-kernel handling for VFIO Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-08 11:08   ` David Gibson
2016-03-08 11:08     ` David Gibson
2016-03-09  8:46     ` Alexey Kardashevskiy
2016-03-09  8:46       ` Alexey Kardashevskiy
2016-03-10  5:18       ` David Gibson
2016-03-10  5:18         ` David Gibson
2016-03-11  2:15         ` Alexey Kardashevskiy
2016-03-11  2:15           ` Alexey Kardashevskiy
2016-03-15  6:00           ` David Gibson
2016-03-15  6:00             ` David Gibson
2016-03-07  3:41 ` [PATCH kernel 9/9] KVM: PPC: VFIO device: support SPAPR TCE Alexey Kardashevskiy
2016-03-07  3:41   ` Alexey Kardashevskiy
2016-03-09  5:45   ` David Gibson
2016-03-09  5:45     ` David Gibson
2016-03-09  9:20     ` Alexey Kardashevskiy
2016-03-09  9:20       ` Alexey Kardashevskiy
2016-03-10  5:21       ` David Gibson
2016-03-10  5:21         ` David Gibson
2016-03-10 23:09         ` Alexey Kardashevskiy
2016-03-10 23:09           ` Alexey Kardashevskiy
2016-03-15  6:04           ` David Gibson
2016-03-15  6:04             ` David Gibson
     [not found]             ` <15389a41428.27cb.1ca38dd7e845b990cd13d431eb58563d@ozlabs.ru>
     [not found]               ` <20160321051932.GJ23586@voom.redhat.com>
2016-03-22  0:34                 ` Alexey Kardashevskiy
2016-03-22  0:34                   ` Alexey Kardashevskiy
2016-03-23  3:03                   ` David Gibson
2016-03-23  3:03                     ` David Gibson
2016-06-09  6:47                     ` Alexey Kardashevskiy
2016-06-09  6:47                       ` Alexey Kardashevskiy
2016-06-10  6:50                       ` David Gibson
2016-06-10  6:50                         ` David Gibson
2016-06-14  3:30                         ` Alexey Kardashevskiy
2016-06-14  3:30                           ` Alexey Kardashevskiy
2016-06-15  4:43                           ` David Gibson
2016-06-15  4:43                             ` David Gibson
2016-04-08  9:13     ` Alexey Kardashevskiy
2016-04-08  9:13       ` Alexey Kardashevskiy
2016-04-11  3:36       ` David Gibson
2016-04-11  3:36         ` 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=56DD2E87.1010504@ozlabs.ru \
    --to=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@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 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.