All of lore.kernel.org
 help / color / mirror / Atom feed
From: Baolu Lu <baolu.lu@linux.intel.com>
To: Yi Liu <yi.l.liu@intel.com>, Joerg Roedel <joro@8bytes.org>,
	Jason Gunthorpe <jgg@nvidia.com>,
	Christoph Hellwig <hch@infradead.org>,
	Kevin Tian <kevin.tian@intel.com>,
	Ashok Raj <ashok.raj@intel.com>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.com>,
	Dave Jiang <dave.jiang@intel.com>, Vinod Koul <vkoul@kernel.org>
Cc: baolu.lu@linux.intel.com, Eric Auger <eric.auger@redhat.com>,
	Jacob jun Pan <jacob.jun.pan@intel.com>,
	Zhangfei Gao <zhangfei.gao@linaro.org>,
	Zhu Tony <tony.zhu@intel.com>,
	iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
	Jean-Philippe Brucker <jean-philippe@linaro.org>
Subject: Re: [PATCH v10 10/12] iommu: Prepare IOMMU domain for IOPF
Date: Sun, 31 Jul 2022 21:47:44 +0800	[thread overview]
Message-ID: <fb86ccdb-dd03-206c-dabc-25d96273ebad@linux.intel.com> (raw)
In-Reply-To: <b0403334-1b88-e75a-418d-71a78ef97c9c@intel.com>

On 2022/7/31 20:50, Yi Liu wrote:
> On 2022/7/5 13:07, Lu Baolu wrote:
>> This adds some mechanisms around the iommu_domain so that the I/O page
>> fault handling framework could route a page fault to the domain and
>> call the fault handler from it.
>>
>> Add pointers to the page fault handler and its private data in struct
>> iommu_domain. The fault handler will be called with the private data
>> as a parameter once a page fault is routed to the domain. Any kernel
>> component which owns an iommu domain could install handler and its
>> private parameter so that the page fault could be further routed and
>> handled.
>>
>> This also prepares the SVA implementation to be the first consumer of
>> the per-domain page fault handling model. The I/O page fault handler
>> for SVA is copied to the SVA file with mmget_not_zero() added before
>> mmap_read_lock().
>>
>> Suggested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
>> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
>> Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
>> Tested-by: Zhangfei Gao <zhangfei.gao@linaro.org>
>> Tested-by: Tony Zhu <tony.zhu@intel.com>
>> ---
>>   include/linux/iommu.h         |  3 ++
>>   drivers/iommu/iommu-sva-lib.h |  8 +++++
>>   drivers/iommu/io-pgfault.c    |  7 +++++
>>   drivers/iommu/iommu-sva-lib.c | 58 +++++++++++++++++++++++++++++++++++
>>   drivers/iommu/iommu.c         |  4 +++
>>   5 files changed, 80 insertions(+)
>>
>> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
>> index ae0cfca064e6..47610f21d451 100644
>> --- a/include/linux/iommu.h
>> +++ b/include/linux/iommu.h
>> @@ -105,6 +105,9 @@ struct iommu_domain {
>>       unsigned long pgsize_bitmap;    /* Bitmap of page sizes in use */
>>       struct iommu_domain_geometry geometry;
>>       struct iommu_dma_cookie *iova_cookie;
>> +    enum iommu_page_response_code (*iopf_handler)(struct iommu_fault 
>> *fault,
>> +                              void *data);
>> +    void *fault_data;
>>       union {
>>           struct {
>>               iommu_fault_handler_t handler;
>> diff --git a/drivers/iommu/iommu-sva-lib.h 
>> b/drivers/iommu/iommu-sva-lib.h
>> index 8909ea1094e3..1b3ace4b5863 100644
>> --- a/drivers/iommu/iommu-sva-lib.h
>> +++ b/drivers/iommu/iommu-sva-lib.h
>> @@ -26,6 +26,8 @@ int iopf_queue_flush_dev(struct device *dev);
>>   struct iopf_queue *iopf_queue_alloc(const char *name);
>>   void iopf_queue_free(struct iopf_queue *queue);
>>   int iopf_queue_discard_partial(struct iopf_queue *queue);
>> +enum iommu_page_response_code
>> +iommu_sva_handle_iopf(struct iommu_fault *fault, void *data);
>>   #else /* CONFIG_IOMMU_SVA */
>>   static inline int iommu_queue_iopf(struct iommu_fault *fault, void 
>> *cookie)
>> @@ -63,5 +65,11 @@ static inline int iopf_queue_discard_partial(struct 
>> iopf_queue *queue)
>>   {
>>       return -ENODEV;
>>   }
>> +
>> +static inline enum iommu_page_response_code
>> +iommu_sva_handle_iopf(struct iommu_fault *fault, void *data)
>> +{
>> +    return IOMMU_PAGE_RESP_INVALID;
>> +}
>>   #endif /* CONFIG_IOMMU_SVA */
>>   #endif /* _IOMMU_SVA_LIB_H */
>> diff --git a/drivers/iommu/io-pgfault.c b/drivers/iommu/io-pgfault.c
>> index 1df8c1dcae77..aee9e033012f 100644
>> --- a/drivers/iommu/io-pgfault.c
>> +++ b/drivers/iommu/io-pgfault.c
>> @@ -181,6 +181,13 @@ static void iopf_handle_group(struct work_struct 
>> *work)
>>    * request completes, outstanding faults will have been dealt with 
>> by the time
>>    * the PASID is freed.
>>    *
>> + * Any valid page fault will be eventually routed to an iommu domain 
>> and the
>> + * page fault handler installed there will get called. The users of this
>> + * handling framework should guarantee that the iommu domain could 
>> only be
>> + * freed after the device has stopped generating page faults (or the 
>> iommu
>> + * hardware has been set to block the page faults) and the pending 
>> page faults
>> + * have been flushed.
>> + *
>>    * Return: 0 on success and <0 on error.
>>    */
>>   int iommu_queue_iopf(struct iommu_fault *fault, void *cookie)
>> diff --git a/drivers/iommu/iommu-sva-lib.c 
>> b/drivers/iommu/iommu-sva-lib.c
>> index 751366980232..536d34855c74 100644
>> --- a/drivers/iommu/iommu-sva-lib.c
>> +++ b/drivers/iommu/iommu-sva-lib.c
>> @@ -167,3 +167,61 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle)
>>       return domain->mm->pasid;
>>   }
>>   EXPORT_SYMBOL_GPL(iommu_sva_get_pasid);
>> +
>> +/*
>> + * I/O page fault handler for SVA
>> + */
>> +enum iommu_page_response_code
>> +iommu_sva_handle_iopf(struct iommu_fault *fault, void *data)
>> +{
>> +    vm_fault_t ret;
>> +    struct vm_area_struct *vma;
>> +    struct mm_struct *mm = data;
>> +    unsigned int access_flags = 0;
>> +    unsigned int fault_flags = FAULT_FLAG_REMOTE;
>> +    struct iommu_fault_page_request *prm = &fault->prm;
>> +    enum iommu_page_response_code status = IOMMU_PAGE_RESP_INVALID;
>> +
>> +    if (!(prm->flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID))
>> +        return status;
>> +
>> +    if (IS_ERR_OR_NULL(mm) || !mmget_not_zero(mm))
> 
> is it possible to be ERR or NULL? The mm life circle should have been 
> guaranteed by the mmgrab() in iommu_sva_domain_alloc(). Perhaps coding
> issue if it happens. :-)

Updated. Thanks!

Best regards,
baolu

  reply	other threads:[~2022-07-31 13:47 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-05  5:06 [PATCH v10 00/12] iommu: SVA and IOPF refactoring Lu Baolu
2022-07-05  5:06 ` [PATCH v10 01/12] iommu: Add max_pasids field in struct iommu_device Lu Baolu
2022-07-23 13:57   ` Jason Gunthorpe
2022-07-31 11:54   ` Yi Liu
2022-07-31 13:33     ` Baolu Lu
2022-07-05  5:07 ` [PATCH v10 02/12] iommu: Add max_pasids field in struct dev_iommu Lu Baolu
2022-07-23 14:02   ` Jason Gunthorpe
2022-07-31 11:55   ` Yi Liu
2022-07-05  5:07 ` [PATCH v10 03/12] iommu: Remove SVM_FLAG_SUPERVISOR_MODE support Lu Baolu
2022-07-31 12:01   ` Yi Liu
2022-07-31 13:39     ` Baolu Lu
2022-07-05  5:07 ` [PATCH v10 04/12] iommu: Add attach/detach_dev_pasid iommu interface Lu Baolu
2022-07-07  1:51   ` Tian, Kevin
2022-07-23 14:11   ` Jason Gunthorpe
2022-07-24  7:03     ` Baolu Lu
2022-07-25 14:40       ` Jason Gunthorpe
2022-07-26  6:23         ` Baolu Lu
2022-07-26 13:57           ` Jason Gunthorpe
2022-07-27  3:20             ` Tian, Kevin
2022-07-27 11:53               ` Jason Gunthorpe
2022-07-28  3:06                 ` Tian, Kevin
2022-07-28 11:59                   ` Jason Gunthorpe
2022-07-29  2:49                     ` Baolu Lu
2022-07-29  2:56                       ` Tian, Kevin
2022-07-29  3:20                         ` Baolu Lu
2022-07-29  4:22                           ` Tian, Kevin
2022-07-30  6:17                             ` Baolu Lu
2022-07-29  2:51                     ` Tian, Kevin
2022-07-29 12:22                       ` Jason Gunthorpe
2022-07-30  6:23                         ` Baolu Lu
2022-07-28  2:44             ` Baolu Lu
2022-07-28  6:27               ` Baolu Lu
2022-08-02  2:19             ` Baolu Lu
2022-08-02 12:37               ` Jason Gunthorpe
2022-08-03 13:07                 ` Baolu Lu
2022-08-03 19:03                   ` Jason Gunthorpe
2022-08-04  2:03                     ` Tian, Kevin
2022-08-04  2:42                     ` Baolu Lu
2022-07-24  7:23     ` Baolu Lu
2022-07-24  8:39     ` Baolu Lu
2022-07-24  9:13     ` Baolu Lu
2022-07-25  7:46       ` Tian, Kevin
2022-07-25 10:11         ` Baolu Lu
2022-07-31 12:10   ` Yi Liu
2022-07-05  5:07 ` [PATCH v10 05/12] iommu: Add IOMMU SVA domain support Lu Baolu
2022-07-07  1:52   ` Tian, Kevin
2022-07-07  3:01     ` Baolu Lu
2022-07-23 14:15   ` Jason Gunthorpe
2022-07-31 12:19   ` Yi Liu
2022-07-05  5:07 ` [PATCH v10 06/12] iommu/vt-d: Add " Lu Baolu
2022-07-23 14:16   ` Jason Gunthorpe
2022-07-31 12:20   ` Yi Liu
2022-07-05  5:07 ` [PATCH v10 07/12] arm-smmu-v3/sva: " Lu Baolu
2022-07-23 14:20   ` Jason Gunthorpe
2022-07-24 11:58     ` Baolu Lu
2022-07-05  5:07 ` [PATCH v10 08/12] iommu/sva: Refactoring iommu_sva_bind/unbind_device() Lu Baolu
2022-07-05 17:43   ` Jean-Philippe Brucker
2022-07-07  1:56   ` Tian, Kevin
2022-07-07  3:02     ` Baolu Lu
2022-07-23 14:26   ` Jason Gunthorpe
2022-07-24 13:48     ` Baolu Lu
2022-07-25  7:39       ` Jean-Philippe Brucker
2022-07-25  8:02         ` Tian, Kevin
2022-07-25  8:47           ` Jean-Philippe Brucker
2022-07-25  9:33         ` Baolu Lu
2022-07-25  9:52           ` Jean-Philippe Brucker
2022-07-25 14:46             ` Jason Gunthorpe
2022-07-25  7:50       ` Tian, Kevin
2022-07-25 10:22         ` Baolu Lu
2022-07-25 14:47           ` Jason Gunthorpe
2022-07-26  8:47             ` Baolu Lu
2022-07-31 12:36   ` Yi Liu
2022-07-31 13:45     ` Baolu Lu
2022-07-31 12:55   ` Yi Liu
2022-07-31 13:51     ` Baolu Lu
2022-07-05  5:07 ` [PATCH v10 09/12] iommu: Remove SVA related callbacks from iommu ops Lu Baolu
2022-07-23 14:27   ` Jason Gunthorpe
2022-07-31 12:38   ` Yi Liu
2022-07-05  5:07 ` [PATCH v10 10/12] iommu: Prepare IOMMU domain for IOPF Lu Baolu
2022-07-07  1:58   ` Tian, Kevin
2022-07-23 14:33   ` Jason Gunthorpe
2022-07-24 14:04     ` Baolu Lu
2022-07-25 14:49       ` Jason Gunthorpe
2022-07-31 12:50   ` Yi Liu
2022-07-31 13:47     ` Baolu Lu [this message]
2022-07-05  5:07 ` [PATCH v10 11/12] iommu: Per-domain I/O page fault handling Lu Baolu
2022-07-07  2:06   ` Tian, Kevin
2022-07-23 14:34   ` Jason Gunthorpe
2022-07-05  5:07 ` [PATCH v10 12/12] iommu: Rename iommu-sva-lib.{c,h} Lu Baolu
2022-07-23 14:34   ` Jason Gunthorpe

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=fb86ccdb-dd03-206c-dabc-25d96273ebad@linux.intel.com \
    --to=baolu.lu@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=dave.jiang@intel.com \
    --cc=eric.auger@redhat.com \
    --cc=hch@infradead.org \
    --cc=iommu@lists.linux.dev \
    --cc=jacob.jun.pan@intel.com \
    --cc=jean-philippe@linaro.com \
    --cc=jean-philippe@linaro.org \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=tony.zhu@intel.com \
    --cc=vkoul@kernel.org \
    --cc=will@kernel.org \
    --cc=yi.l.liu@intel.com \
    --cc=zhangfei.gao@linaro.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.