Commit 818b0324 authored by Mukul Joshi's avatar Mukul Joshi Committed by Alex Deucher

drm/amdkfd: sparse: Fix warning in reading SDMA counters

Add __user annotation to fix related sparse warning while reading
SDMA counters from userland.
Also, rework the read SDMA counters function by removing redundant
checks.
Reported-by: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarMukul Joshi <mukul.joshi@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 37d04745
...@@ -153,30 +153,6 @@ static void decrement_queue_count(struct device_queue_manager *dqm, ...@@ -153,30 +153,6 @@ static void decrement_queue_count(struct device_queue_manager *dqm,
dqm->active_cp_queue_count--; dqm->active_cp_queue_count--;
} }
int read_sdma_queue_counter(uint64_t q_rptr, uint64_t *val)
{
int ret;
uint64_t tmp = 0;
if (!val)
return -EINVAL;
/*
* SDMA activity counter is stored at queue's RPTR + 0x8 location.
*/
if (!access_ok((const void __user *)(q_rptr +
sizeof(uint64_t)), sizeof(uint64_t))) {
pr_err("Can't access sdma queue activity counter\n");
return -EFAULT;
}
ret = get_user(tmp, (uint64_t *)(q_rptr + sizeof(uint64_t)));
if (!ret) {
*val = tmp;
}
return ret;
}
static int allocate_doorbell(struct qcm_process_device *qpd, struct queue *q) static int allocate_doorbell(struct qcm_process_device *qpd, struct queue *q)
{ {
struct kfd_dev *dev = qpd->dqm->dev; struct kfd_dev *dev = qpd->dqm->dev;
...@@ -552,7 +528,7 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm, ...@@ -552,7 +528,7 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
/* Get the SDMA queue stats */ /* Get the SDMA queue stats */
if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) || if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
(q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) { (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
retval = read_sdma_queue_counter((uint64_t)q->properties.read_ptr, retval = read_sdma_queue_counter((uint64_t __user *)q->properties.read_ptr,
&sdma_val); &sdma_val);
if (retval) if (retval)
pr_err("Failed to read SDMA queue counter for queue: %d\n", pr_err("Failed to read SDMA queue counter for queue: %d\n",
...@@ -1473,7 +1449,7 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, ...@@ -1473,7 +1449,7 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,
/* Get the SDMA queue stats */ /* Get the SDMA queue stats */
if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) || if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
(q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) { (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
retval = read_sdma_queue_counter((uint64_t)q->properties.read_ptr, retval = read_sdma_queue_counter((uint64_t __user *)q->properties.read_ptr,
&sdma_val); &sdma_val);
if (retval) if (retval)
pr_err("Failed to read SDMA queue counter for queue: %d\n", pr_err("Failed to read SDMA queue counter for queue: %d\n",
......
...@@ -251,5 +251,11 @@ static inline void dqm_unlock(struct device_queue_manager *dqm) ...@@ -251,5 +251,11 @@ static inline void dqm_unlock(struct device_queue_manager *dqm)
mutex_unlock(&dqm->lock_hidden); mutex_unlock(&dqm->lock_hidden);
} }
int read_sdma_queue_counter(uint64_t q_rptr, uint64_t *val); static inline int read_sdma_queue_counter(uint64_t __user *q_rptr, uint64_t *val)
{
/*
* SDMA activity counter is stored at queue's RPTR + 0x8 location.
*/
return get_user(*val, q_rptr + 1);
}
#endif /* KFD_DEVICE_QUEUE_MANAGER_H_ */ #endif /* KFD_DEVICE_QUEUE_MANAGER_H_ */
...@@ -87,7 +87,7 @@ struct kfd_sdma_activity_handler_workarea { ...@@ -87,7 +87,7 @@ struct kfd_sdma_activity_handler_workarea {
}; };
struct temp_sdma_queue_list { struct temp_sdma_queue_list {
uint64_t rptr; uint64_t __user *rptr;
uint64_t sdma_val; uint64_t sdma_val;
unsigned int queue_id; unsigned int queue_id;
struct list_head list; struct list_head list;
...@@ -159,7 +159,7 @@ static void kfd_sdma_activity_worker(struct work_struct *work) ...@@ -159,7 +159,7 @@ static void kfd_sdma_activity_worker(struct work_struct *work)
} }
INIT_LIST_HEAD(&sdma_q->list); INIT_LIST_HEAD(&sdma_q->list);
sdma_q->rptr = (uint64_t)q->properties.read_ptr; sdma_q->rptr = (uint64_t __user *)q->properties.read_ptr;
sdma_q->queue_id = q->properties.queue_id; sdma_q->queue_id = q->properties.queue_id;
list_add_tail(&sdma_q->list, &sdma_q_list.list); list_add_tail(&sdma_q->list, &sdma_q_list.list);
} }
...@@ -218,7 +218,7 @@ static void kfd_sdma_activity_worker(struct work_struct *work) ...@@ -218,7 +218,7 @@ static void kfd_sdma_activity_worker(struct work_struct *work)
continue; continue;
list_for_each_entry_safe(sdma_q, next, &sdma_q_list.list, list) { list_for_each_entry_safe(sdma_q, next, &sdma_q_list.list, list) {
if (((uint64_t)q->properties.read_ptr == sdma_q->rptr) && if (((uint64_t __user *)q->properties.read_ptr == sdma_q->rptr) &&
(sdma_q->queue_id == q->properties.queue_id)) { (sdma_q->queue_id == q->properties.queue_id)) {
list_del(&sdma_q->list); list_del(&sdma_q->list);
kfree(sdma_q); kfree(sdma_q);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment