Message ID | 20200919193727.2093945-2-robdclark@gmail.com |
---|---|
State | New |
Headers | show |
Series | drm: commit_work scheduling | expand |
On Sat, 19 Sep 2020, Rob Clark <robdclark@gmail.com> wrote: > From: Rob Clark <robdclark@chromium.org> > > This will be used for non-block atomic commits. > > Signed-off-by: Rob Clark <robdclark@chromium.org> > --- > drivers/gpu/drm/drm_crtc.c | 11 +++++++++++ > include/drm/drm_crtc.h | 8 ++++++++ > 2 files changed, 19 insertions(+) > > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index aecdd7ea26dc..4f7c0bfce0a3 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -326,6 +326,14 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, > config->prop_out_fence_ptr, 0); > drm_object_attach_property(&crtc->base, > config->prop_vrr_enabled, 0); > + > + crtc->worker = kthread_create_worker(0, "%s-worker", crtc->name); > + if (IS_ERR(crtc->worker)) { > + drm_mode_object_unregister(dev, &crtc->base); > + ret = PTR_ERR(crtc->worker); > + crtc->worker = NULL; > + return ret; > + } > } > > return 0; > @@ -366,6 +374,9 @@ void drm_crtc_cleanup(struct drm_crtc *crtc) > > kfree(crtc->name); > > + if (crtc->worker) > + kthread_destroy_worker(crtc->worker); > + > memset(crtc, 0, sizeof(*crtc)); > } > EXPORT_SYMBOL(drm_crtc_cleanup); > diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h > index 59b51a09cae6..8964a3732bca 100644 > --- a/include/drm/drm_crtc.h > +++ b/include/drm/drm_crtc.h > @@ -30,6 +30,7 @@ > #include <linux/types.h> > #include <linux/fb.h> > #include <linux/hdmi.h> > +#include <linux/kthread.h> A forward declaration would suffice. > #include <linux/media-bus-format.h> > #include <uapi/drm/drm_mode.h> > #include <uapi/drm/drm_fourcc.h> > @@ -1172,6 +1173,13 @@ struct drm_crtc { > * Initialized via drm_self_refresh_helper_init(). > */ > struct drm_self_refresh_data *self_refresh_data; > + > + /** > + * worker: Missing @, should be "@worker:". > + * > + * Per-CRTC worker for nonblock atomic commits. > + */ > + struct kthread_worker *worker; > }; > > /**
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index aecdd7ea26dc..4f7c0bfce0a3 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -326,6 +326,14 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, config->prop_out_fence_ptr, 0); drm_object_attach_property(&crtc->base, config->prop_vrr_enabled, 0); + + crtc->worker = kthread_create_worker(0, "%s-worker", crtc->name); + if (IS_ERR(crtc->worker)) { + drm_mode_object_unregister(dev, &crtc->base); + ret = PTR_ERR(crtc->worker); + crtc->worker = NULL; + return ret; + } } return 0; @@ -366,6 +374,9 @@ void drm_crtc_cleanup(struct drm_crtc *crtc) kfree(crtc->name); + if (crtc->worker) + kthread_destroy_worker(crtc->worker); + memset(crtc, 0, sizeof(*crtc)); } EXPORT_SYMBOL(drm_crtc_cleanup); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 59b51a09cae6..8964a3732bca 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -30,6 +30,7 @@ #include <linux/types.h> #include <linux/fb.h> #include <linux/hdmi.h> +#include <linux/kthread.h> #include <linux/media-bus-format.h> #include <uapi/drm/drm_mode.h> #include <uapi/drm/drm_fourcc.h> @@ -1172,6 +1173,13 @@ struct drm_crtc { * Initialized via drm_self_refresh_helper_init(). */ struct drm_self_refresh_data *self_refresh_data; + + /** + * worker: + * + * Per-CRTC worker for nonblock atomic commits. + */ + struct kthread_worker *worker; }; /**