1. 07 12月, 2019 1 次提交
  2. 06 12月, 2019 8 次提交
    • T
      drm/i915/pmu: Report frequency as zero while GPU is sleeping · b66ecd04
      Tvrtko Ursulin 提交于
      We used to report the minimum possible frequency as both requested and
      active while GPU was in sleep state. This was a consequence of sampling
      the value from the "current frequency" field in our software tracking.
      
      This was strictly speaking wrong, but given that until recently the
      current frequency in sleeping state used to be equal to minimum, it did
      not stand out sufficiently to be noticed as such.
      
      After some recent changes have made the current frequency be reported
      as last active before GPU went to sleep, meaning both requested and active
      frequencies could end up being reported at their maximum values for the
      duration of the GPU idle state, it became much more obvious that this does
      not make sense.
      
      To fix this we will now sample the frequency counters only when the GPU is
      awake. As a consequence reported frequencies could be reported as below
      the GPU reported minimum but that should be much less confusing that the
      current situation.
      
      v2:
       * Split out early exit conditions for readability. (Chris)
      Signed-off-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Closes: https://gitlab.freedesktop.org/drm/intel/issues/675
      Link: https://patchwork.freedesktop.org/patch/msgid/20191129105436.20100-1-tvrtko.ursulin@linux.intel.com
      b66ecd04
    • C
      drm/i915/gem: Flush the pwrite through the chipset before signaling · 1a74934b
      Chris Wilson 提交于
      Before we signal the fence to indicate completion, ensure the pwrite
      through the indirect GGTT is coherent (as best as we know) in memory.
      Any listeners to the fence may start immediately and sample from the
      backing store prior to the writes being posted, thus seeing stale data.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191206105527.1130413-1-chris@chris-wilson.co.uk
      1a74934b
    • C
      drm/i915/gt: Acquire a GT wakeref for the breadcrumb interrupt · 045d1fb7
      Chris Wilson 提交于
      Take a wakeref on the intel_gt specifically for the enabled breadcrumb
      interrupt so that we can safely process the mmio. If the intel_gt is
      already asleep by the time we try and setup the breadcrumb interrupt, by
      a process of elimination we know the request must have been completed
      and we can skip its enablement!
      
      <4> [1518.350005] Unclaimed write to register 0x220a8
      <4> [1518.350323] WARNING: CPU: 2 PID: 3685 at drivers/gpu/drm/i915/intel_uncore.c:1163 __unclaimed_reg_debug+0x40/0x50 [i915]
      <4> [1518.350393] Modules linked in: vgem snd_hda_codec_hdmi x86_pkg_temp_thermal i915 coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep snd_hda_core btusb cdc_ether btrtl usbnet btbcm btintel r8152 snd_pcm mii bluetooth ecdh_generic ecc i2c_hid pinctrl_sunrisepoint pinctrl_intel intel_lpss_pci prime_numbers [last unloaded: vgem]
      <4> [1518.350646] CPU: 2 PID: 3685 Comm: gem_exec_parse_ Tainted: G     U            5.4.0-rc8-CI-CI_DRM_7490+ #1
      <4> [1518.350708] Hardware name: Google Caroline/Caroline, BIOS MrChromebox 08/27/2018
      <4> [1518.350946] RIP: 0010:__unclaimed_reg_debug+0x40/0x50 [i915]
      <4> [1518.350992] Code: 74 05 5b 5d 41 5c c3 45 84 e4 48 c7 c0 95 8d 47 a0 48 c7 c6 8b 8d 47 a0 48 0f 44 f0 89 ea 48 c7 c7 9e 8d 47 a0 e8 40 45 e3 e0 <0f> 0b 83 2d 27 4f 2a 00 01 5b 5d 41 5c c3 66 90 41 55 41 54 55 53
      <4> [1518.351100] RSP: 0018:ffffc900007f39c8 EFLAGS: 00010086
      <4> [1518.351140] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000006
      <4> [1518.351202] RDX: 0000000080000006 RSI: 0000000000000000 RDI: 00000000ffffffff
      <4> [1518.351249] RBP: 00000000000220a8 R08: 0000000000000000 R09: 0000000000000000
      <4> [1518.351296] R10: ffffc900007f3990 R11: ffffc900007f3868 R12: 0000000000000000
      <4> [1518.351342] R13: 00000000fefeffff R14: 0000000000000092 R15: ffff888155fea000
      <4> [1518.351391] FS:  00007fc255abfe40(0000) GS:ffff88817ab00000(0000) knlGS:0000000000000000
      <4> [1518.351445] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      <4> [1518.351485] CR2: 00007fc2554882d0 CR3: 0000000168ca2005 CR4: 00000000003606e0
      <4> [1518.351529] Call Trace:
      <4> [1518.351746]  fwtable_write32+0x114/0x1d0 [i915]
      <4> [1518.351795]  ? sync_file_alloc+0x80/0x80
      <4> [1518.352039]  gen8_logical_ring_enable_irq+0x30/0x50 [i915]
      <4> [1518.352295]  irq_enable.part.10+0x23/0x40 [i915]
      <4> [1518.352523]  i915_request_enable_breadcrumb+0xb5/0x330 [i915]
      <4> [1518.352575]  ? sync_file_alloc+0x80/0x80
      <4> [1518.352612]  __dma_fence_enable_signaling+0x60/0x160
      <4> [1518.352653]  ? sync_file_alloc+0x80/0x80
      <4> [1518.352685]  dma_fence_add_callback+0x44/0xd0
      <4> [1518.352726]  sync_file_poll+0x95/0xc0
      <4> [1518.352767]  do_sys_poll+0x24d/0x570
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205215842.862750-1-chris@chris-wilson.co.uk
      045d1fb7
    • C
      drm/i915: Claim vma while under closed_lock in i915_vma_parked() · 77853186
      Chris Wilson 提交于
      Remove the vma we wish to destroy from the gt->closed_list to avoid
      having two i915_vma_parked() try and free it.
      
      Fixes: aa5e4453 ("drm/i915/gem: Try to flush pending unbind events")
      References: 2850748e ("drm/i915: Pull i915_vma_pin under the vm->mutex")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205214159.829727-1-chris@chris-wilson.co.uk
      77853186
    • C
      drm/i915/gt: Trim gen6 ppgtt updates to PD cachelines · d315fe8b
      Chris Wilson 提交于
      It appears now that we have the ring TLB invalidation in place, we need
      only update the page directory cachelines that we have altered. A great
      reduction from rewriting the whole 2MiB ppgtt on every update.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Acked-by: NMika Kuoppala <mika.kuoppala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205234059.1010030-1-chris@chris-wilson.co.uk
      d315fe8b
    • C
      drm/i915: Serialise i915_active_acquire() with __active_retire() · bbca083d
      Chris Wilson 提交于
      As __active_retire() does it's final atomic_dec() under the
      ref->tree_lock spinlock, in order to prevent ourselves from reusing the
      ref->cache and ref->tree as they are being destroyed, we need to
      serialise with the retirement during i915_active_acquire().
      
      [  +0.000005] kernel BUG at drivers/gpu/drm/i915/i915_active.c:157!
      [  +0.000011] invalid opcode: 0000 [#1] SMP
      [  +0.000004] CPU: 7 PID: 188 Comm: kworker/u16:4 Not tainted 5.4.0-rc8-03070-gac5e57322614 #89
      [  +0.000002] Hardware name: Razer Razer Blade Stealth 13 Late 2019/LY320, BIOS 1.02 09/10/2019
      [  +0.000082] Workqueue: events_unbound active_work [i915]
      [  +0.000059] RIP: 0010:__active_retire+0x115/0x120 [i915]
      [  +0.000003] Code: 75 28 48 8b 3d 8c 6e 1a 00 48 89 ee e8 e4 5f a5 c0 48 8b 44 24 10 65 48 33 04 25 28 00 00 00 75 0f 48 83 c4 18 5b 5d 41 5c c3 <0f> 0b 0f 0b 0f 0b e8 a0 90 87 c0 0f 1f 44 00 00 48 8b 3d 54 6e 1a
      [  +0.000002] RSP: 0018:ffffb833003f7e48 EFLAGS: 00010286
      [  +0.000003] RAX: ffff8d6e8d726d00 RBX: ffff8d6f9db4e840 RCX: 0000000000000000
      [  +0.000001] RDX: ffffffff82605930 RSI: ffff8d6f9adc4908 RDI: ffff8d6e96cefe28
      [  +0.000002] RBP: ffff8d6e96cefe00 R08: 0000000000000000 R09: ffff8d6f9ffe9a50
      [  +0.000002] R10: 0000000000000048 R11: 0000000000000018 R12: ffff8d6f9adc4930
      [  +0.000001] R13: ffff8d6f9e04fb00 R14: 0000000000000000 R15: ffff8d6f9adc4988
      [  +0.000002] FS:  0000000000000000(0000) GS:ffff8d6f9ffc0000(0000) knlGS:0000000000000000
      [  +0.000002] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  +0.000002] CR2: 000055eb5a34cf10 CR3: 000000018d609002 CR4: 0000000000760ee0
      [  +0.000002] PKRU: 55555554
      [  +0.000001] Call Trace:
      [  +0.000010]  process_one_work+0x1aa/0x350
      [  +0.000004]  worker_thread+0x4d/0x3a0
      [  +0.000004]  kthread+0xfb/0x130
      [  +0.000004]  ? process_one_work+0x350/0x350
      [  +0.000003]  ? kthread_park+0x90/0x90
      [  +0.000005]  ret_from_fork+0x1f/0x40
      Reported-by: NKenneth Graunke <kenneth@whitecape.org>
      Fixes: c9ad602f ("drm/i915: Split i915_active.mutex into an irq-safe spinlock for the rbtree")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Cc: Kenneth Graunke <kenneth@whitecape.org>
      Cc: Matthew Auld <matthew.auld@intel.com>
      Tested-by: NKenneth Graunke <kenneth@whitecape.org>
      Reviewed-by: NKenneth Graunke <kenneth@whitecape.org>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205183332.801237-1-chris@chris-wilson.co.uk
      bbca083d
    • A
      drm/i915/gt: Replace I915_READ with intel_uncore_read · 92c964ca
      Andi Shyti 提交于
      Get rid of the last remaining I915_READ in gt/ and make gt-land
      the first I915_READ-free happy island.
      Suggested-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NAndi Shyti <andi.shyti@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205164422.727968-1-chris@chris-wilson.co.uk
      92c964ca
    • C
      drm/i915/gt: Save irqstate around virtual_context_destroy · 6f7ac828
      Chris Wilson 提交于
      As virtual_context_destroy() may be called from a request signal, it may
      be called from inside an irq-off section, and so we need to do a full
      save/restore of the irq state rather than blindly re-enable irqs upon
      unlocking.
      
      <4> [110.024262] WARNING: inconsistent lock state
      <4> [110.024277] 5.4.0-rc8-CI-CI_DRM_7489+ #1 Tainted: G     U
      <4> [110.024292] --------------------------------
      <4> [110.024305] inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
      <4> [110.024323] kworker/0:0/5 [HC0[0]:SC0[0]:HE1:SE1] takes:
      <4> [110.024338] ffff88826a0c7a18 (&(&rq->lock)->rlock){?.-.}, at: i915_request_retire+0x221/0x930 [i915]
      <4> [110.024592] {IN-HARDIRQ-W} state was registered at:
      <4> [110.024612]   lock_acquire+0xa7/0x1c0
      <4> [110.024627]   _raw_spin_lock_irqsave+0x33/0x50
      <4> [110.024788]   intel_engine_breadcrumbs_irq+0x38c/0x600 [i915]
      <4> [110.024808]   irq_work_run_list+0x49/0x70
      <4> [110.024824]   irq_work_run+0x26/0x50
      <4> [110.024839]   smp_irq_work_interrupt+0x44/0x1e0
      <4> [110.024855]   irq_work_interrupt+0xf/0x20
      <4> [110.024871]   __do_softirq+0xb7/0x47f
      <4> [110.024885]   irq_exit+0xba/0xc0
      <4> [110.024898]   do_IRQ+0x83/0x160
      <4> [110.024910]   ret_from_intr+0x0/0x1d
      <4> [110.024922] irq event stamp: 172864
      <4> [110.024938] hardirqs last  enabled at (172863): [<ffffffff819ea214>] _raw_spin_unlock_irq+0x24/0x50
      <4> [110.024963] hardirqs last disabled at (172864): [<ffffffff819e9fba>] _raw_spin_lock_irq+0xa/0x40
      <4> [110.024988] softirqs last  enabled at (172812): [<ffffffff81c00385>] __do_softirq+0x385/0x47f
      <4> [110.025012] softirqs last disabled at (172797): [<ffffffff810b829a>] irq_exit+0xba/0xc0
      <4> [110.025031]
      other info that might help us debug this:
      <4> [110.025049]  Possible unsafe locking scenario:
      
      <4> [110.025065]        CPU0
      <4> [110.025075]        ----
      <4> [110.025084]   lock(&(&rq->lock)->rlock);
      <4> [110.025099]   <Interrupt>
      <4> [110.025109]     lock(&(&rq->lock)->rlock);
      <4> [110.025124]
       *** DEADLOCK ***
      
      <4> [110.025144] 4 locks held by kworker/0:0/5:
      <4> [110.025156]  #0: ffff88827588f528 ((wq_completion)events){+.+.}, at: process_one_work+0x1de/0x620
      <4> [110.025187]  #1: ffffc9000006fe78 ((work_completion)(&engine->retire_work)){+.+.}, at: process_one_work+0x1de/0x620
      <4> [110.025219]  #2: ffff88825605e270 (&kernel#2){+.+.}, at: engine_retire+0x57/0xe0 [i915]
      <4> [110.025405]  #3: ffff88826a0c7a18 (&(&rq->lock)->rlock){?.-.}, at: i915_request_retire+0x221/0x930 [i915]
      <4> [110.025634]
      stack backtrace:
      <4> [110.025653] CPU: 0 PID: 5 Comm: kworker/0:0 Tainted: G     U            5.4.0-rc8-CI-CI_DRM_7489+ #1
      <4> [110.025675] Hardware name:  /NUC7i5BNB, BIOS BNKBL357.86A.0054.2017.1025.1822 10/25/2017
      <4> [110.025856] Workqueue: events engine_retire [i915]
      <4> [110.025872] Call Trace:
      <4> [110.025891]  dump_stack+0x71/0x9b
      <4> [110.025907]  mark_lock+0x49a/0x500
      <4> [110.025926]  ? print_shortest_lock_dependencies+0x200/0x200
      <4> [110.025946]  mark_held_locks+0x49/0x70
      <4> [110.025962]  ? _raw_spin_unlock_irq+0x24/0x50
      <4> [110.025978]  lockdep_hardirqs_on+0xa2/0x1c0
      <4> [110.025995]  _raw_spin_unlock_irq+0x24/0x50
      <4> [110.026171]  virtual_context_destroy+0xc5/0x2e0 [i915]
      <4> [110.026376]  __active_retire+0xb4/0x290 [i915]
      <4> [110.026396]  dma_fence_signal_locked+0x9e/0x1b0
      <4> [110.026613]  i915_request_retire+0x451/0x930 [i915]
      <4> [110.026766]  retire_requests+0x4d/0x60 [i915]
      <4> [110.026919]  engine_retire+0x63/0xe0 [i915]
      
      Fixes: b1e3177b ("drm/i915: Coordinate i915_active with its own mutex")
      Fixes: 6d06779e ("drm/i915: Load balancing across a virtual engine")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191205145934.663183-1-chris@chris-wilson.co.uk
      6f7ac828
  3. 05 12月, 2019 8 次提交
  4. 04 12月, 2019 16 次提交
  5. 03 12月, 2019 7 次提交
    • C
      drm/i915/execlists: Skip nested spinlock for validating pending · 49e74c8f
      Chris Wilson 提交于
      Only along the submission path can we guarantee that the locked request
      is indeed from a foreign engine, and so the nesting of engine/rq is
      permissible. On the submission tasklet (process_csb()), we may find
      ourselves competing with the normal nesting of rq/engine, invalidating
      our nesting. As we only use the spinlock for debug purposes, skip the
      debug if we cannot acquire the spinlock for safe validation - catching
      99% of the bugs is better than causing a hard lockup.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Fixes: c95d31c3 ("drm/i915/execlists: Lock the request while validating it during promotion")
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191203152631.3107653-2-chris@chris-wilson.co.uk
      49e74c8f
    • C
      drm/i915/execlists: Add a couple more validity checks to assert_pending() · 80aac91b
      Chris Wilson 提交于
      Check the pending request submission is valid: that it at least has a
      reference for the submission and that the request is on the active list.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191203152631.3107653-1-chris@chris-wilson.co.uk
      80aac91b
    • C
      drm/i915: Lift i915_vma_pin() out of intel_renderstate_emit() · 42d10511
      Chris Wilson 提交于
      Once inside a request, inside the timeline->mutex, pinning is verboten.
      
      <4> [896.032829] ======================================================
      <4> [896.032831] WARNING: possible circular locking dependency detected
      <4> [896.032835] 5.4.0-rc8-CI-Patchwork_15533+ #1 Tainted: G     U
      <4> [896.032838] ------------------------------------------------------
      <4> [896.032841] gem_exec_parall/3720 is trying to acquire lock:
      <4> [896.032844] ffff888401863270 (&kernel#2){+.+.}, at: i915_request_create+0x16/0x1c0 [i915]
      <4> [896.032915]
      but task is already holding lock:
      <4> [896.032917] ffff8883ec1c93c0 (&vm->mutex){+.+.}, at: i915_vma_pin+0xf3/0x11c0 [i915]
      <4> [896.032952]
      which lock already depends on the new lock.
      
      <4> [896.032954]
      the existing dependency chain (in reverse order) is:
      <4> [896.032956]
      -> #1 (&vm->mutex){+.+.}:
      <4> [896.032961]        __mutex_lock+0x9a/0x9d0
      <4> [896.032995]        i915_vma_pin+0xf3/0x11c0 [i915]
      <4> [896.033033]        intel_renderstate_emit+0xb9/0x9e0 [i915]
      <4> [896.033081]        i915_gem_init+0x5a9/0xa50 [i915]
      <4> [896.033112]        i915_driver_probe+0xb00/0x15f0 [i915]
      <4> [896.033144]        i915_pci_probe+0x43/0x1c0 [i915]
      <4> [896.033149]        pci_device_probe+0x9e/0x120
      <4> [896.033154]        really_probe+0xea/0x420
      <4> [896.033158]        driver_probe_device+0x10b/0x120
      <4> [896.033161]        device_driver_attach+0x4a/0x50
      <4> [896.033164]        __driver_attach+0x97/0x130
      <4> [896.033168]        bus_for_each_dev+0x74/0xc0
      <4> [896.033171]        bus_add_driver+0x142/0x220
      <4> [896.033174]        driver_register+0x56/0xf0
      <4> [896.033178]        do_one_initcall+0x58/0x2ff
      <4> [896.033183]        do_init_module+0x56/0x1f8
      <4> [896.033187]        load_module+0x243e/0x29f0
      <4> [896.033190]        __do_sys_finit_module+0xe9/0x110
      <4> [896.033194]        do_syscall_64+0x4f/0x210
      <4> [896.033197]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
      <4> [896.033200]
      -> #0 (&kernel#2){+.+.}:
      <4> [896.033206]        __lock_acquire+0x1328/0x15d0
      <4> [896.033209]        lock_acquire+0xa7/0x1c0
      <4> [896.033213]        __mutex_lock+0x9a/0x9d0
      <4> [896.033255]        i915_request_create+0x16/0x1c0 [i915]
      <4> [896.033287]        intel_engine_flush_barriers+0x4c/0x100 [i915]
      <4> [896.033327]        ggtt_flush+0x37/0x60 [i915]
      <4> [896.033366]        i915_gem_evict_something+0x46b/0x5a0 [i915]
      <4> [896.033407]        i915_gem_gtt_insert+0x21d/0x6a0 [i915]
      <4> [896.033449]        i915_vma_pin+0xb36/0x11c0 [i915]
      <4> [896.033488]        gen6_ppgtt_pin+0xd5/0x170 [i915]
      <4> [896.033523]        ring_context_pin+0x2e/0xc0 [i915]
      <4> [896.033554]        __intel_context_do_pin+0x6b/0x190 [i915]
      <4> [896.033591]        i915_gem_do_execbuffer+0x1814/0x26c0 [i915]
      <4> [896.033627]        i915_gem_execbuffer2_ioctl+0x11b/0x460 [i915]
      <4> [896.033632]        drm_ioctl_kernel+0xa7/0xf0
      <4> [896.033635]        drm_ioctl+0x2e1/0x390
      <4> [896.033638]        do_vfs_ioctl+0xa0/0x6f0
      <4> [896.033641]        ksys_ioctl+0x35/0x60
      <4> [896.033644]        __x64_sys_ioctl+0x11/0x20
      <4> [896.033647]        do_syscall_64+0x4f/0x210
      <4> [896.033650]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
      
      Lift the object allocation and pin prior to the request construction.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
      Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
      Reviewed-by: NMika Kuoppala <mika.kuoppala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191202204316.2665847-1-chris@chris-wilson.co.uk
      42d10511
    • C
      drm/i915/gem: Take runtime-pm wakeref prior to unbinding · 3e817471
      Chris Wilson 提交于
      Some machines require ACPI for runtime resume, and ACPI is quite kmalloc
      happy. We cannot handle kmalloc from inside the vm->mutex, as they are
      used by the shrinker, and so we must ensure the global runtime-pm is
      awake prior to unbinding to avoid the potential inversion.
      
      <4> [57.121748] ======================================================
      <4> [57.121750] WARNING: possible circular locking dependency detected
      <4> [57.121753] 5.4.0-rc8-CI-CI_DRM_7466+ #1 Tainted: G     U
      <4> [57.121754] ------------------------------------------------------
      <4> [57.121756] i915_pm_rpm/1105 is trying to acquire lock:
      <4> [57.121758] ffffffff82263a40 (fs_reclaim){+.+.}, at: fs_reclaim_acquire.part.117+0x0/0x30
      <4> [57.121766]
      but task is already holding lock:
      <4> [57.121768] ffff888475a593c0 (&vm->mutex){+.+.}, at: i915_vma_unbind+0x21/0x50 [i915]
      <4> [57.121868]
      which lock already depends on the new lock.
      
      <4> [57.121869]
      the existing dependency chain (in reverse order) is:
      <4> [57.121871]
      -> #1 (&vm->mutex){+.+.}:
      <4> [57.121951]        i915_gem_shrinker_taints_mutex+0xa2/0xd0 [i915]
      <4> [57.122028]        i915_address_space_init+0xa9/0x170 [i915]
      <4> [57.122104]        i915_ggtt_init_hw+0x47/0x130 [i915]
      <4> [57.122150]        i915_driver_probe+0xbb4/0x15f0 [i915]
      <4> [57.122197]        i915_pci_probe+0x43/0x1c0 [i915]
      <4> [57.122202]        pci_device_probe+0x9e/0x120
      <4> [57.122206]        really_probe+0xea/0x420
      <4> [57.122209]        driver_probe_device+0x10b/0x120
      <4> [57.122212]        device_driver_attach+0x4a/0x50
      <4> [57.122214]        __driver_attach+0x97/0x130
      <4> [57.122217]        bus_for_each_dev+0x74/0xc0
      <4> [57.122220]        bus_add_driver+0x142/0x220
      <4> [57.122222]        driver_register+0x56/0xf0
      <4> [57.122226]        do_one_initcall+0x58/0x2ff
      <4> [57.122230]        do_init_module+0x56/0x1f8
      <4> [57.122233]        load_module+0x243e/0x29f0
      <4> [57.122236]        __do_sys_finit_module+0xe9/0x110
      <4> [57.122239]        do_syscall_64+0x4f/0x210
      <4> [57.122242]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
      <4> [57.122244]
      -> #0 (fs_reclaim){+.+.}:
      <4> [57.122249]        __lock_acquire+0x1328/0x15d0
      <4> [57.122251]        lock_acquire+0xa7/0x1c0
      <4> [57.122254]        fs_reclaim_acquire.part.117+0x24/0x30
      <4> [57.122257]        __kmalloc+0x48/0x320
      <4> [57.122261]        acpi_ns_internalize_name+0x44/0x9b
      <4> [57.122264]        acpi_ns_get_node_unlocked+0x6b/0xd3
      <4> [57.122267]        acpi_ns_get_node+0x3b/0x50
      <4> [57.122271]        acpi_get_handle+0x8a/0xb4
      <4> [57.122274]        acpi_has_method+0x1c/0x40
      <4> [57.122278]        acpi_pci_set_power_state+0x40/0xe0
      <4> [57.122281]        pci_platform_power_transition+0x3e/0x90
      <4> [57.122284]        pci_set_power_state+0x83/0xf0
      <4> [57.122287]        pci_restore_standard_config+0x22/0x40
      <4> [57.122289]        pci_pm_runtime_resume+0x23/0xc0
      <4> [57.122293]        __rpm_callback+0xb1/0x110
      <4> [57.122296]        rpm_callback+0x1a/0x70
      <4> [57.122299]        rpm_resume+0x50e/0x790
      <4> [57.122302]        __pm_runtime_resume+0x42/0x80
      <4> [57.122357]        __intel_runtime_pm_get+0x15/0x60 [i915]
      <4> [57.122435]        ggtt_unbind_vma+0x24/0x60 [i915]
      <4> [57.122514]        __i915_vma_unbind.part.39+0xb5/0x500 [i915]
      <4> [57.122593]        i915_vma_unbind+0x2d/0x50 [i915]
      <4> [57.122668]        i915_gem_object_unbind+0x11c/0x260 [i915]
      <4> [57.122740]        i915_gem_object_set_cache_level+0x32/0x90 [i915]
      <4> [57.122810]        i915_gem_set_caching_ioctl+0x1f7/0x2f0 [i915]
      <4> [57.122815]        drm_ioctl_kernel+0xa7/0xf0
      <4> [57.122818]        drm_ioctl+0x2e1/0x390
      <4> [57.122822]        do_vfs_ioctl+0xa0/0x6f0
      <4> [57.122825]        ksys_ioctl+0x35/0x60
      <4> [57.122828]        __x64_sys_ioctl+0x11/0x20
      <4> [57.122830]        do_syscall_64+0x4f/0x210
      <4> [57.122833]        entry_SYSCALL_64_after_hwframe+0x49/0xbe
      
      Closes: https://gitlab.freedesktop.org/drm/intel/issues/711Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NMatthew Auld <matthew.auld@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191203101347.2836057-1-chris@chris-wilson.co.uk
      3e817471
    • C
      drm/i915: Serialise i915_active_wait() with its retirement · e1cda6a5
      Chris Wilson 提交于
      As the i915_active.retire() may be running on another CPU as we detect
      that the i915_active is idle, we may not wait for the retirement itself.
      Wait for the remote callback by waiting for the retirement worker.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112424Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191202140133.2444217-2-chris@chris-wilson.co.uk
      e1cda6a5
    • C
      drm/i915: Specialise i915_active.work lock classes · ae303004
      Chris Wilson 提交于
      Similar to for i915_active.mutex, we require each class of i915_active
      to have distinct lockdep chains as some, but by no means all,
      i915_active are used within the shrinker and so have much more severe
      usage constraints. By using a lockclass local to i915_active_init() all
      i915_active workers have the same lock class, and we may generate false
      positives when waiting for the i915_active. If we push the lockclass
      into the caller, each class of i915_active will have distinct lockdep
      chains.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Acked-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191202140133.2444217-1-chris@chris-wilson.co.uk
      ae303004
    • C
      drm/i915/gem: Unbind all current vma on changing cache-level · 7d0aa0db
      Chris Wilson 提交于
      Avoid dangerous race handling of destroyed vma by unbinding all vma
      instead. Unfortunately, this stops us from trying to be clever and only
      doing the minimal change required, so on first use of scanout we may
      encounter an annoying stall as it transitions to a new cache level.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112413Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NMatthew Auld <matthew.auld@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191202174310.2630302-1-chris@chris-wilson.co.uk
      7d0aa0db