diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-04 19:16:04 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:26 -0400 |
commit | 3098553776a16c08446c408005090423d62e6b54 (patch) | |
tree | 17cc317918e2fb51dd540d86650510928965cb5e /fs/bcachefs/btree_types.h | |
parent | bcachefs: Refactor bch2_btree_node_mem_alloc() (diff) | |
download | linux-3098553776a16c08446c408005090423d62e6b54.tar.gz linux-3098553776a16c08446c408005090423d62e6b54.tar.bz2 linux-3098553776a16c08446c408005090423d62e6b54.zip |
bcachefs: Fix usage of six lock's percpu mode
Six locks have a percpu mode, which we use for interior btree nodes, as
well as btree key cache keys for the subvolumes btree. We've been
switching locks back and forth between percpu and non percpu mode as
needed, but it turns out this is racy - when we're reusing an existing
node, other threads could be attempting to lock it while we're switching
it between modes.
This patch fixes this by never switching 'struct btree' between the two
modes, and instead segragating them between two different freed lists.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_types.h')
-rw-r--r-- | fs/bcachefs/btree_types.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 561406b4b7c2..51eb686331bf 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -152,7 +152,8 @@ struct btree_cache { struct mutex lock; struct list_head live; struct list_head freeable; - struct list_head freed; + struct list_head freed_pcpu; + struct list_head freed_nonpcpu; /* Number of elements in live + freeable lists */ unsigned used; |