diff options
author | Oded Gabbay <ogabbay@kernel.org> | 2020-09-30 14:25:55 +0300 |
---|---|---|
committer | Oded Gabbay <ogabbay@kernel.org> | 2020-11-30 10:47:27 +0200 |
commit | 23c15ae615175637ae4449aa6e64c0584474ddaa (patch) | |
tree | d47c483632e3f29f9a65c8db4d68937ffa5896cb /drivers/misc/habanalabs/common/habanalabs_ioctl.c | |
parent | 6c38e7c60fe772653128667a8cebe16612e819e4 (diff) | |
download | linux-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/habanalabs_ioctl.c')
-rw-r--r-- | drivers/misc/habanalabs/common/habanalabs_ioctl.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/misc/habanalabs/common/habanalabs_ioctl.c b/drivers/misc/habanalabs/common/habanalabs_ioctl.c index 07317ea49129..350a768309bd 100644 --- a/drivers/misc/habanalabs/common/habanalabs_ioctl.c +++ b/drivers/misc/habanalabs/common/habanalabs_ioctl.c @@ -314,10 +314,13 @@ static int clk_throttle_info(struct hl_fpriv *hpriv, struct hl_info_args *args) static int cs_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args) { - struct hl_device *hdev = hpriv->hdev; + void __user *out = (void __user *) (uintptr_t) args->return_pointer; struct hl_info_cs_counters cs_counters = { {0} }; + struct hl_device *hdev = hpriv->hdev; + struct hl_cs_counters_atomic *cntr; u32 max_size = args->return_size; - void __user *out = (void __user *) (uintptr_t) args->return_pointer; + + cntr = &hdev->aggregated_cs_counters; if ((!max_size) || (!out)) return -EINVAL; @@ -325,6 +328,17 @@ static int cs_counters_info(struct hl_fpriv *hpriv, struct hl_info_args *args) memcpy(&cs_counters.cs_counters, &hdev->aggregated_cs_counters, sizeof(struct hl_cs_counters)); + cs_counters.cs_counters.out_of_mem_drop_cnt = + atomic64_read(&cntr->out_of_mem_drop_cnt); + cs_counters.cs_counters.parsing_drop_cnt = + atomic64_read(&cntr->parsing_drop_cnt); + cs_counters.cs_counters.queue_full_drop_cnt = + atomic64_read(&cntr->queue_full_drop_cnt); + cs_counters.cs_counters.device_in_reset_drop_cnt = + atomic64_read(&cntr->device_in_reset_drop_cnt); + cs_counters.cs_counters.max_cs_in_flight_drop_cnt = + atomic64_read(&cntr->max_cs_in_flight_drop_cnt); + if (hpriv->ctx) memcpy(&cs_counters.ctx_cs_counters, &hpriv->ctx->cs_counters, sizeof(struct hl_cs_counters)); |