Message ID | 20250413-msm-gpu-split-v1-1-1132f4b616c7@oss.qualcomm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | drm/msm: rework the ties between KMS and GPU parts of the driver | expand |
On Sun, Apr 13, 2025 at 9:33 AM Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> wrote: > > The global workqueue is only used for vblanks inside KMS code. Move > allocation / flushing / deallcation of it to msm_kms.c Maybe we should also just move the wq into struct msm_kms? BR, -R > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> > --- > drivers/gpu/drm/msm/msm_drv.c | 21 ++------------------- > drivers/gpu/drm/msm/msm_kms.c | 16 +++++++++++++++- > 2 files changed, 17 insertions(+), 20 deletions(-) > > diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c > index c3588dc9e53764a27efda1901b094724cec8928a..02beb40eb9146941aa43862d07a6d82ae21c965e 100644 > --- a/drivers/gpu/drm/msm/msm_drv.c > +++ b/drivers/gpu/drm/msm/msm_drv.c > @@ -82,13 +82,6 @@ static int msm_drm_uninit(struct device *dev) > drm_atomic_helper_shutdown(ddev); > } > > - /* We must cancel and cleanup any pending vblank enable/disable > - * work before msm_irq_uninstall() to avoid work re-enabling an > - * irq after uninstall has disabled it. > - */ > - > - flush_workqueue(priv->wq); > - > msm_gem_shrinker_cleanup(ddev); > > msm_perf_debugfs_cleanup(priv); > @@ -104,8 +97,6 @@ static int msm_drm_uninit(struct device *dev) > ddev->dev_private = NULL; > drm_dev_put(ddev); > > - destroy_workqueue(priv->wq); > - > return 0; > } > > @@ -227,12 +218,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) > ddev->dev_private = priv; > priv->dev = ddev; > > - priv->wq = alloc_ordered_workqueue("msm", 0); > - if (!priv->wq) { > - ret = -ENOMEM; > - goto err_put_dev; > - } > - > INIT_LIST_HEAD(&priv->objects); > mutex_init(&priv->obj_lock); > > @@ -253,12 +238,12 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) > if (priv->kms_init) { > ret = drmm_mode_config_init(ddev); > if (ret) > - goto err_destroy_wq; > + goto err_put_dev; > } > > ret = msm_init_vram(ddev); > if (ret) > - goto err_destroy_wq; > + goto err_put_dev; > > dma_set_max_seg_size(dev, UINT_MAX); > > @@ -304,8 +289,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) > > err_deinit_vram: > msm_deinit_vram(ddev); > -err_destroy_wq: > - destroy_workqueue(priv->wq); > err_put_dev: > drm_dev_put(ddev); > > diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c > index 35d5397e73b4c5cb90b1770e8570277e782be7ec..821f0b9f968fc3d448e612bfae04639ceb770353 100644 > --- a/drivers/gpu/drm/msm/msm_kms.c > +++ b/drivers/gpu/drm/msm/msm_kms.c > @@ -227,6 +227,13 @@ void msm_drm_kms_uninit(struct device *dev) > > BUG_ON(!kms); > > + /* We must cancel and cleanup any pending vblank enable/disable > + * work before msm_irq_uninstall() to avoid work re-enabling an > + * irq after uninstall has disabled it. > + */ > + > + flush_workqueue(priv->wq); > + > /* clean up event worker threads */ > for (i = 0; i < priv->num_crtcs; i++) { > if (priv->event_thread[i].worker) > @@ -243,6 +250,8 @@ void msm_drm_kms_uninit(struct device *dev) > > if (kms && kms->funcs) > kms->funcs->destroy(kms); > + > + destroy_workqueue(priv->wq); > } > > int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) > @@ -258,10 +267,14 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) > if (ret) > return ret; > > + priv->wq = alloc_ordered_workqueue("msm", 0); > + if (!priv->wq) > + return -ENOMEM; > + > ret = priv->kms_init(ddev); > if (ret) { > DRM_DEV_ERROR(dev, "failed to load kms\n"); > - return ret; > + goto err_msm_uninit; > } > > /* Enable normalization of plane zpos */ > @@ -319,6 +332,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) > return 0; > > err_msm_uninit: > + destroy_workqueue(priv->wq); > return ret; > } > > > -- > 2.39.5 >
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index c3588dc9e53764a27efda1901b094724cec8928a..02beb40eb9146941aa43862d07a6d82ae21c965e 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -82,13 +82,6 @@ static int msm_drm_uninit(struct device *dev) drm_atomic_helper_shutdown(ddev); } - /* We must cancel and cleanup any pending vblank enable/disable - * work before msm_irq_uninstall() to avoid work re-enabling an - * irq after uninstall has disabled it. - */ - - flush_workqueue(priv->wq); - msm_gem_shrinker_cleanup(ddev); msm_perf_debugfs_cleanup(priv); @@ -104,8 +97,6 @@ static int msm_drm_uninit(struct device *dev) ddev->dev_private = NULL; drm_dev_put(ddev); - destroy_workqueue(priv->wq); - return 0; } @@ -227,12 +218,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) ddev->dev_private = priv; priv->dev = ddev; - priv->wq = alloc_ordered_workqueue("msm", 0); - if (!priv->wq) { - ret = -ENOMEM; - goto err_put_dev; - } - INIT_LIST_HEAD(&priv->objects); mutex_init(&priv->obj_lock); @@ -253,12 +238,12 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) if (priv->kms_init) { ret = drmm_mode_config_init(ddev); if (ret) - goto err_destroy_wq; + goto err_put_dev; } ret = msm_init_vram(ddev); if (ret) - goto err_destroy_wq; + goto err_put_dev; dma_set_max_seg_size(dev, UINT_MAX); @@ -304,8 +289,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) err_deinit_vram: msm_deinit_vram(ddev); -err_destroy_wq: - destroy_workqueue(priv->wq); err_put_dev: drm_dev_put(ddev); diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c index 35d5397e73b4c5cb90b1770e8570277e782be7ec..821f0b9f968fc3d448e612bfae04639ceb770353 100644 --- a/drivers/gpu/drm/msm/msm_kms.c +++ b/drivers/gpu/drm/msm/msm_kms.c @@ -227,6 +227,13 @@ void msm_drm_kms_uninit(struct device *dev) BUG_ON(!kms); + /* We must cancel and cleanup any pending vblank enable/disable + * work before msm_irq_uninstall() to avoid work re-enabling an + * irq after uninstall has disabled it. + */ + + flush_workqueue(priv->wq); + /* clean up event worker threads */ for (i = 0; i < priv->num_crtcs; i++) { if (priv->event_thread[i].worker) @@ -243,6 +250,8 @@ void msm_drm_kms_uninit(struct device *dev) if (kms && kms->funcs) kms->funcs->destroy(kms); + + destroy_workqueue(priv->wq); } int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) @@ -258,10 +267,14 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) if (ret) return ret; + priv->wq = alloc_ordered_workqueue("msm", 0); + if (!priv->wq) + return -ENOMEM; + ret = priv->kms_init(ddev); if (ret) { DRM_DEV_ERROR(dev, "failed to load kms\n"); - return ret; + goto err_msm_uninit; } /* Enable normalization of plane zpos */ @@ -319,6 +332,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) return 0; err_msm_uninit: + destroy_workqueue(priv->wq); return ret; }
The global workqueue is only used for vblanks inside KMS code. Move allocation / flushing / deallcation of it to msm_kms.c Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> --- drivers/gpu/drm/msm/msm_drv.c | 21 ++------------------- drivers/gpu/drm/msm/msm_kms.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 20 deletions(-)