Commit ca02a011 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin

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
...@@ -279,7 +279,8 @@ static int proto_context_set_protected(struct drm_i915_private *i915, ...@@ -279,7 +279,8 @@ static int proto_context_set_protected(struct drm_i915_private *i915,
} }
static struct i915_gem_proto_context * 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; struct i915_gem_proto_context *pc, *err;
...@@ -287,6 +288,7 @@ proto_context_create(struct drm_i915_private *i915, unsigned int flags) ...@@ -287,6 +288,7 @@ proto_context_create(struct drm_i915_private *i915, unsigned int flags)
if (!pc) if (!pc)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
pc->fpriv = fpriv;
pc->num_user_engines = -1; pc->num_user_engines = -1;
pc->user_engines = NULL; pc->user_engines = NULL;
pc->user_flags = BIT(UCONTEXT_BANNABLE) | pc->user_flags = BIT(UCONTEXT_BANNABLE) |
...@@ -1622,6 +1624,7 @@ i915_gem_create_context(struct drm_i915_private *i915, ...@@ -1622,6 +1624,7 @@ i915_gem_create_context(struct drm_i915_private *i915,
err = PTR_ERR(ppgtt); err = PTR_ERR(ppgtt);
goto err_ctx; goto err_ctx;
} }
ppgtt->vm.fpriv = pc->fpriv;
vm = &ppgtt->vm; vm = &ppgtt->vm;
} }
if (vm) if (vm)
...@@ -1741,7 +1744,7 @@ int i915_gem_context_open(struct drm_i915_private *i915, ...@@ -1741,7 +1744,7 @@ int i915_gem_context_open(struct drm_i915_private *i915,
/* 0 reserved for invalid/unassigned ppgtt */ /* 0 reserved for invalid/unassigned ppgtt */
xa_init_flags(&file_priv->vm_xa, XA_FLAGS_ALLOC1); 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)) { if (IS_ERR(pc)) {
err = PTR_ERR(pc); err = PTR_ERR(pc);
goto err; goto err;
...@@ -1823,6 +1826,7 @@ int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data, ...@@ -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 */ GEM_BUG_ON(id == 0); /* reserved for invalid/unassigned ppgtt */
args->vm_id = id; args->vm_id = id;
ppgtt->vm.fpriv = file_priv;
return 0; return 0;
err_put: err_put:
...@@ -2285,7 +2289,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data, ...@@ -2285,7 +2289,8 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
return -EIO; 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)) if (IS_ERR(ext_data.pc))
return PTR_ERR(ext_data.pc); return PTR_ERR(ext_data.pc);
......
...@@ -188,6 +188,9 @@ struct i915_gem_proto_engine { ...@@ -188,6 +188,9 @@ struct i915_gem_proto_engine {
* CONTEXT_CREATE_SET_PARAM during GEM_CONTEXT_CREATE. * CONTEXT_CREATE_SET_PARAM during GEM_CONTEXT_CREATE.
*/ */
struct i915_gem_proto_context { struct i915_gem_proto_context {
/** @fpriv: Client which creates the context */
struct drm_i915_file_private *fpriv;
/** @vm: See &i915_gem_context.vm */ /** @vm: See &i915_gem_context.vm */
struct i915_address_space *vm; struct i915_address_space *vm;
......
...@@ -83,7 +83,7 @@ live_context(struct drm_i915_private *i915, struct file *file) ...@@ -83,7 +83,7 @@ live_context(struct drm_i915_private *i915, struct file *file)
int err; int err;
u32 id; u32 id;
pc = proto_context_create(i915, 0); pc = proto_context_create(fpriv, i915, 0);
if (IS_ERR(pc)) if (IS_ERR(pc))
return ERR_CAST(pc); return ERR_CAST(pc);
...@@ -152,7 +152,7 @@ kernel_context(struct drm_i915_private *i915, ...@@ -152,7 +152,7 @@ kernel_context(struct drm_i915_private *i915,
struct i915_gem_context *ctx; struct i915_gem_context *ctx;
struct i915_gem_proto_context *pc; struct i915_gem_proto_context *pc;
pc = proto_context_create(i915, 0); pc = proto_context_create(NULL, i915, 0);
if (IS_ERR(pc)) if (IS_ERR(pc))
return ERR_CAST(pc); return ERR_CAST(pc);
......
...@@ -255,6 +255,7 @@ struct i915_address_space { ...@@ -255,6 +255,7 @@ struct i915_address_space {
} rsvd; } rsvd;
struct intel_gt *gt; struct intel_gt *gt;
struct drm_i915_private *i915; struct drm_i915_private *i915;
struct drm_i915_file_private *fpriv;
struct device *dma; struct device *dma;
u64 total; /* size addr space maps (ex. 2GB for ggtt) */ u64 total; /* size addr space maps (ex. 2GB for ggtt) */
u64 reserved; /* size addr space reserved */ u64 reserved; /* size addr space reserved */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment