Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: Remove struct_mutex usage

The remaining struct_mutex usage is just to serialize various gpu
related things (submit/retire/recover/fault/etc), so replace
struct_mutex with gpu->lock.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20211109181117.591148-4-robdclark@gmail.com
Signed-off-by: Rob Clark <robdclark@chromium.org>

+49 -34
+2 -2
drivers/gpu/drm/msm/adreno/a5xx_debugfs.c
··· 107 107 * try to reset an active GPU. 108 108 */ 109 109 110 - mutex_lock(&dev->struct_mutex); 110 + mutex_lock(&gpu->lock); 111 111 112 112 release_firmware(adreno_gpu->fw[ADRENO_FW_PM4]); 113 113 adreno_gpu->fw[ADRENO_FW_PM4] = NULL; ··· 133 133 gpu->funcs->recover(gpu); 134 134 135 135 pm_runtime_put_sync(&gpu->pdev->dev); 136 - mutex_unlock(&dev->struct_mutex); 136 + mutex_unlock(&gpu->lock); 137 137 138 138 return 0; 139 139 }
+2 -2
drivers/gpu/drm/msm/adreno/adreno_device.c
··· 408 408 return NULL; 409 409 } 410 410 411 - mutex_lock(&dev->struct_mutex); 411 + mutex_lock(&gpu->lock); 412 412 ret = msm_gpu_hw_init(gpu); 413 - mutex_unlock(&dev->struct_mutex); 413 + mutex_unlock(&gpu->lock); 414 414 pm_runtime_put_autosuspend(&pdev->dev); 415 415 if (ret) { 416 416 DRM_DEV_ERROR(dev->dev, "gpu hw init failed: %d\n", ret);
+6 -6
drivers/gpu/drm/msm/msm_debugfs.c
··· 29 29 struct msm_gpu *gpu = priv->gpu; 30 30 int ret; 31 31 32 - ret = mutex_lock_interruptible(&show_priv->dev->struct_mutex); 32 + ret = mutex_lock_interruptible(&gpu->lock); 33 33 if (ret) 34 34 return ret; 35 35 36 36 drm_printf(&p, "%s Status:\n", gpu->name); 37 37 gpu->funcs->show(gpu, show_priv->state, &p); 38 38 39 - mutex_unlock(&show_priv->dev->struct_mutex); 39 + mutex_unlock(&gpu->lock); 40 40 41 41 return 0; 42 42 } ··· 48 48 struct msm_drm_private *priv = show_priv->dev->dev_private; 49 49 struct msm_gpu *gpu = priv->gpu; 50 50 51 - mutex_lock(&show_priv->dev->struct_mutex); 51 + mutex_lock(&gpu->lock); 52 52 gpu->funcs->gpu_state_put(show_priv->state); 53 - mutex_unlock(&show_priv->dev->struct_mutex); 53 + mutex_unlock(&gpu->lock); 54 54 55 55 kfree(show_priv); 56 56 ··· 72 72 if (!show_priv) 73 73 return -ENOMEM; 74 74 75 - ret = mutex_lock_interruptible(&dev->struct_mutex); 75 + ret = mutex_lock_interruptible(&gpu->lock); 76 76 if (ret) 77 77 goto free_priv; 78 78 ··· 81 81 show_priv->state = gpu->funcs->gpu_state_get(gpu); 82 82 pm_runtime_put_sync(&gpu->pdev->dev); 83 83 84 - mutex_unlock(&dev->struct_mutex); 84 + mutex_unlock(&gpu->lock); 85 85 86 86 if (IS_ERR(show_priv->state)) { 87 87 ret = PTR_ERR(show_priv->state);
+7 -7
drivers/gpu/drm/msm/msm_gpu.c
··· 150 150 { 151 151 int ret; 152 152 153 - WARN_ON(!mutex_is_locked(&gpu->dev->struct_mutex)); 153 + WARN_ON(!mutex_is_locked(&gpu->lock)); 154 154 155 155 if (!gpu->needs_hw_init) 156 156 return 0; ··· 361 361 char *comm = NULL, *cmd = NULL; 362 362 int i; 363 363 364 - mutex_lock(&dev->struct_mutex); 364 + mutex_lock(&gpu->lock); 365 365 366 366 DRM_DEV_ERROR(dev->dev, "%s: hangcheck recover!\n", gpu->name); 367 367 ··· 442 442 } 443 443 } 444 444 445 - mutex_unlock(&dev->struct_mutex); 445 + mutex_unlock(&gpu->lock); 446 446 447 447 msm_gpu_retire(gpu); 448 448 } ··· 450 450 static void fault_worker(struct kthread_work *work) 451 451 { 452 452 struct msm_gpu *gpu = container_of(work, struct msm_gpu, fault_work); 453 - struct drm_device *dev = gpu->dev; 454 453 struct msm_gem_submit *submit; 455 454 struct msm_ringbuffer *cur_ring = gpu->funcs->active_ring(gpu); 456 455 char *comm = NULL, *cmd = NULL; 457 456 458 - mutex_lock(&dev->struct_mutex); 457 + mutex_lock(&gpu->lock); 459 458 460 459 submit = find_submit(cur_ring, cur_ring->memptrs->fence + 1); 461 460 if (submit && submit->fault_dumped) ··· 489 490 memset(&gpu->fault_info, 0, sizeof(gpu->fault_info)); 490 491 gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu); 491 492 492 - mutex_unlock(&dev->struct_mutex); 493 + mutex_unlock(&gpu->lock); 493 494 } 494 495 495 496 static void hangcheck_timer_reset(struct msm_gpu *gpu) ··· 732 733 struct msm_ringbuffer *ring = submit->ring; 733 734 unsigned long flags; 734 735 735 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 736 + WARN_ON(!mutex_is_locked(&gpu->lock)); 736 737 737 738 pm_runtime_get_sync(&gpu->pdev->dev); 738 739 ··· 847 848 848 849 INIT_LIST_HEAD(&gpu->active_list); 849 850 mutex_init(&gpu->active_lock); 851 + mutex_init(&gpu->lock); 850 852 kthread_init_work(&gpu->retire_work, retire_worker); 851 853 kthread_init_work(&gpu->recover_work, recover_worker); 852 854 kthread_init_work(&gpu->fault_work, fault_worker);
+15 -5
drivers/gpu/drm/msm/msm_gpu.h
··· 162 162 struct list_head active_list; 163 163 164 164 /** 165 + * lock: 166 + * 167 + * General lock for serializing all the gpu things. 168 + * 169 + * TODO move to per-ring locking where feasible (ie. submit/retire 170 + * path, etc) 171 + */ 172 + struct mutex lock; 173 + 174 + /** 165 175 * active_submits: 166 176 * 167 177 * The number of submitted but not yet retired submits, used to 168 178 * determine transitions between active and idle. 169 179 * 170 - * Protected by lock 180 + * Protected by active_lock 171 181 */ 172 182 int active_submits; 173 183 ··· 558 548 { 559 549 struct msm_gpu_state *state = NULL; 560 550 561 - mutex_lock(&gpu->dev->struct_mutex); 551 + mutex_lock(&gpu->lock); 562 552 563 553 if (gpu->crashstate) { 564 554 kref_get(&gpu->crashstate->ref); 565 555 state = gpu->crashstate; 566 556 } 567 557 568 - mutex_unlock(&gpu->dev->struct_mutex); 558 + mutex_unlock(&gpu->lock); 569 559 570 560 return state; 571 561 } 572 562 573 563 static inline void msm_gpu_crashstate_put(struct msm_gpu *gpu) 574 564 { 575 - mutex_lock(&gpu->dev->struct_mutex); 565 + mutex_lock(&gpu->lock); 576 566 577 567 if (gpu->crashstate) { 578 568 if (gpu->funcs->gpu_state_put(gpu->crashstate)) 579 569 gpu->crashstate = NULL; 580 570 } 581 571 582 - mutex_unlock(&gpu->dev->struct_mutex); 572 + mutex_unlock(&gpu->lock); 583 573 } 584 574 585 575 /*
+6 -3
drivers/gpu/drm/msm/msm_perf.c
··· 155 155 struct msm_gpu *gpu = priv->gpu; 156 156 int ret = 0; 157 157 158 - mutex_lock(&dev->struct_mutex); 158 + if (!gpu) 159 + return -ENODEV; 159 160 160 - if (perf->open || !gpu) { 161 + mutex_lock(&gpu->lock); 162 + 163 + if (perf->open) { 161 164 ret = -EBUSY; 162 165 goto out; 163 166 } ··· 174 171 perf->next_jiffies = jiffies + SAMPLE_TIME; 175 172 176 173 out: 177 - mutex_unlock(&dev->struct_mutex); 174 + mutex_unlock(&gpu->lock); 178 175 return ret; 179 176 } 180 177
+9 -7
drivers/gpu/drm/msm/msm_rd.c
··· 86 86 struct msm_gem_submit *submit; 87 87 88 88 /* fifo access is synchronized on the producer side by 89 - * struct_mutex held by submit code (otherwise we could 89 + * gpu->lock held by submit code (otherwise we could 90 90 * end up w/ cmds logged in different order than they 91 91 * were executed). And read_lock synchronizes the reads 92 92 */ ··· 181 181 uint32_t gpu_id; 182 182 int ret = 0; 183 183 184 - mutex_lock(&dev->struct_mutex); 184 + if (!gpu) 185 + return -ENODEV; 185 186 186 - if (rd->open || !gpu) { 187 + mutex_lock(&gpu->lock); 188 + 189 + if (rd->open) { 187 190 ret = -EBUSY; 188 191 goto out; 189 192 } ··· 203 200 rd_write_section(rd, RD_GPU_ID, &gpu_id, sizeof(gpu_id)); 204 201 205 202 out: 206 - mutex_unlock(&dev->struct_mutex); 203 + mutex_unlock(&gpu->lock); 207 204 return ret; 208 205 } 209 206 ··· 343 340 msm_gem_unlock(&obj->base); 344 341 } 345 342 346 - /* called under struct_mutex */ 343 + /* called under gpu->lock */ 347 344 void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit, 348 345 const char *fmt, ...) 349 346 { 350 - struct drm_device *dev = submit->dev; 351 347 struct task_struct *task; 352 348 char msg[256]; 353 349 int i, n; ··· 357 355 /* writing into fifo is serialized by caller, and 358 356 * rd->read_lock is used to serialize the reads 359 357 */ 360 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 358 + WARN_ON(!mutex_is_locked(&submit->gpu->lock)); 361 359 362 360 if (fmt) { 363 361 va_list args;
+2 -2
drivers/gpu/drm/msm/msm_ringbuffer.c
··· 21 21 pm_runtime_get_sync(&gpu->pdev->dev); 22 22 23 23 /* TODO move submit path over to using a per-ring lock.. */ 24 - mutex_lock(&gpu->dev->struct_mutex); 24 + mutex_lock(&gpu->lock); 25 25 26 26 msm_gpu_submit(gpu, submit); 27 27 28 - mutex_unlock(&gpu->dev->struct_mutex); 28 + mutex_unlock(&gpu->lock); 29 29 30 30 pm_runtime_put(&gpu->pdev->dev); 31 31