Am 03.08.2018 um 03:08 schrieb Dieter Nützel: > Hello Christian, AMD guys, > > this one _together_ with these series > [PATCH 1/7] drm/amdgpu: use new scheduler load balancing for VMs > https://lists.freedesktop.org/archives/amd-gfx/2018-August/024802.html > > on top of > amd-staging-drm-next 53d5f1e4a6d9 > > freeze whole system (Intel Xeon X3470, RX580) during _first_ mouse move. > Same for sddm login or first move in KDE Plasma 5. > NO logs so far. - Expected? Not even remotely, can you double check which patch from the "[PATCH 1/7] drm/amdgpu: use new scheduler load balancing for VMs" series is causing the issue? Thanks, Christian. > > Greetings, > Dieter > > Am 01.08.2018 16:27, schrieb Christian König: >> Since we now deal with multiple rq we need to update all of them, not >> just the current one. >> >> Signed-off-by: Christian König <christian.koenig at amd.com> >> --- >>  drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c  | 3 +-- >>  drivers/gpu/drm/scheduler/gpu_scheduler.c | 36 >> ++++++++++++++++++++----------- >>  include/drm/gpu_scheduler.h              | 5 ++--- >>  3 files changed, 26 insertions(+), 18 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c >> index df6965761046..9fcc14e2dfcf 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c >> @@ -407,12 +407,11 @@ void amdgpu_ctx_priority_override(struct >> amdgpu_ctx *ctx, >>     for (i = 0; i < adev->num_rings; i++) { >>         ring = adev->rings[i]; >>         entity = &ctx->rings[i].entity; >> -       rq = &ring->sched.sched_rq[ctx_prio]; >> >>         if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) >>             continue; >> >> -       drm_sched_entity_set_rq(entity, rq); >> +       drm_sched_entity_set_priority(entity, ctx_prio); >>     } >>  } >> >> diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c >> b/drivers/gpu/drm/scheduler/gpu_scheduler.c >> index 05dc6ecd4003..85908c7f913e 100644 >> --- a/drivers/gpu/drm/scheduler/gpu_scheduler.c >> +++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c >> @@ -419,29 +419,39 @@ static void drm_sched_entity_clear_dep(struct >> dma_fence *f, struct dma_fence_cb >>  } >> >>  /** >> - * drm_sched_entity_set_rq - Sets the run queue for an entity >> + * drm_sched_entity_set_rq_priority - helper for >> drm_sched_entity_set_priority >> + */ >> +static void drm_sched_entity_set_rq_priority(struct drm_sched_rq **rq, >> +                        enum drm_sched_priority priority) >> +{ >> +   *rq = &(*rq)->sched->sched_rq[priority]; >> +} >> + >> +/** >> + * drm_sched_entity_set_priority - Sets priority of the entity >>  * >>  * @entity: scheduler entity >> - * @rq: scheduler run queue >> + * @priority: scheduler priority >>  * >> - * Sets the run queue for an entity and removes the entity from the >> previous >> - * run queue in which was present. >> + * Update the priority of runqueus used for the entity. >>  */ >> -void drm_sched_entity_set_rq(struct drm_sched_entity *entity, >> -                struct drm_sched_rq *rq) >> +void drm_sched_entity_set_priority(struct drm_sched_entity *entity, >> +                  enum drm_sched_priority priority) >>  { >> -   if (entity->rq == rq) >> -       return; >> - >> -   BUG_ON(!rq); >> +   unsigned int i; >> >>     spin_lock(&entity->rq_lock); >> + >> +   for (i = 0; i < entity->num_rq_list; ++i) >> + drm_sched_entity_set_rq_priority(&entity->rq_list[i], priority); >> + >>     drm_sched_rq_remove_entity(entity->rq, entity); >> -   entity->rq = rq; >> -   drm_sched_rq_add_entity(rq, entity); >> +   drm_sched_entity_set_rq_priority(&entity->rq, priority); >> +   drm_sched_rq_add_entity(entity->rq, entity); >> + >>     spin_unlock(&entity->rq_lock); >>  } >> -EXPORT_SYMBOL(drm_sched_entity_set_rq); >> +EXPORT_SYMBOL(drm_sched_entity_set_priority); >> >>  /** >>  * drm_sched_dependency_optimized >> diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h >> index 0c4cfe689d4c..22c0f88f7d8f 100644 >> --- a/include/drm/gpu_scheduler.h >> +++ b/include/drm/gpu_scheduler.h >> @@ -298,9 +298,8 @@ void drm_sched_entity_fini(struct >> drm_sched_entity *entity); >>  void drm_sched_entity_destroy(struct drm_sched_entity *entity); >>  void drm_sched_entity_push_job(struct drm_sched_job *sched_job, >>                    struct drm_sched_entity *entity); >> -void drm_sched_entity_set_rq(struct drm_sched_entity *entity, >> -                struct drm_sched_rq *rq); >> - >> +void drm_sched_entity_set_priority(struct drm_sched_entity *entity, >> +                  enum drm_sched_priority priority); >>  struct drm_sched_fence *drm_sched_fence_create( >>     struct drm_sched_entity *s_entity, void *owner); >>  void drm_sched_fence_scheduled(struct drm_sched_fence *fence);