Merge tag 'perf-tools-for-v6.7-1-2023-11-01' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_file_private.h
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2021 Intel Corporation
4  */
5
6 #ifndef __I915_FILE_PRIVATE_H__
7 #define __I915_FILE_PRIVATE_H__
8
9 #include <linux/mutex.h>
10 #include <linux/types.h>
11 #include <linux/xarray.h>
12
13 struct drm_i915_private;
14 struct drm_file;
15 struct i915_drm_client;
16
17 struct drm_i915_file_private {
18         struct drm_i915_private *i915;
19
20         union {
21                 struct drm_file *file;
22                 struct rcu_head rcu;
23         };
24
25         /** @proto_context_lock: Guards all struct i915_gem_proto_context
26          * operations
27          *
28          * This not only guards @proto_context_xa, but is always held
29          * whenever we manipulate any struct i915_gem_proto_context,
30          * including finalizing it on first actual use of the GEM context.
31          *
32          * See i915_gem_proto_context.
33          */
34         struct mutex proto_context_lock;
35
36         /** @proto_context_xa: xarray of struct i915_gem_proto_context
37          *
38          * Historically, the context uAPI allowed for two methods of
39          * setting context parameters: SET_CONTEXT_PARAM and
40          * CONTEXT_CREATE_EXT_SETPARAM.  The former is allowed to be called
41          * at any time while the later happens as part of
42          * GEM_CONTEXT_CREATE.  Everything settable via one was settable
43          * via the other.  While some params are fairly simple and setting
44          * them on a live context is harmless such as the context priority,
45          * others are far trickier such as the VM or the set of engines.
46          * In order to swap out the VM, for instance, we have to delay
47          * until all current in-flight work is complete, swap in the new
48          * VM, and then continue.  This leads to a plethora of potential
49          * race conditions we'd really rather avoid.
50          *
51          * We have since disallowed setting these more complex parameters
52          * on active contexts.  This works by delaying the creation of the
53          * actual context until after the client is done configuring it
54          * with SET_CONTEXT_PARAM.  From the perspective of the client, it
55          * has the same u32 context ID the whole time.  From the
56          * perspective of i915, however, it's a struct i915_gem_proto_context
57          * right up until the point where we attempt to do something which
58          * the proto-context can't handle.  Then the struct i915_gem_context
59          * gets created.
60          *
61          * This is accomplished via a little xarray dance.  When
62          * GEM_CONTEXT_CREATE is called, we create a struct
63          * i915_gem_proto_context, reserve a slot in @context_xa but leave
64          * it NULL, and place the proto-context in the corresponding slot
65          * in @proto_context_xa.  Then, in i915_gem_context_lookup(), we
66          * first check @context_xa.  If it's there, we return the struct
67          * i915_gem_context and we're done.  If it's not, we look in
68          * @proto_context_xa and, if we find it there, we create the actual
69          * context and kill the proto-context.
70          *
71          * In order for this dance to work properly, everything which ever
72          * touches a struct i915_gem_proto_context is guarded by
73          * @proto_context_lock, including context creation.  Yes, this
74          * means context creation now takes a giant global lock but it
75          * can't really be helped and that should never be on any driver's
76          * fast-path anyway.
77          */
78         struct xarray proto_context_xa;
79
80         /** @context_xa: xarray of fully created i915_gem_context
81          *
82          * Write access to this xarray is guarded by @proto_context_lock.
83          * Otherwise, writers may race with finalize_create_context_locked().
84          *
85          * See @proto_context_xa.
86          */
87         struct xarray context_xa;
88         struct xarray vm_xa;
89
90         unsigned int bsd_engine;
91
92 /*
93  * Every context ban increments per client ban score. Also
94  * hangs in short succession increments ban score. If ban threshold
95  * is reached, client is considered banned and submitting more work
96  * will fail. This is a stop gap measure to limit the badly behaving
97  * clients access to gpu. Note that unbannable contexts never increment
98  * the client ban score.
99  */
100 #define I915_CLIENT_SCORE_HANG_FAST     1
101 #define   I915_CLIENT_FAST_HANG_JIFFIES (60 * HZ)
102 #define I915_CLIENT_SCORE_CONTEXT_BAN   3
103 #define I915_CLIENT_SCORE_BANNED        9
104         /** ban_score: Accumulated score of all ctx bans and fast hangs. */
105         atomic_t ban_score;
106         unsigned long hang_timestamp;
107
108         struct i915_drm_client *client;
109 };
110
111 #endif /* __I915_FILE_PRIVATE_H__ */