Commit 230630bd authored by Thierry Reding's avatar Thierry Reding
Browse files

drm/tegra: gr3d: Properly clean up resources



Failure to register the Tegra DRM client would leak the resources. Move
cleanup code to error unwinding gotos to fix that and share the cleanup
code with the other error paths.

Reviewed-by: default avatarDmitry Osipenko <digetx@gmail.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent dd99b4b4
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -52,8 +52,9 @@ static int gr3d_init(struct host1x_client *client)

	client->syncpts[0] = host1x_syncpt_request(client, flags);
	if (!client->syncpts[0]) {
		host1x_channel_put(gr3d->channel);
		return -ENOMEM;
		err = -ENOMEM;
		dev_err(client->dev, "failed to request syncpoint: %d\n", err);
		goto put;
	}

	if (tegra->domain) {
@@ -65,15 +66,30 @@ static int gr3d_init(struct host1x_client *client)
				dev_err(client->dev,
					"failed to attach to domain: %d\n",
					err);
				host1x_syncpt_free(client->syncpts[0]);
				host1x_channel_put(gr3d->channel);
				iommu_group_put(gr3d->group);
				return err;
				goto free;
			}
		}
	}

	return tegra_drm_register_client(dev->dev_private, drm);
	err = tegra_drm_register_client(dev->dev_private, drm);
	if (err < 0) {
		dev_err(client->dev, "failed to register client: %d\n", err);
		goto detach;
	}

	return 0;

detach:
	if (gr3d->group) {
		iommu_detach_group(tegra->domain, gr3d->group);
		iommu_group_put(gr3d->group);
	}
free:
	host1x_syncpt_free(client->syncpts[0]);
put:
	host1x_channel_put(gr3d->channel);
	return err;
}

static int gr3d_exit(struct host1x_client *client)