diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 18 |
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 | ||
622 | out: | 621 | out: |
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; |
924 | out: | 920 | out: |
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 | } |