ploop device maintains the list of free ploop requests: plo->free_list.
Let's count the number of items in the list: plo->free_qlen. The counter
will be used in next patches of this patch-set.

The patch also introduces plo->free_qmax counter -- total number of
allocated ploop requests. This is useful to compare plo->free_qlen
with (in case plo->tune.max_requests changed in flight).

https://jira.sw.ru/browse/PSBM-49454

Signed-off-by: Maxim Patlasov <mpatla...@virtuozzo.com>
---
 drivers/block/ploop/dev.c   |   15 ++++++++++++++-
 drivers/block/ploop/sysfs.c |   12 ++++++++++++
 include/linux/ploop/ploop.h |    2 ++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 9992ae5..cc33b2d 100644
--- a/drivers/block/ploop/dev.c
+++ b/drivers/block/ploop/dev.c
@@ -191,6 +191,7 @@ ploop_alloc_request(struct ploop_device * plo)
 
        preq = list_entry(plo->free_list.next, struct ploop_request, list);
        list_del_init(&preq->list);
+       plo->free_qlen--;
        ploop_congest(plo);
        return preq;
 }
@@ -231,6 +232,7 @@ void ploop_preq_drop(struct ploop_device * plo, struct 
list_head *drop_list,
                      int keep_locked)
 {
        struct ploop_request * preq;
+       int drop_qlen = 0;
 
        list_for_each_entry(preq, drop_list, list) {
                if (preq->ioc) {
@@ -240,11 +242,13 @@ void ploop_preq_drop(struct ploop_device * plo, struct 
list_head *drop_list,
                }
 
                BUG_ON (test_bit(PLOOP_REQ_ZERO, &preq->state));
+               drop_qlen++;
        }
 
        spin_lock_irq(&plo->lock);
 
        list_splice_init(drop_list, plo->free_list.prev);
+       plo->free_qlen += drop_qlen;
        if (waitqueue_active(&plo->req_waitq))
                wake_up(&plo->req_waitq);
        else if (test_bit(PLOOP_S_WAIT_PROCESS, &plo->state) &&
@@ -489,9 +493,11 @@ ploop_bio_queue(struct ploop_device * plo, struct bio * 
bio,
 {
        struct ploop_request * preq;
 
-       BUG_ON (list_empty(&plo->free_list));
+       BUG_ON(list_empty(&plo->free_list));
+       BUG_ON(plo->free_qlen <= 0);
        preq = list_entry(plo->free_list.next, struct ploop_request, list);
        list_del_init(&preq->list);
+       plo->free_qlen--;
 
        preq->req_cluster = bio->bi_sector >> plo->cluster_log;
        bio->bi_next = NULL;
@@ -529,6 +535,7 @@ ploop_bio_queue(struct ploop_device * plo, struct bio * bio,
                        }
                        BIO_ENDIO(plo->queue, bio, err);
                        list_add(&preq->list, &plo->free_list);
+                       plo->free_qlen++;
                        plo->bio_discard_qlen--;
                        plo->bio_total--;
                        return;
@@ -1387,6 +1394,7 @@ static void ploop_complete_request(struct ploop_request * 
preq)
        } else {
                ploop_uncongest(plo);
                list_add(&preq->list, &plo->free_list);
+               plo->free_qlen++;
                if (waitqueue_active(&plo->req_waitq))
                        wake_up(&plo->req_waitq);
                else if (test_bit(PLOOP_S_WAIT_PROCESS, &plo->state) &&
@@ -3799,6 +3807,8 @@ static int ploop_start(struct ploop_device * plo, struct 
block_device *bdev)
                preq->plo = plo;
                INIT_LIST_HEAD(&preq->delay_list);
                list_add(&preq->list, &plo->free_list);
+               plo->free_qlen++;
+               plo->free_qmax++;
        }
 
        list_for_each_entry_reverse(delta, &plo->map.delta_list, list) {
@@ -3951,8 +3961,11 @@ static int ploop_stop(struct ploop_device * plo, struct 
block_device *bdev)
 
                preq = list_first_entry(&plo->free_list, struct ploop_request, 
list);
                list_del(&preq->list);
+               plo->free_qlen--;
+               plo->free_qmax--;
                kfree(preq);
        }
+       BUG_ON(plo->free_qlen);
 
        ploop_map_destroy(&plo->map);
        if (plo->trans_map)
diff --git a/drivers/block/ploop/sysfs.c b/drivers/block/ploop/sysfs.c
index d6dcc83..c062c1e 100644
--- a/drivers/block/ploop/sysfs.c
+++ b/drivers/block/ploop/sysfs.c
@@ -425,6 +425,16 @@ static ssize_t print_push_backup_uuid(struct ploop_device 
* plo, char * page)
        return snprintf(page, PAGE_SIZE, "%pUB\n", uuid);
 }
 
+static u32 show_free_reqs(struct ploop_device * plo)
+{
+       return plo->free_qlen;
+}
+
+static u32 show_free_qmax(struct ploop_device * plo)
+{
+       return plo->free_qmax;
+}
+
 #define _TUNE_U32(_name)                               \
 static u32 show_##_name(struct ploop_device * plo)     \
 {                                                      \
@@ -507,6 +517,8 @@ static struct attribute *state_attributes[] = {
        _A3(cookie),
        _A3(push_backup_uuid),
        _A(open_count),
+       _A(free_reqs),
+       _A(free_qmax),
        NULL
 };
 
diff --git a/include/linux/ploop/ploop.h b/include/linux/ploop/ploop.h
index b03565b..87a530e 100644
--- a/include/linux/ploop/ploop.h
+++ b/include/linux/ploop/ploop.h
@@ -364,6 +364,8 @@ struct ploop_device
        struct list_head        entry_queue;
        int                     entry_qlen;
        int                     read_sync_reqs;
+       int                     free_qlen; /* len of free_list */
+       int                     free_qmax; /* max len of free_list */
 
        struct bio              *bio_head;
        struct bio              *bio_tail;

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to