Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 257361
b: refs/heads/master
c: acf92b4
h: refs/heads/master
i:
  257359: 06d1ae9
v: v3
  • Loading branch information
Dave Chinner authored and Al Viro committed Jul 20, 2011
1 parent 5c82936 commit b20771c
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 095760730c1047c69159ce88021a7fa3833502c8
refs/heads/master: acf92b485cccf028177f46918e045c0c4e80ee10
45 changes: 32 additions & 13 deletions trunk/mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,31 +251,40 @@ unsigned long shrink_slab(struct shrink_control *shrink,
unsigned long total_scan;
unsigned long max_pass;
int shrink_ret = 0;
long nr;
long new_nr;

/*
* copy the current shrinker scan count into a local variable
* and zero it so that other concurrent shrinker invocations
* don't also do this scanning work.
*/
do {
nr = shrinker->nr;
} while (cmpxchg(&shrinker->nr, nr, 0) != nr);

total_scan = nr;
max_pass = do_shrinker_shrink(shrinker, shrink, 0);
delta = (4 * nr_pages_scanned) / shrinker->seeks;
delta *= max_pass;
do_div(delta, lru_pages + 1);
shrinker->nr += delta;
if (shrinker->nr < 0) {
total_scan += delta;
if (total_scan < 0) {
printk(KERN_ERR "shrink_slab: %pF negative objects to "
"delete nr=%ld\n",
shrinker->shrink, shrinker->nr);
shrinker->nr = max_pass;
shrinker->shrink, total_scan);
total_scan = max_pass;
}

/*
* Avoid risking looping forever due to too large nr value:
* never try to free more than twice the estimate number of
* freeable entries.
*/
if (shrinker->nr > max_pass * 2)
shrinker->nr = max_pass * 2;

total_scan = shrinker->nr;
shrinker->nr = 0;
if (total_scan > max_pass * 2)
total_scan = max_pass * 2;

trace_mm_shrink_slab_start(shrinker, shrink, total_scan,
trace_mm_shrink_slab_start(shrinker, shrink, nr,
nr_pages_scanned, lru_pages,
max_pass, delta, total_scan);

Expand All @@ -296,9 +305,19 @@ unsigned long shrink_slab(struct shrink_control *shrink,
cond_resched();
}

shrinker->nr += total_scan;
trace_mm_shrink_slab_end(shrinker, shrink_ret, total_scan,
shrinker->nr);
/*
* move the unused scan count back into the shrinker in a
* manner that handles concurrent updates. If we exhausted the
* scan, there is no need to do an update.
*/
do {
nr = shrinker->nr;
new_nr = total_scan + nr;
if (total_scan <= 0)
break;
} while (cmpxchg(&shrinker->nr, nr, new_nr) != nr);

trace_mm_shrink_slab_end(shrinker, shrink_ret, nr, new_nr);
}
up_read(&shrinker_rwsem);
out:
Expand Down

0 comments on commit b20771c

Please sign in to comment.