Skip to content

Commit

Permalink
dm cache policy mq: keep track of the number of entries in a multiqueue
Browse files Browse the repository at this point in the history
Small optimisation, now queue_empty() doesn't need to walk all levels of
the multiqueue.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
  • Loading branch information
Joe Thornber authored and Mike Snitzer committed Mar 31, 2015
1 parent ac1f9ef commit 75da39b
Showing 1 changed file with 12 additions and 13 deletions.
25 changes: 12 additions & 13 deletions drivers/md/dm-cache-policy-mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,42 +126,36 @@ static void iot_examine_bio(struct io_tracker *t, struct bio *bio)
#define NR_QUEUE_LEVELS 16u

struct queue {
unsigned nr_elts;
struct list_head qs[NR_QUEUE_LEVELS];
};

static void queue_init(struct queue *q)
{
unsigned i;

q->nr_elts = 0;
for (i = 0; i < NR_QUEUE_LEVELS; i++)
INIT_LIST_HEAD(q->qs + i);
}

/*
* Checks to see if the queue is empty.
* FIXME: reduce cpu usage.
*/
static bool queue_empty(struct queue *q)
{
unsigned i;

for (i = 0; i < NR_QUEUE_LEVELS; i++)
if (!list_empty(q->qs + i))
return false;

return true;
return q->nr_elts == 0;
}

/*
* Insert an entry to the back of the given level.
*/
static void queue_push(struct queue *q, unsigned level, struct list_head *elt)
{
q->nr_elts++;
list_add_tail(elt, q->qs + level);
}

static void queue_remove(struct list_head *elt)
static void queue_remove(struct queue *q, struct list_head *elt)
{
q->nr_elts--;
list_del(elt);
}

Expand Down Expand Up @@ -197,6 +191,7 @@ static struct list_head *queue_pop(struct queue *q)
struct list_head *r = queue_peek(q);

if (r) {
q->nr_elts--;
list_del(r);

/* have we just emptied the bottom level? */
Expand Down Expand Up @@ -496,7 +491,11 @@ static void push(struct mq_policy *mq, struct entry *e)
*/
static void del(struct mq_policy *mq, struct entry *e)
{
queue_remove(&e->list);
if (in_cache(mq, e))
queue_remove(e->dirty ? &mq->cache_dirty : &mq->cache_clean, &e->list);
else
queue_remove(&mq->pre_cache, &e->list);

hash_remove(e);
}

Expand Down

0 comments on commit 75da39b

Please sign in to comment.