| From 9e7f616fe4eb1b4a1890bcc5868c3e0a2899ddbb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 2 Mar 2021 02:13:59 -0800 |
| Subject: iommu/vt-d: Reject unsupported page request modes |
| |
| From: Jacob Pan <jacob.jun.pan@linux.intel.com> |
| |
| [ Upstream commit 78a523fe73b81b4447beb2d6c78c9fafae24eebb ] |
| |
| When supervisor/privilige mode SVM is used, we bind init_mm.pgd with |
| a supervisor PASID. There should not be any page fault for init_mm. |
| Execution request with DMA read is also not supported. |
| |
| This patch checks PRQ descriptor for both unsupported configurations, |
| reject them both with invalid responses. |
| |
| Fixes: 1c4f88b7f1f92 ("iommu/vt-d: Shared virtual address in scalable mode") |
| Acked-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> |
| Link: https://lore.kernel.org/r/1614680040-1989-4-git-send-email-jacob.jun.pan@linux.intel.com |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iommu/intel/svm.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c |
| index b3bcd6dec93e..8670cddadc91 100644 |
| --- a/drivers/iommu/intel/svm.c |
| +++ b/drivers/iommu/intel/svm.c |
| @@ -959,7 +959,17 @@ static irqreturn_t prq_event_thread(int irq, void *d) |
| ((unsigned long long *)req)[1]); |
| goto no_pasid; |
| } |
| - |
| + /* We shall not receive page request for supervisor SVM */ |
| + if (req->pm_req && (req->rd_req | req->wr_req)) { |
| + pr_err("Unexpected page request in Privilege Mode"); |
| + /* No need to find the matching sdev as for bad_req */ |
| + goto no_pasid; |
| + } |
| + /* DMA read with exec requeset is not supported. */ |
| + if (req->exe_req && req->rd_req) { |
| + pr_err("Execution request not supported\n"); |
| + goto no_pasid; |
| + } |
| if (!svm || svm->pasid != req->pasid) { |
| rcu_read_lock(); |
| svm = ioasid_find(NULL, req->pasid, NULL); |
| -- |
| 2.30.2 |
| |