From: Eric Auger <eric.auger-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
To: Jean-Philippe Brucker
<Jean-Philippe.Brucker-5wv7dgnIgG8@public.gmane.org>
Cc: eric.auger-qxv4g6HH51o@public.gmane.org,
jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org,
kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
patches-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
marc.zyngier-5wv7dgnIgG8@public.gmane.org,
will.deacon-5wv7dgnIgG8@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
Manish.Jaggi-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org,
kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg@public.gmane.org,
christoffer.dall-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org
Subject: Re: [RFC v5 06/17] dma-reserved-iommu: iommu_get/put_single_reserved
Date: Tue, 29 Mar 2016 19:07:34 +0200 [thread overview]
Message-ID: <56FAB656.7030400@linaro.org> (raw)
In-Reply-To: <20160310115253.GA14609-lfHAr0XZR/HZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
Hi Jean-Philippe,
On 03/10/2016 12:52 PM, Jean-Philippe Brucker wrote:
> Hi Eric,
>
> On Tue, Mar 01, 2016 at 06:27:46PM +0000, Eric Auger wrote:
>> [...]
>> +
>> +int iommu_get_single_reserved(struct iommu_domain *domain,
>> + phys_addr_t addr, int prot,
>> + dma_addr_t *iova)
>> +{
>> + unsigned long order = __ffs(domain->ops->pgsize_bitmap);
>> + size_t page_size = 1 << order;
>> + phys_addr_t mask = page_size - 1;
>> + phys_addr_t aligned_addr = addr & ~mask;
>> + phys_addr_t offset = addr - aligned_addr;
>> + struct iommu_reserved_binding *b;
>> + struct iova *p_iova;
>> + struct iova_domain *iovad =
>> + (struct iova_domain *)domain->reserved_iova_cookie;
>> + int ret;
>> +
>> + if (!iovad)
>> + return -EINVAL;
>> +
>> + mutex_lock(&domain->reserved_mutex);
>
> I believe this function could get called from the chunk of __setup_irq
> that is executed atomically:
>
> * request_threaded_irq
> * __setup_irq
> * irq_startup
> * irq_domain_activate_irq
> * msi_domain_activate
> * msi_compose
> * iommu_get_single_reserved
>
> If this is the case, we should probably use a spinlock to protect the
> iova_domain...
Please apologize for the delay, I was in vacation.
Thank you for spotting this flow. I will rework the locking.
>
>> +
>> + b = find_reserved_binding(domain, aligned_addr, page_size);
>> + if (b) {
>> + *iova = b->iova + offset;
>> + kref_get(&b->kref);
>> + ret = 0;
>> + goto unlock;
>> + }
>> +
>> + /* there is no existing reserved iova for this pa */
>> + p_iova = alloc_iova(iovad, 1, iovad->dma_32bit_pfn, true);
>> + if (!p_iova) {
>> + ret = -ENOMEM;
>> + goto unlock;
>> + }
>> + *iova = p_iova->pfn_lo << order;
>> +
>> + b = kzalloc(sizeof(*b), GFP_KERNEL);
>
> ... and GFP_ATOMIC here.
OK
Thank you for your time!
Best Regards
Eric
>
> Thanks,
> Jean-Philippe
>
>> + if (!b) {
>> + ret = -ENOMEM;
>> + goto free_iova_unlock;
>> + }
>> +
>> + ret = iommu_map(domain, *iova, aligned_addr, page_size, prot);
>> + if (ret)
>> + goto free_binding_iova_unlock;
>> +
>> + kref_init(&b->kref);
>> + kref_get(&b->kref);
>> + b->domain = domain;
>> + b->addr = aligned_addr;
>> + b->iova = *iova;
>> + b->size = page_size;
>> +
>> + link_reserved_binding(domain, b);
>> +
>> + *iova += offset;
>> + goto unlock;
>> +
>> +free_binding_iova_unlock:
>> + kfree(b);
>> +free_iova_unlock:
>> + free_iova(iovad, *iova >> order);
>> +unlock:
>> + mutex_unlock(&domain->reserved_mutex);
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_get_single_reserved);
WARNING: multiple messages have this Message-ID (diff)
From: eric.auger@linaro.org (Eric Auger)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC v5 06/17] dma-reserved-iommu: iommu_get/put_single_reserved
Date: Tue, 29 Mar 2016 19:07:34 +0200 [thread overview]
Message-ID: <56FAB656.7030400@linaro.org> (raw)
In-Reply-To: <20160310115253.GA14609@e106794-lin.cambridge.arm.com>
Hi Jean-Philippe,
On 03/10/2016 12:52 PM, Jean-Philippe Brucker wrote:
> Hi Eric,
>
> On Tue, Mar 01, 2016 at 06:27:46PM +0000, Eric Auger wrote:
>> [...]
>> +
>> +int iommu_get_single_reserved(struct iommu_domain *domain,
>> + phys_addr_t addr, int prot,
>> + dma_addr_t *iova)
>> +{
>> + unsigned long order = __ffs(domain->ops->pgsize_bitmap);
>> + size_t page_size = 1 << order;
>> + phys_addr_t mask = page_size - 1;
>> + phys_addr_t aligned_addr = addr & ~mask;
>> + phys_addr_t offset = addr - aligned_addr;
>> + struct iommu_reserved_binding *b;
>> + struct iova *p_iova;
>> + struct iova_domain *iovad =
>> + (struct iova_domain *)domain->reserved_iova_cookie;
>> + int ret;
>> +
>> + if (!iovad)
>> + return -EINVAL;
>> +
>> + mutex_lock(&domain->reserved_mutex);
>
> I believe this function could get called from the chunk of __setup_irq
> that is executed atomically:
>
> * request_threaded_irq
> * __setup_irq
> * irq_startup
> * irq_domain_activate_irq
> * msi_domain_activate
> * msi_compose
> * iommu_get_single_reserved
>
> If this is the case, we should probably use a spinlock to protect the
> iova_domain...
Please apologize for the delay, I was in vacation.
Thank you for spotting this flow. I will rework the locking.
>
>> +
>> + b = find_reserved_binding(domain, aligned_addr, page_size);
>> + if (b) {
>> + *iova = b->iova + offset;
>> + kref_get(&b->kref);
>> + ret = 0;
>> + goto unlock;
>> + }
>> +
>> + /* there is no existing reserved iova for this pa */
>> + p_iova = alloc_iova(iovad, 1, iovad->dma_32bit_pfn, true);
>> + if (!p_iova) {
>> + ret = -ENOMEM;
>> + goto unlock;
>> + }
>> + *iova = p_iova->pfn_lo << order;
>> +
>> + b = kzalloc(sizeof(*b), GFP_KERNEL);
>
> ... and GFP_ATOMIC here.
OK
Thank you for your time!
Best Regards
Eric
>
> Thanks,
> Jean-Philippe
>
>> + if (!b) {
>> + ret = -ENOMEM;
>> + goto free_iova_unlock;
>> + }
>> +
>> + ret = iommu_map(domain, *iova, aligned_addr, page_size, prot);
>> + if (ret)
>> + goto free_binding_iova_unlock;
>> +
>> + kref_init(&b->kref);
>> + kref_get(&b->kref);
>> + b->domain = domain;
>> + b->addr = aligned_addr;
>> + b->iova = *iova;
>> + b->size = page_size;
>> +
>> + link_reserved_binding(domain, b);
>> +
>> + *iova += offset;
>> + goto unlock;
>> +
>> +free_binding_iova_unlock:
>> + kfree(b);
>> +free_iova_unlock:
>> + free_iova(iovad, *iova >> order);
>> +unlock:
>> + mutex_unlock(&domain->reserved_mutex);
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_get_single_reserved);
WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger@linaro.org>
To: Jean-Philippe Brucker <Jean-Philippe.Brucker@arm.com>
Cc: eric.auger@st.com, robin.murphy@arm.com,
alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org,
tglx@linutronix.de, jason@lakedaemon.net, marc.zyngier@arm.com,
christoffer.dall@linaro.org,
linux-arm-kernel@lists.infradead.org,
kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org,
patches@linaro.org, Manish.Jaggi@caviumnetworks.com,
linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org
Subject: Re: [RFC v5 06/17] dma-reserved-iommu: iommu_get/put_single_reserved
Date: Tue, 29 Mar 2016 19:07:34 +0200 [thread overview]
Message-ID: <56FAB656.7030400@linaro.org> (raw)
In-Reply-To: <20160310115253.GA14609@e106794-lin.cambridge.arm.com>
Hi Jean-Philippe,
On 03/10/2016 12:52 PM, Jean-Philippe Brucker wrote:
> Hi Eric,
>
> On Tue, Mar 01, 2016 at 06:27:46PM +0000, Eric Auger wrote:
>> [...]
>> +
>> +int iommu_get_single_reserved(struct iommu_domain *domain,
>> + phys_addr_t addr, int prot,
>> + dma_addr_t *iova)
>> +{
>> + unsigned long order = __ffs(domain->ops->pgsize_bitmap);
>> + size_t page_size = 1 << order;
>> + phys_addr_t mask = page_size - 1;
>> + phys_addr_t aligned_addr = addr & ~mask;
>> + phys_addr_t offset = addr - aligned_addr;
>> + struct iommu_reserved_binding *b;
>> + struct iova *p_iova;
>> + struct iova_domain *iovad =
>> + (struct iova_domain *)domain->reserved_iova_cookie;
>> + int ret;
>> +
>> + if (!iovad)
>> + return -EINVAL;
>> +
>> + mutex_lock(&domain->reserved_mutex);
>
> I believe this function could get called from the chunk of __setup_irq
> that is executed atomically:
>
> * request_threaded_irq
> * __setup_irq
> * irq_startup
> * irq_domain_activate_irq
> * msi_domain_activate
> * msi_compose
> * iommu_get_single_reserved
>
> If this is the case, we should probably use a spinlock to protect the
> iova_domain...
Please apologize for the delay, I was in vacation.
Thank you for spotting this flow. I will rework the locking.
>
>> +
>> + b = find_reserved_binding(domain, aligned_addr, page_size);
>> + if (b) {
>> + *iova = b->iova + offset;
>> + kref_get(&b->kref);
>> + ret = 0;
>> + goto unlock;
>> + }
>> +
>> + /* there is no existing reserved iova for this pa */
>> + p_iova = alloc_iova(iovad, 1, iovad->dma_32bit_pfn, true);
>> + if (!p_iova) {
>> + ret = -ENOMEM;
>> + goto unlock;
>> + }
>> + *iova = p_iova->pfn_lo << order;
>> +
>> + b = kzalloc(sizeof(*b), GFP_KERNEL);
>
> ... and GFP_ATOMIC here.
OK
Thank you for your time!
Best Regards
Eric
>
> Thanks,
> Jean-Philippe
>
>> + if (!b) {
>> + ret = -ENOMEM;
>> + goto free_iova_unlock;
>> + }
>> +
>> + ret = iommu_map(domain, *iova, aligned_addr, page_size, prot);
>> + if (ret)
>> + goto free_binding_iova_unlock;
>> +
>> + kref_init(&b->kref);
>> + kref_get(&b->kref);
>> + b->domain = domain;
>> + b->addr = aligned_addr;
>> + b->iova = *iova;
>> + b->size = page_size;
>> +
>> + link_reserved_binding(domain, b);
>> +
>> + *iova += offset;
>> + goto unlock;
>> +
>> +free_binding_iova_unlock:
>> + kfree(b);
>> +free_iova_unlock:
>> + free_iova(iovad, *iova >> order);
>> +unlock:
>> + mutex_unlock(&domain->reserved_mutex);
>> + return ret;
>> +}
>> +EXPORT_SYMBOL_GPL(iommu_get_single_reserved);
next prev parent reply other threads:[~2016-03-29 17:07 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-01 18:27 [RFC v5 00/17] KVM PCIe/MSI passthrough on ARM/ARM64 Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 02/17] iommu/arm-smmu: advertise DOMAIN_ATTR_MSI_MAPPING attribute Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 03/17] iommu: introduce a reserved iova cookie Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-03 16:26 ` Julien Grall
2016-03-03 16:26 ` Julien Grall
2016-03-03 16:26 ` Julien Grall
2016-03-29 17:26 ` Eric Auger
2016-03-29 17:26 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 04/17] dma-reserved-iommu: alloc/free_reserved_iova_domain Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 05/17] dma-reserved-iommu: reserved binding rb-tree and helpers Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
[not found] ` <1456856877-4817-1-git-send-email-eric.auger-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-03-01 18:27 ` [RFC v5 01/17] iommu: Add DOMAIN_ATTR_MSI_MAPPING attribute Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 06/17] dma-reserved-iommu: iommu_get/put_single_reserved Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
[not found] ` <1456856877-4817-7-git-send-email-eric.auger-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2016-03-10 11:52 ` Jean-Philippe Brucker
2016-03-10 11:52 ` Jean-Philippe Brucker
2016-03-10 11:52 ` Jean-Philippe Brucker
[not found] ` <20160310115253.GA14609-lfHAr0XZR/HZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2016-03-29 17:07 ` Eric Auger [this message]
2016-03-29 17:07 ` Eric Auger
2016-03-29 17:07 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 07/17] dma-reserved-iommu: iommu_unmap_reserved Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 08/17] msi: Add a new MSI_FLAG_IRQ_REMAPPING flag Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 09/17] irqchip/gic-v3-its: ITS advertises MSI_FLAG_IRQ_REMAPPING Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 10/17] msi: export msi_get_domain_info Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 11/17] msi: msi_compose wrapper Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 12/17] msi: IOMMU map the doorbell address when needed Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 13/17] vfio: introduce VFIO_IOVA_RESERVED vfio_dma type Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 14/17] vfio: allow the user to register reserved iova range for MSI mapping Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 15/17] vfio/type1: also check IRQ remapping capability at msi domain Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 16/17] iommu/arm-smmu: do not advertise IOMMU_CAP_INTR_REMAP Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` [RFC v5 17/17] vfio/type1: return MSI mapping requirements with VFIO_IOMMU_GET_INFO Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-01 18:27 ` Eric Auger
2016-03-02 8:11 ` [RFC v5 00/17] KVM PCIe/MSI passthrough on ARM/ARM64 Jaggi, Manish
2016-03-02 8:11 ` Jaggi, Manish
2016-03-02 8:11 ` Jaggi, Manish
[not found] ` <BY1PR0701MB1594168E79366B507B7C8A16E1BC0-vsFp3N3nJ9josxbTuffl3E5OhdzP3rhOnBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
2016-03-02 12:30 ` Eric Auger
2016-03-02 12:30 ` Eric Auger
2016-03-02 12:30 ` Eric Auger
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=56FAB656.7030400@linaro.org \
--to=eric.auger-qsej5fyqhm4dnm+yrofe0a@public.gmane.org \
--cc=Jean-Philippe.Brucker-5wv7dgnIgG8@public.gmane.org \
--cc=Manish.Jaggi-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org \
--cc=christoffer.dall-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=eric.auger-qxv4g6HH51o@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=jason-NLaQJdtUoK4Be96aLqz0jA@public.gmane.org \
--cc=kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=marc.zyngier-5wv7dgnIgG8@public.gmane.org \
--cc=patches-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.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.