drm/msm: Put back the vaddr in submit_reloc()
The error cases in submit_reloc() need to put back the virtual address of the bo before failling. Add a single failure path for the function. Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
parent
88b333b0ed
commit
6490abc4bc
|
@ -290,7 +290,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
||||||
{
|
{
|
||||||
uint32_t i, last_offset = 0;
|
uint32_t i, last_offset = 0;
|
||||||
uint32_t *ptr;
|
uint32_t *ptr;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
if (offset % 4) {
|
if (offset % 4) {
|
||||||
DRM_ERROR("non-aligned cmdstream buffer: %u\n", offset);
|
DRM_ERROR("non-aligned cmdstream buffer: %u\n", offset);
|
||||||
|
@ -318,12 +318,13 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
||||||
|
|
||||||
ret = copy_from_user(&submit_reloc, userptr, sizeof(submit_reloc));
|
ret = copy_from_user(&submit_reloc, userptr, sizeof(submit_reloc));
|
||||||
if (ret)
|
if (ret)
|
||||||
return -EFAULT;
|
goto out;
|
||||||
|
|
||||||
if (submit_reloc.submit_offset % 4) {
|
if (submit_reloc.submit_offset % 4) {
|
||||||
DRM_ERROR("non-aligned reloc offset: %u\n",
|
DRM_ERROR("non-aligned reloc offset: %u\n",
|
||||||
submit_reloc.submit_offset);
|
submit_reloc.submit_offset);
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* offset in dwords: */
|
/* offset in dwords: */
|
||||||
|
@ -332,12 +333,13 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
||||||
if ((off >= (obj->base.size / 4)) ||
|
if ((off >= (obj->base.size / 4)) ||
|
||||||
(off < last_offset)) {
|
(off < last_offset)) {
|
||||||
DRM_ERROR("invalid offset %u at reloc %u\n", off, i);
|
DRM_ERROR("invalid offset %u at reloc %u\n", off, i);
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = submit_bo(submit, submit_reloc.reloc_idx, NULL, &iova, &valid);
|
ret = submit_bo(submit, submit_reloc.reloc_idx, NULL, &iova, &valid);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto out;
|
||||||
|
|
||||||
if (valid)
|
if (valid)
|
||||||
continue;
|
continue;
|
||||||
|
@ -354,9 +356,10 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
||||||
last_offset = off;
|
last_offset = off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
msm_gem_put_vaddr_locked(&obj->base);
|
msm_gem_put_vaddr_locked(&obj->base);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void submit_cleanup(struct msm_gem_submit *submit)
|
static void submit_cleanup(struct msm_gem_submit *submit)
|
||||||
|
|
Loading…
Reference in New Issue