On Fri, Feb 07, 2020 at 03:36:49PM +0100, Noralf Trønnes wrote: > > > Den 07.02.2020 09.41, skrev Thomas Zimmermann: > > The simple-encoder helpers initialize an encoder with an empty > > implementation. This covers the requirements of most of the existing > > DRM drivers. A call to drm_simple_encoder_create() allocates and > > initializes an encoder instance, a call to drm_simple_encoder_init() > > initializes a pre-allocated instance. > > > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> > > --- > > drivers/gpu/drm/drm_encoder.c | 116 ++++++++++++++++++++++++++++++++++ > > include/drm/drm_encoder.h | 10 +++ > > 2 files changed, 126 insertions(+) > > > > diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c > > <snip> > > > +/** > > + * drm_simple_encoder_create - Allocate and initialize an encoder > > + * @dev: drm device > > + * @encoder_type: user visible type of the encoder > > + * @name: printf style format string for the encoder name, or NULL for > > + * default name > > + * > > + * Allocates and initialises an encoder that has no further functionality. The > > + * encoder will be released automatically. > > + * > > + * Returns: > > + * The encoder on success, a pointer-encoder error code on failure. > > + */ > > +struct drm_encoder *drm_simple_encoder_create(struct drm_device *dev, > > + int encoder_type, > > + const char *name, ...) > > +{ > > + char *namestr = NULL; > > + struct drm_encoder *encoder; > > + int ret; > > + > > + encoder = devm_kzalloc(dev->dev, sizeof(*encoder), GFP_KERNEL); > > The encoder can outlive the devres if the device is unbound when > userspace has open fds, so you can't use devm_ here. Ah yes great catch. Rule of thumb: Never use devm_ for any drm_* structure. It's wrong. There's a todo somewhere to essentially create a drm_managed set of apis where the cleanup matches the right lifetime - we need to only free/release drm resource at drm_driver->release time. -Daniel > > Noralf. > > > + if (!encoder) > > + return ERR_PTR(-ENOMEM); > > + > > + if (name) { > > + va_list ap; > > + > > + va_start(ap, name); > > + namestr = kvasprintf(GFP_KERNEL, name, ap); > > + va_end(ap); > > + if (!namestr) { > > + ret = -ENOMEM; > > + goto err_devm_kfree; > > + } > > + } > > + > > + ret = __drm_encoder_init(dev, encoder, > > + &drm_simple_encoder_funcs_destroy, > > + encoder_type, namestr); > > + if (ret) > > + goto err_kfree; > > + > > + return encoder; > > + > > +err_kfree: > > + if (name) > > + kfree(namestr); > > +err_devm_kfree: > > + devm_kfree(dev->dev, encoder); > > + return ERR_PTR(ret); > > +} > > +EXPORT_SYMBOL(drm_simple_encoder_create); > > + -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization