|
@@ -106,7 +106,8 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
|
|
|
pagefault_disable();
|
|
|
}
|
|
|
|
|
|
- if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) {
|
|
|
+ if ((submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) ||
|
|
|
+ !(submit_bo.flags & MSM_SUBMIT_BO_FLAGS)) {
|
|
|
DRM_ERROR("invalid flags: %x\n", submit_bo.flags);
|
|
|
ret = -EINVAL;
|
|
|
goto out_unlock;
|
|
@@ -290,7 +291,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
|
|
{
|
|
|
uint32_t i, last_offset = 0;
|
|
|
uint32_t *ptr;
|
|
|
- int ret;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (offset % 4) {
|
|
|
DRM_ERROR("non-aligned cmdstream buffer: %u\n", offset);
|
|
@@ -318,12 +319,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));
|
|
|
if (ret)
|
|
|
- return -EFAULT;
|
|
|
+ goto out;
|
|
|
|
|
|
if (submit_reloc.submit_offset % 4) {
|
|
|
DRM_ERROR("non-aligned reloc offset: %u\n",
|
|
|
submit_reloc.submit_offset);
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/* offset in dwords: */
|
|
@@ -332,12 +334,13 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
|
|
if ((off >= (obj->base.size / 4)) ||
|
|
|
(off < last_offset)) {
|
|
|
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);
|
|
|
if (ret)
|
|
|
- return ret;
|
|
|
+ goto out;
|
|
|
|
|
|
if (valid)
|
|
|
continue;
|
|
@@ -354,9 +357,10 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
|
|
|
last_offset = off;
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
msm_gem_put_vaddr_locked(&obj->base);
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void submit_cleanup(struct msm_gem_submit *submit)
|