Sfoglia il codice sorgente

blkcg: associate writeback bios with a blkg

One of the goals of this series is to remove a separate reference to
the css of the bio. This can and should be accessed via bio_blkcg. In
this patch, the wbc_init_bio call is changed such that it must be called
after a queue has been associated with the bio.

Signed-off-by: Dennis Zhou <dennisszhou@gmail.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Dennis Zhou (Facebook) 7 anni fa
parent
commit
bdc2491708
4 ha cambiato i file con 14 aggiunte e 11 eliminazioni
  1. 5 3
      Documentation/admin-guide/cgroup-v2.rst
  2. 5 5
      fs/buffer.c
  3. 1 1
      fs/ext4/page-io.c
  4. 3 2
      include/linux/writeback.h

+ 5 - 3
Documentation/admin-guide/cgroup-v2.rst

@@ -1857,8 +1857,10 @@ following two functions.
 
 
   wbc_init_bio(@wbc, @bio)
   wbc_init_bio(@wbc, @bio)
 	Should be called for each bio carrying writeback data and
 	Should be called for each bio carrying writeback data and
-	associates the bio with the inode's owner cgroup.  Can be
-	called anytime between bio allocation and submission.
+	associates the bio with the inode's owner cgroup and the
+	corresponding request queue.  This must be called after
+	a queue (device) has been associated with the bio and
+	before submission.
 
 
   wbc_account_io(@wbc, @page, @bytes)
   wbc_account_io(@wbc, @page, @bytes)
 	Should be called for each data segment being written out.
 	Should be called for each data segment being written out.
@@ -1877,7 +1879,7 @@ the configuration, the bio may be executed at a lower priority and if
 the writeback session is holding shared resources, e.g. a journal
 the writeback session is holding shared resources, e.g. a journal
 entry, may lead to priority inversion.  There is no one easy solution
 entry, may lead to priority inversion.  There is no one easy solution
 for the problem.  Filesystems can try to work around specific problem
 for the problem.  Filesystems can try to work around specific problem
-cases by skipping wbc_init_bio() or using bio_associate_blkcg()
+cases by skipping wbc_init_bio() or using bio_associate_create_blkg()
 directly.
 directly.
 
 
 
 

+ 5 - 5
fs/buffer.c

@@ -3060,11 +3060,6 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
 	 */
 	 */
 	bio = bio_alloc(GFP_NOIO, 1);
 	bio = bio_alloc(GFP_NOIO, 1);
 
 
-	if (wbc) {
-		wbc_init_bio(wbc, bio);
-		wbc_account_io(wbc, bh->b_page, bh->b_size);
-	}
-
 	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
 	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
 	bio_set_dev(bio, bh->b_bdev);
 	bio_set_dev(bio, bh->b_bdev);
 	bio->bi_write_hint = write_hint;
 	bio->bi_write_hint = write_hint;
@@ -3084,6 +3079,11 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
 		op_flags |= REQ_PRIO;
 		op_flags |= REQ_PRIO;
 	bio_set_op_attrs(bio, op, op_flags);
 	bio_set_op_attrs(bio, op, op_flags);
 
 
+	if (wbc) {
+		wbc_init_bio(wbc, bio);
+		wbc_account_io(wbc, bh->b_page, bh->b_size);
+	}
+
 	submit_bio(bio);
 	submit_bio(bio);
 	return 0;
 	return 0;
 }
 }

+ 1 - 1
fs/ext4/page-io.c

@@ -374,13 +374,13 @@ static int io_submit_init_bio(struct ext4_io_submit *io,
 	bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
 	bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
 	if (!bio)
 	if (!bio)
 		return -ENOMEM;
 		return -ENOMEM;
-	wbc_init_bio(io->io_wbc, bio);
 	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
 	bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
 	bio_set_dev(bio, bh->b_bdev);
 	bio_set_dev(bio, bh->b_bdev);
 	bio->bi_end_io = ext4_end_bio;
 	bio->bi_end_io = ext4_end_bio;
 	bio->bi_private = ext4_get_io_end(io->io_end);
 	bio->bi_private = ext4_get_io_end(io->io_end);
 	io->io_bio = bio;
 	io->io_bio = bio;
 	io->io_next_block = bh->b_blocknr;
 	io->io_next_block = bh->b_blocknr;
+	wbc_init_bio(io->io_wbc, bio);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 2
include/linux/writeback.h

@@ -246,7 +246,8 @@ static inline void wbc_attach_fdatawrite_inode(struct writeback_control *wbc,
  *
  *
  * @bio is a part of the writeback in progress controlled by @wbc.  Perform
  * @bio is a part of the writeback in progress controlled by @wbc.  Perform
  * writeback specific initialization.  This is used to apply the cgroup
  * writeback specific initialization.  This is used to apply the cgroup
- * writeback context.
+ * writeback context.  Must be called after the bio has been associated with
+ * a device.
  */
  */
 static inline void wbc_init_bio(struct writeback_control *wbc, struct bio *bio)
 static inline void wbc_init_bio(struct writeback_control *wbc, struct bio *bio)
 {
 {
@@ -257,7 +258,7 @@ static inline void wbc_init_bio(struct writeback_control *wbc, struct bio *bio)
 	 * regular writeback instead of writing things out itself.
 	 * regular writeback instead of writing things out itself.
 	 */
 	 */
 	if (wbc->wb)
 	if (wbc->wb)
-		bio_associate_blkcg(bio, wbc->wb->blkcg_css);
+		bio_associate_blkg_from_css(bio, wbc->wb->blkcg_css);
 }
 }
 
 
 #else	/* CONFIG_CGROUP_WRITEBACK */
 #else	/* CONFIG_CGROUP_WRITEBACK */