Revert "perf map: Fix dso->nsinfo refcounting"
[linux-2.6-microblaze.git] / block / blk-cgroup.c
index 7b06a5f..575d7a2 100644 (file)
@@ -56,6 +56,8 @@ static LIST_HEAD(all_blkcgs);         /* protected by blkcg_pol_mutex */
 bool blkcg_debug_stats = false;
 static struct workqueue_struct *blkcg_punt_bio_wq;
 
+#define BLKG_DESTROY_BATCH_SIZE  64
+
 static bool blkcg_policy_enabled(struct request_queue *q,
                                 const struct blkcg_policy *pol)
 {
@@ -422,7 +424,9 @@ static void blkg_destroy(struct blkcg_gq *blkg)
 static void blkg_destroy_all(struct request_queue *q)
 {
        struct blkcg_gq *blkg, *n;
+       int count = BLKG_DESTROY_BATCH_SIZE;
 
+restart:
        spin_lock_irq(&q->queue_lock);
        list_for_each_entry_safe(blkg, n, &q->blkg_list, q_node) {
                struct blkcg *blkcg = blkg->blkcg;
@@ -430,6 +434,17 @@ static void blkg_destroy_all(struct request_queue *q)
                spin_lock(&blkcg->lock);
                blkg_destroy(blkg);
                spin_unlock(&blkcg->lock);
+
+               /*
+                * in order to avoid holding the spin lock for too long, release
+                * it when a batch of blkgs are destroyed.
+                */
+               if (!(--count)) {
+                       count = BLKG_DESTROY_BATCH_SIZE;
+                       spin_unlock_irq(&q->queue_lock);
+                       cond_resched();
+                       goto restart;
+               }
        }
 
        q->root_blkg = NULL;