You need to sign in or sign up before continuing.
提交 496cbac7 编写于 作者: G Guo Mengqi 提交者: Zheng Zengkai

Revert "iommu: handle page response timeout"

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5EOOG
CVE: NA

--------------------------------

This reverts commit da76349c.
However, the iommu_fault_param and iommu_fault_event changes
are reserved to avoid KABI change.
Signed-off-by: NGuo Mengqi <guomengqi3@huawei.com>
Reviewed-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 29c68be3
...@@ -1084,39 +1084,6 @@ int iommu_group_unregister_notifier(struct iommu_group *group, ...@@ -1084,39 +1084,6 @@ int iommu_group_unregister_notifier(struct iommu_group *group,
} }
EXPORT_SYMBOL_GPL(iommu_group_unregister_notifier); EXPORT_SYMBOL_GPL(iommu_group_unregister_notifier);
static void iommu_dev_fault_timer_fn(struct timer_list *t)
{
struct iommu_fault_param *fparam = from_timer(fparam, t, timer);
struct iommu_fault_event *evt;
struct iommu_fault_page_request *prm;
u64 now;
now = get_jiffies_64();
/* The goal is to ensure driver or guest page fault handler(via vfio)
* send page response on time. Otherwise, limited queue resources
* may be occupied by some irresponsive guests or drivers.
* When per device pending fault list is not empty, we periodically checks
* if any anticipated page response time has expired.
*
* TODO:
* We could do the following if response time expires:
* 1. send page response code FAILURE to all pending PRQ
* 2. inform device driver or vfio
* 3. drain in-flight page requests and responses for this device
* 4. clear pending fault list such that driver can unregister fault
* handler(otherwise blocked when pending faults are present).
*/
list_for_each_entry(evt, &fparam->faults, list) {
prm = &evt->fault.prm;
if (time_after64(now, evt->expire))
pr_err("Page response time expired!, pasid %d gid %d exp %llu now %llu\n",
prm->pasid, prm->grpid, evt->expire, now);
}
mod_timer(t, now + prq_timeout);
}
/** /**
* iommu_register_device_fault_handler() - Register a device fault handler * iommu_register_device_fault_handler() - Register a device fault handler
* @dev: the device * @dev: the device
...@@ -1164,9 +1131,6 @@ int iommu_register_device_fault_handler(struct device *dev, ...@@ -1164,9 +1131,6 @@ int iommu_register_device_fault_handler(struct device *dev,
mutex_init(&param->fault_param->lock); mutex_init(&param->fault_param->lock);
INIT_LIST_HEAD(&param->fault_param->faults); INIT_LIST_HEAD(&param->fault_param->faults);
if (prq_timeout)
timer_setup(&param->fault_param->timer, iommu_dev_fault_timer_fn,
TIMER_DEFERRABLE);
done_unlock: done_unlock:
mutex_unlock(&param->lock); mutex_unlock(&param->lock);
...@@ -1306,9 +1270,7 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt) ...@@ -1306,9 +1270,7 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt)
struct dev_iommu *param = dev->iommu; struct dev_iommu *param = dev->iommu;
struct iommu_fault_event *evt_pending = NULL; struct iommu_fault_event *evt_pending = NULL;
struct iommu_fault_param *fparam; struct iommu_fault_param *fparam;
struct timer_list *tmr;
int ret = 0; int ret = 0;
u64 exp;
if (!param || !evt || WARN_ON_ONCE(!iommu_fault_valid(&evt->fault))) if (!param || !evt || WARN_ON_ONCE(!iommu_fault_valid(&evt->fault)))
return -EINVAL; return -EINVAL;
...@@ -1329,17 +1291,7 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt) ...@@ -1329,17 +1291,7 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt)
ret = -ENOMEM; ret = -ENOMEM;
goto done_unlock; goto done_unlock;
} }
/* Keep track of response expiration time */
exp = get_jiffies_64() + prq_timeout;
evt_pending->expire = exp;
mutex_lock(&fparam->lock); mutex_lock(&fparam->lock);
if (list_empty(&fparam->faults)) {
/* First pending event, start timer */
tmr = &fparam->timer;
WARN_ON(timer_pending(tmr));
mod_timer(tmr, exp);
}
list_add_tail(&evt_pending->list, &fparam->faults); list_add_tail(&evt_pending->list, &fparam->faults);
mutex_unlock(&fparam->lock); mutex_unlock(&fparam->lock);
} }
...@@ -1417,13 +1369,6 @@ int iommu_page_response(struct device *dev, ...@@ -1417,13 +1369,6 @@ int iommu_page_response(struct device *dev,
break; break;
} }
/* stop response timer if no more pending request */
if (list_empty(&param->fault_param->faults) &&
timer_pending(&param->fault_param->timer)) {
pr_debug("no pending PRQ, stop timer\n");
del_timer(&param->fault_param->timer);
}
done_unlock: done_unlock:
mutex_unlock(&param->fault_param->lock); mutex_unlock(&param->fault_param->lock);
return ret; return ret;
......
...@@ -393,7 +393,7 @@ struct iommu_device { ...@@ -393,7 +393,7 @@ struct iommu_device {
struct iommu_fault_event { struct iommu_fault_event {
struct iommu_fault fault; struct iommu_fault fault;
struct list_head list; struct list_head list;
u64 expire; _KABI_DEPRECATE(u64, expire);
}; };
/** /**
...@@ -408,7 +408,7 @@ struct iommu_fault_param { ...@@ -408,7 +408,7 @@ struct iommu_fault_param {
iommu_dev_fault_handler_t handler; iommu_dev_fault_handler_t handler;
void *data; void *data;
struct list_head faults; struct list_head faults;
struct timer_list timer; _KABI_DEPRECATE(struct timer_list, timer);
struct mutex lock; struct mutex lock;
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册