The SDMA queue counter read was dispatched by GC version: anything newer
than gfx 9.4.2 was routed to the kfd2kgd->hqd_sdma_get_counter hook.
However that hook is only implemented for gfx 9.4.3, so gfx 10.3, gfx 11
and gfx 12 fell into the else branch with a NULL hook and got
-EOPNOTSUPP. This spammed "Failed to read SDMA queue counter" on every
SDMA queue teardown and left sdma_val at 0, so the per-process SDMA
activity accounting stopped working on those ASICs.

Dispatch based on whether the hook is implemented instead of the GC
version, so ASICs without the hook keep using read_sdma_queue_counter()
as before.

Fixes: 0ee24cad5b35 ("drm/amdkfd: add sdma queue counter for gfxv9.4.3")

Signed-off-by: Jesse Zhang <[email protected]>
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c | 28 ++++++++-----------
 drivers/gpu/drm/amd/amdkfd/kfd_process.c      | 12 ++++----
 2 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 53415317ad63..7ee10fb0a8fd 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1027,17 +1027,15 @@ static int destroy_queue_nocpsch(struct 
device_queue_manager *dqm,
        /* Get the SDMA queue stats */
        if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
            (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
-               if (KFD_GC_VERSION(dqm->dev) <= IP_VERSION(9, 4, 2))
+               if (dqm->dev->kfd2kgd->hqd_sdma_get_counter)
+                       retval = dqm->dev->kfd2kgd->hqd_sdma_get_counter(
+                                       dqm->dev->adev, q->mqd,
+                                       
dqm->dev->kfd->device_info.num_sdma_queues_per_engine,
+                                       &sdma_val);
+               else
                        retval = read_sdma_queue_counter(
                                        (uint64_t __user 
*)q->properties.read_ptr,
                                        &sdma_val);
-               else
-                       retval = dqm->dev->kfd2kgd->hqd_sdma_get_counter ?
-                                dqm->dev->kfd2kgd->hqd_sdma_get_counter(
-                                       dqm->dev->adev, q->mqd,
-                                       
dqm->dev->kfd->device_info.num_sdma_queues_per_engine,
-                                       &sdma_val) :
-                                -EOPNOTSUPP;
                if (retval)
                        dev_err(dev, "Failed to read SDMA queue counter for 
queue: %d\n",
                                q->properties.queue_id);
@@ -2675,17 +2673,15 @@ static int destroy_queue_cpsch(struct 
device_queue_manager *dqm,
        /* Get the SDMA queue stats */
        if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
            (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
-               if (KFD_GC_VERSION(dqm->dev) <= IP_VERSION(9, 4, 2))
+               if (dqm->dev->kfd2kgd->hqd_sdma_get_counter)
+                       retval = dqm->dev->kfd2kgd->hqd_sdma_get_counter(
+                                       dqm->dev->adev, q->mqd,
+                                       
dqm->dev->kfd->device_info.num_sdma_queues_per_engine,
+                                       &sdma_val);
+               else
                        retval = read_sdma_queue_counter(
                                        (uint64_t __user 
*)q->properties.read_ptr,
                                        &sdma_val);
-               else
-                       retval = dqm->dev->kfd2kgd->hqd_sdma_get_counter ?
-                                dqm->dev->kfd2kgd->hqd_sdma_get_counter(
-                                       dqm->dev->adev, q->mqd,
-                                       
dqm->dev->kfd->device_info.num_sdma_queues_per_engine,
-                                       &sdma_val) :
-                                -EOPNOTSUPP;
 
                if (retval)
                        dev_err(dev, "Failed to read SDMA queue counter for 
queue: %d\n",
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index e0b885b2395a..f280c3e41ea6 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -192,15 +192,13 @@ static void kfd_sdma_activity_worker(struct work_struct 
*work)
        list_for_each_entry(sdma_q, &sdma_q_list.list, list) {
                val = 0;
 
-               if (KFD_GC_VERSION(dqm->dev) <= IP_VERSION(9, 4, 2))
-                       ret = read_sdma_queue_counter(sdma_q->rptr, &val);
-               else
-                       ret = dqm->dev->kfd2kgd->hqd_sdma_get_counter ?
-                             dqm->dev->kfd2kgd->hqd_sdma_get_counter(
+               if (dqm->dev->kfd2kgd->hqd_sdma_get_counter)
+                       ret = dqm->dev->kfd2kgd->hqd_sdma_get_counter(
                                        dqm->dev->adev, sdma_q->mqd,
                                        
dqm->dev->kfd->device_info.num_sdma_queues_per_engine,
-                                       &val) :
-                             -EOPNOTSUPP;
+                                       &val);
+               else
+                       ret = read_sdma_queue_counter(sdma_q->rptr, &val);
 
                if (ret) {
                        pr_debug("Failed to read SDMA queue active counter for 
queue id: %d",
-- 
2.49.0

Reply via email to