mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 09:31:50 +00:00
iommu/vt-d: Use INVALID response code instead of FAILURE
The VT-d IOMMU response RESPONSE_FAILURE for a page request in below cases: - When it gets a Page_Request with no PASID; - When it gets a Page_Request with PASID that is not in use for this device. This is allowed by the spec, but IOMMU driver doesn't support such cases today. When the device receives RESPONSE_FAILURE, it sends the device state machine to HALT state. Now if we try to unload the driver, it hangs since the device doesn't send any outbound transactions to host when the driver is trying to clear things up. The only possible responses would be for invalidation requests. Let's use RESPONSE_INVALID instead for now, so that the device state machine doesn't enter HALT state. Suggested-by: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Link: https://lore.kernel.org/r/20210126080730.2232859-3-baolu.lu@linux.intel.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
28a77185f1
commit
3aa7c62cb7
@ -911,10 +911,8 @@ static irqreturn_t prq_event_thread(int irq, void *d)
|
||||
u64 address;
|
||||
|
||||
handled = 1;
|
||||
|
||||
req = &iommu->prq[head / sizeof(*req)];
|
||||
|
||||
result = QI_RESP_FAILURE;
|
||||
result = QI_RESP_INVALID;
|
||||
address = (u64)req->addr << VTD_PAGE_SHIFT;
|
||||
if (!req->pasid_present) {
|
||||
pr_err("%s: Page request without PASID: %08llx %08llx\n",
|
||||
@ -952,7 +950,6 @@ static irqreturn_t prq_event_thread(int irq, void *d)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
result = QI_RESP_INVALID;
|
||||
/* Since we're using init_mm.pgd directly, we should never take
|
||||
* any faults on kernel addresses. */
|
||||
if (!svm->mm)
|
||||
|
Loading…
Reference in New Issue
Block a user