Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: Push dirtyfb ioctl kms locking down to drivers

Not all drivers will need take all the modeset locks for dirtyfb, so
push the locking down to the drivers.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Ville Syrjälä and committed by
Dave Airlie
73e9efd4 ee61c730

+37 -8
-2
drivers/gpu/drm/drm_crtc.c
··· 2767 2767 } 2768 2768 2769 2769 if (fb->funcs->dirty) { 2770 - drm_modeset_lock_all(dev); 2771 2770 ret = fb->funcs->dirty(fb, file_priv, flags, r->color, 2772 2771 clips, num_clips); 2773 - drm_modeset_unlock_all(dev); 2774 2772 } else { 2775 2773 ret = -ENOSYS; 2776 2774 }
+4
drivers/gpu/drm/omapdrm/omap_fb.c
··· 123 123 { 124 124 int i; 125 125 126 + drm_modeset_lock_all(fb->dev); 127 + 126 128 for (i = 0; i < num_clips; i++) { 127 129 omap_framebuffer_flush(fb, clips[i].x1, clips[i].y1, 128 130 clips[i].x2 - clips[i].x1, 129 131 clips[i].y2 - clips[i].y1); 130 132 } 133 + 134 + drm_modeset_unlock_all(fb->dev); 131 135 132 136 return 0; 133 137 }
+8 -1
drivers/gpu/drm/qxl/qxl_display.c
··· 399 399 struct qxl_bo *qobj; 400 400 int inc = 1; 401 401 402 + drm_modeset_lock_all(fb->dev); 403 + 402 404 qobj = gem_to_qxl_bo(qxl_fb->obj); 403 405 /* if we aren't primary surface ignore this */ 404 - if (!qobj->is_primary) 406 + if (!qobj->is_primary) { 407 + drm_modeset_unlock_all(fb->dev); 405 408 return 0; 409 + } 406 410 407 411 if (!num_clips) { 408 412 num_clips = 1; ··· 421 417 422 418 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color, 423 419 clips, num_clips, inc); 420 + 421 + drm_modeset_unlock_all(fb->dev); 422 + 424 423 return 0; 425 424 } 426 425
+9 -3
drivers/gpu/drm/udl/udl_fb.c
··· 403 403 int i; 404 404 int ret = 0; 405 405 406 + drm_modeset_lock_all(fb->dev); 407 + 406 408 if (!ufb->active_16) 407 - return 0; 409 + goto unlock; 408 410 409 411 if (ufb->obj->base.import_attach) { 410 412 ret = dma_buf_begin_cpu_access(ufb->obj->base.import_attach->dmabuf, 411 413 0, ufb->obj->base.size, 412 414 DMA_FROM_DEVICE); 413 415 if (ret) 414 - return ret; 416 + goto unlock; 415 417 } 416 418 417 419 for (i = 0; i < num_clips; i++) { ··· 421 419 clips[i].x2 - clips[i].x1, 422 420 clips[i].y2 - clips[i].y1); 423 421 if (ret) 424 - break; 422 + goto unlock; 425 423 } 426 424 427 425 if (ufb->obj->base.import_attach) { ··· 429 427 0, ufb->obj->base.size, 430 428 DMA_FROM_DEVICE); 431 429 } 430 + 431 + unlock: 432 + drm_modeset_unlock_all(fb->dev); 433 + 432 434 return ret; 433 435 } 434 436
+16 -2
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
··· 609 609 if (!dev_priv->sou_priv) 610 610 return -EINVAL; 611 611 612 + drm_modeset_lock_all(dev_priv->dev); 613 + 612 614 ret = ttm_read_lock(&vmaster->lock, true); 613 - if (unlikely(ret != 0)) 615 + if (unlikely(ret != 0)) { 616 + drm_modeset_unlock_all(dev_priv->dev); 614 617 return ret; 618 + } 615 619 616 620 if (!num_clips) { 617 621 num_clips = 1; ··· 633 629 clips, num_clips, inc, NULL); 634 630 635 631 ttm_read_unlock(&vmaster->lock); 632 + 633 + drm_modeset_unlock_all(dev_priv->dev); 634 + 636 635 return 0; 637 636 } 638 637 ··· 960 953 struct drm_clip_rect norect; 961 954 int ret, increment = 1; 962 955 956 + drm_modeset_lock_all(dev_priv->dev); 957 + 963 958 ret = ttm_read_lock(&vmaster->lock, true); 964 - if (unlikely(ret != 0)) 959 + if (unlikely(ret != 0)) { 960 + drm_modeset_unlock_all(dev_priv->dev); 965 961 return ret; 962 + } 966 963 967 964 if (!num_clips) { 968 965 num_clips = 1; ··· 990 979 } 991 980 992 981 ttm_read_unlock(&vmaster->lock); 982 + 983 + drm_modeset_unlock_all(dev_priv->dev); 984 + 993 985 return ret; 994 986 } 995 987