LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: "Liu, Yi L" <yi.l.liu@intel.com>
To: Jacob Pan <jacob.jun.pan@linux.intel.com>,
	"iommu@lists.linux-foundation.org"
	<iommu@lists.linux-foundation.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Joerg Roedel <joro@8bytes.org>,
	"David Woodhouse" <dwmw2@infradead.org>,
	Jean-Philippe Brucker <jean-philippe.brucker@arm.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	"Wysocki, Rafael J" <rafael.j.wysocki@intel.com>
Cc: Lan Tianyu <tianyu.lan@intel.com>,
	"Tian, Kevin" <kevin.tian@intel.com>,
	"Raj, Ashok" <ashok.raj@intel.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Jean Delvare <khali@linux-fr.org>,
	"Christoph Hellwig" <hch@infradead.org>
Subject: RE: [PATCH v4 17/22] iommu/intel-svm: report device page request
Date: Mon, 14 May 2018 06:56:11 +0000	[thread overview]
Message-ID: <A2975661238FB949B60364EF0F2C257439BEFA7F@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <1521774734-48433-18-git-send-email-jacob.jun.pan@linux.intel.com>

Hi Jacob,

Same comment with the one to patch 16, pci_get_bus_and_slot() is
deprecated, may update accordingly.

Thanks,
Yi Liu

> From: Jacob Pan [mailto:jacob.jun.pan@linux.intel.com]
> Sent: Friday, March 23, 2018 11:12 AM
> 
> If the source device of a page request has its PASID table pointer bound to a guest,
> the first level page tables are owned by the guest.
> In this case, we shall let guest OS to manage page fault.
> 
> This patch uses the IOMMU fault reporting API to send fault events, possibly via VFIO,
> to the guest OS. Once guest pages are fault in, guest will issue page response which
> will be passed down via the invalidation passdown APIs.
> 
> Recoverable faults, such as page request reporting is not limitted to guest use. In
> kernel driver can also request a chance to receive fault notifications.
> 
> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> Signed-off-by: Ashok Raj <ashok.raj@intel.com>
> ---
>  drivers/iommu/intel-svm.c | 71 ++++++++++++++++++++++++++++++++++++++++---
> ----
>  include/linux/iommu.h     |  1 +
>  2 files changed, 62 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c index
> 99bc9bd..bdc702c 100644
> --- a/drivers/iommu/intel-svm.c
> +++ b/drivers/iommu/intel-svm.c
> @@ -580,6 +580,56 @@ static bool is_canonical_address(u64 addr)
>  	return (((saddr << shift) >> shift) == saddr);  }
> 
> +static int prq_to_iommu_prot(struct page_req_dsc *req) {
> +	int prot = 0;
> +
> +	if (req->rd_req)
> +		prot |= IOMMU_FAULT_READ;
> +	if (req->wr_req)
> +		prot |= IOMMU_FAULT_WRITE;
> +	if (req->exe_req)
> +		prot |= IOMMU_FAULT_EXEC;
> +	if (req->priv_req)
> +		prot |= IOMMU_FAULT_PRIV;
> +
> +	return prot;
> +}
> +
> +static int intel_svm_prq_report(struct page_req_dsc *desc) {
> +	int ret = 0;
> +	struct iommu_fault_event event;
> +	struct pci_dev *pdev;
> +
> +	memset(&event, 0, sizeof(struct iommu_fault_event));
> +	pdev = pci_get_bus_and_slot(desc->bus, desc->devfn);
> +	if (!pdev) {
> +		pr_err("No PCI device found for PRQ [%02x:%02x.%d]\n",
> +			desc->bus, PCI_SLOT(desc->devfn),
> +			PCI_FUNC(desc->devfn));
> +		return -ENODEV;
> +	}
> +
> +	/* Fill in event data for device specific processing */
> +	event.type = IOMMU_FAULT_PAGE_REQ;
> +	event.addr = (u64)desc->addr << VTD_PAGE_SHIFT;
> +	event.pasid = desc->pasid;
> +	event.page_req_group_id = desc->prg_index;
> +	event.prot = prq_to_iommu_prot(desc);
> +	event.last_req = desc->lpig;
> +	event.pasid_valid = 1;
> +	/* keep track of PRQ so that when the response comes back, we know
> +	 * whether we do group response or stream response. SRR[0] and
> +	 * private[54:32] bits in the descriptor are stored.
> +	 */
> +	event.iommu_private = *(u64 *)desc;
> +	ret = iommu_report_device_fault(&pdev->dev, &event);
> +	pci_dev_put(pdev);
> +
> +	return ret;
> +}
> +
>  static irqreturn_t prq_event_thread(int irq, void *d)  {
>  	struct intel_iommu *iommu = d;
> @@ -628,6 +678,16 @@ static irqreturn_t prq_event_thread(int irq, void *d)
>  				goto no_pasid;
>  			}
>  		}
> +		/* If address is not canonical, return invalid response */
> +		if (!is_canonical_address(address))
> +			goto bad_req;
> +
> +		/*
> +		 * If prq is to be handled outside iommu driver via receiver of
> +		 * the fault notifiers, we skip the page response here.
> +		 */
> +		if (!intel_svm_prq_report(req))
> +			goto prq_advance;
> 
>  		result = QI_RESP_INVALID;
>  		/* Since we're using init_mm.pgd directly, we should never take @@
> -638,9 +698,6 @@ static irqreturn_t prq_event_thread(int irq, void *d)
>  		if (!mmget_not_zero(svm->mm))
>  			goto bad_req;
> 
> -		/* If address is not canonical, return invalid response */
> -		if (!is_canonical_address(address))
> -			goto bad_req;
> 
>  		down_read(&svm->mm->mmap_sem);
>  		vma = find_extend_vma(svm->mm, address); @@ -673,12 +730,6
> @@ static irqreturn_t prq_event_thread(int irq, void *d)
> 
>  		if (WARN_ON(&sdev->list == &svm->devs))
>  			sdev = NULL;
> -
> -		if (sdev && sdev->ops && sdev->ops->fault_cb) {
> -			int rwxp = (req->rd_req << 3) | (req->wr_req << 2) |
> -				(req->exe_req << 1) | (req->priv_req);
> -			sdev->ops->fault_cb(sdev->dev, req->pasid, req->addr, req-
> >private, rwxp, result);
> -		}
>  		/* We get here in the error case where the PASID lookup failed,
>  		   and these can be NULL. Do not use them below this point! */
>  		sdev = NULL;
> @@ -704,7 +755,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
> 
>  			qi_submit_sync(&resp, iommu);
>  		}
> -
> +	prq_advance:
>  		head = (head + sizeof(*req)) & PRQ_RING_MASK;
>  	}
> 
> diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 94cfda8..dbe2866
> 100644
> --- a/include/linux/iommu.h
> +++ b/include/linux/iommu.h
> @@ -42,6 +42,7 @@
>   * if the IOMMU page table format is equivalent.
>   */
>  #define IOMMU_PRIV	(1 << 5)
> +#define IOMMU_EXEC	(1 << 6)
> 
>  struct iommu_ops;
>  struct iommu_group;
> --
> 2.7.4

  reply	other threads:[~2018-05-14  6:56 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-23  3:11 [PATCH v4 00/22] IOMMU and VT-d driver support for Shared Virtual Address (SVA) Jacob Pan
2018-03-23  3:11 ` [PATCH v4 01/22] iommu: introduce bind_pasid_table API function Jacob Pan
2018-03-23  3:11 ` [PATCH v4 02/22] iommu/vt-d: move device_domain_info to header Jacob Pan
2018-03-23  3:11 ` [PATCH v4 03/22] iommu/vt-d: add a flag for pasid table bound status Jacob Pan
2018-03-23  3:11 ` [PATCH v4 04/22] iommu/vt-d: add bind_pasid_table function Jacob Pan
2018-03-23  3:11 ` [PATCH v4 05/22] iommu: introduce iommu invalidate API function Jacob Pan
2018-03-23  3:11 ` [PATCH v4 06/22] iommu/vt-d: add definitions for PFSID Jacob Pan
2018-03-23  3:11 ` [PATCH v4 07/22] iommu/vt-d: fix dev iotlb pfsid use Jacob Pan
2018-03-23  3:12 ` [PATCH v4 08/22] iommu/vt-d: support flushing more translation cache types Jacob Pan
2018-03-23  3:12 ` [PATCH v4 09/22] iommu/vt-d: add svm/sva invalidate function Jacob Pan
2018-03-23  3:12 ` [PATCH v4 10/22] iommu: introduce device fault data Jacob Pan
2018-03-23  3:12 ` [PATCH v4 11/22] driver core: add per device iommu param Jacob Pan
2018-03-23  8:12   ` Greg Kroah-Hartman
2018-03-23  3:12 ` [PATCH v4 12/22] iommu: introduce device fault report API Jacob Pan
2018-03-23  3:12 ` [PATCH v4 13/22] iommu: introduce page response function Jacob Pan
2018-03-23  3:12 ` [PATCH v4 14/22] iommu: handle page response timeout Jacob Pan
2018-03-23  3:12 ` [PATCH v4 15/22] iommu/config: add build dependency for dmar Jacob Pan
2018-03-23  3:12 ` [PATCH v4 16/22] iommu/vt-d: report non-recoverable faults to device Jacob Pan
2018-05-14  6:55   ` Liu, Yi L
2018-03-23  3:12 ` [PATCH v4 17/22] iommu/intel-svm: report device page request Jacob Pan
2018-05-14  6:56   ` Liu, Yi L [this message]
2018-05-14 18:30     ` Jacob Pan
2018-03-23  3:12 ` [PATCH v4 18/22] iommu/intel-svm: replace dev ops with fault report API Jacob Pan
2018-03-23  3:12 ` [PATCH v4 19/22] iommu/intel-svm: do not flush iotlb for viommu Jacob Pan
2018-03-23  3:12 ` [PATCH v4 20/22] iommu/vt-d: add intel iommu page response function Jacob Pan
2018-03-24 23:19   ` kbuild test robot
2018-03-24 23:19   ` [RFC PATCH] iommu/vt-d: intel_iommu_page_response() can be static kbuild test robot
2018-03-23  3:12 ` [PATCH v4 21/22] trace/iommu: add sva trace events Jacob Pan
2018-03-23  3:12 ` [PATCH v4 22/22] iommu: use sva invalidate and device fault trace event Jacob Pan
2018-04-16 21:48 [PATCH v4 00/22] IOMMU and VT-d driver support for Shared Virtual Address (SVA) Jacob Pan
2018-04-16 21:49 ` [PATCH v4 17/22] iommu/intel-svm: report device page request Jacob Pan

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=A2975661238FB949B60364EF0F2C257439BEFA7F@SHSMSX104.ccr.corp.intel.com \
    --to=yi.l.liu@intel.com \
    --cc=alex.williamson@redhat.com \
    --cc=ashok.raj@intel.com \
    --cc=dwmw2@infradead.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@infradead.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=jacob.jun.pan@linux.intel.com \
    --cc=jean-philippe.brucker@arm.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=khali@linux-fr.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=tianyu.lan@intel.com \
    --subject='RE: [PATCH v4 17/22] iommu/intel-svm: report device page request' \
    /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

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).