drm: Handle dev->unique with drmm_
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 23 Mar 2020 14:49:19 +0000 (15:49 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 26 Mar 2020 14:36:20 +0000 (15:36 +0100)
We need to add a drmm_kstrdup for this, but let's start somewhere.

This is not exactly perfect onion unwinding, but it's jsut a kfree so
doesn't really matter at all.

Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200323144950.3018436-21-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_managed.c
include/drm/drm_managed.h

index 70d89752edd60c0f92583cc2940a22566c58eaa9..7e01e8c1804145008e55c14892ba80af8b568a5d 100644 (file)
@@ -777,7 +777,6 @@ void drm_dev_fini(struct drm_device *dev)
        mutex_destroy(&dev->filelist_mutex);
        mutex_destroy(&dev->struct_mutex);
        drm_legacy_destroy_members(dev);
-       kfree(dev->unique);
 }
 EXPORT_SYMBOL(drm_dev_fini);
 
@@ -1059,8 +1058,8 @@ EXPORT_SYMBOL(drm_dev_unregister);
  */
 int drm_dev_set_unique(struct drm_device *dev, const char *name)
 {
-       kfree(dev->unique);
-       dev->unique = kstrdup(name, GFP_KERNEL);
+       drmm_kfree(dev, dev->unique);
+       dev->unique = drmm_kstrdup(dev, name, GFP_KERNEL);
 
        return dev->unique ? 0 : -ENOMEM;
 }
index 46d679b66e4d9ab873ca7d4ce228dca6201249d5..6bce1c892df3d18e92fb2c72cc51eea18726f685 100644 (file)
@@ -167,6 +167,22 @@ void *drmm_kmalloc(struct drm_device *dev, size_t size, gfp_t gfp)
 }
 EXPORT_SYMBOL(drmm_kmalloc);
 
+char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp)
+{
+       size_t size;
+       char *buf;
+
+       if (!s)
+               return NULL;
+
+       size = strlen(s) + 1;
+       buf = drmm_kmalloc(dev, size, gfp);
+       if (buf)
+               memcpy(buf, s, size);
+       return buf;
+}
+EXPORT_SYMBOL_GPL(drmm_kstrdup);
+
 void drmm_kfree(struct drm_device *dev, void *data)
 {
        struct drmres *dr_match = NULL, *dr;
index 7b5df7d09b197e604d3101321e81940b6b86a623..89e6fce9f689466edc743ee4b42083b26033f75f 100644 (file)
@@ -24,6 +24,7 @@ static inline void *drmm_kzalloc(struct drm_device *dev, size_t size, gfp_t gfp)
 {
        return drmm_kmalloc(dev, size, gfp | __GFP_ZERO);
 }
+char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp);
 
 void drmm_kfree(struct drm_device *dev, void *data);