Commit 8d45f1de authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay
Browse files

habanalabs: Avoid using a non-initialized MMU cache mutex



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: default avatarTomer Tayar <ttayar@habana.ai>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 8438846c
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -231,6 +231,7 @@ static int device_early_init(struct hl_device *hdev)


	mutex_init(&hdev->fd_open_cnt_lock);
	mutex_init(&hdev->fd_open_cnt_lock);
	mutex_init(&hdev->send_cpu_message_lock);
	mutex_init(&hdev->send_cpu_message_lock);
	mutex_init(&hdev->mmu_cache_lock);
	INIT_LIST_HEAD(&hdev->hw_queues_mirror_list);
	INIT_LIST_HEAD(&hdev->hw_queues_mirror_list);
	spin_lock_init(&hdev->hw_queues_mirror_lock);
	spin_lock_init(&hdev->hw_queues_mirror_lock);
	atomic_set(&hdev->in_reset, 0);
	atomic_set(&hdev->in_reset, 0);
@@ -260,6 +261,7 @@ early_fini:
 */
 */
static void device_early_fini(struct hl_device *hdev)
static void device_early_fini(struct hl_device *hdev)
{
{
	mutex_destroy(&hdev->mmu_cache_lock);
	mutex_destroy(&hdev->send_cpu_message_lock);
	mutex_destroy(&hdev->send_cpu_message_lock);


	hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr);
	hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr);
+1 −7
Original line number Original line Diff line number Diff line
@@ -404,15 +404,12 @@ int hl_mmu_init(struct hl_device *hdev)


	/* MMU H/W init was already done in device hw_init() */
	/* MMU H/W init was already done in device hw_init() */


	mutex_init(&hdev->mmu_cache_lock);

	hdev->mmu_pgt_pool =
	hdev->mmu_pgt_pool =
			gen_pool_create(__ffs(prop->mmu_hop_table_size), -1);
			gen_pool_create(__ffs(prop->mmu_hop_table_size), -1);


	if (!hdev->mmu_pgt_pool) {
	if (!hdev->mmu_pgt_pool) {
		dev_err(hdev->dev, "Failed to create page gen pool\n");
		dev_err(hdev->dev, "Failed to create page gen pool\n");
		rc = -ENOMEM;
		return -ENOMEM;
		goto err_pool_create;
	}
	}


	rc = gen_pool_add(hdev->mmu_pgt_pool, prop->mmu_pgt_addr +
	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:
err_pool_add:
	gen_pool_destroy(hdev->mmu_pgt_pool);
	gen_pool_destroy(hdev->mmu_pgt_pool);
err_pool_create:
	mutex_destroy(&hdev->mmu_cache_lock);


	return rc;
	return rc;
}
}
@@ -459,7 +454,6 @@ void hl_mmu_fini(struct hl_device *hdev)


	kvfree(hdev->mmu_shadow_hop0);
	kvfree(hdev->mmu_shadow_hop0);
	gen_pool_destroy(hdev->mmu_pgt_pool);
	gen_pool_destroy(hdev->mmu_pgt_pool);
	mutex_destroy(&hdev->mmu_cache_lock);


	/* MMU H/W fini will be done in device hw_fini() */
	/* MMU H/W fini will be done in device hw_fini() */
}
}