diff options
author | Christian König <christian.koenig@amd.com> | 2016-01-31 05:32:04 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-02-10 14:17:18 -0500 |
commit | 4acabfe3793eb9bf89f71cc0cef23dfb2a812916 (patch) | |
tree | 6f7264b6be02983e133060311790a54db7ce3fbd /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
parent | 867d0517c705d9ae5a21f566ffe2308f5c070c6c (diff) |
drm/amdgpu: fix num_ibs check
Specifying no IBs on command submission is invalid, stop crashing
badly when somebody tries it.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucer@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index e7e384264202..55179efccfcf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -211,6 +211,10 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
211 | } | 211 | } |
212 | } | 212 | } |
213 | 213 | ||
214 | if (p->num_ibs == 0) { | ||
215 | ret = -EINVAL; | ||
216 | goto free_all_kdata; | ||
217 | } | ||
214 | 218 | ||
215 | p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); | 219 | p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); |
216 | if (!p->ibs) { | 220 | if (!p->ibs) { |
@@ -551,9 +555,6 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev, | |||
551 | struct amdgpu_ring *ring; | 555 | struct amdgpu_ring *ring; |
552 | int i, r; | 556 | int i, r; |
553 | 557 | ||
554 | if (parser->num_ibs == 0) | ||
555 | return 0; | ||
556 | |||
557 | /* Only for UVD/VCE VM emulation */ | 558 | /* Only for UVD/VCE VM emulation */ |
558 | for (i = 0; i < parser->num_ibs; i++) { | 559 | for (i = 0; i < parser->num_ibs; i++) { |
559 | ring = parser->ibs[i].ring; | 560 | ring = parser->ibs[i].ring; |
@@ -660,9 +661,6 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
660 | j++; | 661 | j++; |
661 | } | 662 | } |
662 | 663 | ||
663 | if (!parser->num_ibs) | ||
664 | return 0; | ||
665 | |||
666 | /* add GDS resources to first IB */ | 664 | /* add GDS resources to first IB */ |
667 | if (parser->bo_list) { | 665 | if (parser->bo_list) { |
668 | struct amdgpu_bo *gds = parser->bo_list->gds_obj; | 666 | struct amdgpu_bo *gds = parser->bo_list->gds_obj; |
@@ -705,9 +703,6 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
705 | struct amdgpu_ib *ib; | 703 | struct amdgpu_ib *ib; |
706 | int i, j, r; | 704 | int i, j, r; |
707 | 705 | ||
708 | if (!p->num_ibs) | ||
709 | return 0; | ||
710 | |||
711 | /* Add dependencies to first IB */ | 706 | /* Add dependencies to first IB */ |
712 | ib = &p->ibs[0]; | 707 | ib = &p->ibs[0]; |
713 | for (i = 0; i < p->nchunks; ++i) { | 708 | for (i = 0; i < p->nchunks; ++i) { |
@@ -866,8 +861,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
866 | if (r) | 861 | if (r) |
867 | goto out; | 862 | goto out; |
868 | 863 | ||
869 | if (parser.num_ibs) | 864 | r = amdgpu_cs_submit(&parser, cs); |
870 | r = amdgpu_cs_submit(&parser, cs); | ||
871 | 865 | ||
872 | out: | 866 | out: |
873 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); | 867 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); |