From: Yu Kuai <[email protected]>

blkg creation is now serialized by q->blkcg_mutex and no longer runs
under q->queue_lock.  The radix tree is initialized with GFP_NOWAIT, so
radix_tree_insert() cannot sleep while blkcg->lock is held and the old
preload dance is no longer needed.

Remove the preload calls and the associated unwind path.

Signed-off-by: Yu Kuai <[email protected]>
---
 block/blk-cgroup.c | 22 ++--------------------
 1 file changed, 2 insertions(+), 20 deletions(-)

diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 71313bb3c4f3..b99ab8d67798 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -420,7 +420,6 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg, 
struct gendisk *disk,
                        pol->pd_init_fn(blkg->pd[i]);
        }
 
-       /* insert */
        spin_lock_irq(&blkcg->lock);
        ret = radix_tree_insert(&blkcg->blkg_tree, disk->queue->id, blkg);
        if (likely(!ret)) {
@@ -875,16 +874,10 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct 
blkcg_policy *pol,
                        goto fail_unlock;
                }
 
-               if (radix_tree_preload(GFP_KERNEL)) {
-                       blkg_free(new_blkg);
-                       ret = -ENOMEM;
-                       goto fail_unlock;
-               }
-
                if (!blkcg_policy_enabled(q, pol)) {
                        blkg_free(new_blkg);
                        ret = -EOPNOTSUPP;
-                       goto fail_preloaded;
+                       goto fail_unlock;
                }
 
                rcu_read_lock();
@@ -896,12 +889,10 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct 
blkcg_policy *pol,
                        blkg = blkg_create(pos, disk, new_blkg);
                        if (IS_ERR(blkg)) {
                                ret = PTR_ERR(blkg);
-                               goto fail_preloaded;
+                               goto fail_unlock;
                        }
                }
 
-               radix_tree_preload_end();
-
                if (pos == blkcg)
                        goto success;
        }
@@ -909,8 +900,6 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct 
blkcg_policy *pol,
        ctx->blkg = blkg;
        return 0;
 
-fail_preloaded:
-       radix_tree_preload_end();
 fail_unlock:
        mutex_unlock(&q->blkcg_mutex);
        /*
@@ -1448,7 +1437,6 @@ int blkcg_init_disk(struct gendisk *disk)
 {
        struct request_queue *q = disk->queue;
        struct blkcg_gq *new_blkg, *blkg;
-       bool preloaded;
 
        /*
         * If the queue is shared across disk rebind (e.g., SCSI), the
@@ -1466,8 +1454,6 @@ int blkcg_init_disk(struct gendisk *disk)
        if (!new_blkg)
                return -ENOMEM;
 
-       preloaded = !radix_tree_preload(GFP_KERNEL);
-
        /* Make sure the root blkg exists. */
        mutex_lock(&q->blkcg_mutex);
        blkg = blkg_create(&blkcg_root, disk, new_blkg);
@@ -1475,16 +1461,12 @@ int blkcg_init_disk(struct gendisk *disk)
                goto err_unlock;
        q->root_blkg = blkg;
 
-       if (preloaded)
-               radix_tree_preload_end();
        mutex_unlock(&q->blkcg_mutex);
 
        return 0;
 
 err_unlock:
        mutex_unlock(&q->blkcg_mutex);
-       if (preloaded)
-               radix_tree_preload_end();
        return PTR_ERR(blkg);
 }
 
-- 
2.51.0


Reply via email to