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