aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-01-31 05:32:04 -0500
committerAlex Deucher <alexander.deucher@amd.com>2016-02-10 14:17:18 -0500
commit4acabfe3793eb9bf89f71cc0cef23dfb2a812916 (patch)
tree6f7264b6be02983e133060311790a54db7ce3fbd /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent867d0517c705d9ae5a21f566ffe2308f5c070c6c (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.c16
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
872out: 866out:
873 amdgpu_cs_parser_fini(&parser, r, reserved_buffers); 867 amdgpu_cs_parser_fini(&parser, r, reserved_buffers);