public inbox for linuxppc-dev@ozlabs.org 
 help / color / mirror / Atom feed
From: David Gibson <david@gibson•dropbear.id.au>
To: Alexey Kardashevskiy <aik@ozlabs•ru>
Cc: linuxppc-dev@lists•ozlabs.org,
	Alex Williamson <alex.williamson@redhat•com>,
	Paul Mackerras <paulus@samba•org>
Subject: Re: [PATCH kernel 09/15] powerpc/mmu: Add real mode support for IOMMU preregistered memory
Date: Fri, 12 Aug 2016 14:02:24 +1000	[thread overview]
Message-ID: <20160812040224.GL16493@voom.fritz.box> (raw)
In-Reply-To: <1470213656-1042-10-git-send-email-aik@ozlabs.ru>

[-- Attachment #1: Type: text/plain, Size: 4172 bytes --]

On Wed, Aug 03, 2016 at 06:40:50PM +1000, Alexey Kardashevskiy wrote:
> This makes mm_iommu_lookup() able to work in realmode by replacing
> list_for_each_entry_rcu() (which can do debug stuff which can fail in
> real mode) with list_for_each_entry_lockless().
> 
> This adds realmode version of mm_iommu_ua_to_hpa() which adds
> explicit vmalloc'd-to-linear address conversion.
> Unlike mm_iommu_ua_to_hpa(), mm_iommu_ua_to_hpa_rm() can fail.
> 
> This changes mm_iommu_preregistered() to receive @mm as in real mode
> @current does not always have a correct pointer.
> 
> This adds realmode version of mm_iommu_lookup() which receives @mm
> (for the same reason as for mm_iommu_preregistered()) and uses
> lockless version of list_for_each_entry_rcu().
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs•ru>

Reviewed-by: David Gibson <david@gibson•dropbear.id.au>

> ---
>  arch/powerpc/include/asm/mmu_context.h |  4 ++++
>  arch/powerpc/mm/mmu_context_iommu.c    | 39 ++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h
> index a4c4ed5..939030c 100644
> --- a/arch/powerpc/include/asm/mmu_context.h
> +++ b/arch/powerpc/include/asm/mmu_context.h
> @@ -27,10 +27,14 @@ extern long mm_iommu_put(struct mm_struct *mm,
>  extern void mm_iommu_init(struct mm_struct *mm);
>  extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup(struct mm_struct *mm,
>  		unsigned long ua, unsigned long size);
> +extern struct mm_iommu_table_group_mem_t *mm_iommu_lookup_rm(
> +		struct mm_struct *mm, unsigned long ua, unsigned long size);
>  extern struct mm_iommu_table_group_mem_t *mm_iommu_find(struct mm_struct *mm,
>  		unsigned long ua, unsigned long entries);
>  extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem,
>  		unsigned long ua, unsigned long *hpa);
> +extern long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t *mem,
> +		unsigned long ua, unsigned long *hpa);
>  extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem);
>  extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem);
>  #endif
> diff --git a/arch/powerpc/mm/mmu_context_iommu.c b/arch/powerpc/mm/mmu_context_iommu.c
> index 10f01fe..36a906c 100644
> --- a/arch/powerpc/mm/mmu_context_iommu.c
> +++ b/arch/powerpc/mm/mmu_context_iommu.c
> @@ -242,6 +242,25 @@ struct mm_iommu_table_group_mem_t *mm_iommu_lookup(struct mm_struct *mm,
>  }
>  EXPORT_SYMBOL_GPL(mm_iommu_lookup);
>  
> +struct mm_iommu_table_group_mem_t *mm_iommu_lookup_rm(struct mm_struct *mm,
> +		unsigned long ua, unsigned long size)
> +{
> +	struct mm_iommu_table_group_mem_t *mem, *ret = NULL;
> +
> +	list_for_each_entry_lockless(mem, &mm->context.iommu_group_mem_list,
> +			next) {
> +		if ((mem->ua <= ua) &&
> +				(ua + size <= mem->ua +
> +				 (mem->entries << PAGE_SHIFT))) {
> +			ret = mem;
> +			break;
> +		}
> +	}
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(mm_iommu_lookup_rm);
> +
>  struct mm_iommu_table_group_mem_t *mm_iommu_find(struct mm_struct *mm,
>  		unsigned long ua, unsigned long entries)
>  {
> @@ -273,6 +292,26 @@ long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem,
>  }
>  EXPORT_SYMBOL_GPL(mm_iommu_ua_to_hpa);
>  
> +long mm_iommu_ua_to_hpa_rm(struct mm_iommu_table_group_mem_t *mem,
> +		unsigned long ua, unsigned long *hpa)
> +{
> +	const long entry = (ua - mem->ua) >> PAGE_SHIFT;
> +	void *va = &mem->hpas[entry];
> +	unsigned long *ra;
> +
> +	if (entry >= mem->entries)
> +		return -EFAULT;
> +
> +	ra = (void *) vmalloc_to_phys(va);
> +	if (!ra)
> +		return -EFAULT;
> +
> +	*hpa = *ra | (ua & ~PAGE_MASK);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(mm_iommu_ua_to_hpa_rm);
> +
>  long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem)
>  {
>  	if (atomic64_inc_not_zero(&mem->mapped))

-- 
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 --]

  reply	other threads:[~2016-08-12  4:48 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-03  8:40 [PATCH kernel 00/15] powerpc/kvm/vfio: Enable in-kernel acceleration Alexey Kardashevskiy
2016-08-03  8:40 ` [PATCH kernel 01/15] Revert "iommu: Add a function to find an iommu group by id" Alexey Kardashevskiy
2016-08-15  4:58   ` Paul Mackerras
2016-08-03  8:40 ` [PATCH kernel 02/15] KVM: PPC: Finish enabling VFIO KVM device on POWER Alexey Kardashevskiy
2016-08-04  5:21   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 03/15] KVM: PPC: Reserve KVM_CAP_SPAPR_TCE_VFIO capability number Alexey Kardashevskiy
2016-08-03  8:40 ` [PATCH kernel 04/15] powerpc/powernv/ioda: Fix TCE invalidate to work in real mode again Alexey Kardashevskiy
2016-08-04  5:23   ` David Gibson
2016-08-09 11:26   ` [kernel, " Michael Ellerman
2016-08-03  8:40 ` [PATCH kernel 05/15] powerpc/iommu: Stop using @current in mm_iommu_xxx Alexey Kardashevskiy
2016-08-03 10:10   ` Nicholas Piggin
2016-08-05  7:00   ` Michael Ellerman
2016-08-09  5:29     ` Alexey Kardashevskiy
2016-08-09  4:43   ` Balbir Singh
2016-08-09  6:04     ` Nicholas Piggin
2016-08-09  6:17       ` Balbir Singh
2016-08-12  2:57   ` David Gibson
2016-08-12  4:56     ` Alexey Kardashevskiy
2016-08-15 10:58       ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 06/15] powerpc/mm/iommu: Put pages on process exit Alexey Kardashevskiy
2016-08-03 10:11   ` Nicholas Piggin
2016-08-12  3:13   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 07/15] powerpc/iommu: Cleanup iommu_table disposal Alexey Kardashevskiy
2016-08-12  3:18   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 08/15] powerpc/vfio_spapr_tce: Add reference counting to iommu_table Alexey Kardashevskiy
2016-08-12  3:29   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 09/15] powerpc/mmu: Add real mode support for IOMMU preregistered memory Alexey Kardashevskiy
2016-08-12  4:02   ` David Gibson [this message]
2016-08-03  8:40 ` [PATCH kernel 10/15] KVM: PPC: Use preregistered memory API to access TCE list Alexey Kardashevskiy
2016-08-12  4:17   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 11/15] powerpc/powernv/iommu: Add real mode version of iommu_table_ops::exchange() Alexey Kardashevskiy
2016-08-12  4:29   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 12/15] KVM: PPC: Enable IOMMU_API for KVM_BOOK3S_64 permanently Alexey Kardashevskiy
2016-08-12  4:34   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 13/15] KVM: PPC: Pass kvm* to kvmppc_find_table() Alexey Kardashevskiy
2016-08-12  4:45   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 14/15] vfio/spapr_tce: Export container API for external users Alexey Kardashevskiy
2016-08-08 16:43   ` Alex Williamson
2016-08-09  5:19     ` Alexey Kardashevskiy
2016-08-09 12:16       ` Alex Williamson
2016-08-10  5:37         ` Alexey Kardashevskiy
2016-08-10 16:46           ` Alex Williamson
2016-08-12  5:46             ` David Gibson
2016-08-12  6:12               ` Alexey Kardashevskiy
2016-08-15 11:07                 ` David Gibson
2016-08-17  8:31                   ` Alexey Kardashevskiy
2016-08-12 15:22               ` Alex Williamson
2016-08-17  3:17                 ` David Gibson
2016-08-18  0:22                   ` Alexey Kardashevskiy
2016-08-29  6:35                     ` Alexey Kardashevskiy
2016-08-29 13:27                       ` David Gibson
2016-09-07  9:09                         ` Alexey Kardashevskiy
2016-09-21  6:56                           ` Alexey Kardashevskiy
2016-09-23  7:12                             ` David Gibson
2016-10-17  6:06                               ` Alexey Kardashevskiy
2016-10-18  1:42                                 ` David Gibson
2016-08-15  3:59         ` Paul Mackerras
2016-08-15 15:32           ` Alex Williamson
2016-08-12  5:25   ` David Gibson
2016-08-03  8:40 ` [PATCH kernel 15/15] KVM: PPC: Add in-kernel acceleration for VFIO Alexey Kardashevskiy

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=20160812040224.GL16493@voom.fritz.box \
    --to=david@gibson$(echo .)dropbear.id.au \
    --cc=aik@ozlabs$(echo .)ru \
    --cc=alex.williamson@redhat$(echo .)com \
    --cc=linuxppc-dev@lists$(echo .)ozlabs.org \
    --cc=paulus@samba$(echo .)org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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