aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index baf00617fe90..27ef52847e6d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -609,7 +609,6 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
609 } 609 }
610 } 610 }
611 611
612 mutex_lock(&vm->mutex);
613 r = amdgpu_bo_vm_update_pte(parser, vm); 612 r = amdgpu_bo_vm_update_pte(parser, vm);
614 if (r) { 613 if (r) {
615 goto out; 614 goto out;
@@ -620,7 +619,6 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
620 parser->filp); 619 parser->filp);
621 620
622out: 621out:
623 mutex_unlock(&vm->mutex);
624 return r; 622 return r;
625} 623}
626 624
@@ -828,15 +826,14 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
828{ 826{
829 struct amdgpu_device *adev = dev->dev_private; 827 struct amdgpu_device *adev = dev->dev_private;
830 union drm_amdgpu_cs *cs = data; 828 union drm_amdgpu_cs *cs = data;
829 struct amdgpu_fpriv *fpriv = filp->driver_priv;
830 struct amdgpu_vm *vm = &fpriv->vm;
831 struct amdgpu_cs_parser *parser; 831 struct amdgpu_cs_parser *parser;
832 bool reserved_buffers = false; 832 bool reserved_buffers = false;
833 int i, r; 833 int i, r;
834 834
835 down_read(&adev->exclusive_lock); 835 if (!adev->accel_working)
836 if (!adev->accel_working) {
837 up_read(&adev->exclusive_lock);
838 return -EBUSY; 836 return -EBUSY;
839 }
840 837
841 parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0); 838 parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0);
842 if (!parser) 839 if (!parser)
@@ -844,12 +841,11 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
844 r = amdgpu_cs_parser_init(parser, data); 841 r = amdgpu_cs_parser_init(parser, data);
845 if (r) { 842 if (r) {
846 DRM_ERROR("Failed to initialize parser !\n"); 843 DRM_ERROR("Failed to initialize parser !\n");
847 kfree(parser); 844 amdgpu_cs_parser_fini(parser, r, false);
848 up_read(&adev->exclusive_lock);
849 r = amdgpu_cs_handle_lockup(adev, r); 845 r = amdgpu_cs_handle_lockup(adev, r);
850 return r; 846 return r;
851 } 847 }
852 848 mutex_lock(&vm->mutex);
853 r = amdgpu_cs_parser_relocs(parser); 849 r = amdgpu_cs_parser_relocs(parser);
854 if (r == -ENOMEM) 850 if (r == -ENOMEM)
855 DRM_ERROR("Not enough memory for command submission!\n"); 851 DRM_ERROR("Not enough memory for command submission!\n");
@@ -916,14 +912,14 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
916 912
917 mutex_unlock(&job->job_lock); 913 mutex_unlock(&job->job_lock);
918 amdgpu_cs_parser_fini_late(parser); 914 amdgpu_cs_parser_fini_late(parser);
919 up_read(&adev->exclusive_lock); 915 mutex_unlock(&vm->mutex);
920 return 0; 916 return 0;
921 } 917 }
922 918
923 cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence; 919 cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence;
924out: 920out:
925 amdgpu_cs_parser_fini(parser, r, reserved_buffers); 921 amdgpu_cs_parser_fini(parser, r, reserved_buffers);
926 up_read(&adev->exclusive_lock); 922 mutex_unlock(&vm->mutex);
927 r = amdgpu_cs_handle_lockup(adev, r); 923 r = amdgpu_cs_handle_lockup(adev, r);
928 return r; 924 return r;
929} 925}