[dm-devel] [PATCH 8/8] [dm-cache] cache target

Alasdair G Kergon agk at redhat.com
Tue Feb 12 15:27:33 UTC 2013


[Although I'm replying to this old email, I'm looking at
updated code taken from the all-caches branch of 
git://github.com/jthornber/linux-2.6 ]

On Thu, Dec 13, 2012 at 08:19:16PM +0000, Joe Thornber wrote:
>  drivers/md/Kconfig                            |   22 +

>  drivers/md/dm-cache-policy-cleaner.c          |  482 +++++
>  drivers/md/dm-cache-policy-mq.c               | 1254 +++++++++++++

> --- a/drivers/md/Kconfig
> +++ b/drivers/md/Kconfig

> +config DM_CACHE
> +       tristate "Cache target (EXPERIMENTAL)"
> +       depends on BLK_DEV_DM
> +       default n
> +       select DM_PERSISTENT_DATA
> +       select DM_PRISON
> +       ---help---
> +         Use an SSD to speed up a slower device.

Can we allow for other non-SSD uses too?
"Use a faster device like an SSD to speed up a slower device." perhaps?

> +         dm-cache attempts to improve performance of a block device by
> +         moving frequently used data to a smaller, higher performance
> +         device.  Different 'policy' plugins can be used to change the
> +         algorithms used to select which blocks are promoted, demoted,
> +         cleaned etc.  It supports writeback and writethrough modes.


> +++ b/drivers/md/dm-cache-policy-cleaner.c
> @@ -0,0 +1,482 @@

> +#include "dm-cache-policy.h"
> +#include "dm.h"
> +
> +#include <linux/hash.h>
> +#include <linux/list.h>

list.h already included by dm.h

> +#include <linux/module.h>
> +#include <linux/slab.h>
> +
> +/*----------------------------------------------------------------*/
> +

#define DM_MSG_PREFIX "cache cleaner"
#define CLEANER_VERSION "1.0.0"


> +static int alloc_cache_blocks_with_hash(struct policy *p, dm_cblock_t cache_size)
> +{
> +	int r;

int r = -ENOMEM ?

> +
> +	p->cblocks = vzalloc(sizeof(*p->cblocks) * from_cblock(cache_size));
> +	if (p->cblocks) {
> +		unsigned u = from_cblock(cache_size);
> +
> +		while (u--)
> +			list_add(&p->cblocks[u].list, &p->free);
> +
> +		p->nr_cblocks_allocated = 0;
> +
> +		/* Cache entries hash. */
> +		r = alloc_hash(&p->chash, from_cblock(cache_size));
> +		if (r)
> +			vfree(p->cblocks);
> +
> +	} else
> +		r = -ENOMEM;

Initialise instead.

> +}
> +
> +
> +static void __set_clear_dirty(struct dm_cache_policy *pe, dm_oblock_t oblock, bool set)

Extra blank line

> +#if 0
> +static int wb_status(struct dm_cache_policy *pe, status_type_t type, unsigned status_flags, char *result, unsigned maxlen)
> +{
> +	ssize_t sz = 0;
> +	struct policy *p = to_policy(pe);
> +
> +	switch (type) {
> +	case STATUSTYPE_INFO:
> +		DMEMIT("%u", from_cblock(p->nr_dirty));
> +		break;
> +
> +	case STATUSTYPE_TABLE:
> +		break;
> +	}
> +
> +	return 0;
> +}
> +#endif

Provide a documented stable status or drop this for now?

> +#if 0
> +	p->policy.status = wb_status;
> +	p->policy.message = NULL;
> +#endif

> +static int __init wb_init(void)
> +{
> +	return dm_cache_policy_register(&wb_policy_type);
> +}

Log like other modules (e.g. dm-queue-length.c):
	DMINFO("version " CLEANER_VERSION " loaded");

Similar DMINFO changes in dm-cache-policy-mq.c.

Alasdair




More information about the dm-devel mailing list