OSDN Git Service

drm/i915: Allow userspace to clone contexts on creation
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 21 May 2019 21:11:29 +0000 (22:11 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 22 May 2019 07:40:37 +0000 (08:40 +0100)
commitb81dde719439c8f09bb61e742ed95bfc4b33946b
treee2d4bb1ed5cbc358001b82e98c9795d4e102b517
parent8319f44c0525708c26ac7724da897cff3dbb0f84
drm/i915: Allow userspace to clone contexts on creation

A usecase arose out of handling context recovery in mesa, whereby they
wish to recreate a context with fresh logical state but preserving all
other details of the original. Currently, they create a new context and
iterate over which bits they want to copy across, but it would much more
convenient if they were able to just pass in a target context to clone
during creation. This essentially extends the setparam during creation
to pull the details from a target context instead of the user supplied
parameters.

The ideal here is that we don't expose control over anything more than
can be obtained via CONTEXT_PARAM. That is userspace retains explicit
control over all features, and this api is just convenience.

For example, you could replace

struct context_param p = { .param = CONTEXT_PARAM_VM };

param.ctx_id = old_id;
gem_context_get_param(&p.param);

new_id = gem_context_create();

param.ctx_id = new_id;
gem_context_set_param(&p.param);

gem_vm_destroy(param.value); /* drop the ref to VM_ID handle */

with

struct create_ext_param p = {
  { .name = CONTEXT_CREATE_CLONE },
  .clone_id = old_id,
  .flags = CLONE_FLAGS_VM
}
new_id = gem_context_create_ext(&p);

and not have to worry about stray namespace pollution etc.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190521211134.16117-5-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_context.c
include/uapi/drm/i915_drm.h