On Fri, Jul 23, 2021 at 11:12:49AM +0800, lichenyang wrote:
+static int loongson_drm_load(struct drm_device *dev) +{
- struct loongson_device *ldev;
- int ret;
- ldev = devm_kzalloc(dev->dev, sizeof(*ldev), GFP_KERNEL);
- if (!ldev)
return -ENOMEM;
- dev->dev_private = ldev;
- ldev->dev = dev;
- ret = loongson_device_init(dev);
- if (ret)
goto err;
- ret = drmm_vram_helper_init(dev, ldev->vram_start, ldev->vram_size);
- if (ret) {
drm_err(dev, "Error initializing vram %d\n", ret);
goto err;
- }
- drm_mode_config_init(dev);
- dev->mode_config.funcs = (void *)&loongson_mode_funcs;
- dev->mode_config.min_width = 1;
- dev->mode_config.min_height = 1;
- dev->mode_config.max_width = 4096;
- dev->mode_config.max_height = 4096;
- dev->mode_config.preferred_depth = 32;
- dev->mode_config.prefer_shadow = 1;
- dev->mode_config.fb_base = ldev->vram_start;
- ret = loongson_modeset_init(ldev);
- if (ret) {
drm_err(dev, "Fatal error during modeset init: %d\n", ret);
goto err;
- }
- drm_kms_helper_poll_init(dev);
- drm_mode_config_reset(dev);
- return 0;
+err:
- kfree(ldev);
I'm sorry, in the earlier version I told you to add this kfree() but this is devm_ allocated so the kfree() is wrong and will lead to a double free. My bad. That's on me.
- drm_err(dev, "failed to initialize drm driver: %d\n", ret);
- return ret;
+}
regards, dan carpenter