Skip to content

Commit

Permalink
staging/lustre/obdclass: convert lu_object shrinker to count/scan API
Browse files Browse the repository at this point in the history
convert lu_object shrinker to new count/scan API.

Signed-off-by: Peng Tao <tao.peng@emc.com>
  • Loading branch information
bergwolf committed Jun 5, 2013
1 parent df48ce3 commit 9b1794a
Showing 1 changed file with 50 additions and 46 deletions.
96 changes: 50 additions & 46 deletions drivers/staging/lustre/lustre/obdclass/lu_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -1781,7 +1781,6 @@ int lu_env_refill_by_tags(struct lu_env *env, __u32 ctags,
}
EXPORT_SYMBOL(lu_env_refill_by_tags);

static struct shrinker *lu_site_shrinker = NULL;

typedef struct lu_site_stats{
unsigned lss_populated;
Expand Down Expand Up @@ -1837,61 +1836,66 @@ static void lu_site_stats_get(cfs_hash_t *hs,
* objects without taking the lu_sites_guard lock, but this is not
* possible in the current implementation.
*/
static int lu_cache_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask))
static long lu_cache_shrink_count(struct shrinker *sk, struct shrink_control *sc)
{
lu_site_stats_t stats;
struct lu_site *s;
struct lu_site *tmp;
int cached = 0;
int remain = shrink_param(sc, nr_to_scan);
LIST_HEAD(splice);

if (!(shrink_param(sc, gfp_mask) & __GFP_FS)) {
if (remain != 0)
return -1;
else
/* We must not take the lu_sites_guard lock when
* __GFP_FS is *not* set because of the deadlock
* possibility detailed above. Additionally,
* since we cannot determine the number of
* objects in the cache without taking this
* lock, we're in a particularly tough spot. As
* a result, we'll just lie and say our cache is
* empty. This _should_ be ok, as we can't
* reclaim objects when __GFP_FS is *not* set
* anyways.
*/
return 0;
}
long cached = 0;

CDEBUG(D_INODE, "Shrink %d objects\n", remain);
if (!sc->gfp_mask & __GFP_FS)
return 0;

mutex_lock(&lu_sites_guard);
list_for_each_entry_safe(s, tmp, &lu_sites, ls_linkage) {
if (shrink_param(sc, nr_to_scan) != 0) {
remain = lu_site_purge(&lu_shrink_env, s, remain);
/*
* Move just shrunk site to the tail of site list to
* assure shrinking fairness.
*/
list_move_tail(&s->ls_linkage, &splice);
}

memset(&stats, 0, sizeof(stats));
lu_site_stats_get(s->ls_obj_hash, &stats, 0);
cached += stats.lss_total - stats.lss_busy;
if (shrink_param(sc, nr_to_scan) && remain <= 0)
break;
}
list_splice(&splice, lu_sites.prev);
mutex_unlock(&lu_sites_guard);

cached = (cached / 100) * sysctl_vfs_cache_pressure;
if (shrink_param(sc, nr_to_scan) == 0)
CDEBUG(D_INODE, "%d objects cached\n", cached);
CDEBUG(D_INODE, "%ld objects cached\n", cached);
return cached;
}

static long lu_cache_shrink_scan(struct shrinker *sk, struct shrink_control *sc)
{
struct lu_site *s;
struct lu_site *tmp;
long remain = sc->nr_to_scan, freed = 0;
LIST_HEAD(splice);

if (!sc->gfp_mask & __GFP_FS)
/* We must not take the lu_sites_guard lock when
* __GFP_FS is *not* set because of the deadlock
* possibility detailed above. Additionally,
* since we cannot determine the number of
* objects in the cache without taking this
* lock, we're in a particularly tough spot. As
* a result, we'll just lie and say our cache is
* empty. This _should_ be ok, as we can't
* reclaim objects when __GFP_FS is *not* set
* anyways.
*/
return -1;

mutex_lock(&lu_sites_guard);
list_for_each_entry_safe(s, tmp, &lu_sites, ls_linkage) {
freed = lu_site_purge(&lu_shrink_env, s, remain);
remain -= freed;
/*
* Move just shrunk site to the tail of site list to
* assure shrinking fairness.
*/
list_move_tail(&s->ls_linkage, &splice);
}
list_splice(&splice, lu_sites.prev);
mutex_unlock(&lu_sites_guard);

return sc->nr_to_scan - remain;
}

/*
* Debugging stuff.
*/
Expand Down Expand Up @@ -1941,6 +1945,12 @@ void lu_context_keys_dump(void)
}
EXPORT_SYMBOL(lu_context_keys_dump);

static struct shrinker lu_site_shrinker = {
.count_objects = lu_cache_shrink_count,
.scan_objects = lu_cache_shrink_scan,
.seeks = DEFAULT_SEEKS,
};

/**
* Initialization of global lu_* data.
*/
Expand Down Expand Up @@ -1975,9 +1985,7 @@ int lu_global_init(void)
* inode, one for ea. Unfortunately setting this high value results in
* lu_object/inode cache consuming all the memory.
*/
lu_site_shrinker = set_shrinker(DEFAULT_SEEKS, lu_cache_shrink);
if (lu_site_shrinker == NULL)
return -ENOMEM;
register_shrinker(&lu_site_shrinker);

return result;
}
Expand All @@ -1987,11 +1995,7 @@ int lu_global_init(void)
*/
void lu_global_fini(void)
{
if (lu_site_shrinker != NULL) {
remove_shrinker(lu_site_shrinker);
lu_site_shrinker = NULL;
}

unregister_shrinker(&lu_site_shrinker);
lu_context_key_degister(&lu_global_key);

/*
Expand Down

1 comment on commit 9b1794a

@adilger
Copy link

@adilger adilger commented on 9b1794a Jun 5, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks OK.

Please sign in to comment.