• Chris Wilson's avatar
    drm/i915: Lift i915_vma_pin() out of intel_renderstate_emit() · 42d10511
    Chris Wilson authored
    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: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20191202204316.2665847-1-chris@chris-wilson.co.uk
    42d10511
i915_gem.c 38.6 KB