On Thu, 2015-10-15 at 21:25 +0300, Dan Carpenter wrote:
> 
> The patch 0b9252a34858: "iommu/vt-d: Implement page request handling" 
> from Oct 8, 2015, leads to the following Smatch complaint:
> 
> drivers/iommu/intel-svm.c:452 prq_event_thread()
>          error: we previously assumed 'svm' could be null (see line 412)

Thanks. I'm going to fix it thus:

diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
index 817be76..b7e923a 100644
--- a/drivers/iommu/intel-svm.c
+++ b/drivers/iommu/intel-svm.c
@@ -510,7 +510,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
                                pr_err("%s: Page request for invalid PASID %d: 
%08llx %08llx\n",
                                       iommu->name, req->pasid, ((unsigned long 
long *)req)[0],
                                       ((unsigned long long *)req)[1]);
-                               goto bad_req;
+                               goto no_pasid;
                        }
                }
 
@@ -552,7 +552,11 @@ static irqreturn_t prq_event_thread(int irq, void *d)
                                (req->wr_req << 1) | (req->exe_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;
+               svm = NULL;
+       no_pasid:
                if (req->lpig) {
                        /* Page Group Response */
                        resp.low = QI_PGRP_PASID(req->pasid) |
@@ -562,7 +566,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
                        resp.high = QI_PGRP_IDX(req->prg_index) |
                                QI_PGRP_PRIV(req->private) | 
QI_PGRP_RESP_CODE(result);
 
-                       qi_submit_sync(&resp, svm->iommu);
+                       qi_submit_sync(&resp, iommu);
                } else if (req->srr) {
                        /* Page Stream Response */
                        resp.low = QI_PSTRM_IDX(req->prg_index) |
@@ -571,7 +575,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
                        resp.high = QI_PSTRM_ADDR(address) | 
QI_PSTRM_DEVFN(req->devfn) |
                                QI_PSTRM_RESP_CODE(result);
 
-                       qi_submit_sync(&resp, svm->iommu);
+                       qi_submit_sync(&resp, iommu);
                }
 
                head = (head + sizeof(*req)) & PRQ_RING_MASK;
-- 
David Woodhouse                            Open Source Technology Centre
david.woodho...@intel.com                              Intel Corporation

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to