Commit ca02a011 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin
Browse files

drm/i915: Record which client owns a VM



To enable accounting of indirect client memory usage (such as page tables)
in the following patch, lets start recording the creator of each PPGTT.

Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarAravind Iddamsetty <aravind.iddamsetty@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231107101806.608990-2-tvrtko.ursulin@linux.intel.com
parent e4ae85e3
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -279,7 +279,8 @@ static int proto_context_set_protected(struct drm_i915_private *i915,
}

static struct i915_gem_proto_context *
proto_context_create(struct drm_i915_private *i915, unsigned int flags)
proto_context_create(struct drm_i915_file_private *fpriv,
		     struct drm_i915_private *i915, unsigned int flags)
{
	struct i915_gem_proto_context *pc, *err;

@@ -287,6 +288,7 @@ proto_context_create(struct drm_i915_private *i915, unsigned int flags)
	if (!pc)
		return ERR_PTR(-ENOMEM);

	pc->fpriv = fpriv;
	pc->num_user_engines = -1;
	pc->user_engines = NULL;
	pc->user_flags = BIT(UCONTEXT_BANNABLE) |
@@ -1622,6 +1624,7 @@ i915_gem_create_context(struct drm_i915_private *i915,
			err = PTR_ERR(ppgtt);
			goto err_ctx;
		}
		ppgtt->vm.fpriv = pc->fpriv;
		vm = &ppgtt->vm;
	}
	if (vm)
@@ -1741,7 +1744,7 @@ int i915_gem_context_open(struct drm_i915_private *i915,
	/* 0 reserved for invalid/unassigned ppgtt */
	xa_init_flags(&file_priv->vm_xa, XA_FLAGS_ALLOC1);

	pc = proto_context_create(i915, 0);
	pc = proto_context_create(file_priv, i915, 0);
	if (IS_ERR(pc)) {
		err = PTR_ERR(pc);
		goto err;
@@ -1823,6 +1826,7 @@ int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,

	GEM_BUG_ON(id == 0); /* reserved for invalid/unassigned ppgtt */
	args->vm_id = id;
	ppgtt->vm.fpriv = file_priv;
	return 0;

err_put:
@@ -2285,7 +2289,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
		return -EIO;
	}

	ext_data.pc = proto_context_create(i915, args->flags);
	ext_data.pc = proto_context_create(file->driver_priv, i915,
					   args->flags);
	if (IS_ERR(ext_data.pc))
		return PTR_ERR(ext_data.pc);

+3 −0
Original line number Diff line number Diff line
@@ -188,6 +188,9 @@ struct i915_gem_proto_engine {
 * CONTEXT_CREATE_SET_PARAM during GEM_CONTEXT_CREATE.
 */
struct i915_gem_proto_context {
	/** @fpriv: Client which creates the context */
	struct drm_i915_file_private *fpriv;

	/** @vm: See &i915_gem_context.vm */
	struct i915_address_space *vm;

+2 −2
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ live_context(struct drm_i915_private *i915, struct file *file)
	int err;
	u32 id;

	pc = proto_context_create(i915, 0);
	pc = proto_context_create(fpriv, i915, 0);
	if (IS_ERR(pc))
		return ERR_CAST(pc);

@@ -152,7 +152,7 @@ kernel_context(struct drm_i915_private *i915,
	struct i915_gem_context *ctx;
	struct i915_gem_proto_context *pc;

	pc = proto_context_create(i915, 0);
	pc = proto_context_create(NULL, i915, 0);
	if (IS_ERR(pc))
		return ERR_CAST(pc);

+1 −0
Original line number Diff line number Diff line
@@ -255,6 +255,7 @@ struct i915_address_space {
	} rsvd;
	struct intel_gt *gt;
	struct drm_i915_private *i915;
	struct drm_i915_file_private *fpriv;
	struct device *dma;
	u64 total;		/* size addr space maps (ex. 2GB for ggtt) */
	u64 reserved;		/* size addr space reserved */