提交 dd99b4b4 编写于 作者: T Thierry Reding

drm/tegra: gr2d: 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: NDmitry Osipenko <digetx@gmail.com>
Signed-off-by: NThierry Reding <treding@nvidia.com>
上级 fd5ec0dc
...@@ -42,8 +42,9 @@ static int gr2d_init(struct host1x_client *client) ...@@ -42,8 +42,9 @@ static int gr2d_init(struct host1x_client *client)
client->syncpts[0] = host1x_syncpt_request(client, flags); client->syncpts[0] = host1x_syncpt_request(client, flags);
if (!client->syncpts[0]) { if (!client->syncpts[0]) {
host1x_channel_put(gr2d->channel); err = -ENOMEM;
return -ENOMEM; dev_err(client->dev, "failed to request syncpoint: %d\n", err);
goto put;
} }
if (tegra->domain) { if (tegra->domain) {
...@@ -55,15 +56,30 @@ static int gr2d_init(struct host1x_client *client) ...@@ -55,15 +56,30 @@ static int gr2d_init(struct host1x_client *client)
dev_err(client->dev, dev_err(client->dev,
"failed to attach to domain: %d\n", "failed to attach to domain: %d\n",
err); err);
host1x_syncpt_free(client->syncpts[0]);
host1x_channel_put(gr2d->channel);
iommu_group_put(gr2d->group); iommu_group_put(gr2d->group);
return err; goto free;
} }
} }
} }
return tegra_drm_register_client(tegra, drm); err = tegra_drm_register_client(tegra, drm);
if (err < 0) {
dev_err(client->dev, "failed to register client: %d\n", err);
goto detach;
}
return 0;
detach:
if (gr2d->group) {
iommu_detach_group(tegra->domain, gr2d->group);
iommu_group_put(gr2d->group);
}
free:
host1x_syncpt_free(client->syncpts[0]);
put:
host1x_channel_put(gr2d->channel);
return err;
} }
static int gr2d_exit(struct host1x_client *client) static int gr2d_exit(struct host1x_client *client)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册