John Stultz
36fb7843f1
pstore: Revert pmsg_lock back to a normal mutex
...
[ Upstream commit 5239a89b06d6b199f133bf0ffea421683187f257 ]
This reverts commit 76d62f24db07f22ccf9bc18ca793c27d4ebef721.
So while priority inversion on the pmsg_lock is an occasional
problem that an rt_mutex would help with, in uses where logging
is writing to pmsg heavily from multiple threads, the pmsg_lock
can be heavily contended.
After this change landed, it was reported that cases where the
mutex locking overhead was commonly adding on the order of 10s
of usecs delay had suddenly jumped to ~msec delay with rtmutex.
It seems the slight differences in the locks under this level
of contention causes the normal mutexes to utilize the spinning
optimizations, while the rtmutexes end up in the sleeping
slowpath (which allows additional threads to pile on trying
to take the lock).
In this case, it devolves to a worse case senerio where the lock
acquisition and scheduling overhead dominates, and each thread
is waiting on the order of ~ms to do ~us of work.
Obviously, having tons of threads all contending on a single
lock for logging is non-optimal, so the proper fix is probably
reworking pstore pmsg to have per-cpu buffers so we don't have
contention.
Additionally, Steven Rostedt has provided some furhter
optimizations for rtmutexes that improves the rtmutex spinning
path, but at least in my testing, I still see the test tripping
into the sleeping path on rtmutexes while utilizing the spinning
path with mutexes.
But in the short term, lets revert the change to the rt_mutex
and go back to normal mutexes to avoid a potentially major
performance regression. And we can work on optimizations to both
rtmutexes and finer-grained locking for pstore pmsg in the
future.
Cc: Wei Wang <wvw@google.com>
Cc: Midas Chien<midaschieh@google.com>
Cc: "Chunhui Li (李春辉)" <chunhui.li@mediatek.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: Anton Vorontsov <anton@enomsg.org>
Cc: "Guilherme G. Piccoli" <gpiccoli@igalia.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: kernel-team@android.com
Fixes: 76d62f24db07 ("pstore: Switch pmsg_lock to an rt_mutex to avoid priority inversion")
Reported-by: "Chunhui Li (李春辉)" <chunhui.li@mediatek.com>
Signed-off-by: John Stultz <jstultz@google.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230308204043.2061631-1-jstultz@google.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-05-17 11:35:45 +02:00
..
9p
9p: missing chunk of "fs/9p: Don't update file type when updating file attributes"
2022-06-22 14:11:02 +02:00
adfs
affs
affs: initialize fsdata in affs_truncate()
2023-02-06 07:52:36 +01:00
afs
afs: Fix fileserver probe RTT handling
2022-12-08 11:23:03 +01:00
autofs
befs
bfs
bfs: don't use WARNING: string when it's just info.
2021-01-06 14:48:39 +01:00
btrfs
btrfs: fix fast csum implementation detection
2023-04-20 12:07:35 +02:00
cachefiles
cachefiles: Handle readpage error correctly
2020-11-05 11:43:36 +01:00
ceph
ceph: flush cap releases when the session is flushed
2023-02-22 12:50:33 +01:00
cifs
smb3: fix problem with null cifs super block with previous patch
2023-04-20 12:07:32 +02:00
coda
coda: Avoid partial allocation of sig_inputArgs
2023-03-11 16:43:56 +01:00
configfs
configfs: fix possible memory leak in configfs_create_dir()
2023-01-18 11:41:09 +01:00
cramfs
crypto
fscrypt: add fscrypt_symlink_getattr() for computing st_size
2021-09-12 08:56:38 +02:00
debugfs
debugfs: regset32: Add Runtime PM support
2023-05-17 11:35:32 +02:00
devpts
fsnotify: fix fsnotify hooks in pseudo filesystems
2022-02-01 17:24:34 +01:00
dlm
fs: dlm: handle -EBUSY first in lock arg validation
2022-10-26 13:22:14 +02:00
ecryptfs
Revert "ecryptfs: replace BUG_ON with error handling code"
2021-05-26 12:05:19 +02:00
efivarfs
efivarfs: revert "fix memory leak in efivarfs_create()"
2020-12-02 08:49:53 +01:00
efs
erofs
erofs: fix potential overflow calculating xattr_isize
2023-05-17 11:35:35 +02:00
exportfs
ext2
ext2: Add more validity checks for inode counts
2022-08-25 11:17:28 +02:00
ext4
ext4: fix use-after-free in ext4_xattr_set_entry
2023-04-26 11:24:05 +02:00
f2fs
f2fs: handle dqget error in f2fs_transfer_project_quota()
2023-05-17 11:35:42 +02:00
fat
fat: add ratelimit to fat*_ent_bread()
2022-06-14 18:11:30 +02:00
freevxfs
fscache
fscache: Fix cookie key hashing
2021-09-22 12:26:25 +02:00
fuse
fuse: lock inode unconditionally in fuse_fallocate()
2022-12-08 11:23:01 +01:00
gfs2
gfs2: Always check inode size of inline inodes
2023-04-05 11:16:46 +02:00
hfs
hfs: fix missing hfs_bnode_get() in __hfs_bnode_create
2023-03-11 16:43:59 +01:00
hfsplus
fs: hfsplus: fix UAF issue in hfsplus_put_super
2023-03-11 16:43:59 +01:00
hostfs
hostfs: fix memory handling in follow_link()
2021-04-14 08:24:14 +02:00
hpfs
hugetlbfs
hugetlbfs: fix null-ptr-deref in hugetlbfs_parse_param()
2023-01-18 11:41:38 +01:00
iomap
iomap: iomap_write_failed fix
2022-06-14 18:11:36 +02:00
isofs
isofs: Fix out of bound access for corrupted isofs image
2021-11-12 14:43:03 +01:00
jbd2
jbd2: wake up journal waiters in FIFO order, not LIFO
2022-10-26 13:22:17 +02:00
jffs2
jffs2: correct logic when creating a hole in jffs2_write_begin
2023-03-22 13:28:07 +01:00
jfs
fs/jfs: fix shift exponent db_agl2size negative
2023-03-11 16:44:07 +01:00
kernfs
kernfs: fix use-after-free in __kernfs_remove
2022-11-03 23:56:54 +09:00
lockd
lockd: lockd server-side shouldn't set fl_ops
2021-09-22 12:26:34 +02:00
minix
minix: fix bug when opening a file with O_DIRECT
2022-04-15 14:18:35 +02:00
nfs
NFSv4: Fix hangs when recovering open state after a server reboot
2023-04-05 11:16:45 +02:00
nfs_common
nfs_common: need lock during iterate through the list
2020-12-30 11:51:22 +01:00
nfsd
NFSD: callback request does not use correct credential for AUTH_SYS
2023-04-20 12:07:33 +02:00
nilfs2
nilfs2: initialize unused bytes in segment summary blocks
2023-04-26 11:24:04 +02:00
nls
notify
fsnotify: fix wrong lockdep annotations
2022-06-14 18:11:34 +02:00
ntfs
ntfs: check overflow when iterating ATTR_RECORDs
2022-11-25 17:42:22 +01:00
ocfs2
ocfs2: fix data corruption after failed write
2023-04-05 11:16:42 +02:00
omfs
openpromfs
orangefs
orangefs: Fix kmemleak in orangefs_{kernel,client}_debug_init()
2023-01-18 11:41:39 +01:00
overlayfs
ovl: Use ovl mounter's fsuid and fsgid in ovl_link()
2023-01-18 11:41:43 +01:00
proc
mm: hugetlb: proc: check for hugetlb shared PMD in /proc/PID/smaps
2023-02-22 12:50:28 +01:00
pstore
pstore: Revert pmsg_lock back to a normal mutex
2023-05-17 11:35:45 +02:00
qnx4
qnx4: work around gcc false positive warning bug
2021-09-30 10:09:26 +02:00
qnx6
quota
ext4: fix bug_on in __es_tree_search caused by bad quota inode
2023-01-18 11:42:02 +01:00
ramfs
ramfs: fix nommu mmap with gaps in the page cache
2020-10-29 09:57:53 +01:00
reiserfs
reiserfs: Add security prefix to xattr name in reiserfs_security_write()
2023-05-17 11:35:33 +02:00
romfs
romfs: fix uninitialized memory leak in romfs_dev_read()
2020-08-26 10:40:51 +02:00
squashfs
revert "squashfs: harden sanity check in squashfs_read_xattr_id_table"
2023-02-22 12:50:39 +01:00
sysfs
sysfs: Add sysfs_emit and sysfs_emit_at to format sysfs output
2021-03-07 12:20:48 +01:00
sysv
fs: sysv: Fix sysv_nblocks() returns wrong value
2023-01-18 11:40:58 +01:00
tracefs
tracefs: Only clobber mode/uid/gid on remount if asked
2022-09-20 12:28:00 +02:00
ubifs
ubifs: Free memory for tmpfile name
2023-05-17 11:35:34 +02:00
udf
udf: Fix file corruption when appending just after end of preallocated extent
2023-03-11 16:44:01 +01:00
ufs
fs/ufs: avoid potential u32 multiplication overflow
2020-08-21 13:05:37 +02:00
unicode
verity
fsverity: don't drop pagecache at end of FS_IOC_ENABLE_VERITY
2023-04-05 11:16:42 +02:00
xfs
xfs: fix forkoff miscalculation related to XFS_LITINO(mp)
2023-04-26 11:24:06 +02:00
aio.c
aio: fix mremap after fork null-deref
2023-02-22 12:50:35 +01:00
anon_inodes.c
attr.c
vfs: Check the truncate maximum size in inode_newsize_ok()
2022-08-25 11:17:21 +02:00
bad_inode.c
binfmt_aout.c
binfmt: Move install_exec_creds after setup_new_exec to match binfmt_elf
2023-01-18 11:41:46 +01:00
binfmt_elf.c
elf: don't use MAP_FIXED_NOREPLACE for elf interpreter mappings
2021-10-06 15:42:35 +02:00
binfmt_elf_fdpic.c
binfmt: Fix error return code in load_elf_fdpic_binary()
2023-01-18 11:41:46 +01:00
binfmt_em86.c
binfmt_flat.c
binfmt: Move install_exec_creds after setup_new_exec to match binfmt_elf
2023-01-18 11:41:46 +01:00
binfmt_misc.c
binfmt_misc: fix shift-out-of-bounds in check_special_flags
2023-01-18 11:41:33 +01:00
binfmt_script.c
block_dev.c
block: reexpand iov_iter after read/write
2021-05-22 11:38:29 +02:00
buffer.c
mm: fs: initialize fsdata passed to write_begin/write_end interface
2022-11-25 17:42:22 +01:00
char_dev.c
chardev: fix error handling in cdev_device_add()
2023-01-18 11:41:25 +01:00
compat.c
compat_binfmt_elf.c
compat_ioctl.c
compat_ioctl: remove /dev/random commands
2022-06-22 14:11:03 +02:00
coredump.c
coredump: fix core_pattern parse error
2020-12-11 13:23:30 +01:00
d_path.c
fs: fix NULL dereference due to data race in prepend_path()
2020-10-29 09:57:45 +01:00
dax.c
dax: fix cache flush on PMD-mapped pages
2022-06-14 18:11:41 +02:00
dcache.c
fix dget_parent() fastpath race
2020-10-01 13:17:19 +02:00
dcookies.c
direct-io.c
fs: direct-io: fix missing sdio->boundary
2021-04-14 08:24:11 +02:00
drop_caches.c
eventfd.c
eventpoll.c
epoll: check for events when removing a timed out thread from the wait queue
2022-12-08 11:23:05 +01:00
exec.c
exec: Force single empty string when argv is empty
2022-06-06 08:33:50 +02:00
fcntl.c
fcntl: fix potential deadlock for &fasync_struct.fa_lock
2021-09-15 09:47:28 +02:00
fhandle.c
file.c
fs: prevent out-of-bounds array speculation when closing a file descriptor
2023-03-17 08:32:47 +01:00
file_table.c
SUNRPC: Ensure we flush any closed sockets before xs_xprt_free()
2022-05-25 09:14:34 +02:00
filesystems.c
fs-writeback.c
fs-writeback: writeback_sb_inodes:Recalculate 'wrote' according skipped pages
2022-06-14 18:11:44 +02:00
fs_context.c
memcg: charge fs_context and legacy_fs_context
2022-02-08 18:24:29 +01:00
fs_parser.c
fs_pin.c
fs_struct.c
fs_types.c
fsopen.c
inode.c
fs: fix UAF/GPF bug in nilfs_mdt_destroy
2022-10-15 07:54:36 +02:00
internal.h
cgroup1: fix leaked context root causing sporadic NULL deref in LTP
2021-07-31 08:19:37 +02:00
io_uring.c
io_uring/af_unix: defer registered files gc to io_uring release
2022-10-26 13:22:59 +02:00
ioctl.c
Kconfig
Kconfig.binfmt
libfs.c
libfs: add DEFINE_SIMPLE_ATTRIBUTE_SIGNED for signed value
2023-01-18 11:40:55 +01:00
locks.c
Makefile
mbcache.c
mbcache: Avoid nesting of cache->c_list_lock under bit locks
2023-01-18 11:41:59 +01:00
mount.h
mpage.c
namei.c
mm: fs: initialize fsdata passed to write_begin/write_end interface
2022-11-25 17:42:22 +01:00
namespace.c
fs: warn about impending deprecation of mandatory locks
2021-08-26 08:36:22 -04:00
no-block.c
nsfs.c
open.c
pipe.c
pipe: increase minimum default pipe size to 2 pages
2021-08-12 13:21:02 +02:00
pnode.c
pnode: terminate at peers of source
2023-01-18 11:41:44 +01:00
pnode.h
mount: fix mounting of detached mounts onto targets that reside on shared mounts
2021-03-17 17:03:33 +01:00
posix_acl.c
proc_namespace.c
read_write.c
readdir.c
readdir: make sure to verify directory entry for legacy interfaces too
2021-04-21 12:56:16 +02:00
select.c
select: Fix indefinitely sleeping task in poll_schedule_timeout()
2022-01-29 10:25:11 +01:00
seq_file.c
seq_file: disallow extremely large seq buffer allocations
2021-07-20 16:10:54 +02:00
signalfd.c
io_uring: disable polling pollfree files
2022-09-05 10:27:47 +02:00
splice.c
Revert "fs: check FMODE_LSEEK to control internal pipe splicing"
2022-10-17 17:24:32 +02:00
stack.c
stat.c
stat: fix inconsistency between struct stat and struct compat_stat
2022-04-27 13:50:48 +02:00
statfs.c
super.c
vfs: make freeze_super abort when sync_filesystem returns error
2022-02-23 11:59:55 +01:00
sync.c
timerfd.c
userfaultfd.c
userfaultfd: open userfaultfds with O_RDONLY
2022-10-26 13:22:21 +02:00
utimes.c
xattr.c
fs: don't audit the capability check in simple_xattr_list()
2023-01-18 11:40:53 +01:00