[Devel] [PATCH RH8] ploop: Assign blkcg to kthread before rw
Kirill Tkhai
ktkhai at virtuozzo.com
Thu Jul 8 13:22:41 MSK 2021
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
drivers/md/dm-ploop-map.c | 23 ++++++++++++++++++++++-
drivers/md/dm-ploop.h | 2 ++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 00e4a6ad1d92..30bb2c025653 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -9,6 +9,8 @@
#include <linux/dm-io.h>
#include <linux/dm-kcopyd.h>
#include <linux/sched/mm.h>
+#include <linux/cgroup.h>
+#include <linux/blk-cgroup.h>
#include <linux/init.h>
#include <linux/vmalloc.h>
#include <linux/uio.h>
@@ -59,6 +61,7 @@ void ploop_index_wb_init(struct ploop_index_wb *piwb, struct ploop *ploop)
void init_pio(struct ploop *ploop, unsigned int bi_op, struct pio *pio)
{
pio->ploop = ploop;
+ pio->css = NULL;
pio->bi_op = bi_op;
pio->wants_discard_index_cleanup = false;
pio->is_data_alloc = false;
@@ -108,7 +111,8 @@ void prq_endio(struct pio *pio, void *prq_ptr, blk_status_t bi_status)
if (prq->bvec)
kfree(prq->bvec);
-
+ if (prq->css)
+ css_put(prq->css);
dm_complete_request(rq, bi_status);
}
@@ -182,6 +186,7 @@ static struct pio * split_and_chain_pio(struct ploop *ploop,
return NULL;
init_pio(ploop, pio->bi_op, split);
+ split->css = pio->css;
split->queue_list_id = pio->queue_list_id;
split->free_on_endio = true;
split->bi_io_vec = pio->bi_io_vec;
@@ -1175,7 +1180,13 @@ static void submit_rw_mapped(struct ploop *ploop, struct pio *pio)
pos = to_bytes(pio->bi_iter.bi_sector);
file = ploop->deltas[pio->level].file;
+
+ if (pio->css)
+ kthread_associate_blkcg(pio->css);
ploop_call_rw_iter(file, pos, rw, &iter, pio);
+ if (pio->css)
+ kthread_associate_blkcg(NULL);
+
}
void map_and_submit_rw(struct ploop *ploop, u32 dst_clu, struct pio *pio, u8 level)
@@ -1233,6 +1244,7 @@ static int submit_cluster_cow(struct ploop *ploop, unsigned int level,
if (!aux_pio || !cow)
goto err;
init_pio(ploop, REQ_OP_READ, aux_pio);
+ aux_pio->css = cow_pio->css;
pio_prepare_offsets(ploop, aux_pio, clu);
aux_pio->endio_cb = ploop_cow_endio;
aux_pio->endio_cb_data = cow;
@@ -1275,6 +1287,7 @@ static void submit_cluster_write(struct ploop_cow *cow)
cow->dst_clu = dst_clu;
init_pio(ploop, REQ_OP_WRITE, aux_pio);
+ aux_pio->css = cow->cow_pio->css;
pio_prepare_offsets(ploop, aux_pio, dst_clu);
BUG_ON(irqs_disabled());
@@ -1768,6 +1781,13 @@ static void init_prq(struct ploop_rq *prq, struct request *rq)
{
prq->rq = rq;
prq->bvec = NULL;
+ prq->css = NULL;
+#ifdef CONFIG_BLK_CGROUP
+ if (rq->bio && rq->bio->bi_blkg) {
+ prq->css = &bio_blkcg(rq->bio)->css;
+ css_get(prq->css); /* css_put is in prq_endio */
+ }
+#endif
}
static void submit_embedded_pio(struct ploop *ploop, struct pio *pio)
@@ -1826,6 +1846,7 @@ int ploop_clone_and_map(struct dm_target *ti, struct request *rq,
pio = map_info_to_embedded_pio(info);
init_pio(ploop, req_op(rq), pio);
+ pio->css = prq->css;
pio->endio_cb = prq_endio;
pio->endio_cb_data = prq;
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index d766a3381205..9fcad49015b1 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -223,6 +223,7 @@ struct ploop {
struct ploop_rq {
struct request *rq;
struct bio_vec *bvec;
+ struct cgroup_subsys_state *css;
};
struct pio;
@@ -230,6 +231,7 @@ typedef void (*ploop_endio_t)(struct pio *, void *, blk_status_t);
struct pio {
struct ploop *ploop;
+ struct cgroup_subsys_state *css;
struct list_head list;
struct hlist_node hlist_node;
More information about the Devel
mailing list