Skip to content

Commit 972a278

Browse files
committed
Merge tag 'for-5.19-rc7-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs reverts from David Sterba: "Due to a recent report [1] we need to revert the radix tree to xarray conversion patches. There's a problem with sleeping under spinlock, when xa_insert could allocate memory under pressure. We use GFP_NOFS so this is a real problem that we unfortunately did not discover during review. I'm sorry to do such change at rc6 time but the revert is IMO the safer option, there are patches to use mutex instead of the spin locks but that would need more testing. The revert branch has been tested on a few setups, all seem ok. The conversion to xarray will be revisited in the future" Link: https://lore.kernel.org/linux-btrfs/cover.1657097693.git.fdmanana@suse.com/ [1] * tag 'for-5.19-rc7-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: Revert "btrfs: turn delayed_nodes_tree into an XArray" Revert "btrfs: turn name_cache radix tree into XArray in send_ctx" Revert "btrfs: turn fs_info member buffer_radix into XArray" Revert "btrfs: turn fs_roots_radix in btrfs_fs_info into an XArray"
2 parents c5fe7a9 + 088aea3 commit 972a278

File tree

9 files changed

+340
-256
lines changed

9 files changed

+340
-256
lines changed

fs/btrfs/ctree.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -675,9 +675,8 @@ struct btrfs_fs_info {
675675
rwlock_t global_root_lock;
676676
struct rb_root global_root_tree;
677677

678-
/* The xarray that holds all the FS roots */
679-
spinlock_t fs_roots_lock;
680-
struct xarray fs_roots;
678+
spinlock_t fs_roots_radix_lock;
679+
struct radix_tree_root fs_roots_radix;
681680

682681
/* block group cache stuff */
683682
rwlock_t block_group_cache_lock;
@@ -995,10 +994,10 @@ struct btrfs_fs_info {
995994

996995
struct btrfs_delayed_root *delayed_root;
997996

998-
/* Extent buffer xarray */
997+
/* Extent buffer radix tree */
999998
spinlock_t buffer_lock;
1000999
/* Entries are eb->start / sectorsize */
1001-
struct xarray extent_buffers;
1000+
struct radix_tree_root buffer_radix;
10021001

10031002
/* next backup root to be overwritten */
10041003
int backup_root_index;
@@ -1119,8 +1118,7 @@ enum {
11191118
*/
11201119
BTRFS_ROOT_SHAREABLE,
11211120
BTRFS_ROOT_TRACK_DIRTY,
1122-
/* The root is tracked in fs_info::fs_roots */
1123-
BTRFS_ROOT_REGISTERED,
1121+
BTRFS_ROOT_IN_RADIX,
11241122
BTRFS_ROOT_ORPHAN_ITEM_INSERTED,
11251123
BTRFS_ROOT_DEFRAG_RUNNING,
11261124
BTRFS_ROOT_FORCE_COW,
@@ -1224,10 +1222,10 @@ struct btrfs_root {
12241222
struct rb_root inode_tree;
12251223

12261224
/*
1227-
* Xarray that keeps track of delayed nodes of every inode, protected
1228-
* by inode_lock
1225+
* radix tree that keeps track of delayed nodes of every inode,
1226+
* protected by inode_lock
12291227
*/
1230-
struct xarray delayed_nodes;
1228+
struct radix_tree_root delayed_nodes_tree;
12311229
/*
12321230
* right now this just gets used so that a root has its own devid
12331231
* for stat. It may be used for more later

fs/btrfs/delayed-inode.c

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static struct btrfs_delayed_node *btrfs_get_delayed_node(
7878
}
7979

8080
spin_lock(&root->inode_lock);
81-
node = xa_load(&root->delayed_nodes, ino);
81+
node = radix_tree_lookup(&root->delayed_nodes_tree, ino);
8282

8383
if (node) {
8484
if (btrfs_inode->delayed_node) {
@@ -90,17 +90,17 @@ static struct btrfs_delayed_node *btrfs_get_delayed_node(
9090

9191
/*
9292
* It's possible that we're racing into the middle of removing
93-
* this node from the xarray. In this case, the refcount
93+
* this node from the radix tree. In this case, the refcount
9494
* was zero and it should never go back to one. Just return
95-
* NULL like it was never in the xarray at all; our release
95+
* NULL like it was never in the radix at all; our release
9696
* function is in the process of removing it.
9797
*
9898
* Some implementations of refcount_inc refuse to bump the
9999
* refcount once it has hit zero. If we don't do this dance
100100
* here, refcount_inc() may decide to just WARN_ONCE() instead
101101
* of actually bumping the refcount.
102102
*
103-
* If this node is properly in the xarray, we want to bump the
103+
* If this node is properly in the radix, we want to bump the
104104
* refcount twice, once for the inode and once for this get
105105
* operation.
106106
*/
@@ -128,30 +128,36 @@ static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node(
128128
u64 ino = btrfs_ino(btrfs_inode);
129129
int ret;
130130

131-
do {
132-
node = btrfs_get_delayed_node(btrfs_inode);
133-
if (node)
134-
return node;
131+
again:
132+
node = btrfs_get_delayed_node(btrfs_inode);
133+
if (node)
134+
return node;
135135

136-
node = kmem_cache_zalloc(delayed_node_cache, GFP_NOFS);
137-
if (!node)
138-
return ERR_PTR(-ENOMEM);
139-
btrfs_init_delayed_node(node, root, ino);
136+
node = kmem_cache_zalloc(delayed_node_cache, GFP_NOFS);
137+
if (!node)
138+
return ERR_PTR(-ENOMEM);
139+
btrfs_init_delayed_node(node, root, ino);
140140

141-
/* Cached in the inode and can be accessed */
142-
refcount_set(&node->refs, 2);
141+
/* cached in the btrfs inode and can be accessed */
142+
refcount_set(&node->refs, 2);
143143

144-
spin_lock(&root->inode_lock);
145-
ret = xa_insert(&root->delayed_nodes, ino, node, GFP_NOFS);
146-
if (ret) {
147-
spin_unlock(&root->inode_lock);
148-
kmem_cache_free(delayed_node_cache, node);
149-
if (ret != -EBUSY)
150-
return ERR_PTR(ret);
151-
}
152-
} while (ret);
144+
ret = radix_tree_preload(GFP_NOFS);
145+
if (ret) {
146+
kmem_cache_free(delayed_node_cache, node);
147+
return ERR_PTR(ret);
148+
}
149+
150+
spin_lock(&root->inode_lock);
151+
ret = radix_tree_insert(&root->delayed_nodes_tree, ino, node);
152+
if (ret == -EEXIST) {
153+
spin_unlock(&root->inode_lock);
154+
kmem_cache_free(delayed_node_cache, node);
155+
radix_tree_preload_end();
156+
goto again;
157+
}
153158
btrfs_inode->delayed_node = node;
154159
spin_unlock(&root->inode_lock);
160+
radix_tree_preload_end();
155161

156162
return node;
157163
}
@@ -270,7 +276,8 @@ static void __btrfs_release_delayed_node(
270276
* back up. We can delete it now.
271277
*/
272278
ASSERT(refcount_read(&delayed_node->refs) == 0);
273-
xa_erase(&root->delayed_nodes, delayed_node->inode_id);
279+
radix_tree_delete(&root->delayed_nodes_tree,
280+
delayed_node->inode_id);
274281
spin_unlock(&root->inode_lock);
275282
kmem_cache_free(delayed_node_cache, delayed_node);
276283
}
@@ -1863,35 +1870,34 @@ void btrfs_kill_delayed_inode_items(struct btrfs_inode *inode)
18631870

18641871
void btrfs_kill_all_delayed_nodes(struct btrfs_root *root)
18651872
{
1866-
unsigned long index = 0;
1867-
struct btrfs_delayed_node *delayed_node;
1873+
u64 inode_id = 0;
18681874
struct btrfs_delayed_node *delayed_nodes[8];
1875+
int i, n;
18691876

18701877
while (1) {
1871-
int n = 0;
1872-
18731878
spin_lock(&root->inode_lock);
1874-
if (xa_empty(&root->delayed_nodes)) {
1879+
n = radix_tree_gang_lookup(&root->delayed_nodes_tree,
1880+
(void **)delayed_nodes, inode_id,
1881+
ARRAY_SIZE(delayed_nodes));
1882+
if (!n) {
18751883
spin_unlock(&root->inode_lock);
1876-
return;
1884+
break;
18771885
}
18781886

1879-
xa_for_each_start(&root->delayed_nodes, index, delayed_node, index) {
1887+
inode_id = delayed_nodes[n - 1]->inode_id + 1;
1888+
for (i = 0; i < n; i++) {
18801889
/*
18811890
* Don't increase refs in case the node is dead and
18821891
* about to be removed from the tree in the loop below
18831892
*/
1884-
if (refcount_inc_not_zero(&delayed_node->refs)) {
1885-
delayed_nodes[n] = delayed_node;
1886-
n++;
1887-
}
1888-
if (n >= ARRAY_SIZE(delayed_nodes))
1889-
break;
1893+
if (!refcount_inc_not_zero(&delayed_nodes[i]->refs))
1894+
delayed_nodes[i] = NULL;
18901895
}
1891-
index++;
18921896
spin_unlock(&root->inode_lock);
18931897

1894-
for (int i = 0; i < n; i++) {
1898+
for (i = 0; i < n; i++) {
1899+
if (!delayed_nodes[i])
1900+
continue;
18951901
__btrfs_kill_delayed_node(delayed_nodes[i]);
18961902
btrfs_release_delayed_node(delayed_nodes[i]);
18971903
}

0 commit comments

Comments
 (0)