@@ -1968,11 +1968,24 @@ void elv_fq_set_request_io_group(struct request_queue *q, struct request *rq,
spin_unlock_irqrestore(q->queue_lock, flags);
BUG_ON(!iog);
- /* Store iog in rq. TODO: take care of referencing */
+ elv_get_iog(iog);
rq->iog = iog;
}
/*
+ * This request has been serviced. Clean up iog info and drop the reference.
+ */
+void elv_fq_unset_request_io_group(struct request *rq)
+{
+ struct io_group *iog = rq->iog;
+
+ if (iog) {
+ rq->iog = NULL;
+ elv_put_iog(iog);
+ }
+}
+
+/*
* Find/Create the io queue the rq should go in. This is an optimization
* for the io schedulers (noop, deadline and AS) which maintain only single
* io queue per cgroup. In this case common layer can just maintain a
@@ -512,6 +512,7 @@ static inline struct io_group *ioq_to_io_group(struct io_queue *ioq)
extern int io_group_allow_merge(struct request *rq, struct bio *bio);
extern void elv_fq_set_request_io_group(struct request_queue *q,
struct request *rq, struct bio *bio);
+extern void elv_fq_unset_request_io_group(struct request *rq);
static inline bfq_weight_t iog_weight(struct io_group *iog)
{
return iog->entity.weight;
@@ -571,6 +572,10 @@ static inline void elv_fq_set_request_io_group(struct request_queue *q,
{
}
+static inline void elv_fq_unset_request_io_group(struct request *rq)
+{
+}
+
static inline bfq_weight_t iog_weight(struct io_group *iog)
{
/* Just root group is present and weight is immaterial. */
@@ -992,6 +992,8 @@ void elv_put_request(struct request_queue *q, struct request *rq)
{
struct elevator_queue *e = q->elevator;
+ elv_fq_unset_request_io_group(rq);
+
/*
* Optimization for noop, deadline and AS which maintain only single
* ioq per io group
Hi Vivek, This patch adds io group reference handling when allocating and removing a request. Signed-off-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com> --- elevator-fq.c | 15 ++++++++++++++- elevator-fq.h | 5 +++++ elevator.c | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel