Skip to content

Commit 0c5fea1

Browse files
cwabbott0Rob Clark
authored andcommitted
drm/msm: Don't use a worker to capture fault devcoredump
Now that we use a threaded IRQ, it should be safe to do this in the fault handler. We can also remove fault_info from struct msm_gpu and just pass it directly. Signed-off-by: Connor Abbott <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/654889/ Signed-off-by: Rob Clark <[email protected]>
1 parent f681c2a commit 0c5fea1

File tree

3 files changed

+19
-31
lines changed

3 files changed

+19
-31
lines changed

drivers/gpu/drm/msm/adreno/adreno_gpu.c

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,6 @@ int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags,
270270
const char *type = "UNKNOWN";
271271
bool do_devcoredump = info && !READ_ONCE(gpu->crashstate);
272272

273-
/*
274-
* If we aren't going to be resuming later from fault_worker, then do
275-
* it now.
276-
*/
277-
if (!do_devcoredump) {
278-
gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu);
279-
}
280-
281273
/*
282274
* Print a default message if we couldn't get the data from the
283275
* adreno-smmu-priv
@@ -304,16 +296,18 @@ int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags,
304296
scratch[0], scratch[1], scratch[2], scratch[3]);
305297

306298
if (do_devcoredump) {
299+
struct msm_gpu_fault_info fault_info = {};
300+
307301
/* Turn off the hangcheck timer to keep it from bothering us */
308302
timer_delete(&gpu->hangcheck_timer);
309303

310-
gpu->fault_info.ttbr0 = info->ttbr0;
311-
gpu->fault_info.iova = iova;
312-
gpu->fault_info.flags = flags;
313-
gpu->fault_info.type = type;
314-
gpu->fault_info.block = block;
304+
fault_info.ttbr0 = info->ttbr0;
305+
fault_info.iova = iova;
306+
fault_info.flags = flags;
307+
fault_info.type = type;
308+
fault_info.block = block;
315309

316-
kthread_queue_work(gpu->worker, &gpu->fault_work);
310+
msm_gpu_fault_crashstate_capture(gpu, &fault_info);
317311
}
318312

319313
return 0;

drivers/gpu/drm/msm/msm_gpu.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ static void msm_gpu_crashstate_get_bo(struct msm_gpu_state *state,
257257
}
258258

259259
static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
260-
struct msm_gem_submit *submit, char *comm, char *cmd)
260+
struct msm_gem_submit *submit, struct msm_gpu_fault_info *fault_info,
261+
char *comm, char *cmd)
261262
{
262263
struct msm_gpu_state *state;
263264

@@ -276,7 +277,8 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
276277
/* Fill in the additional crash state information */
277278
state->comm = kstrdup(comm, GFP_KERNEL);
278279
state->cmd = kstrdup(cmd, GFP_KERNEL);
279-
state->fault_info = gpu->fault_info;
280+
if (fault_info)
281+
state->fault_info = *fault_info;
280282

281283
if (submit) {
282284
int i;
@@ -308,7 +310,8 @@ static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
308310
}
309311
#else
310312
static void msm_gpu_crashstate_capture(struct msm_gpu *gpu,
311-
struct msm_gem_submit *submit, char *comm, char *cmd)
313+
struct msm_gem_submit *submit, struct msm_gpu_fault_info *fault_info,
314+
char *comm, char *cmd)
312315
{
313316
}
314317
#endif
@@ -405,7 +408,7 @@ static void recover_worker(struct kthread_work *work)
405408

406409
/* Record the crash state */
407410
pm_runtime_get_sync(&gpu->pdev->dev);
408-
msm_gpu_crashstate_capture(gpu, submit, comm, cmd);
411+
msm_gpu_crashstate_capture(gpu, submit, NULL, comm, cmd);
409412

410413
kfree(cmd);
411414
kfree(comm);
@@ -459,9 +462,8 @@ static void recover_worker(struct kthread_work *work)
459462
msm_gpu_retire(gpu);
460463
}
461464

462-
static void fault_worker(struct kthread_work *work)
465+
void msm_gpu_fault_crashstate_capture(struct msm_gpu *gpu, struct msm_gpu_fault_info *fault_info)
463466
{
464-
struct msm_gpu *gpu = container_of(work, struct msm_gpu, fault_work);
465467
struct msm_gem_submit *submit;
466468
struct msm_ringbuffer *cur_ring = gpu->funcs->active_ring(gpu);
467469
char *comm = NULL, *cmd = NULL;
@@ -484,16 +486,13 @@ static void fault_worker(struct kthread_work *work)
484486

485487
/* Record the crash state */
486488
pm_runtime_get_sync(&gpu->pdev->dev);
487-
msm_gpu_crashstate_capture(gpu, submit, comm, cmd);
489+
msm_gpu_crashstate_capture(gpu, submit, fault_info, comm, cmd);
488490
pm_runtime_put_sync(&gpu->pdev->dev);
489491

490492
kfree(cmd);
491493
kfree(comm);
492494

493495
resume_smmu:
494-
memset(&gpu->fault_info, 0, sizeof(gpu->fault_info));
495-
gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu);
496-
497496
mutex_unlock(&gpu->lock);
498497
}
499498

@@ -882,7 +881,6 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
882881
init_waitqueue_head(&gpu->retire_event);
883882
kthread_init_work(&gpu->retire_work, retire_worker);
884883
kthread_init_work(&gpu->recover_work, recover_worker);
885-
kthread_init_work(&gpu->fault_work, fault_worker);
886884

887885
priv->hangcheck_period = DRM_MSM_HANGCHECK_DEFAULT_PERIOD;
888886

drivers/gpu/drm/msm/msm_gpu.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,6 @@ struct msm_gpu {
253253
#define DRM_MSM_HANGCHECK_PROGRESS_RETRIES 3
254254
struct timer_list hangcheck_timer;
255255

256-
/* Fault info for most recent iova fault: */
257-
struct msm_gpu_fault_info fault_info;
258-
259-
/* work for handling GPU ioval faults: */
260-
struct kthread_work fault_work;
261-
262256
/* work for handling GPU recovery: */
263257
struct kthread_work recover_work;
264258

@@ -705,6 +699,8 @@ static inline void msm_gpu_crashstate_put(struct msm_gpu *gpu)
705699
mutex_unlock(&gpu->lock);
706700
}
707701

702+
void msm_gpu_fault_crashstate_capture(struct msm_gpu *gpu, struct msm_gpu_fault_info *fault_info);
703+
708704
/*
709705
* Simple macro to semi-cleanly add the MAP_PRIV flag for targets that can
710706
* support expanded privileges

0 commit comments

Comments
 (0)