All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	Dan Williams <dan.j.williams@intel.com>,
	Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>,
	Lekshmi Pillai <lekshmicpillai@in.ibm.com>,
	Tejun Heo <tj@kernel.org>, NeilBrown <neilb@suse.de>,
	Omar Sandoval <osandov@osandov.com>, Jan Kara <jack@suse.cz>
Subject: [PATCH 05/13] bdi: Mark congested->bdi as internal
Date: Tue, 21 Feb 2017 18:09:50 +0100	[thread overview]
Message-ID: <20170221170958.21845-6-jack@suse.cz> (raw)
In-Reply-To: <20170221170958.21845-1-jack@suse.cz>

congested->bdi pointer is used only to be able to remove congested
structure from bdi->cgwb_congested_tree on structure release. Moreover
the pointer can become NULL when we unregister the bdi. Rename the field
to __bdi and add a comment to make it more explicit this is internal
stuff of memcg writeback code and people should not use the field as
such use will be likely race prone.

We do not bother with converting congested->bdi to a proper refcounted
reference. It will be slightly ugly to special-case bdi->wb.congested to
avoid effectively a cyclic reference of bdi to itself and the reference
gets cleared from bdi_unregister() making it impossible to reference
a freed bdi.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 include/linux/backing-dev-defs.h |  4 +++-
 mm/backing-dev.c                 | 10 +++++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index ad955817916d..8fb3dcdebc80 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -54,7 +54,9 @@ struct bdi_writeback_congested {
 	atomic_t refcnt;		/* nr of attached wb's and blkg */
 
 #ifdef CONFIG_CGROUP_WRITEBACK
-	struct backing_dev_info *bdi;	/* the associated bdi */
+	struct backing_dev_info *__bdi;	/* the associated bdi, set to NULL
+					 * on bdi unregistration. For memcg-wb
+					 * internal use only! */
 	int blkcg_id;			/* ID of the associated blkcg */
 	struct rb_node rb_node;		/* on bdi->cgwb_congestion_tree */
 #endif
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 28ce6cf7b2ff..c324eae17f0d 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -438,7 +438,7 @@ wb_congested_get_create(struct backing_dev_info *bdi, int blkcg_id, gfp_t gfp)
 		return NULL;
 
 	atomic_set(&new_congested->refcnt, 0);
-	new_congested->bdi = bdi;
+	new_congested->__bdi = bdi;
 	new_congested->blkcg_id = blkcg_id;
 	goto retry;
 
@@ -466,10 +466,10 @@ void wb_congested_put(struct bdi_writeback_congested *congested)
 	}
 
 	/* bdi might already have been destroyed leaving @congested unlinked */
-	if (congested->bdi) {
+	if (congested->__bdi) {
 		rb_erase(&congested->rb_node,
-			 &congested->bdi->cgwb_congested_tree);
-		congested->bdi = NULL;
+			 &congested->__bdi->cgwb_congested_tree);
+		congested->__bdi = NULL;
 	}
 
 	spin_unlock_irqrestore(&cgwb_lock, flags);
@@ -698,7 +698,7 @@ static void cgwb_bdi_destroy(struct backing_dev_info *bdi)
 			rb_entry(rbn, struct bdi_writeback_congested, rb_node);
 
 		rb_erase(rbn, &bdi->cgwb_congested_tree);
-		congested->bdi = NULL;	/* mark @congested unlinked */
+		congested->__bdi = NULL;	/* mark @congested unlinked */
 	}
 
 	spin_unlock_irq(&cgwb_lock);
-- 
2.10.2

  parent reply	other threads:[~2017-02-21 17:09 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-21 17:09 [PATCH 0/13 v2] block: Fix block device shutdown related races Jan Kara
2017-02-21 17:09 ` [PATCH 01/13] block: Move bdev_unhash_inode() after invalidate_partition() Jan Kara
2017-02-21 17:09 ` [PATCH 02/13] block: Unhash also block device inode for the whole device Jan Kara
2017-02-21 17:09 ` [PATCH 03/13] block: Revalidate i_bdev reference in bd_aquire() Jan Kara
2017-02-21 17:09 ` [PATCH 04/13] block: Move bdi_unregister() to del_gendisk() Jan Kara
2017-02-21 19:53   ` Bart Van Assche
2017-02-22  8:51     ` Jan Kara
2017-02-22 17:42       ` Bart Van Assche
2017-02-21 17:09 ` Jan Kara [this message]
2017-02-28 16:06   ` [PATCH 05/13] bdi: Mark congested->bdi as internal Tejun Heo
2017-02-21 17:09 ` [PATCH 06/13] bdi: Make wb->bdi a proper reference Jan Kara
2017-02-28 16:07   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 07/13] bdi: Move removal from bdi->wb_list into wb_shutdown() Jan Kara
2017-02-28 16:14   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 08/13] bdi: Shutdown writeback on all cgwbs in cgwb_bdi_destroy() Jan Kara
2017-02-28 16:44   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 09/13] bdi: Do not wait for cgwbs release in bdi_unregister() Jan Kara
2017-02-28 16:51   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 10/13] bdi: Rename cgwb_bdi_destroy() to cgwb_bdi_unregister() Jan Kara
2017-02-28 16:51   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 11/13] block: Fix oops in locked_inode_to_wb_and_lock_list() Jan Kara
2017-02-28 16:52   ` Tejun Heo
2017-02-21 17:09 ` [PATCH 12/13] kobject: Export kobject_get_unless_zero() Jan Kara
2017-02-21 19:39   ` Bart Van Assche
2017-02-21 17:09 ` [PATCH 13/13] block: Fix oops scsi_disk_get() Jan Kara
2017-02-21 19:33   ` Bart Van Assche
2017-02-21 17:19 ` [PATCH 0/13 v2] block: Fix block device shutdown related races Jan Kara
2017-02-21 18:55   ` Dan Williams
2017-02-21 17:19 ` Jens Axboe
2017-02-22 10:24   ` Jan Kara
2017-03-01  7:25     ` Omar Sandoval
2017-03-01  7:26       ` Omar Sandoval
2017-03-01 15:11         ` Jan Kara
2017-03-06 20:38           ` Omar Sandoval
2017-03-07 13:57             ` Jan Kara
2017-03-07 16:28               ` Omar Sandoval
2017-03-08 13:21                 ` Jan Kara
2017-02-28 16:54 ` Tejun Heo
2017-03-01 15:37   ` Jan Kara
2017-03-01 16:26     ` Tejun Heo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170221170958.21845-6-jack@suse.cz \
    --to=jack@suse.cz \
    --cc=axboe@kernel.dk \
    --cc=bauerman@linux.vnet.ibm.com \
    --cc=dan.j.williams@intel.com \
    --cc=hch@infradead.org \
    --cc=lekshmicpillai@in.ibm.com \
    --cc=linux-block@vger.kernel.org \
    --cc=neilb@suse.de \
    --cc=osandov@osandov.com \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.