]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
dm cache policy smq: allocate cache blocks in order
authorJoe Thornber <ejt@redhat.com>
Thu, 9 Nov 2017 16:41:05 +0000 (11:41 -0500)
committerMike Snitzer <snitzer@redhat.com>
Fri, 10 Nov 2017 20:45:05 +0000 (15:45 -0500)
Previously, cache blocks were being allocated in reverse order.  Fix
this by pulling the block off the head of the free list.

Shouldn't have any impact on performance or latency but it is more
correct to have the cache blocks allocated/mapped in ascending order.
This fix will slightly increase the chances of two adjacent oblocks
being in adjacent cblocks.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-cache-policy-smq.c

index 58be846ba5b9b84986b45c3617184150bc35b757..4ab23d0075f615f35b9c996ae658a26456313465 100644 (file)
@@ -213,6 +213,19 @@ static void l_del(struct entry_space *es, struct ilist *l, struct entry *e)
                l->nr_elts--;
 }
 
+static struct entry *l_pop_head(struct entry_space *es, struct ilist *l)
+{
+       struct entry *e;
+
+       for (e = l_head(es, l); e; e = l_next(es, e))
+               if (!e->sentinel) {
+                       l_del(es, l, e);
+                       return e;
+               }
+
+       return NULL;
+}
+
 static struct entry *l_pop_tail(struct entry_space *es, struct ilist *l)
 {
        struct entry *e;
@@ -719,7 +732,7 @@ static struct entry *alloc_entry(struct entry_alloc *ea)
        if (l_empty(&ea->free))
                return NULL;
 
-       e = l_pop_tail(ea->es, &ea->free);
+       e = l_pop_head(ea->es, &ea->free);
        init_entry(e);
        ea->nr_allocated++;