linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
To: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: kvm@vger.kernel.org, linux-pci@vger.kernel.org,
	xuzaibo@huawei.com, will.deacon@arm.com, okaya@codeaurora.org,
	linux-mm@kvack.org, ashok.raj@intel.com, bharatku@xilinx.com,
	linux-acpi@vger.kernel.org, rfranz@cavium.com,
	devicetree@vger.kernel.org, rgummal@xilinx.com,
	linux-arm-kernel@lists.infradead.org, dwmw2@infradead.org,
	ilias.apalodimas@linaro.org, iommu@lists.linux-foundation.org,
	christian.koenig@amd.com
Subject: Re: [PATCH v2 03/40] iommu/sva: Manage process address spaces
Date: Mon, 21 May 2018 15:44:01 +0100	[thread overview]
Message-ID: <d3629e67-34ad-b080-3c03-bf48e5d780d5@arm.com> (raw)
In-Reply-To: <20180517150516.000067ca@huawei.com>

On 17/05/18 15:25, Jonathan Cameron wrote:
>> +static struct io_mm *
>> +io_mm_alloc(struct iommu_domain *domain, struct device *dev,
>> +	    struct mm_struct *mm, unsigned long flags)
>> +{
>> +	int ret;
>> +	int pasid;
>> +	struct io_mm *io_mm;
>> +	struct iommu_sva_param *param = dev->iommu_param->sva_param;
>> +
>> +	if (!domain->ops->mm_alloc || !domain->ops->mm_free)
>> +		return ERR_PTR(-ENODEV);
>> +
>> +	io_mm = domain->ops->mm_alloc(domain, mm, flags);
>> +	if (IS_ERR(io_mm))
>> +		return io_mm;
>> +	if (!io_mm)
>> +		return ERR_PTR(-ENOMEM);
>> +
>> +	/*
>> +	 * The mm must not be freed until after the driver frees the io_mm
>> +	 * (which may involve unpinning the CPU ASID for instance, requiring a
>> +	 * valid mm struct.)
>> +	 */
>> +	mmgrab(mm);
>> +
>> +	io_mm->flags		= flags;
>> +	io_mm->mm		= mm;
>> +	io_mm->release		= domain->ops->mm_free;
>> +	INIT_LIST_HEAD(&io_mm->devices);
>> +
>> +	idr_preload(GFP_KERNEL);
>> +	spin_lock(&iommu_sva_lock);
>> +	pasid = idr_alloc(&iommu_pasid_idr, io_mm, param->min_pasid,
>> +			  param->max_pasid + 1, GFP_ATOMIC);
> 
> I'd expect the IDR cleanup to be in io_mm_free as that would 'match'
> against io_mm_alloc but it's in io_mm_release just before the io_mm_free
> call, perhaps move it or am I missing something?
> 
> Hmm. This is reworked in patch 5 to use call rcu to do the free.  I suppose
> we may be burning an idr entry if we take a while to get round to the
> free..  If so a comment to explain this would be great.

Ok, I'll see if I can come up with some comments for both patch 3 and 5.

>> +	io_mm->pasid = pasid;
>> +	spin_unlock(&iommu_sva_lock);
>> +	idr_preload_end();
>> +
>> +	if (pasid < 0) {
>> +		ret = pasid;
>> +		goto err_free_mm;
>> +	}
>> +
>> +	/* TODO: keep track of mm. For the moment, abort. */
> 
> From later patches, I can now see why we didn't init the kref
> here, but perhaps a comment would make that clear rather than
> people checking it is correctly used throughout?  Actually just grab
> the comment from patch 5 and put it in this one and that will
> do the job nicely.

Ok

>> +	ret = -ENOSYS;
>> +	spin_lock(&iommu_sva_lock);
>> +	idr_remove(&iommu_pasid_idr, io_mm->pasid);
>> +	spin_unlock(&iommu_sva_lock);
>> +
>> +err_free_mm:
>> +	domain->ops->mm_free(io_mm);
> 
> Really minor, but you now have io_mm->release set so to keep
> this obviously the same as the io_mm_free path, perhaps call
> that rather than mm_free directly.

Yes, makes sense

>> +static void io_mm_detach_locked(struct iommu_bond *bond)
>> +{
>> +	struct iommu_bond *tmp;
>> +	bool detach_domain = true;
>> +	struct iommu_domain *domain = bond->domain;
>> +
>> +	list_for_each_entry(tmp, &domain->mm_list, domain_head) {
>> +		if (tmp->io_mm == bond->io_mm && tmp->dev != bond->dev) {
>> +			detach_domain = false;
>> +			break;
>> +		}
>> +	}
>> +
>> +	domain->ops->mm_detach(domain, bond->dev, bond->io_mm, detach_domain);
>> +
> 
> I can't see an immediate reason to have a different order in her to the reverse of
> the attach above.   So I think you should be detaching after the list_del calls.
> If there is a reason, can we have a comment so I don't ask on v10.

I don't see a reason either right now, I'll see if it can be moved

> 
>> +	list_del(&bond->mm_head);
>> +	list_del(&bond->domain_head);
>> +	list_del(&bond->dev_head);
>> +	io_mm_put_locked(bond->io_mm);


>> +	/* If an io_mm already exists, use it */
>> +	spin_lock(&iommu_sva_lock);
>> +	idr_for_each_entry(&iommu_pasid_idr, io_mm, i) {
>> +		if (io_mm->mm == mm && io_mm_get_locked(io_mm)) {
>> +			/* ... Unless it's already bound to this device */
>> +			list_for_each_entry(tmp, &io_mm->devices, mm_head) {
>> +				if (tmp->dev == dev) {
>> +					bond = tmp;
> 
> Using bond for this is clear in a sense, but can we not just use ret
> so it is obvious here that we are going to return -EEXIST?
> At first glance I thought you were going to carry on with this bond
> and couldn't work out why it would ever make sense to have two bonds
> between a device an an io_mm (which it doesn't!)

Yes, using ret is nicer

Thanks,
Jean

  reply	other threads:[~2018-05-21 14:44 UTC|newest]

Thread overview: 125+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-11 19:06 [PATCH v2 00/40] Shared Virtual Addressing for the IOMMU Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 01/40] iommu: Introduce Shared Virtual Addressing API Jean-Philippe Brucker
2018-05-16 20:41   ` Jacob Pan
2018-05-17 10:02     ` Jean-Philippe Brucker
2018-05-17 17:00       ` Jacob Pan
2018-09-05 11:29   ` Auger Eric
2018-09-06 11:09     ` Jean-Philippe Brucker
2018-09-06 11:12       ` Christian König
2018-09-06 12:45         ` Jean-Philippe Brucker
2018-09-07  8:55           ` Christian König
2018-09-07 15:45             ` Jean-Philippe Brucker
2018-09-07 18:02               ` Christian König
2018-09-07 21:25                 ` Jacob Pan
2018-09-08  7:29                   ` Christian König
2018-09-12 12:40                     ` Jean-Philippe Brucker
2018-09-12 12:56                       ` Christian König
2018-09-13  7:15                   ` Tian, Kevin
2018-09-13  7:26             ` Tian, Kevin
2018-05-11 19:06 ` [PATCH v2 02/40] iommu/sva: Bind process address spaces to devices Jean-Philippe Brucker
2018-05-17 13:10   ` Jonathan Cameron
2018-05-21 14:43     ` Jean-Philippe Brucker
2018-09-05 11:29   ` Auger Eric
2018-09-06 11:09     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 03/40] iommu/sva: Manage process address spaces Jean-Philippe Brucker
2018-05-16 23:31   ` Jacob Pan
2018-05-17 10:02     ` Jean-Philippe Brucker
2018-05-22 16:43       ` Jacob Pan
2018-05-24 11:44         ` Jean-Philippe Brucker
2018-05-24 11:50           ` Ilias Apalodimas
2018-05-24 15:04             ` Jean-Philippe Brucker
2018-05-25  6:33               ` Ilias Apalodimas
2018-05-25  8:39                 ` Jonathan Cameron
2018-05-26  2:24                   ` Kenneth Lee
     [not found]                   ` <20180525093959.000040a7-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2018-05-26  2:24                     ` Kenneth Lee
2018-05-26  2:24                   ` Kenneth Lee
     [not found]                   ` <20180526022445.GA6069@kllp05>
2018-06-11 16:10                     ` Kenneth Lee
2018-06-11 16:10                     ` Kenneth Lee
2018-06-11 16:10                     ` Kenneth Lee
2018-06-11 16:32                   ` Kenneth Lee
2018-05-17 14:25   ` Jonathan Cameron
2018-05-21 14:44     ` Jean-Philippe Brucker [this message]
2018-09-05 12:14   ` Auger Eric
2018-09-05 18:18     ` Jacob Pan
2018-09-06 17:40       ` Jean-Philippe Brucker
2018-09-06 11:10     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 04/40] iommu/sva: Add a mm_exit callback for device drivers Jean-Philippe Brucker
2018-09-05 13:23   ` Auger Eric
2018-09-06 11:10     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 05/40] iommu/sva: Track mm changes with an MMU notifier Jean-Philippe Brucker
2018-05-17 14:25   ` Jonathan Cameron
2018-05-21 14:44     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 06/40] iommu/sva: Search mm by PASID Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 07/40] iommu: Add a page fault handler Jean-Philippe Brucker
2018-05-17 15:25   ` Jonathan Cameron
2018-05-21 14:48     ` Jean-Philippe Brucker
2018-05-18 18:04   ` Jacob Pan
2018-05-21 14:49     ` Jean-Philippe Brucker
2018-05-22 23:35       ` Jacob Pan
2018-05-24 11:44         ` Jean-Philippe Brucker
2018-05-26  0:35           ` Jacob Pan
2018-05-29 10:00             ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 08/40] iommu/iopf: Handle mm faults Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 09/40] iommu/sva: Register page fault handler Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 10/40] mm: export symbol mm_access Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 11/40] mm: export symbol find_get_task_by_vpid Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 12/40] mm: export symbol mmput_async Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 13/40] vfio: Add support for Shared Virtual Addressing Jean-Philippe Brucker
2018-05-17 15:58   ` Jonathan Cameron
2018-05-21 14:51     ` Jean-Philippe Brucker
2018-05-23  9:38   ` Xu Zaibo
2018-05-24 11:44     ` Jean-Philippe Brucker
2018-05-24 12:35       ` Xu Zaibo
2018-05-24 15:04         ` Jean-Philippe Brucker
2018-05-25  2:39           ` Xu Zaibo
2018-05-25  9:47             ` Jean-Philippe Brucker
2018-05-26  3:53               ` Xu Zaibo
2018-05-29 11:55                 ` Jean-Philippe Brucker
2018-05-29 12:24                   ` Xu Zaibo
2018-08-27  8:06   ` Xu Zaibo
2018-08-31 13:34     ` Jean-Philippe Brucker
2018-09-01  2:23       ` Xu Zaibo
2018-09-03 10:34         ` Jean-Philippe Brucker
2018-09-04  2:12           ` Xu Zaibo
2018-09-04 10:57             ` Jean-Philippe Brucker
2018-09-05  3:15               ` Xu Zaibo
2018-09-05 11:02                 ` Jean-Philippe Brucker
2018-09-06  7:26                   ` Xu Zaibo
2018-05-11 19:06 ` [PATCH v2 14/40] dt-bindings: document stall and PASID properties for IOMMU masters Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 15/40] iommu/of: Add stall and pasid properties to iommu_fwspec Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 16/40] arm64: mm: Pin down ASIDs for sharing mm with devices Jean-Philippe Brucker
2018-05-15 14:16   ` Catalin Marinas
2018-05-17 10:01     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 17/40] iommu/arm-smmu-v3: Link domains and devices Jean-Philippe Brucker
2018-05-17 16:07   ` Jonathan Cameron
2018-05-21 14:49     ` Jean-Philippe Brucker
2018-09-10 15:16   ` Auger Eric
2018-05-11 19:06 ` [PATCH v2 18/40] iommu/io-pgtable-arm: Factor out ARM LPAE register defines Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 19/40] iommu: Add generic PASID table library Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 20/40] iommu/arm-smmu-v3: Move context descriptor code Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 21/40] iommu/arm-smmu-v3: Add support for Substream IDs Jean-Philippe Brucker
2018-05-31 11:01   ` Bharat Kumar Gogada
2018-06-01 10:46     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 22/40] iommu/arm-smmu-v3: Add second level of context descriptor table Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 23/40] iommu/arm-smmu-v3: Share process page tables Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 24/40] iommu/arm-smmu-v3: Seize private ASID Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 25/40] iommu/arm-smmu-v3: Add support for VHE Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 26/40] iommu/arm-smmu-v3: Enable broadcast TLB maintenance Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 27/40] iommu/arm-smmu-v3: Add SVA feature checking Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 28/40] iommu/arm-smmu-v3: Implement mm operations Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 29/40] iommu/arm-smmu-v3: Add support for Hardware Translation Table Update Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 30/40] iommu/arm-smmu-v3: Register I/O Page Fault queue Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 31/40] iommu/arm-smmu-v3: Improve add_device error handling Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 32/40] iommu/arm-smmu-v3: Maintain a SID->device structure Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 33/40] iommu/arm-smmu-v3: Add stall support for platform devices Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 34/40] ACPI/IORT: Check ATS capability in root complex nodes Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 35/40] iommu/arm-smmu-v3: Add support for PCI ATS Jean-Philippe Brucker
2018-05-19 17:25   ` Sinan Kaya
2018-05-21 14:52     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 36/40] iommu/arm-smmu-v3: Hook up ATC invalidation to mm ops Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 37/40] iommu/arm-smmu-v3: Disable tagged pointers Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 38/40] PCI: Make "PRG Response PASID Required" handling common Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 39/40] iommu/arm-smmu-v3: Add support for PRI Jean-Philippe Brucker
2018-05-25 14:08   ` Bharat Kumar Gogada
2018-05-29 10:27     ` Jean-Philippe Brucker
2018-05-11 19:06 ` [PATCH v2 40/40] iommu/arm-smmu-v3: Add support for PCI PASID Jean-Philippe Brucker

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=d3629e67-34ad-b080-3c03-bf48e5d780d5@arm.com \
    --to=jean-philippe.brucker@arm.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=ashok.raj@intel.com \
    --cc=bharatku@xilinx.com \
    --cc=christian.koenig@amd.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dwmw2@infradead.org \
    --cc=ilias.apalodimas@linaro.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=okaya@codeaurora.org \
    --cc=rfranz@cavium.com \
    --cc=rgummal@xilinx.com \
    --cc=will.deacon@arm.com \
    --cc=xuzaibo@huawei.com \
    /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).