Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 072c521e authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "bdi: Do not wait for cgwbs release in bdi_unregister()"

parents 983b8134 a345cd51
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -161,7 +161,6 @@ struct backing_dev_info {
#ifdef CONFIG_CGROUP_WRITEBACK
	struct radix_tree_root cgwb_tree; /* radix tree of active cgroup wbs */
	struct rb_root cgwb_congested_tree; /* their congested states */
	atomic_t usage_cnt; /* counts both cgwbs and cgwb_contested's */
#else
	struct bdi_writeback_congested *wb_congested;
#endif
+1 −21
Original line number Diff line number Diff line
@@ -405,11 +405,9 @@ static void wb_exit(struct bdi_writeback *wb)
/*
 * cgwb_lock protects bdi->cgwb_tree, bdi->cgwb_congested_tree,
 * blkcg->cgwb_list, and memcg->cgwb_list.  bdi->cgwb_tree is also RCU
 * protected.  cgwb_release_wait is used to wait for the completion of cgwb
 * releases from bdi destruction path.
 * protected.
 */
static DEFINE_SPINLOCK(cgwb_lock);
static DECLARE_WAIT_QUEUE_HEAD(cgwb_release_wait);

/**
 * wb_congested_get_create - get or create a wb_congested
@@ -504,7 +502,6 @@ static void cgwb_release_workfn(struct work_struct *work)
{
	struct bdi_writeback *wb = container_of(work, struct bdi_writeback,
						release_work);
	struct backing_dev_info *bdi = wb->bdi;

	wb_shutdown(wb);

@@ -515,9 +512,6 @@ static void cgwb_release_workfn(struct work_struct *work)
	percpu_ref_exit(&wb->refcnt);
	wb_exit(wb);
	kfree_rcu(wb, rcu);

	if (atomic_dec_and_test(&bdi->usage_cnt))
		wake_up_all(&cgwb_release_wait);
}

static void cgwb_release(struct percpu_ref *refcnt)
@@ -607,7 +601,6 @@ static int cgwb_create(struct backing_dev_info *bdi,
		/* we might have raced another instance of this function */
		ret = radix_tree_insert(&bdi->cgwb_tree, memcg_css->id, wb);
		if (!ret) {
			atomic_inc(&bdi->usage_cnt);
			list_add_tail_rcu(&wb->bdi_node, &bdi->wb_list);
			list_add(&wb->memcg_node, memcg_cgwb_list);
			list_add(&wb->blkcg_node, blkcg_cgwb_list);
@@ -697,7 +690,6 @@ static int cgwb_bdi_init(struct backing_dev_info *bdi)

	INIT_RADIX_TREE(&bdi->cgwb_tree, GFP_ATOMIC);
	bdi->cgwb_congested_tree = RB_ROOT;
	atomic_set(&bdi->usage_cnt, 1);

	ret = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL);
	if (!ret) {
@@ -727,18 +719,6 @@ static void cgwb_bdi_destroy(struct backing_dev_info *bdi)
		spin_lock_irq(&cgwb_lock);
	}
	spin_unlock_irq(&cgwb_lock);

	/*
	 * All cgwb's must be shutdown and released before returning.  Drain
	 * the usage counter to wait for all cgwb's ever created on @bdi.
	 */
	atomic_dec(&bdi->usage_cnt);
	wait_event(cgwb_release_wait, !atomic_read(&bdi->usage_cnt));
	/*
	 * Grab back our reference so that we hold it when @bdi gets
	 * re-registered.
	 */
	atomic_inc(&bdi->usage_cnt);
}

/**