habanalabs: Avoid using a non-initialized MMU cache mutex
authorTomer Tayar <ttayar@habana.ai>
Mon, 13 May 2019 09:13:39 +0000 (12:13 +0300)
committerOded Gabbay <oded.gabbay@gmail.com>
Fri, 24 May 2019 19:46:15 +0000 (22:46 +0300)
The MMU cache mutex is used in the ASIC hw_init() functions, but it is
initialized only later in hl_mmu_init().
This patch prevents it by moving the initialization to the
device_early_init() function.

Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/misc/habanalabs/device.c
drivers/misc/habanalabs/mmu.c

index 91a9e47a3482505ca0a77d41a9e74db0fe032286..0b19d3eefb98f1a686cdf52ec123794bca6ebadb 100644 (file)
@@ -231,6 +231,7 @@ static int device_early_init(struct hl_device *hdev)
 
        mutex_init(&hdev->fd_open_cnt_lock);
        mutex_init(&hdev->send_cpu_message_lock);
+       mutex_init(&hdev->mmu_cache_lock);
        INIT_LIST_HEAD(&hdev->hw_queues_mirror_list);
        spin_lock_init(&hdev->hw_queues_mirror_lock);
        atomic_set(&hdev->in_reset, 0);
@@ -260,6 +261,7 @@ early_fini:
  */
 static void device_early_fini(struct hl_device *hdev)
 {
+       mutex_destroy(&hdev->mmu_cache_lock);
        mutex_destroy(&hdev->send_cpu_message_lock);
 
        hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr);
index 533d9315b6fb968b16fac5e9a0fbbc9847d83206..10aee314144462771fe84455a325e98ac84bb892 100644 (file)
@@ -404,15 +404,12 @@ int hl_mmu_init(struct hl_device *hdev)
 
        /* MMU H/W init was already done in device hw_init() */
 
-       mutex_init(&hdev->mmu_cache_lock);
-
        hdev->mmu_pgt_pool =
                        gen_pool_create(__ffs(prop->mmu_hop_table_size), -1);
 
        if (!hdev->mmu_pgt_pool) {
                dev_err(hdev->dev, "Failed to create page gen pool\n");
-               rc = -ENOMEM;
-               goto err_pool_create;
+               return -ENOMEM;
        }
 
        rc = gen_pool_add(hdev->mmu_pgt_pool, prop->mmu_pgt_addr +
@@ -436,8 +433,6 @@ int hl_mmu_init(struct hl_device *hdev)
 
 err_pool_add:
        gen_pool_destroy(hdev->mmu_pgt_pool);
-err_pool_create:
-       mutex_destroy(&hdev->mmu_cache_lock);
 
        return rc;
 }
@@ -459,7 +454,6 @@ void hl_mmu_fini(struct hl_device *hdev)
 
        kvfree(hdev->mmu_shadow_hop0);
        gen_pool_destroy(hdev->mmu_pgt_pool);
-       mutex_destroy(&hdev->mmu_cache_lock);
 
        /* MMU H/W fini will be done in device hw_fini() */
 }