1. 12 11月, 2016 1 次提交
    • C
      drm/i915: Only wait upon the execution timeline when unlocked · 9caa34aa
      Chris Wilson 提交于
      In order to walk the list of all timelines, we currently require the
      struct_mutex. We are sometimes called prior to the struct_mutex being
      taken by the caller (i.e !I915_WAIT_LOCKED) in which case we can only
      trust the global execution timelines (as these are owned by the device).
      This means in the unlocked phase we can only wait upon the currently
      executing requests and not all queued.
      
      [  175.743243] general protection fault: 0000 [#1] SMP
      [  175.743263] Modules linked in: nls_iso8859_1 intel_rapl x86_pkg_temp_thermal coretemp kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel iwlwifi aesni_intel aes_x86_64 lrw snd_soc_rt5640 gf128mul snd_soc_rl6231 snd_soc_core glue_helper snd_compress snd_pcm_dmaengine snd_hda_codec_hdmi ablk_helper snd_hda_codec_realtek cryptd snd_hda_codec_generic serio_raw cfg80211 snd_hda_intel snd_hda_codec ir_lirc_codec snd_hda_core lirc_dev snd_hwdep snd_pcm lpc_ich mei_me mei snd_seq_midi shpchp snd_seq_midi_event snd_rawmidi snd_seq snd_seq_device snd_timer rc_rc6_mce acpi_als nuvoton_cir kfifo_buf rc_core snd industrialio snd_soc_sst_acpi soundcore snd_soc_sst_match i2c_designware_platform 8250_dw i2c_designware_core dw_dmac spi_pxa2xx_platform mac_hid acpi_pad parport_pc ppdev lp parport
      [  175.743509]  autofs4 i915 e1000e psmouse ptp pps_core xhci_pci ehci_pci ahci xhci_hcd ehci_hcd libahci video sdhci_acpi sdhci i2c_hid hid
      [  175.743560] CPU: 2 PID: 2386 Comm: wtdg_monitor.sh Tainted: G     U          4.9.0-rc4-nightly+ #2
      [  175.743581] Hardware name:                  /NUC5i7RYB, BIOS RYBDWi35.86A.0358.2016.0606.1423 06/06/2016
      [  175.743603] task: ffff88024509ba80 task.stack: ffffc9007bd18000
      [  175.743618] RIP: 0010:[<ffffffffa01af29b>]  [<ffffffffa01af29b>] i915_gem_wait_for_idle+0x3b/0x140 [i915]
      [  175.743660] RSP: 0000:ffffc9007bd1b9b8  EFLAGS: 00010297
      [  175.743674] RAX: ffff88024489d248 RBX: 0000000000000000 RCX: 0000000000000000
      [  175.743691] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff880244898000
      [  175.743708] RBP: ffffc9007bd1b9f0 R08: 0000000000000000 R09: 0000000000000001
      [  175.743724] R10: 00000028eaf42792 R11: 0000000000000001 R12: dead000000000100
      [  175.743741] R13: dead000000000148 R14: ffffc9007bd1ba5f R15: 0000000000000005
      [  175.743758] FS:  00007f2638330700(0000) GS:ffff880256d00000(0000) knlGS:0000000000000000
      [  175.743777] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  175.743791] CR2: 00007f885c8cea40 CR3: 00000002416b5000 CR4: 00000000003406e0
      [  175.743808] Stack:
      [  175.743816]  ffff88024489d248 000000004509ba80 ffff880244898000 ffff88024509ba80
      [  175.743840]  00000000ffff8b69 ffffc9007bd1ba5f ffffc9007bd1ba5e ffffc9007bd1ba28
      [  175.743863]  ffffffffa01b661d 00000000ffffffff 0000000000000000 ffff880244898000
      [  175.743886] Call Trace:
      [  175.743906]  [<ffffffffa01b661d>] i915_gem_shrinker_lock_uninterruptible.constprop.5+0x5d/0xc0 [i915]
      [  175.743937]  [<ffffffffa01b6cd0>] i915_gem_shrinker_oom+0x30/0x1b0 [i915]
      [  175.743955]  [<ffffffff8109ca79>] notifier_call_chain+0x49/0x70
      [  175.743971]  [<ffffffff8109cd9d>] __blocking_notifier_call_chain+0x4d/0x70
      [  175.743988]  [<ffffffff8109cdd6>] blocking_notifier_call_chain+0x16/0x20
      [  175.744005]  [<ffffffff811885dc>] out_of_memory+0x22c/0x480
      [  175.744020]  [<ffffffff81205542>] __alloc_pages_slowpath+0x851/0x8ec
      [  175.744037]  [<ffffffff8118ca51>] __alloc_pages_nodemask+0x2c1/0x310
      [  175.744054]  [<ffffffff811d8ea8>] alloc_pages_current+0x88/0x120
      [  175.744070]  [<ffffffff811833a4>] __page_cache_alloc+0xb4/0xc0
      [  175.744086]  [<ffffffff811865ca>] filemap_fault+0x29a/0x500
      [  175.744101]  [<ffffffff81299aa6>] ext4_filemap_fault+0x36/0x50
      [  175.744117]  [<ffffffff811b3d4a>] __do_fault+0x6a/0xe0
      [  175.744131]  [<ffffffff811b97ee>] handle_mm_fault+0xd0e/0x1330
      [  175.744147]  [<ffffffff8106738c>] __do_page_fault+0x23c/0x4d0
      [  175.744162]  [<ffffffff81067650>] do_page_fault+0x30/0x80
      [  175.744177]  [<ffffffff817ffbe8>] page_fault+0x28/0x30
      [  175.744191] Code: 41 57 41 56 41 55 41 54 53 48 83 ec 10 4c 8b a7 48 52 00 00 89 75 d4 48 89 45 c8 49 39 c4 74 78 4d 8d 6c 24 48 41 bf 05 00 00 00 <49> 8b 5d 00 48 85 db 74 50 8b 83 20 01 00 00 85 c0 74 15 48 8b
      [  175.744320] RIP  [<ffffffffa01af29b>] i915_gem_wait_for_idle+0x3b/0x140 [i915]
      [  175.744351]  RSP <ffffc9007bd1b9b8>
      
      Fixes: 80b204bc ("drm/i915: Enable multiple timelines")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Reviewed-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161111145809.9701-1-chris@chris-wilson.co.uk
      9caa34aa
  2. 11 11月, 2016 7 次提交
  3. 10 11月, 2016 10 次提交
  4. 09 11月, 2016 8 次提交
  5. 08 11月, 2016 7 次提交
  6. 07 11月, 2016 7 次提交
    • I
      drm/i915: Add assert for no pending GPU requests during suspend/resume in LR mode · 31ab49ab
      Imre Deak 提交于
      During resume we will reset the SW/HW tracking for each ring head/tail
      pointers and so are not prepared to replay any pending requests (as
      opposed to GPU reset time). Add an assert for this both to the suspend
      and the resume code.
      
      v2:
      - Check for ELSP port idle already during suspend and check !gt.awake
        during resume. (Chris)
      v3:
      - Move the !gt.awake check to i915_gem_resume().
      v4:
      - s/intel_lr_engines_idle/intel_execlists_idle/ (Chris)
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Cc: Mika Kuoppala <mika.kuoppala@intel.com>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: http://patchwork.freedesktop.org/patch/msgid/1478510405-11799-4-git-send-email-imre.deak@intel.com
      31ab49ab
    • I
      drm/i915: Make sure engines are idle during GPU idling in LR mode · 0cb5670b
      Imre Deak 提交于
      We assume that the GPU is idle once receiving the seqno via the last
      request's user interrupt. In execlist mode the corresponding context
      completed interrupt can be delayed though and until this latter
      interrupt arrives we consider the request to be pending on the ELSP
      submit port. This can cause a problem during system suspend where this
      last request will be seen by the resume code as still pending. Such
      pending requests are normally replayed after a GPU reset, but during
      resume we reset both SW and HW tracking of the ring head/tail pointers,
      so replaying the pending request with its stale tail pointer will leave
      the ring in an inconsistent state. A subsequent request submission can
      lead then to the GPU executing from uninitialized area in the ring
      behind the above stale tail pointer.
      
      Fix this by making sure any pending request on the ELSP port is
      completed before suspending. I used a polling wait since the completion
      time I measured was <1ms and since normally we only need to wait during
      system suspend. GPU idling during runtime suspend is scheduled with a
      delay (currently 50-100ms) after the retirement of the last request at
      which point the context completed interrupt must have arrived already.
      
      The chance of this bug was increased by
      
      commit 1c777c5d
      Author: Imre Deak <imre.deak@intel.com>
      Date:   Wed Oct 12 17:46:37 2016 +0300
      
          drm/i915/hsw: Fix GPU hang during resume from S3-devices state
      
      but it could happen even without the explicit GPU reset, since we
      disable interrupts afterwards during the suspend sequence.
      
      v2:
      - Do an unlocked poll-wait first. (Chris)
      v3-4:
      - s/intel_lr_engines_idle/intel_execlists_idle/ and move
        i915.enable_execlists check to the new helper. (Chris)
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Cc: Mika Kuoppala <mika.kuoppala@intel.com>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98470Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: http://patchwork.freedesktop.org/patch/msgid/1478510405-11799-3-git-send-email-imre.deak@intel.com
      0cb5670b
    • I
      drm/i915: Avoid early GPU idling due to race with new request · 93c97dc1
      Imre Deak 提交于
      There is a small race where a new request can be submitted and retired
      after the idle worker started to run which leads to idling the GPU too
      early. Fix this by deferring the idling to the pending instance of the
      worker.
      
      This scenario was pointed out by Chris.
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: http://patchwork.freedesktop.org/patch/msgid/1478510405-11799-2-git-send-email-imre.deak@intel.com
      93c97dc1
    • I
      drm/i915: Avoid early GPU idling due to already pending idle work · 5bd11a34
      Imre Deak 提交于
      Atm, in case an idle work handler is already pending but haven't yet
      started to run, retiring a new request will not extend the active period
      as required, rather simply leaves the pending idle work to be scheduled
      at the original expiration time. This may lead to idling the GPU too
      early. Fix this by using the delayed-work scheduler alternative which
      makes sure the handler's expiration time is extended in this case.
      
      Cc: Chris Wilson <chris@chris-wilson.co.uk>
      Requested-by: NChris Wilson <chris@chris-wilson.co.uk>
      Signed-off-by: NImre Deak <imre.deak@intel.com>
      Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
      Link: http://patchwork.freedesktop.org/patch/msgid/1478510405-11799-1-git-send-email-imre.deak@intel.com
      5bd11a34
    • C
      drm/i915: Limit Valleyview and earlier to only using mappable scanout · 767a222e
      Chris Wilson 提交于
      Valleyview appears to be limited to only scanning out from the first 512MiB
      of the Global GTT. Lets presume that this behaviour was inherited from the
      display block copied from g4x (not Ironlake) and all earlier generations
      are similarly affected, though testing suggests different symptoms. For
      simplicity, impose that these platforms must scanout from the mappable
      region. (For extra simplicity, use HAS_GMCH_DISPLAY even though this
      catches Cherryview which does not appear to be limited to the low
      aperture for its scanout.)
      
      v2: Use HAS_GMCH_DISPLAY() to more clearly convey my intent about
      limiting this workaround to the old style of display engine.
      
      v3: Update changelog to reflect testing by Ville Syrjälä
      v4: Include the changes to the comments as well
      Reported-by: NLuis Botello <luis.botello.ortega@intel.com>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98036
      Fixes: 2efb813d ("drm/i915: Fallback to using unmappable memory for scanout")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Akash Goel <akash.goel@intel.com>
      Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.9-rc1+
      Link: http://patchwork.freedesktop.org/patch/msgid/20161107110128.28762-1-chris@chris-wilson.co.uk
      Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com
      767a222e
    • C
      drm/i915: Round tile chunks up for constructing partial VMAs · 0ef723cb
      Chris Wilson 提交于
      When we split a large object up into chunks for GTT faulting (because we
      can't fit the whole object into the aperture) we have to align our cuts
      with the fence registers. Each partial VMA must cover a complete set of
      tile rows or the offset into each partial VMA is not aligned with the
      whole image. Currently we enforce a minimum size on each partial VMA,
      but this minimum size itself was not aligned to the tile row causing
      distortion.
      Reported-by: NAndreas Reis <andreas.reis@gmail.com>
      Reported-by: NChris Clayton <chris2553@googlemail.com>
      Reported-by: NNorbert Preining <preining@logic.at>
      Tested-by: NNorbert Preining <preining@logic.at>
      Tested-by: NChris Clayton <chris2553@googlemail.com>
      Fixes: 03af84fe ("drm/i915: Choose partial chunksize based on tile row size")
      Fixes: a61007a8 ("drm/i915: Fix partial GGTT faulting") # enabling patch
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98402
      Testcase: igt/gem_mmap_gtt/medium-copy-odd
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
      Cc: Jani Nikula <jani.nikula@linux.intel.com>
      Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.9-rc1+
      Link: http://patchwork.freedesktop.org/patch/msgid/20161107105443.27855-1-chris@chris-wilson.co.ukReviewed-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
      0ef723cb
    • C
      drm/i915: Remove the vma from the object list upon close · dfd2812e
      Chris Wilson 提交于
      Currently, the vma is being unlink from the object lookup on destroy.
      However, we are meant to be decoupling it upon close so that the user
      cannot access the closed vma whilst it remains active on the GPU.
      
      [   34.074858] kernel BUG at drivers/gpu/drm/i915/i915_gem_gtt.c:3561!
      [   34.074875] invalid opcode: 0000 [#1] PREEMPT SMP
      [   34.074888] Modules linked in: snd_hda_intel i915 x86_pkg_temp_thermal coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel lpc_ich mei_me mei snd_hda_codec_realtek snd_hda_codec_generic snd_hda_codec_hdmi snd_hda_codec snd_hwdep snd_hda_core i2c_designware_platform i2c_designware_core snd_pcm e1000e ptp pps_core sdhci_acpi sdhci mmc_core i2c_hid [last unloaded: i915]
      [   34.075010] CPU: 1 PID: 6224 Comm: gem_close_race Tainted: G     U          4.9.0-rc3-CI-CI_DRM_1800+ #1
      [   34.075034] Hardware name:                  /NUC5i7RYB, BIOS RYBDWi35.86A.0355.2016.0224.1501 02/24/2016
      [   34.075057] task: ffff8802459a8040 task.stack: ffffc90000524000
      [   34.075074] RIP: 0010:[<ffffffffa0392cbc>]  [<ffffffffa0392cbc>] i915_gem_obj_lookup_or_create_vma+0x8c/0xc0 [i915]
      [   34.075118] RSP: 0018:ffffc90000527b68  EFLAGS: 00010202
      [   34.075135] RAX: ffff8802426c5e40 RBX: 0000000000000000 RCX: ffff8802447fc2a8
      [   34.075158] RDX: 0000000000000000 RSI: ffff8802447fc2a8 RDI: ffff880248a4a880
      [   34.075181] RBP: ffffc90000527b88 R08: 0000000000000008 R09: 0000000000000000
      [   34.075203] R10: 0000000000000001 R11: 0000000000000000 R12: ffff880248a4a880
      [   34.075225] R13: ffff8802447fc2a8 R14: ffff880243e9afa8 R15: ffff880248a4a9c8
      [   34.075248] FS:  00007f9b43e59740(0000) GS:ffff880256c80000(0000) knlGS:0000000000000000
      [   34.075273] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [   34.075292] CR2: 00007f9b43419140 CR3: 000000024455d000 CR4: 00000000003406e0
      [   34.075314] Stack:
      [   34.075323]  0000000000000000 ffffc90000527bd0 ffff880243cb8008 ffff880243e9afa8
      [   34.075353]  ffffc90000527c08 ffffffffa03874c7 ffffc90000527bb8 ffff880243e9afa8
      [   34.075383]  ffff880243e9afb0 ffffc90000527e10 ffff8802447fc2a8 ffff880243cb8040
      [   34.075414] Call Trace:
      [   34.075435]  [<ffffffffa03874c7>] eb_lookup_vmas.isra.7+0x247/0x330 [i915]
      [   34.075468]  [<ffffffffa0388c34>] i915_gem_do_execbuffer.isra.15+0x604/0x1a10 [i915]
      [   34.075507]  [<ffffffffa039c957>] ? i915_gem_object_get_sg+0x347/0x380 [i915]
      [   34.075532]  [<ffffffff811a69ce>] ? __might_fault+0x3e/0x90
      [   34.075562]  [<ffffffffa038a430>] i915_gem_execbuffer2+0xc0/0x250 [i915]
      [   34.075585]  [<ffffffff81552926>] drm_ioctl+0x1f6/0x480
      [   34.075604]  [<ffffffff8100107a>] ? trace_hardirqs_on_thunk+0x1a/0x1c
      [   34.075635]  [<ffffffffa038a370>] ? i915_gem_execbuffer+0x330/0x330 [i915]
      [   34.075658]  [<ffffffff81202d2e>] do_vfs_ioctl+0x8e/0x690
      [   34.075677]  [<ffffffff8181582d>] ? _raw_spin_unlock_irqrestore+0x3d/0x60
      [   34.075700]  [<ffffffff810fcd51>] ? SyS_timer_settime+0x141/0x1e0
      [   34.075721]  [<ffffffff810d6de2>] ? trace_hardirqs_on_caller+0x122/0x1b0
      [   34.075742]  [<ffffffff8120336c>] SyS_ioctl+0x3c/0x70
      [   34.075760]  [<ffffffff8181602e>] entry_SYSCALL_64_fastpath+0x1c/0xb1
      [   34.075781] Code: 44 a0 48 c7 c2 9a 7e 43 a0 be e0 0d 00 00 48 c7 c7 a0 45 44 a0 e8 55 b8 ce e0 48 85 db 74 a3 49 83 bd f8 03 00 00 00 74 99 0f 0b <0f> 0b 48 89 da 4c 89 ee 4c 89 e7 e8 04 a9 ff ff 48 89 da 49 89
      [   34.075955] RIP  [<ffffffffa0392cbc>] i915_gem_obj_lookup_or_create_vma+0x8c/0xc0 [i915]
      [   34.075994]  RSP <ffffc90000527b68>
      
      Testcase: igt/gem_close_race/basic-threads
      Fixes: db6c2b41 ("drm/i915: Store the vma in an rbtree...")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: http://patchwork.freedesktop.org/patch/msgid/20161104161241.25871-1-chris@chris-wilson.co.ukReviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      dfd2812e