return rc;
 }
 
+/* Should be called while the context's mem_hash_lock is taken */
+static struct hl_vm_hash_node *get_vm_hash_node_locked(struct hl_ctx *ctx, u64 vaddr)
+{
+       struct hl_vm_hash_node *hnode;
+
+       hash_for_each_possible(ctx->mem_hash, hnode, node, vaddr)
+               if (vaddr == hnode->vaddr)
+                       return hnode;
+
+       return NULL;
+}
+
 /**
  * unmap_device_va() - unmap the given device virtual address.
  * @ctx: pointer to the context structure.
 {
        struct hl_vm_phys_pg_pack *phys_pg_pack = NULL;
        u64 vaddr = args->unmap.device_virt_addr;
-       struct hl_vm_hash_node *hnode = NULL;
        struct asic_fixed_properties *prop;
        struct hl_device *hdev = ctx->hdev;
        struct hl_userptr *userptr = NULL;
+       struct hl_vm_hash_node *hnode;
        struct hl_va_range *va_range;
        enum vm_type *vm_type;
        bool is_userptr;
 
        /* protect from double entrance */
        mutex_lock(&ctx->mem_hash_lock);
-       hash_for_each_possible(ctx->mem_hash, hnode, node, (unsigned long)vaddr)
-               if (vaddr == hnode->vaddr)
-                       break;
-
+       hnode = get_vm_hash_node_locked(ctx, vaddr);
        if (!hnode) {
                mutex_unlock(&ctx->mem_hash_lock);
-               dev_err(hdev->dev,
-                       "unmap failed, no mem hnode for vaddr 0x%llx\n",
-                       vaddr);
+               dev_err(hdev->dev, "unmap failed, no mem hnode for vaddr 0x%llx\n", vaddr);
                return -EINVAL;
        }
 
 
        /* get the memory handle */
        mutex_lock(&ctx->mem_hash_lock);
-       hash_for_each_possible(ctx->mem_hash, hnode, node, (unsigned long)addr)
-               if (addr == hnode->vaddr)
-                       break;
-
+       hnode = get_vm_hash_node_locked(ctx, addr);
        if (!hnode) {
                mutex_unlock(&ctx->mem_hash_lock);
                dev_dbg(hdev->dev, "map address %#llx not found\n", addr);