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

Commit db6638d7 authored by Dennis Zhou's avatar Dennis Zhou Committed by Jens Axboe
Browse files

blkcg: remove bio->bi_css and instead use bio->bi_blkg



Prior patches ensured that any bio that interacts with a request_queue
is properly associated with a blkg. This makes bio->bi_css unnecessary
as blkg maintains a reference to blkcg already.

This removes the bio field bi_css and transfers corresponding uses to
access via bi_blkg.

Signed-off-by: default avatarDennis Zhou <dennis@kernel.org>
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent fd42df30
Loading
Loading
Loading
Loading
+13 −46
Original line number Diff line number Diff line
@@ -610,7 +610,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src)
	bio->bi_iter = bio_src->bi_iter;
	bio->bi_io_vec = bio_src->bi_io_vec;

	bio_clone_blkcg_association(bio, bio_src);
	bio_clone_blkg_association(bio, bio_src);
	blkcg_bio_issue_init(bio);
}
EXPORT_SYMBOL(__bio_clone_fast);
@@ -1957,34 +1957,6 @@ EXPORT_SYMBOL(bioset_init_from_src);

#ifdef CONFIG_BLK_CGROUP

/**
 * bio_associate_blkcg - associate a bio with the specified blkcg
 * @bio: target bio
 * @blkcg_css: css of the blkcg to associate
 *
 * Associate @bio with the blkcg specified by @blkcg_css.  Block layer will
 * treat @bio as if it were issued by a task which belongs to the blkcg.
 *
 * This function takes an extra reference of @blkcg_css which will be put
 * when @bio is released.  The caller must own @bio and is responsible for
 * synchronizing calls to this function.  If @blkcg_css is %NULL, a call to
 * blkcg_get_css() finds the current css from the kthread or task.
 */
int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css)
{
	if (unlikely(bio->bi_css))
		return -EBUSY;

	if (blkcg_css)
		css_get(blkcg_css);
	else
		blkcg_css = blkcg_get_css();

	bio->bi_css = blkcg_css;
	return 0;
}
EXPORT_SYMBOL_GPL(bio_associate_blkcg);

/**
 * bio_disassociate_blkg - puts back the blkg reference if associated
 * @bio: target bio
@@ -1994,6 +1966,8 @@ EXPORT_SYMBOL_GPL(bio_associate_blkcg);
void bio_disassociate_blkg(struct bio *bio)
{
	if (bio->bi_blkg) {
		/* a ref is always taken on css */
		css_put(&bio_blkcg(bio)->css);
		blkg_put(bio->bi_blkg);
		bio->bi_blkg = NULL;
	}
@@ -2047,7 +2021,6 @@ void bio_associate_blkg_from_css(struct bio *bio,
				 struct cgroup_subsys_state *css)
{
	css_get(css);
	bio->bi_css = css;
	__bio_associate_blkg_from_css(bio, css);
}
EXPORT_SYMBOL_GPL(bio_associate_blkg_from_css);
@@ -2066,13 +2039,10 @@ void bio_associate_blkg_from_page(struct bio *bio, struct page *page)
{
	struct cgroup_subsys_state *css;

	if (unlikely(bio->bi_css))
		return;
	if (!page->mem_cgroup)
		return;

	css = cgroup_get_e_css(page->mem_cgroup->css.cgroup, &io_cgrp_subsys);
	bio->bi_css = css;
	__bio_associate_blkg_from_css(bio, css);
}
#endif /* CONFIG_MEMCG */
@@ -2094,8 +2064,10 @@ void bio_associate_blkg(struct bio *bio)

	rcu_read_lock();

	bio_associate_blkcg(bio, NULL);
	blkcg = bio_blkcg(bio);
	if (bio->bi_blkg)
		blkcg = bio->bi_blkg->blkcg;
	else
		blkcg = css_to_blkcg(blkcg_get_css());

	if (!blkcg->css.parent) {
		__bio_associate_blkg(bio, q->root_blkg);
@@ -2115,27 +2087,22 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg);
 */
void bio_disassociate_task(struct bio *bio)
{
	if (bio->bi_css) {
		css_put(bio->bi_css);
		bio->bi_css = NULL;
	}
	bio_disassociate_blkg(bio);
}

/**
 * bio_clone_blkcg_association - clone blkcg association from src to dst bio
 * bio_clone_blkg_association - clone blkg association from src to dst bio
 * @dst: destination bio
 * @src: source bio
 */
void bio_clone_blkcg_association(struct bio *dst, struct bio *src)
void bio_clone_blkg_association(struct bio *dst, struct bio *src)
{
	if (src->bi_css)
		WARN_ON(bio_associate_blkcg(dst, src->bi_css));

	if (src->bi_blkg)
	if (src->bi_blkg) {
		css_get(&bio_blkcg(src)->css);
		__bio_associate_blkg(dst, src->bi_blkg);
	}
EXPORT_SYMBOL_GPL(bio_clone_blkcg_association);
}
EXPORT_SYMBOL_GPL(bio_clone_blkg_association);
#endif /* CONFIG_BLK_CGROUP */

static void __init biovec_init_slabs(void)
+1 −1
Original line number Diff line number Diff line
@@ -277,7 +277,7 @@ static struct bio *bounce_clone_bio(struct bio *bio_src, gfp_t gfp_mask,
		}
	}

	bio_clone_blkcg_association(bio, bio_src);
	bio_clone_blkg_association(bio, bio_src);
	blkcg_bio_issue_init(bio);

	return bio;
+3 −2
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@
#include <linux/falloc.h>
#include <linux/uio.h>
#include <linux/ioprio.h>
#include <linux/blk-cgroup.h>

#include "loop.h"

@@ -1820,8 +1821,8 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,

	/* always use the first bio's css */
#ifdef CONFIG_BLK_CGROUP
	if (cmd->use_aio && rq->bio && rq->bio->bi_css) {
		cmd->css = rq->bio->bi_css;
	if (cmd->use_aio && rq->bio && rq->bio->bi_blkg) {
		cmd->css = &bio_blkcg(rq->bio)->css;
		css_get(cmd->css);
	} else
#endif
+1 −1
Original line number Diff line number Diff line
@@ -542,7 +542,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
		    !discard_bio)
			continue;
		bio_chain(discard_bio, bio);
		bio_clone_blkcg_association(discard_bio, bio);
		bio_clone_blkg_association(discard_bio, bio);
		if (mddev->gendisk)
			trace_block_bio_remap(bdev_get_queue(rdev->bdev),
				discard_bio, disk_devt(mddev->gendisk),
+4 −7
Original line number Diff line number Diff line
@@ -498,7 +498,7 @@ do { \
do {						\
	(dst)->bi_disk = (src)->bi_disk;	\
	(dst)->bi_partno = (src)->bi_partno;	\
	bio_clone_blkcg_association(dst, src);	\
	bio_clone_blkg_association(dst, src);	\
} while (0)

#define bio_dev(bio) \
@@ -512,23 +512,20 @@ static inline void bio_associate_blkg_from_page(struct bio *bio,
#endif

#ifdef CONFIG_BLK_CGROUP
int bio_associate_blkcg(struct bio *bio, struct cgroup_subsys_state *blkcg_css);
void bio_disassociate_blkg(struct bio *bio);
void bio_associate_blkg(struct bio *bio);
void bio_associate_blkg_from_css(struct bio *bio,
				 struct cgroup_subsys_state *css);
void bio_disassociate_task(struct bio *bio);
void bio_clone_blkcg_association(struct bio *dst, struct bio *src);
void bio_clone_blkg_association(struct bio *dst, struct bio *src);
#else	/* CONFIG_BLK_CGROUP */
static inline int bio_associate_blkcg(struct bio *bio,
			struct cgroup_subsys_state *blkcg_css) { return 0; }
static inline void bio_disassociate_blkg(struct bio *bio) { }
static inline void bio_associate_blkg(struct bio *bio) { }
static inline void bio_associate_blkg_from_css(struct bio *bio,
					       struct cgroup_subsys_state *css)
{ }
static inline void bio_disassociate_task(struct bio *bio) { }
static inline void bio_clone_blkcg_association(struct bio *dst,
static inline void bio_clone_blkg_association(struct bio *dst,
					      struct bio *src) { }
#endif	/* CONFIG_BLK_CGROUP */

Loading