Skip to content

Commit

Permalink
drm/i915: Track all user contexts per client
Browse files Browse the repository at this point in the history
We soon want to start answering questions like how much GPU time is the
context belonging to a client which exited still using.

To enable this we start tracking all context belonging to a client on a
separate list.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Aravind Iddamsetty <aravind.iddamsetty@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20210123153733.18139-6-chris@chris-wilson.co.uk
Link: https://patchwork.freedesktop.org/patch/msgid/20210124153136.19124-6-chris@chris-wilson.co.uk
  • Loading branch information
Tvrtko Ursulin authored and Chris Wilson committed Jan 24, 2021
1 parent b6b77d7 commit 0f7ae81
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 0 deletions.
12 changes: 12 additions & 0 deletions drivers/gpu/drm/i915/gem/i915_gem_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ static void set_closed_name(struct i915_gem_context *ctx)
static void context_close(struct i915_gem_context *ctx)
{
struct i915_address_space *vm;
struct i915_drm_client *client;

/* Flush any concurrent set_engines() */
mutex_lock(&ctx->engines_mutex);
Expand Down Expand Up @@ -631,6 +632,13 @@ static void context_close(struct i915_gem_context *ctx)
list_del(&ctx->link);
spin_unlock(&ctx->i915->gem.contexts.lock);

client = ctx->client;
if (client) {
spin_lock(&client->ctx_lock);
list_del_rcu(&ctx->client_link);
spin_unlock(&client->ctx_lock);
}

mutex_unlock(&ctx->mutex);

/*
Expand Down Expand Up @@ -936,6 +944,10 @@ static int gem_context_register(struct i915_gem_context *ctx,

ctx->client = client;

spin_lock(&client->ctx_lock);
list_add_tail_rcu(&ctx->client_link, &client->ctx_list);
spin_unlock(&client->ctx_lock);

spin_lock(&i915->gem.contexts.lock);
list_add_tail(&ctx->link, &i915->gem.contexts.list);
spin_unlock(&i915->gem.contexts.lock);
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/gem/i915_gem_context_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ struct i915_gem_context {
/** client: struct i915_drm_client */
struct i915_drm_client *client;

/** link: &drm_client.context_list */
struct list_head client_link;

/**
* @ref: reference count
*
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/i915_drm_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ i915_drm_client_add(struct i915_drm_clients *clients, struct task_struct *task)

kref_init(&client->kref);
mutex_init(&client->update_lock);
spin_lock_init(&client->ctx_lock);
INIT_LIST_HEAD(&client->ctx_list);

client->clients = clients;
INIT_RCU_WORK(&client->rcu, __rcu_i915_drm_client_free);

Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/i915/i915_drm_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
#include <linux/device.h>
#include <linux/kobject.h>
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/pid.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/xarray.h>

#include "gt/intel_engine_types.h"
Expand Down Expand Up @@ -46,6 +48,9 @@ struct i915_drm_client {
struct i915_drm_client_name __rcu *name;
bool closed;

spinlock_t ctx_lock; /* For add/remove from ctx_list. */
struct list_head ctx_list; /* List of contexts belonging to client. */

struct i915_drm_clients *clients;

struct kobject *root;
Expand Down

0 comments on commit 0f7ae81

Please sign in to comment.