Skip to content

Commit

Permalink
zpool: remove zpool_evict()
Browse files Browse the repository at this point in the history
Remove zpool_evict() helper function.  As zbud is currently the only
zpool implementation that supports eviction, add zpool and zpool_ops
references to struct zbud_pool and directly call zpool_ops->evict(zpool,
handle) on eviction.

Currently zpool provides the zpool_evict helper which locks the zpool
list lock and searches through all pools to find the specific one
matching the caller, and call the corresponding zpool_ops->evict
function.  However, this is unnecessary, as the zbud pool can simply
keep a reference to the zpool that created it, as well as the zpool_ops,
and directly call the zpool_ops->evict function, when it needs to evict
a page.  This avoids a spinlock and list search in zpool for each
eviction.

Signed-off-by: Dan Streetman <[email protected]>
Cc: Seth Jennings <[email protected]>
Cc: Minchan Kim <[email protected]>
Cc: Nitin Gupta <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
ddstreet authored and torvalds committed Jun 26, 2015
1 parent cf41f5f commit 479305f
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 36 deletions.
5 changes: 2 additions & 3 deletions include/linux/zpool.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ struct zpool_driver {
atomic_t refcount;
struct list_head list;

void *(*create)(char *name, gfp_t gfp, struct zpool_ops *ops);
void *(*create)(char *name, gfp_t gfp, struct zpool_ops *ops,
struct zpool *zpool);
void (*destroy)(void *pool);

int (*malloc)(void *pool, size_t size, gfp_t gfp,
Expand All @@ -102,6 +103,4 @@ void zpool_register_driver(struct zpool_driver *driver);

int zpool_unregister_driver(struct zpool_driver *driver);

int zpool_evict(void *pool, unsigned long handle);

#endif
23 changes: 19 additions & 4 deletions mm/zbud.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ struct zbud_pool {
struct list_head lru;
u64 pages_nr;
struct zbud_ops *ops;
#ifdef CONFIG_ZPOOL
struct zpool *zpool;
struct zpool_ops *zpool_ops;
#endif
};

/*
Expand All @@ -123,17 +127,28 @@ struct zbud_header {

static int zbud_zpool_evict(struct zbud_pool *pool, unsigned long handle)
{
return zpool_evict(pool, handle);
if (pool->zpool && pool->zpool_ops && pool->zpool_ops->evict)
return pool->zpool_ops->evict(pool->zpool, handle);
else
return -ENOENT;
}

static struct zbud_ops zbud_zpool_ops = {
.evict = zbud_zpool_evict
};

static void *zbud_zpool_create(char *name, gfp_t gfp,
struct zpool_ops *zpool_ops)
struct zpool_ops *zpool_ops,
struct zpool *zpool)
{
return zbud_create_pool(gfp, zpool_ops ? &zbud_zpool_ops : NULL);
struct zbud_pool *pool;

pool = zbud_create_pool(gfp, zpool_ops ? &zbud_zpool_ops : NULL);
if (pool) {
pool->zpool = zpool;
pool->zpool_ops = zpool_ops;
}
return pool;
}

static void zbud_zpool_destroy(void *pool)
Expand Down Expand Up @@ -292,7 +307,7 @@ struct zbud_pool *zbud_create_pool(gfp_t gfp, struct zbud_ops *ops)
struct zbud_pool *pool;
int i;

pool = kmalloc(sizeof(struct zbud_pool), gfp);
pool = kzalloc(sizeof(struct zbud_pool), gfp);
if (!pool)
return NULL;
spin_lock_init(&pool->lock);
Expand Down
29 changes: 1 addition & 28 deletions mm/zpool.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,33 +73,6 @@ int zpool_unregister_driver(struct zpool_driver *driver)
}
EXPORT_SYMBOL(zpool_unregister_driver);

/**
* zpool_evict() - evict callback from a zpool implementation.
* @pool: pool to evict from.
* @handle: handle to evict.
*
* This can be used by zpool implementations to call the
* user's evict zpool_ops struct evict callback.
*/
int zpool_evict(void *pool, unsigned long handle)
{
struct zpool *zpool;

spin_lock(&pools_lock);
list_for_each_entry(zpool, &pools_head, list) {
if (zpool->pool == pool) {
spin_unlock(&pools_lock);
if (!zpool->ops || !zpool->ops->evict)
return -EINVAL;
return zpool->ops->evict(zpool, handle);
}
}
spin_unlock(&pools_lock);

return -ENOENT;
}
EXPORT_SYMBOL(zpool_evict);

static struct zpool_driver *zpool_get_driver(char *type)
{
struct zpool_driver *driver;
Expand Down Expand Up @@ -170,7 +143,7 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp,

zpool->type = driver->type;
zpool->driver = driver;
zpool->pool = driver->create(name, gfp, ops);
zpool->pool = driver->create(name, gfp, ops, zpool);
zpool->ops = ops;

if (!zpool->pool) {
Expand Down
3 changes: 2 additions & 1 deletion mm/zsmalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,8 @@ static void record_obj(unsigned long handle, unsigned long obj)

#ifdef CONFIG_ZPOOL

static void *zs_zpool_create(char *name, gfp_t gfp, struct zpool_ops *zpool_ops)
static void *zs_zpool_create(char *name, gfp_t gfp, struct zpool_ops *zpool_ops,
struct zpool *zpool)
{
return zs_create_pool(name, gfp);
}
Expand Down

0 comments on commit 479305f

Please sign in to comment.