These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / md / dm-cache-policy-mq.c
index 515d44b..ddb2698 100644 (file)
@@ -1236,7 +1236,7 @@ static int __mq_writeback_work(struct mq_policy *mq, dm_oblock_t *oblock,
 }
 
 static int mq_writeback_work(struct dm_cache_policy *p, dm_oblock_t *oblock,
-                            dm_cblock_t *cblock)
+                            dm_cblock_t *cblock, bool critical_only)
 {
        int r;
        struct mq_policy *mq = to_mq_policy(p);
@@ -1283,7 +1283,7 @@ static dm_cblock_t mq_residency(struct dm_cache_policy *p)
        return r;
 }
 
-static void mq_tick(struct dm_cache_policy *p)
+static void mq_tick(struct dm_cache_policy *p, bool can_block)
 {
        struct mq_policy *mq = to_mq_policy(p);
        unsigned long flags;
@@ -1291,6 +1291,12 @@ static void mq_tick(struct dm_cache_policy *p)
        spin_lock_irqsave(&mq->tick_lock, flags);
        mq->tick_protected++;
        spin_unlock_irqrestore(&mq->tick_lock, flags);
+
+       if (can_block) {
+               mutex_lock(&mq->lock);
+               copy_tick(mq);
+               mutex_unlock(&mq->lock);
+       }
 }
 
 static int mq_set_config_value(struct dm_cache_policy *p,
@@ -1323,22 +1329,24 @@ static int mq_set_config_value(struct dm_cache_policy *p,
        return 0;
 }
 
-static int mq_emit_config_values(struct dm_cache_policy *p, char *result, unsigned maxlen)
+static int mq_emit_config_values(struct dm_cache_policy *p, char *result,
+                                unsigned maxlen, ssize_t *sz_ptr)
 {
-       ssize_t sz = 0;
+       ssize_t sz = *sz_ptr;
        struct mq_policy *mq = to_mq_policy(p);
 
        DMEMIT("10 random_threshold %u "
               "sequential_threshold %u "
               "discard_promote_adjustment %u "
               "read_promote_adjustment %u "
-              "write_promote_adjustment %u",
+              "write_promote_adjustment %u ",
               mq->tracker.thresholds[PATTERN_RANDOM],
               mq->tracker.thresholds[PATTERN_SEQUENTIAL],
               mq->discard_promote_adjustment,
               mq->read_promote_adjustment,
               mq->write_promote_adjustment);
 
+       *sz_ptr = sz;
        return 0;
 }
 
@@ -1402,7 +1410,7 @@ static struct dm_cache_policy *mq_create(dm_cblock_t cache_size,
        mq->generation_period = max((unsigned) from_cblock(cache_size), 1024U);
 
        mq->nr_buckets = next_power(from_cblock(cache_size) / 2, 16);
-       mq->hash_bits = ffs(mq->nr_buckets) - 1;
+       mq->hash_bits = __ffs(mq->nr_buckets);
        mq->table = vzalloc(sizeof(*mq->table) * mq->nr_buckets);
        if (!mq->table)
                goto bad_alloc_table;
@@ -1423,21 +1431,12 @@ bad_pre_cache_init:
 
 static struct dm_cache_policy_type mq_policy_type = {
        .name = "mq",
-       .version = {1, 3, 0},
+       .version = {1, 4, 0},
        .hint_size = 4,
        .owner = THIS_MODULE,
        .create = mq_create
 };
 
-static struct dm_cache_policy_type default_policy_type = {
-       .name = "default",
-       .version = {1, 3, 0},
-       .hint_size = 4,
-       .owner = THIS_MODULE,
-       .create = mq_create,
-       .real = &mq_policy_type
-};
-
 static int __init mq_init(void)
 {
        int r;
@@ -1447,36 +1446,21 @@ static int __init mq_init(void)
                                           __alignof__(struct entry),
                                           0, NULL);
        if (!mq_entry_cache)
-               goto bad;
+               return -ENOMEM;
 
        r = dm_cache_policy_register(&mq_policy_type);
        if (r) {
                DMERR("register failed %d", r);
-               goto bad_register_mq;
-       }
-
-       r = dm_cache_policy_register(&default_policy_type);
-       if (!r) {
-               DMINFO("version %u.%u.%u loaded",
-                      mq_policy_type.version[0],
-                      mq_policy_type.version[1],
-                      mq_policy_type.version[2]);
-               return 0;
+               kmem_cache_destroy(mq_entry_cache);
+               return -ENOMEM;
        }
 
-       DMERR("register failed (as default) %d", r);
-
-       dm_cache_policy_unregister(&mq_policy_type);
-bad_register_mq:
-       kmem_cache_destroy(mq_entry_cache);
-bad:
-       return -ENOMEM;
+       return 0;
 }
 
 static void __exit mq_exit(void)
 {
        dm_cache_policy_unregister(&mq_policy_type);
-       dm_cache_policy_unregister(&default_policy_type);
 
        kmem_cache_destroy(mq_entry_cache);
 }
@@ -1487,5 +1471,3 @@ module_exit(mq_exit);
 MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("mq cache policy");
-
-MODULE_ALIAS("dm-cache-default");