dm-cache: fix warnings about duplicate slab caches
The commit4c39529663
adds a warning about duplicate cache names if CONFIG_DEBUG_VM is selected. These warnings are triggered by the dm-cache code. The dm-cache code allocates a slab cache for each device. This commit changes it to allocate just one slab cache in the module init function. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Fixes:4c39529663
("slab: Warn on duplicate cache names when DEBUG_VM=y")
This commit is contained in:
parent
42964e4b5e
commit
346dbf1b13
@ -11,12 +11,6 @@
|
|||||||
|
|
||||||
#define DM_MSG_PREFIX "dm-background-tracker"
|
#define DM_MSG_PREFIX "dm-background-tracker"
|
||||||
|
|
||||||
struct bt_work {
|
|
||||||
struct list_head list;
|
|
||||||
struct rb_node node;
|
|
||||||
struct policy_work work;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct background_tracker {
|
struct background_tracker {
|
||||||
unsigned int max_work;
|
unsigned int max_work;
|
||||||
atomic_t pending_promotes;
|
atomic_t pending_promotes;
|
||||||
@ -26,10 +20,10 @@ struct background_tracker {
|
|||||||
struct list_head issued;
|
struct list_head issued;
|
||||||
struct list_head queued;
|
struct list_head queued;
|
||||||
struct rb_root pending;
|
struct rb_root pending;
|
||||||
|
|
||||||
struct kmem_cache *work_cache;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct kmem_cache *btracker_work_cache = NULL;
|
||||||
|
|
||||||
struct background_tracker *btracker_create(unsigned int max_work)
|
struct background_tracker *btracker_create(unsigned int max_work)
|
||||||
{
|
{
|
||||||
struct background_tracker *b = kmalloc(sizeof(*b), GFP_KERNEL);
|
struct background_tracker *b = kmalloc(sizeof(*b), GFP_KERNEL);
|
||||||
@ -48,12 +42,6 @@ struct background_tracker *btracker_create(unsigned int max_work)
|
|||||||
INIT_LIST_HEAD(&b->queued);
|
INIT_LIST_HEAD(&b->queued);
|
||||||
|
|
||||||
b->pending = RB_ROOT;
|
b->pending = RB_ROOT;
|
||||||
b->work_cache = KMEM_CACHE(bt_work, 0);
|
|
||||||
if (!b->work_cache) {
|
|
||||||
DMERR("couldn't create mempool for background work items");
|
|
||||||
kfree(b);
|
|
||||||
b = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
@ -66,10 +54,9 @@ void btracker_destroy(struct background_tracker *b)
|
|||||||
BUG_ON(!list_empty(&b->issued));
|
BUG_ON(!list_empty(&b->issued));
|
||||||
list_for_each_entry_safe (w, tmp, &b->queued, list) {
|
list_for_each_entry_safe (w, tmp, &b->queued, list) {
|
||||||
list_del(&w->list);
|
list_del(&w->list);
|
||||||
kmem_cache_free(b->work_cache, w);
|
kmem_cache_free(btracker_work_cache, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
kmem_cache_destroy(b->work_cache);
|
|
||||||
kfree(b);
|
kfree(b);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btracker_destroy);
|
EXPORT_SYMBOL_GPL(btracker_destroy);
|
||||||
@ -180,7 +167,7 @@ static struct bt_work *alloc_work(struct background_tracker *b)
|
|||||||
if (max_work_reached(b))
|
if (max_work_reached(b))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
|
return kmem_cache_alloc(btracker_work_cache, GFP_NOWAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int btracker_queue(struct background_tracker *b,
|
int btracker_queue(struct background_tracker *b,
|
||||||
@ -203,7 +190,7 @@ int btracker_queue(struct background_tracker *b,
|
|||||||
* There was a race, we'll just ignore this second
|
* There was a race, we'll just ignore this second
|
||||||
* bit of work for the same oblock.
|
* bit of work for the same oblock.
|
||||||
*/
|
*/
|
||||||
kmem_cache_free(b->work_cache, w);
|
kmem_cache_free(btracker_work_cache, w);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +231,7 @@ void btracker_complete(struct background_tracker *b,
|
|||||||
update_stats(b, &w->work, -1);
|
update_stats(b, &w->work, -1);
|
||||||
rb_erase(&w->node, &b->pending);
|
rb_erase(&w->node, &b->pending);
|
||||||
list_del(&w->list);
|
list_del(&w->list);
|
||||||
kmem_cache_free(b->work_cache, w);
|
kmem_cache_free(btracker_work_cache, w);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btracker_complete);
|
EXPORT_SYMBOL_GPL(btracker_complete);
|
||||||
|
|
||||||
|
@ -26,6 +26,14 @@
|
|||||||
* protected with a spinlock.
|
* protected with a spinlock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct bt_work {
|
||||||
|
struct list_head list;
|
||||||
|
struct rb_node node;
|
||||||
|
struct policy_work work;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct kmem_cache *btracker_work_cache;
|
||||||
|
|
||||||
struct background_work;
|
struct background_work;
|
||||||
struct background_tracker;
|
struct background_tracker;
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "dm-bio-record.h"
|
#include "dm-bio-record.h"
|
||||||
#include "dm-cache-metadata.h"
|
#include "dm-cache-metadata.h"
|
||||||
#include "dm-io-tracker.h"
|
#include "dm-io-tracker.h"
|
||||||
|
#include "dm-cache-background-tracker.h"
|
||||||
|
|
||||||
#include <linux/dm-io.h>
|
#include <linux/dm-io.h>
|
||||||
#include <linux/dm-kcopyd.h>
|
#include <linux/dm-kcopyd.h>
|
||||||
@ -2263,7 +2264,7 @@ static int parse_cache_args(struct cache_args *ca, int argc, char **argv,
|
|||||||
|
|
||||||
/*----------------------------------------------------------------*/
|
/*----------------------------------------------------------------*/
|
||||||
|
|
||||||
static struct kmem_cache *migration_cache;
|
static struct kmem_cache *migration_cache = NULL;
|
||||||
|
|
||||||
#define NOT_CORE_OPTION 1
|
#define NOT_CORE_OPTION 1
|
||||||
|
|
||||||
@ -3445,22 +3446,36 @@ static int __init dm_cache_init(void)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
migration_cache = KMEM_CACHE(dm_cache_migration, 0);
|
migration_cache = KMEM_CACHE(dm_cache_migration, 0);
|
||||||
if (!migration_cache)
|
if (!migration_cache) {
|
||||||
return -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
btracker_work_cache = kmem_cache_create("dm_cache_bt_work",
|
||||||
|
sizeof(struct bt_work), __alignof__(struct bt_work), 0, NULL);
|
||||||
|
if (!btracker_work_cache) {
|
||||||
|
r = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
r = dm_register_target(&cache_target);
|
r = dm_register_target(&cache_target);
|
||||||
if (r) {
|
if (r) {
|
||||||
kmem_cache_destroy(migration_cache);
|
goto err;
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
kmem_cache_destroy(migration_cache);
|
||||||
|
kmem_cache_destroy(btracker_work_cache);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit dm_cache_exit(void)
|
static void __exit dm_cache_exit(void)
|
||||||
{
|
{
|
||||||
dm_unregister_target(&cache_target);
|
dm_unregister_target(&cache_target);
|
||||||
kmem_cache_destroy(migration_cache);
|
kmem_cache_destroy(migration_cache);
|
||||||
|
kmem_cache_destroy(btracker_work_cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(dm_cache_init);
|
module_init(dm_cache_init);
|
||||||
|
Loading…
Reference in New Issue
Block a user