[Devel,RHEL7,COMMIT] ploop: introduce plo->free_qlen counter

Submitted by Konstantin Khorenko on July 19, 2016, 9:43 a.m.

Details

Message ID 201607190943.u6J9haQ0016380@finist_cl7.x64_64.work.ct
State New
Series "ploop: introduce plo->free_qlen counter"
Headers show

Commit Message

Konstantin Khorenko July 19, 2016, 9:43 a.m.
The commit is pushed to "branch-rh7-3.10.0-327.18.2.vz7.15.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.18.2.vz7.14.27
------>
commit a5804c74acbc1bc0513f79e586ac7954643fa51e
Author: Maxim Patlasov <mpatlasov@virtuozzo.com>
Date:   Tue Jul 19 13:43:36 2016 +0400

    ploop: introduce plo->free_qlen counter
    
    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 <mpatlasov@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(-)

Patch hide | download patch | download mbox

diff --git a/drivers/block/ploop/dev.c b/drivers/block/ploop/dev.c
index 0711fb5..2ff3ac1 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 7864edf..d2d3165 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;