summaryrefslogtreecommitdiffstats
path: root/drivers/misc/habanalabs/common/hw_queue.c
diff options
context:
space:
mode:
authorOded Gabbay <ogabbay@kernel.org>2020-09-30 14:25:55 +0300
committerOded Gabbay <ogabbay@kernel.org>2020-11-30 10:47:27 +0200
commit23c15ae615175637ae4449aa6e64c0584474ddaa (patch)
treed47c483632e3f29f9a65c8db4d68937ffa5896cb /drivers/misc/habanalabs/common/hw_queue.c
parent6c38e7c60fe772653128667a8cebe16612e819e4 (diff)
downloadlinux-23c15ae615175637ae4449aa6e64c0584474ddaa.tar.bz2
habanalabs: change aggregate cs counters to atomic
In case we will have multiple contexts/processes, we can't just increment aggregated counters. We need to make them atomic as they can be incremented by multiple processes Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Diffstat (limited to 'drivers/misc/habanalabs/common/hw_queue.c')
-rw-r--r--drivers/misc/habanalabs/common/hw_queue.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/misc/habanalabs/common/hw_queue.c b/drivers/misc/habanalabs/common/hw_queue.c
index 250cf9cefc06..f36e8a98affd 100644
--- a/drivers/misc/habanalabs/common/hw_queue.c
+++ b/drivers/misc/habanalabs/common/hw_queue.c
@@ -484,17 +484,21 @@ static void init_signal_wait_cs(struct hl_cs *cs)
*/
int hl_hw_queue_schedule_cs(struct hl_cs *cs)
{
+ struct hl_cs_counters_atomic *cntr;
struct hl_ctx *ctx = cs->ctx;
struct hl_device *hdev = ctx->hdev;
struct hl_cs_job *job, *tmp;
struct hl_hw_queue *q;
- u32 max_queues;
int rc = 0, i, cq_cnt;
+ u32 max_queues;
+
+ cntr = &hdev->aggregated_cs_counters;
hdev->asic_funcs->hw_queues_lock(hdev);
if (hl_device_disabled_or_in_reset(hdev)) {
ctx->cs_counters.device_in_reset_drop_cnt++;
+ atomic64_inc(&cntr->device_in_reset_drop_cnt);
dev_err(hdev->dev,
"device is disabled or in reset, CS rejected!\n");
rc = -EPERM;
@@ -528,6 +532,7 @@ int hl_hw_queue_schedule_cs(struct hl_cs *cs)
if (rc) {
ctx->cs_counters.queue_full_drop_cnt++;
+ atomic64_inc(&cntr->queue_full_drop_cnt);
goto unroll_cq_resv;
}