@@ -109,6 +109,7 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,
109
109
return r ;
110
110
111
111
++ (num_ibs [r ]);
112
+ p -> gang_leader_idx = r ;
112
113
return 0 ;
113
114
}
114
115
@@ -300,7 +301,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
300
301
if (ret )
301
302
goto free_all_kdata ;
302
303
}
303
- p -> gang_leader = p -> jobs [p -> gang_size - 1 ];
304
+ p -> gang_leader = p -> jobs [p -> gang_leader_idx ];
304
305
305
306
if (p -> ctx -> vram_lost_counter != p -> gang_leader -> vram_lost_counter ) {
306
307
ret = - ECANCELED ;
@@ -1194,16 +1195,18 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
1194
1195
return r ;
1195
1196
}
1196
1197
1197
- for (i = 0 ; i < p -> gang_size - 1 ; ++ i ) {
1198
+ for (i = 0 ; i < p -> gang_size ; ++ i ) {
1199
+ if (p -> jobs [i ] == leader )
1200
+ continue ;
1201
+
1198
1202
r = amdgpu_sync_clone (& leader -> sync , & p -> jobs [i ]-> sync );
1199
1203
if (r )
1200
1204
return r ;
1201
1205
}
1202
1206
1203
- r = amdgpu_ctx_wait_prev_fence (p -> ctx , p -> entities [p -> gang_size - 1 ]);
1207
+ r = amdgpu_ctx_wait_prev_fence (p -> ctx , p -> entities [p -> gang_leader_idx ]);
1204
1208
if (r && r != - ERESTARTSYS )
1205
1209
DRM_ERROR ("amdgpu_ctx_wait_prev_fence failed.\n" );
1206
-
1207
1210
return r ;
1208
1211
}
1209
1212
@@ -1237,9 +1240,12 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1237
1240
for (i = 0 ; i < p -> gang_size ; ++ i )
1238
1241
drm_sched_job_arm (& p -> jobs [i ]-> base );
1239
1242
1240
- for (i = 0 ; i < ( p -> gang_size - 1 ) ; ++ i ) {
1243
+ for (i = 0 ; i < p -> gang_size ; ++ i ) {
1241
1244
struct dma_fence * fence ;
1242
1245
1246
+ if (p -> jobs [i ] == leader )
1247
+ continue ;
1248
+
1243
1249
fence = & p -> jobs [i ]-> base .s_fence -> scheduled ;
1244
1250
r = amdgpu_sync_fence (& leader -> sync , fence );
1245
1251
if (r )
@@ -1275,7 +1281,10 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1275
1281
list_for_each_entry (e , & p -> validated , tv .head ) {
1276
1282
1277
1283
/* Everybody except for the gang leader uses READ */
1278
- for (i = 0 ; i < (p -> gang_size - 1 ); ++ i ) {
1284
+ for (i = 0 ; i < p -> gang_size ; ++ i ) {
1285
+ if (p -> jobs [i ] == leader )
1286
+ continue ;
1287
+
1279
1288
dma_resv_add_fence (e -> tv .bo -> base .resv ,
1280
1289
& p -> jobs [i ]-> base .s_fence -> finished ,
1281
1290
DMA_RESV_USAGE_READ );
@@ -1285,7 +1294,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1285
1294
e -> tv .num_shared = 0 ;
1286
1295
}
1287
1296
1288
- seq = amdgpu_ctx_add_fence (p -> ctx , p -> entities [p -> gang_size - 1 ],
1297
+ seq = amdgpu_ctx_add_fence (p -> ctx , p -> entities [p -> gang_leader_idx ],
1289
1298
p -> fence );
1290
1299
amdgpu_cs_post_dependencies (p );
1291
1300
0 commit comments