drm/vmwgfx: Fix a couple of lock dependency violations
Subsystems (3)
PATCH 1/2 drm/vmwgfx: Fix a couple of lock dependency violations
Experimental lockdep annotation added to the TTM lock has unveiled a couple of lock dependency violations in the vmwgfx driver. In both cases it turns out that the device_private::reservation_sem is not needed so the offending code is moved out of that lock.
Cc <[email protected]>
Acked-by Sinclair Yeh <[email protected]>
Signed-off-by Thomas Hellstrom <[email protected]>
--- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 8 +++----- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 14 +++----------- 2 files changed, 6 insertions(+), 16 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +3 -5
@@ -2780,13 +2780,11 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,NULL , arg->command_size, arg->throttle_us, (void __user *)(unsigned long )arg->fence_rep, NULL); - +ttm_read_unlock (&dev_priv->reservation_sem);if (unlikely (ret !=0 )) - goto out_unlock; +return ret;vmw_kms_cursor_post_execbuf (dev_priv); -out_unlock: -ttm_read_unlock (&dev_priv->reservation_sem); -return ret; +return 0 ; }
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +3 -11
@@ -2033,23 +2033,17 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,int i;struct drm_mode_config *mode_config = &dev->mode_config; - ret =ttm_read_lock (&dev_priv->reservation_sem, true); -if (unlikely (ret !=0 )) -return ret; -if (!arg->num_outputs) {struct drm_vmw_rect def_rect = {0 ,0 ,800 ,600 };vmw_du_update_layout (dev_priv,1 , &def_rect); - goto out_unlock; +return 0 ; } rects_size = arg->num_outputs *sizeof (struct drm_vmw_rect ); rects =kcalloc (arg->num_outputs,sizeof (struct drm_vmw_rect ),GFP_KERNEL ); -if (unlikely (!rects)) { - ret = -ENOMEM ; - goto out_unlock; - } +if (unlikely (!rects)) +return -ENOMEM ; user_rects = (void __user *)(unsigned long )arg->rects; ret =copy_from_user (rects, user_rects, rects_size);
@@ -2074,7 +2068,5 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, out_free:kfree (rects); -out_unlock: -ttm_read_unlock (&dev_priv->reservation_sem);return ret; }
Signature · 6 lines
2.1.0 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 2/2 drm/vmwgfx: Reorder device takedown somewhat
To take down the MOB and GMR memory types, the driver may have to issue fence objects and thus make sure that the fence manager is taken down after those memory types.
Reorder device init accordingly.
Cc <[email protected]>
Signed-off-by Thomas Hellstrom <[email protected]>
Reviewed-by Sinclair Yeh <[email protected]>
--- drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 77 +++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 37 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +40 -37
@@ -725,32 +725,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) goto out_err1; } - ret =ttm_bo_init_mm (&dev_priv->bdev,TTM_PL_VRAM , - (dev_priv->vram_size >>PAGE_SHIFT )); -if (unlikely (ret !=0 )) { -DRM_ERROR ("Failed initializing memory manager for VRAM.\n" ); - goto out_err2; - } - - dev_priv->has_gmr = true; -if (((dev_priv->capabilities & (SVGA_CAP_GMR |SVGA_CAP_GMR2 )) ==0 ) || - refuse_dma ||ttm_bo_init_mm (&dev_priv->bdev,VMW_PL_GMR , -VMW_PL_GMR ) !=0 ) { -DRM_INFO ("No GMR memory available. " -"Graphics memory resources are very limited.\n" ); - dev_priv->has_gmr = false; - } - -if (dev_priv->capabilities &SVGA_CAP_GBOBJECTS ) { - dev_priv->has_mob = true; -if (ttm_bo_init_mm (&dev_priv->bdev,VMW_PL_MOB , -VMW_PL_MOB ) !=0 ) { -DRM_INFO ("No MOB memory available. " -"3D will be disabled.\n" ); - dev_priv->has_mob = false; - } - } - dev_priv->mmio_mtrr =arch_phys_wc_add (dev_priv->mmio_start, dev_priv->mmio_size);
@@ -813,6 +787,33 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) goto out_no_fman; } + + ret =ttm_bo_init_mm (&dev_priv->bdev,TTM_PL_VRAM , + (dev_priv->vram_size >>PAGE_SHIFT )); +if (unlikely (ret !=0 )) { +DRM_ERROR ("Failed initializing memory manager for VRAM.\n" ); + goto out_no_vram; + } + + dev_priv->has_gmr = true; +if (((dev_priv->capabilities & (SVGA_CAP_GMR |SVGA_CAP_GMR2 )) ==0 ) || + refuse_dma ||ttm_bo_init_mm (&dev_priv->bdev,VMW_PL_GMR , +VMW_PL_GMR ) !=0 ) { +DRM_INFO ("No GMR memory available. " +"Graphics memory resources are very limited.\n" ); + dev_priv->has_gmr = false; + } + +if (dev_priv->capabilities &SVGA_CAP_GBOBJECTS ) { + dev_priv->has_mob = true; +if (ttm_bo_init_mm (&dev_priv->bdev,VMW_PL_MOB , +VMW_PL_MOB ) !=0 ) { +DRM_INFO ("No MOB memory available. " +"3D will be disabled.\n" ); + dev_priv->has_mob = false; + } + } +vmw_kms_save_vga (dev_priv);/* Start kms and overlay systems, needs fifo. */
@@ -838,6 +839,12 @@ out_no_fifo:vmw_kms_close (dev_priv); out_no_kms:vmw_kms_restore_vga (dev_priv); +if (dev_priv->has_mob) + (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_MOB ); +if (dev_priv->has_gmr) + (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_GMR ); + (void )ttm_bo_clean_mm (&dev_priv->bdev,TTM_PL_VRAM ); +out_no_vram:vmw_fence_manager_takedown (dev_priv->fman); out_no_fman:if (dev_priv->capabilities &SVGA_CAP_IRQMASK )
@@ -853,12 +860,6 @@ out_err4:iounmap (dev_priv->mmio_virt); out_err3:arch_phys_wc_del (dev_priv->mmio_mtrr); -if (dev_priv->has_mob) - (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_MOB ); -if (dev_priv->has_gmr) - (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_GMR ); - (void )ttm_bo_clean_mm (&dev_priv->bdev,TTM_PL_VRAM ); -out_err2: (void )ttm_bo_device_release (&dev_priv->bdev); out_err1:vmw_ttm_global_release (dev_priv);
@@ -887,6 +888,13 @@ static int vmw_driver_unload(struct drm_device *dev) }vmw_kms_close (dev_priv);vmw_overlay_close (dev_priv); + +if (dev_priv->has_mob) + (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_MOB ); +if (dev_priv->has_gmr) + (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_GMR ); + (void )ttm_bo_clean_mm (&dev_priv->bdev,TTM_PL_VRAM ); +vmw_fence_manager_takedown (dev_priv->fman);if (dev_priv->capabilities &SVGA_CAP_IRQMASK )drm_irq_uninstall (dev_priv->dev);
@@ -898,11 +906,6 @@ static int vmw_driver_unload(struct drm_device *dev)ttm_object_device_release (&dev_priv->tdev);iounmap (dev_priv->mmio_virt);arch_phys_wc_del (dev_priv->mmio_mtrr); -if (dev_priv->has_mob) - (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_MOB ); -if (dev_priv->has_gmr) - (void )ttm_bo_clean_mm (&dev_priv->bdev,VMW_PL_GMR ); - (void )ttm_bo_clean_mm (&dev_priv->bdev,TTM_PL_VRAM ); (void )ttm_bo_device_release (&dev_priv->bdev);vmw_ttm_global_release (dev_priv);
Signature · 1 line
2.1.0