Skip to content

Commit

Permalink
accel/ivpu: Unmap partially mapped BOs in case of errors
Browse files Browse the repository at this point in the history
Ensure that all buffers that were created only partially through
allocated scatter-gather table are unmapped from MMU600 in case of errors.

Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241017145817.121590-6-jacek.lawrynowicz@linux.intel.com
  • Loading branch information
Karol Wachowski authored and Jacek Lawrynowicz committed Oct 30, 2024
1 parent add38f8 commit 1fc65fa
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions drivers/accel/ivpu/ivpu_mmu_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,7 @@ int
ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
u64 vpu_addr, struct sg_table *sgt, bool llc_coherent)
{
size_t start_vpu_addr = vpu_addr;
struct scatterlist *sg;
int ret;
u64 prot;
Expand Down Expand Up @@ -462,7 +463,7 @@ ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
ret = ivpu_mmu_context_map_pages(vdev, ctx, vpu_addr, dma_addr, size, prot);
if (ret) {
ivpu_err(vdev, "Failed to map context pages\n");
goto err_unlock;
goto err_unmap_pages;
}
vpu_addr += size;
}
Expand All @@ -472,25 +473,27 @@ ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
if (ret) {
ivpu_err(vdev, "Failed to set context descriptor for context %u: %d\n",
ctx->id, ret);
goto err_unlock;
goto err_unmap_pages;
}
ctx->is_cd_valid = true;
}

/* Ensure page table modifications are flushed from wc buffers to memory */
wmb();

mutex_unlock(&ctx->lock);

ret = ivpu_mmu_invalidate_tlb(vdev, ctx->id);
if (ret)
if (ret) {
ivpu_err(vdev, "Failed to invalidate TLB for ctx %u: %d\n", ctx->id, ret);
return ret;
goto err_unmap_pages;
}

err_unlock:
mutex_unlock(&ctx->lock);
return ret;
return 0;

err_unmap_pages:
ivpu_mmu_context_unmap_pages(ctx, start_vpu_addr, vpu_addr - start_vpu_addr);
mutex_unlock(&ctx->lock);
return ret;
}

void
Expand Down

0 comments on commit 1fc65fa

Please sign in to comment.