On 9/9/20 5:06 AM, Dmitry Osipenko wrote:
05.09.2020 13:34, Mikko Perttunen пишет:
+int tegra_drm_ioctl_channel_open(struct drm_device *drm, void *data,
+                                struct drm_file *file)
+{
+       struct tegra_drm_file *fpriv = file->driver_priv;
+       struct tegra_drm *tegra = drm->dev_private;
+       struct drm_tegra_channel_open *args = data;
+       struct tegra_drm_client *client = NULL;
+       struct tegra_drm_channel_ctx *ctx;
+       int err;
+
+       if (args->flags || args->reserved[0] || args->reserved[1])
+               return -EINVAL;
+
+       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       if (!ctx)
+               return -ENOMEM;
+
+       err = -ENODEV;
+       list_for_each_entry(client, &tegra->clients, list) {
+               if (client->base.class == args->host1x_class) {
+                       err = 0;
+                       break;
+               }
+       }
+       if (err)
+               goto free_ctx;
+
+       if (client->shared_channel) {
+               ctx->channel = host1x_channel_get(client->shared_channel);
+       } else {
+               ctx->channel = host1x_channel_request(&client->base);
+               if (!ctx->channel) {
+                       err = -EBUSY;
+                       goto free_ctx;
+               }
+       }
+
+       err = xa_alloc(&fpriv->contexts, &args->channel_ctx, ctx,
+                      XA_LIMIT(1, U32_MAX), GFP_KERNEL);
+       if (err < 0) {
+               mutex_unlock(&fpriv->lock);

Looks like the lock was never taken.

Thanks, will fix.


+               goto put_channel;
+       }
+
+       ctx->client = client;
+       xa_init_flags(&ctx->mappings, XA_FLAGS_ALLOC);

Why not XA_FLAGS_ALLOC1?


Will fix as well.

Mikko
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to