05.09.2020 13:34, Mikko Perttunen пишет: > +int tegra_drm_ioctl_channel_submit(struct drm_device *drm, void *data, > + struct drm_file *file) > +{ > + struct tegra_drm_file *fpriv = file->driver_priv; > + struct drm_tegra_channel_submit *args = data; > + struct drm_tegra_submit_syncpt_incr incr; > + struct tegra_drm_job_data *job_data; > + struct ww_acquire_ctx acquire_ctx; > + struct tegra_drm_channel_ctx *ctx; > + struct host1x_job *job; > + struct gather_bo *bo; > + u32 i; > + int err; > + > + if (args->reserved[0] || args->reserved[1] || args->reserved[2] || > + args->reserved[3]) > + return -EINVAL; > + > + ctx = tegra_drm_channel_ctx_lock(fpriv, args->channel_ctx); > + if (!ctx) > + return -EINVAL; > + > + err = submit_copy_gather_data(drm, &bo, args); > + if (err) > + goto unlock; > + > + job_data = kzalloc(sizeof(*job_data), GFP_KERNEL); > + if (!job_data) { > + err = -ENOMEM; > + goto put_bo; > + } > + > + err = submit_process_bufs(drm, bo, job_data, ctx, args, &acquire_ctx); > + if (err) > + goto free_job_data; > + > + err = submit_create_job(drm, &job, bo, ctx, args, file); > + if (err) > + goto free_job_data; > + > + err = submit_handle_syncpts(drm, job, &incr, args); > + if (err) > + goto put_job; How many sync points would use an average job? Maybe it should be better to have the predefined array of sync points within the struct drm_tegra_channel_submit?