• Chris Wilson's avatar
    drm/i915: Track pages pinned due to swizzling quirk · bc0629a7
    Chris Wilson authored
    If we have a tiled object and an unknown CPU swizzle pattern, we pin the
    pages to prevent the object from being swapped out (and us corrupting
    the contents as we do not know the access pattern and so cannot convert
    it to linear and back to tiled on reuse). This requires us to remember
    to drop the extra pinning when freeing the object, or else we trigger
    warnings about the pin leak. In commit fbbd37b3 ("drm/i915: Move
    object release to a freelist + worker"), the object free path was
    deferred to a worker, but the unpinning of the quirk, along with marking
    the object as reclaimable, was left on the immediate path (so that if
    required we could reclaim the pages under memory pressure as early as
    possible). However, this split introduced a bug where the pages were no
    longer being unpinned if they were marked as unneeded.
    
    [  231.800401] WARNING: CPU: 1 PID: 90 at drivers/gpu/drm/i915/i915_gem.c:4275 __i915_gem_free_objects+0x326/0x3c0 [i915]
    [  231.800403] WARN_ON(i915_gem_object_has_pinned_pages(obj))
    [  231.800405] Modules linked in:
    [  231.800406]  snd_hda_intel i915 snd_hda_codec_generic mei_me snd_hda_codec coretemp snd_hwdep mei lpc_ich snd_hda_core snd_pcm e1000e ptp pps_core [last unloaded: i915]
    [  231.800426] CPU: 1 PID: 90 Comm: kworker/1:4 Tainted: G     U          4.9.0-rc2-CI-CI_DRM_1780+ #1
    [  231.800428] Hardware name: LENOVO 7465CTO/7465CTO, BIOS 6DET44WW (2.08 ) 04/22/2009
    [  231.800456] Workqueue: events __i915_gem_free_work [i915]
    [  231.800459]  ffffc9000034fc80 ffffffff8142dd65 ffffc9000034fcd0 0000000000000000
    [  231.800465]  ffffc9000034fcc0 ffffffff8107e4e6 000010b300000001 0000000000001000
    [  231.800469]  ffff88011d3db740 ffff880130ef0000 0000000000000000 ffff880130ef5ea0
    [  231.800474] Call Trace:
    [  231.800479]  [<ffffffff8142dd65>] dump_stack+0x67/0x92
    [  231.800484]  [<ffffffff8107e4e6>] __warn+0xc6/0xe0
    [  231.800487]  [<ffffffff8107e54a>] warn_slowpath_fmt+0x4a/0x50
    [  231.800491]  [<ffffffff811d12ac>] ? kmem_cache_free+0x2dc/0x340
    [  231.800520]  [<ffffffffa009ef36>] __i915_gem_free_objects+0x326/0x3c0 [i915]
    [  231.800548]  [<ffffffffa009effe>] __i915_gem_free_work+0x2e/0x50 [i915]
    [  231.800552]  [<ffffffff8109c27c>] process_one_work+0x1ec/0x6b0
    [  231.800555]  [<ffffffff8109c1f6>] ? process_one_work+0x166/0x6b0
    [  231.800558]  [<ffffffff8109c789>] worker_thread+0x49/0x490
    [  231.800561]  [<ffffffff8109c740>] ? process_one_work+0x6b0/0x6b0
    [  231.800563]  [<ffffffff8109c740>] ? process_one_work+0x6b0/0x6b0
    [  231.800566]  [<ffffffff810a2aab>] kthread+0xeb/0x110
    [  231.800569]  [<ffffffff810a29c0>] ? kthread_park+0x60/0x60
    [  231.800573]  [<ffffffff818164a7>] ret_from_fork+0x27/0x40
    
    Moving to a separate flag for tracking the quirked pin is overkill for
    the bug (since we only have to interchange the two tests in
    i915_gem_free_object) but it does reduce a complicated test on all
    objects and provide a sanitycheck for uncommon code paths.
    
    Fixes: fbbd37b3 ("drm/i915: Move object release to a freelist + worker")
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20161101100317.11129-2-chris@chris-wilson.co.uk
    bc0629a7
i915_gem.c 136 KB