Chris Wilson
0f763ff370
drm/i915: Lock llist_del_first() vs llist_del_all()
...
An oversight in commit 87701b4b55 ("drm/i915: Only free the oldest
stale object before a fresh allocation") was that not only do we have to
serialise concurrent users of llist_del_first(), but we also have to
lock llist_del_first() vs llist_del_all().
From llist.h,
* This can be summarized as follows:
*
* | add | del_first | del_all
* add | - | - | -
* del_first | | L | L
* del_all | | | -
*
* Where, a particular row's operation can happen concurrently with a column's
* operation, with "-" being no lock needed, while "L" being lock is needed.
This should hopefully explain:
<4>[ 89.287106] general protection fault: 0000 [#1 ] PREEMPT SMP
<4>[ 89.287126] Modules linked in: snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_codec_generic x86_pkg_temp_thermal intel_powerclamp coretemp i915 crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core r8169 mii mei_me mei snd_pcm prime_numbers i2c_hid pinctrl_geminilake pinctrl_intel
<4>[ 89.287226] CPU: 2 PID: 23 Comm: ksoftirqd/2 Tainted: G U 4.14.0-rc8-CI-CI_DRM_3315+ #1
<4>[ 89.287247] Hardware name: Intel Corp. Geminilake/GLK RVP2 LP4SD (07), BIOS GELKRVPA.X64.0062.B30.1708222146 08/22/2017
<4>[ 89.287270] task: ffff88017ab34ec0 task.stack: ffffc90000128000
<4>[ 89.287290] RIP: 0010:llist_add_batch+0x4/0x20
<4>[ 89.287301] RSP: 0018:ffffc9000012bdb8 EFLAGS: 00010296
<4>[ 89.287314] RAX: ffffffff811017ad RBX: 6e468801a1560000 RCX: ef3e53fceecdeb81
<4>[ 89.287330] RDX: 6e468801a1566130 RSI: ffff880103d73d98 RDI: ffff880103d73d98
<4>[ 89.287346] RBP: ffffc9000012bdb8 R08: ffff88017ab35780 R09: 0000000000000000
<4>[ 89.287361] R10: ffffc9000012bd68 R11: 00000000abb18c3d R12: ffffffffa01369e0
<4>[ 89.287377] R13: ffff88017fd1b8f8 R14: ffff88017ab34ec0 R15: 000000000000000a
<4>[ 89.287393] FS: 0000000000000000(0000) GS:ffff88017fd00000(0000) knlGS:0000000000000000
<4>[ 89.287411] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
<4>[ 89.287424] CR2: 00007ff0c0755018 CR3: 000000016df9b000 CR4: 00000000003406e0
<4>[ 89.287440] Call Trace:
<4>[ 89.287511] __i915_gem_free_object_rcu+0x20/0x40 [i915]
<4>[ 89.287527] rcu_process_callbacks+0x27a/0x730
<4>[ 89.287544] __do_softirq+0xc0/0x4ae
<4>[ 89.287559] ? smpboot_thread_fn+0x2d/0x280
<4>[ 89.287571] run_ksoftirqd+0x1f/0x70
<4>[ 89.287582] smpboot_thread_fn+0x18a/0x280
<4>[ 89.287595] kthread+0x114/0x150
<4>[ 89.287605] ? sort_range+0x30/0x30
<4>[ 89.287615] ? kthread_create_on_node+0x40/0x40
<4>[ 89.287628] ret_from_fork+0x27/0x40
<4>[ 89.287641] Code: 0d 48 83 ea 01 4c 89 c1 48 83 fa ff 74 12 48 23 0c d7 74 ed 48 c1 e2 06 48 0f bd c9 48 8d 04 0a 5d c3 90 90 90 90 90 55 48 89 e5 <48> 8b 0a 48 89 0e 48 89 c8 f0 48 0f b1 3a 48 39 c1 75 ed 48 85
<1>[ 89.287774] RIP: llist_add_batch+0x4/0x20 RSP: ffffc9000012bdb8
<4>[ 89.287826] ---[ end trace e775d15174d8ae02 ]---
(Lockless lists are only easy (and lockless) when only using
llist_add/llist_del_all!)
Fixes: 87701b4b55 ("drm/i915: Only free the oldest stale object before
a fresh allocation")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171106111508.11941-1-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
(cherry picked from commit f991c492aa )
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
2017-11-09 16:18:25 +02:00
arch
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
block
bio_copy_user_iov(): don't ignore ->iov_offset
2017-10-10 23:55:14 -04:00
certs
modsign: add markers to endif-statements in certs/Makefile
2017-07-14 11:01:37 +10:00
crypto
Merge commit 'tags/keys-fixes-20171018' into fixes-v4.14-rc5
2017-10-19 12:28:38 +11:00
Documentation
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
drivers
drm/i915: Lock llist_del_first() vs llist_del_all()
2017-11-09 16:18:25 +02:00
firmware
firmware: Restore support for built-in firmware
2017-09-16 10:58:48 -07:00
fs
Various SMB3 fixes for 4.14 and stable
2017-10-28 08:39:35 -07:00
include
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
init
kbuild: Fix optimization level choice default
2017-10-07 20:08:05 +09:00
ipc
fix a typo in put_compat_shm_info()
2017-09-25 20:41:46 -04:00
kernel
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2017-10-29 08:11:49 -07:00
lib
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
mm
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
net
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2017-10-29 08:11:49 -07:00
samples
Fix tracing sample code warning.
2017-10-27 20:35:31 -07:00
scripts
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
security
Revert "apparmor: add base infastructure for socket mediation"
2017-10-26 19:35:35 +02:00
sound
ALSA: hda - fix headset mic problem for Dell machines with alc236
2017-10-24 14:32:24 +02:00
tools
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
usr
ramfs: clarify help text that compression applies to ramfs as well as legacy ramdisk.
2017-07-06 16:24:30 -07:00
virt
Revert "KVM: Don't accept obviously wrong gsi values via KVM_IRQFD"
2017-09-19 08:37:17 +02:00
.cocciconfig
.get_maintainer.ignore
.gitattributes
.gitattributes: set git diff driver for C source code files
2016-10-07 18:46:30 -07:00
.gitignore
kbuild: Add support to generate LLVM assembly files
2017-04-25 08:13:52 +09:00
.mailmap
Update James Hogan's email address
2017-10-04 17:11:53 -07:00
COPYING
CREDITS
selinux/stable-4.14 PR 20170831
2017-09-12 13:21:00 -07:00
Kbuild
kbuild: Consolidate header generation from ASM offset information
2017-04-13 05:43:37 +09:00
Kconfig
MAINTAINERS
Linux 4.14-rc7
2017-11-02 12:40:41 +10:00
Makefile
Linux 4.14-rc7
2017-10-29 13:58:38 -07:00
README
README: add a new README file, pointing to the Documentation/
2016-10-24 08:12:35 -02:00