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

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
...@@ -610,7 +610,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src) ...@@ -610,7 +610,7 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src)
bio->bi_iter = bio_src->bi_iter; bio->bi_iter = bio_src->bi_iter;
bio->bi_io_vec = bio_src->bi_io_vec; 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); blkcg_bio_issue_init(bio);
} }
EXPORT_SYMBOL(__bio_clone_fast); EXPORT_SYMBOL(__bio_clone_fast);
...@@ -1957,34 +1957,6 @@ EXPORT_SYMBOL(bioset_init_from_src); ...@@ -1957,34 +1957,6 @@ EXPORT_SYMBOL(bioset_init_from_src);
#ifdef CONFIG_BLK_CGROUP #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_disassociate_blkg - puts back the blkg reference if associated
* @bio: target bio * @bio: target bio
...@@ -1994,6 +1966,8 @@ EXPORT_SYMBOL_GPL(bio_associate_blkcg); ...@@ -1994,6 +1966,8 @@ EXPORT_SYMBOL_GPL(bio_associate_blkcg);
void bio_disassociate_blkg(struct bio *bio) void bio_disassociate_blkg(struct bio *bio)
{ {
if (bio->bi_blkg) { if (bio->bi_blkg) {
/* a ref is always taken on css */
css_put(&bio_blkcg(bio)->css);
blkg_put(bio->bi_blkg); blkg_put(bio->bi_blkg);
bio->bi_blkg = NULL; bio->bi_blkg = NULL;
} }
...@@ -2047,7 +2021,6 @@ void bio_associate_blkg_from_css(struct bio *bio, ...@@ -2047,7 +2021,6 @@ void bio_associate_blkg_from_css(struct bio *bio,
struct cgroup_subsys_state *css) struct cgroup_subsys_state *css)
{ {
css_get(css); css_get(css);
bio->bi_css = css;
__bio_associate_blkg_from_css(bio, css); __bio_associate_blkg_from_css(bio, css);
} }
EXPORT_SYMBOL_GPL(bio_associate_blkg_from_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) ...@@ -2066,13 +2039,10 @@ void bio_associate_blkg_from_page(struct bio *bio, struct page *page)
{ {
struct cgroup_subsys_state *css; struct cgroup_subsys_state *css;
if (unlikely(bio->bi_css))
return;
if (!page->mem_cgroup) if (!page->mem_cgroup)
return; return;
css = cgroup_get_e_css(page->mem_cgroup->css.cgroup, &io_cgrp_subsys); css = cgroup_get_e_css(page->mem_cgroup->css.cgroup, &io_cgrp_subsys);
bio->bi_css = css;
__bio_associate_blkg_from_css(bio, css); __bio_associate_blkg_from_css(bio, css);
} }
#endif /* CONFIG_MEMCG */ #endif /* CONFIG_MEMCG */
...@@ -2094,8 +2064,10 @@ void bio_associate_blkg(struct bio *bio) ...@@ -2094,8 +2064,10 @@ void bio_associate_blkg(struct bio *bio)
rcu_read_lock(); rcu_read_lock();
bio_associate_blkcg(bio, NULL); if (bio->bi_blkg)
blkcg = bio_blkcg(bio); blkcg = bio->bi_blkg->blkcg;
else
blkcg = css_to_blkcg(blkcg_get_css());
if (!blkcg->css.parent) { if (!blkcg->css.parent) {
__bio_associate_blkg(bio, q->root_blkg); __bio_associate_blkg(bio, q->root_blkg);
...@@ -2115,27 +2087,22 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg); ...@@ -2115,27 +2087,22 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg);
*/ */
void bio_disassociate_task(struct bio *bio) 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_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 * @dst: destination bio
* @src: source 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) if (src->bi_blkg) {
WARN_ON(bio_associate_blkcg(dst, src->bi_css)); css_get(&bio_blkcg(src)->css);
if (src->bi_blkg)
__bio_associate_blkg(dst, src->bi_blkg); __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 */ #endif /* CONFIG_BLK_CGROUP */
static void __init biovec_init_slabs(void) static void __init biovec_init_slabs(void)
......
...@@ -277,7 +277,7 @@ static struct bio *bounce_clone_bio(struct bio *bio_src, gfp_t gfp_mask, ...@@ -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); blkcg_bio_issue_init(bio);
return bio; return bio;
......
...@@ -77,6 +77,7 @@ ...@@ -77,6 +77,7 @@
#include <linux/falloc.h> #include <linux/falloc.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/ioprio.h> #include <linux/ioprio.h>
#include <linux/blk-cgroup.h>
#include "loop.h" #include "loop.h"
...@@ -1820,8 +1821,8 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx, ...@@ -1820,8 +1821,8 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
/* always use the first bio's css */ /* always use the first bio's css */
#ifdef CONFIG_BLK_CGROUP #ifdef CONFIG_BLK_CGROUP
if (cmd->use_aio && rq->bio && rq->bio->bi_css) { if (cmd->use_aio && rq->bio && rq->bio->bi_blkg) {
cmd->css = rq->bio->bi_css; cmd->css = &bio_blkcg(rq->bio)->css;
css_get(cmd->css); css_get(cmd->css);
} else } else
#endif #endif
......
...@@ -542,7 +542,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) ...@@ -542,7 +542,7 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
!discard_bio) !discard_bio)
continue; continue;
bio_chain(discard_bio, bio); bio_chain(discard_bio, bio);
bio_clone_blkcg_association(discard_bio, bio); bio_clone_blkg_association(discard_bio, bio);
if (mddev->gendisk) if (mddev->gendisk)
trace_block_bio_remap(bdev_get_queue(rdev->bdev), trace_block_bio_remap(bdev_get_queue(rdev->bdev),
discard_bio, disk_devt(mddev->gendisk), discard_bio, disk_devt(mddev->gendisk),
......
...@@ -498,7 +498,7 @@ do { \ ...@@ -498,7 +498,7 @@ do { \
do { \ do { \
(dst)->bi_disk = (src)->bi_disk; \ (dst)->bi_disk = (src)->bi_disk; \
(dst)->bi_partno = (src)->bi_partno; \ (dst)->bi_partno = (src)->bi_partno; \
bio_clone_blkcg_association(dst, src); \ bio_clone_blkg_association(dst, src); \
} while (0) } while (0)
#define bio_dev(bio) \ #define bio_dev(bio) \
...@@ -512,24 +512,21 @@ static inline void bio_associate_blkg_from_page(struct bio *bio, ...@@ -512,24 +512,21 @@ static inline void bio_associate_blkg_from_page(struct bio *bio,
#endif #endif
#ifdef CONFIG_BLK_CGROUP #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_disassociate_blkg(struct bio *bio);
void bio_associate_blkg(struct bio *bio); void bio_associate_blkg(struct bio *bio);
void bio_associate_blkg_from_css(struct bio *bio, void bio_associate_blkg_from_css(struct bio *bio,
struct cgroup_subsys_state *css); struct cgroup_subsys_state *css);
void bio_disassociate_task(struct bio *bio); 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 */ #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_disassociate_blkg(struct bio *bio) { }
static inline void bio_associate_blkg(struct bio *bio) { } static inline void bio_associate_blkg(struct bio *bio) { }
static inline void bio_associate_blkg_from_css(struct bio *bio, static inline void bio_associate_blkg_from_css(struct bio *bio,
struct cgroup_subsys_state *css) struct cgroup_subsys_state *css)
{ } { }
static inline void bio_disassociate_task(struct bio *bio) { } 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) { } struct bio *src) { }
#endif /* CONFIG_BLK_CGROUP */ #endif /* CONFIG_BLK_CGROUP */
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
......
...@@ -309,8 +309,8 @@ static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css) ...@@ -309,8 +309,8 @@ static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css)
*/ */
static inline struct blkcg *__bio_blkcg(struct bio *bio) static inline struct blkcg *__bio_blkcg(struct bio *bio)
{ {
if (bio && bio->bi_css) if (bio && bio->bi_blkg)
return css_to_blkcg(bio->bi_css); return bio->bi_blkg->blkcg;
return css_to_blkcg(blkcg_css()); return css_to_blkcg(blkcg_css());
} }
...@@ -324,8 +324,8 @@ static inline struct blkcg *__bio_blkcg(struct bio *bio) ...@@ -324,8 +324,8 @@ static inline struct blkcg *__bio_blkcg(struct bio *bio)
*/ */
static inline struct blkcg *bio_blkcg(struct bio *bio) static inline struct blkcg *bio_blkcg(struct bio *bio)
{ {
if (bio && bio->bi_css) if (bio && bio->bi_blkg)
return css_to_blkcg(bio->bi_css); return bio->bi_blkg->blkcg;
return NULL; return NULL;
} }
......
...@@ -174,10 +174,11 @@ struct bio { ...@@ -174,10 +174,11 @@ struct bio {
void *bi_private; void *bi_private;
#ifdef CONFIG_BLK_CGROUP #ifdef CONFIG_BLK_CGROUP
/* /*
* Optional css associated with this bio. Put on bio * Represents the association of the css and request_queue for the bio.
* release. Read comment on top of bio_associate_current(). * If a bio goes direct to device, it will not have a blkg as it will
* not have a request_queue associated with it. The reference is put
* on release of the bio.
*/ */
struct cgroup_subsys_state *bi_css;
struct blkcg_gq *bi_blkg; struct blkcg_gq *bi_blkg;
struct bio_issue bi_issue; struct bio_issue bi_issue;
#endif #endif
......
...@@ -764,9 +764,9 @@ blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) ...@@ -764,9 +764,9 @@ blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio)
if (!bt || !(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP)) if (!bt || !(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP))
return NULL; return NULL;
if (!bio->bi_css) if (!bio->bi_blkg)
return NULL; return NULL;
return cgroup_get_kernfs_id(bio->bi_css->cgroup); return cgroup_get_kernfs_id(bio_blkcg(bio)->css.cgroup);
} }
#else #else
static union kernfs_node_id * static union kernfs_node_id *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment