Skip to content

Commit 0ea92ac

Browse files
mbrost05johnharr-intel
authored andcommitted
drm/i915/guc: Move GuC guc_id allocation under submission state sub-struct
Move guc_id allocation under submission state sub-struct as a future patch will reuse the spin lock as a global submission state lock. Moving this into sub-struct makes ownership of fields / lock clear. v2: (Docs) - Add comment for submission_state sub-structure v3: (John Harrison) - Fixup a few comments v4: (John Harrison) - Fix typo Signed-off-by: Matthew Brost <[email protected]> Reviewed-by: John Harrison <[email protected]> Signed-off-by: John Harrison <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 82a149a commit 0ea92ac

File tree

3 files changed

+46
-34
lines changed

3 files changed

+46
-34
lines changed

drivers/gpu/drm/i915/gt/intel_context_types.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,18 +197,18 @@ struct intel_context {
197197
struct {
198198
/**
199199
* @id: handle which is used to uniquely identify this context
200-
* with the GuC, protected by guc->contexts_lock
200+
* with the GuC, protected by guc->submission_state.lock
201201
*/
202202
u16 id;
203203
/**
204204
* @ref: the number of references to the guc_id, when
205205
* transitioning in and out of zero protected by
206-
* guc->contexts_lock
206+
* guc->submission_state.lock
207207
*/
208208
atomic_t ref;
209209
/**
210210
* @link: in guc->guc_id_list when the guc_id has no refs but is
211-
* still valid, protected by guc->contexts_lock
211+
* still valid, protected by guc->submission_state.lock
212212
*/
213213
struct list_head link;
214214
} guc_id;

drivers/gpu/drm/i915/gt/uc/intel_guc.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,26 @@ struct intel_guc {
7171
} interrupts;
7272

7373
/**
74-
* @contexts_lock: protects guc_ids, guc_id_list, ce->guc_id.id, and
75-
* ce->guc_id.ref when transitioning in and out of zero
74+
* @submission_state: sub-structure for submission state protected by
75+
* single lock
7676
*/
77-
spinlock_t contexts_lock;
78-
/** @guc_ids: used to allocate unique ce->guc_id.id values */
79-
struct ida guc_ids;
80-
/**
81-
* @guc_id_list: list of intel_context with valid guc_ids but no refs
82-
*/
83-
struct list_head guc_id_list;
77+
struct {
78+
/**
79+
* @lock: protects everything in submission_state,
80+
* ce->guc_id.id, and ce->guc_id.ref when transitioning in and
81+
* out of zero
82+
*/
83+
spinlock_t lock;
84+
/**
85+
* @guc_ids: used to allocate new guc_ids
86+
*/
87+
struct ida guc_ids;
88+
/**
89+
* @guc_id_list: list of intel_context with valid guc_ids but no
90+
* refs
91+
*/
92+
struct list_head guc_id_list;
93+
} submission_state;
8494

8595
/**
8696
* @submission_supported: tracks whether we support GuC submission on

drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
* fence is used to stall all requests associated with this guc_id until the
6969
* corresponding G2H returns indicating the guc_id has been deregistered.
7070
*
71-
* guc_ids:
71+
* submission_state.guc_ids:
7272
* Unique number associated with private GuC context data passed in during
7373
* context registration / submission / deregistration. 64k available. Simple ida
7474
* is used for allocation.
@@ -89,7 +89,7 @@
8989
* sched_engine can be submitting at a time. Currently only one sched_engine is
9090
* used for all of GuC submission but that could change in the future.
9191
*
92-
* guc->contexts_lock
92+
* guc->submission_state.lock
9393
* Protects guc_id allocation for the given GuC, i.e. only one context can be
9494
* doing guc_id allocation operations at a time for each GuC in the system.
9595
*
@@ -103,7 +103,7 @@
103103
*
104104
* Lock ordering rules:
105105
* sched_engine->lock -> ce->guc_state.lock
106-
* guc->contexts_lock -> ce->guc_state.lock
106+
* guc->submission_state.lock -> ce->guc_state.lock
107107
*
108108
* Reset races:
109109
* When a full GT reset is triggered it is assumed that some G2H responses to
@@ -1148,9 +1148,9 @@ int intel_guc_submission_init(struct intel_guc *guc)
11481148

11491149
xa_init_flags(&guc->context_lookup, XA_FLAGS_LOCK_IRQ);
11501150

1151-
spin_lock_init(&guc->contexts_lock);
1152-
INIT_LIST_HEAD(&guc->guc_id_list);
1153-
ida_init(&guc->guc_ids);
1151+
spin_lock_init(&guc->submission_state.lock);
1152+
INIT_LIST_HEAD(&guc->submission_state.guc_id_list);
1153+
ida_init(&guc->submission_state.guc_ids);
11541154

11551155
return 0;
11561156
}
@@ -1215,15 +1215,16 @@ static void guc_submit_request(struct i915_request *rq)
12151215

12161216
static int new_guc_id(struct intel_guc *guc)
12171217
{
1218-
return ida_simple_get(&guc->guc_ids, 0,
1218+
return ida_simple_get(&guc->submission_state.guc_ids, 0,
12191219
GUC_MAX_LRC_DESCRIPTORS, GFP_KERNEL |
12201220
__GFP_RETRY_MAYFAIL | __GFP_NOWARN);
12211221
}
12221222

12231223
static void __release_guc_id(struct intel_guc *guc, struct intel_context *ce)
12241224
{
12251225
if (!context_guc_id_invalid(ce)) {
1226-
ida_simple_remove(&guc->guc_ids, ce->guc_id.id);
1226+
ida_simple_remove(&guc->submission_state.guc_ids,
1227+
ce->guc_id.id);
12271228
reset_lrc_desc(guc, ce->guc_id.id);
12281229
set_context_guc_id_invalid(ce);
12291230
}
@@ -1235,20 +1236,20 @@ static void release_guc_id(struct intel_guc *guc, struct intel_context *ce)
12351236
{
12361237
unsigned long flags;
12371238

1238-
spin_lock_irqsave(&guc->contexts_lock, flags);
1239+
spin_lock_irqsave(&guc->submission_state.lock, flags);
12391240
__release_guc_id(guc, ce);
1240-
spin_unlock_irqrestore(&guc->contexts_lock, flags);
1241+
spin_unlock_irqrestore(&guc->submission_state.lock, flags);
12411242
}
12421243

12431244
static int steal_guc_id(struct intel_guc *guc)
12441245
{
12451246
struct intel_context *ce;
12461247
int guc_id;
12471248

1248-
lockdep_assert_held(&guc->contexts_lock);
1249+
lockdep_assert_held(&guc->submission_state.lock);
12491250

1250-
if (!list_empty(&guc->guc_id_list)) {
1251-
ce = list_first_entry(&guc->guc_id_list,
1251+
if (!list_empty(&guc->submission_state.guc_id_list)) {
1252+
ce = list_first_entry(&guc->submission_state.guc_id_list,
12521253
struct intel_context,
12531254
guc_id.link);
12541255

@@ -1273,7 +1274,7 @@ static int assign_guc_id(struct intel_guc *guc, u16 *out)
12731274
{
12741275
int ret;
12751276

1276-
lockdep_assert_held(&guc->contexts_lock);
1277+
lockdep_assert_held(&guc->submission_state.lock);
12771278

12781279
ret = new_guc_id(guc);
12791280
if (unlikely(ret < 0)) {
@@ -1295,7 +1296,7 @@ static int pin_guc_id(struct intel_guc *guc, struct intel_context *ce)
12951296
GEM_BUG_ON(atomic_read(&ce->guc_id.ref));
12961297

12971298
try_again:
1298-
spin_lock_irqsave(&guc->contexts_lock, flags);
1299+
spin_lock_irqsave(&guc->submission_state.lock, flags);
12991300

13001301
might_lock(&ce->guc_state.lock);
13011302

@@ -1310,7 +1311,7 @@ static int pin_guc_id(struct intel_guc *guc, struct intel_context *ce)
13101311
atomic_inc(&ce->guc_id.ref);
13111312

13121313
out_unlock:
1313-
spin_unlock_irqrestore(&guc->contexts_lock, flags);
1314+
spin_unlock_irqrestore(&guc->submission_state.lock, flags);
13141315

13151316
/*
13161317
* -EAGAIN indicates no guc_id are available, let's retire any
@@ -1346,11 +1347,12 @@ static void unpin_guc_id(struct intel_guc *guc, struct intel_context *ce)
13461347
if (unlikely(context_guc_id_invalid(ce)))
13471348
return;
13481349

1349-
spin_lock_irqsave(&guc->contexts_lock, flags);
1350+
spin_lock_irqsave(&guc->submission_state.lock, flags);
13501351
if (!context_guc_id_invalid(ce) && list_empty(&ce->guc_id.link) &&
13511352
!atomic_read(&ce->guc_id.ref))
1352-
list_add_tail(&ce->guc_id.link, &guc->guc_id_list);
1353-
spin_unlock_irqrestore(&guc->contexts_lock, flags);
1353+
list_add_tail(&ce->guc_id.link,
1354+
&guc->submission_state.guc_id_list);
1355+
spin_unlock_irqrestore(&guc->submission_state.lock, flags);
13541356
}
13551357

13561358
static int __guc_action_register_context(struct intel_guc *guc,
@@ -1921,16 +1923,16 @@ static void guc_context_destroy(struct kref *kref)
19211923
* returns indicating this context has been deregistered the guc_id is
19221924
* returned to the pool of available guc_id.
19231925
*/
1924-
spin_lock_irqsave(&guc->contexts_lock, flags);
1926+
spin_lock_irqsave(&guc->submission_state.lock, flags);
19251927
if (context_guc_id_invalid(ce)) {
1926-
spin_unlock_irqrestore(&guc->contexts_lock, flags);
1928+
spin_unlock_irqrestore(&guc->submission_state.lock, flags);
19271929
__guc_context_destroy(ce);
19281930
return;
19291931
}
19301932

19311933
if (!list_empty(&ce->guc_id.link))
19321934
list_del_init(&ce->guc_id.link);
1933-
spin_unlock_irqrestore(&guc->contexts_lock, flags);
1935+
spin_unlock_irqrestore(&guc->submission_state.lock, flags);
19341936

19351937
/* Seal race with Reset */
19361938
spin_lock_irqsave(&ce->guc_state.lock, flags);

0 commit comments

Comments
 (0)