splat linux:shrinker: Fix fail-safe
Ensure the fail-safe is reset between successive tests. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
parent
ca072ee70f
commit
794f145bf9
|
@ -101,6 +101,17 @@ static int
|
||||||
__splat_linux_shrinker_fn(struct shrinker *shrink, struct shrink_control *sc)
|
__splat_linux_shrinker_fn(struct shrinker *shrink, struct shrink_control *sc)
|
||||||
{
|
{
|
||||||
static int failsafe = 0;
|
static int failsafe = 0;
|
||||||
|
static unsigned long last_splat_linux_shrinker_size = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shrinker_size can only decrease or stay the same between callbacks
|
||||||
|
* in the same run, so Reset failsafe whenever shrinker increases
|
||||||
|
* as this indicates a new run.
|
||||||
|
*/
|
||||||
|
if (last_splat_linux_shrinker_size < splat_linux_shrinker_size)
|
||||||
|
failsafe = 0;
|
||||||
|
|
||||||
|
last_splat_linux_shrinker_size = splat_linux_shrinker_size;
|
||||||
|
|
||||||
if (sc->nr_to_scan) {
|
if (sc->nr_to_scan) {
|
||||||
splat_linux_shrinker_size = splat_linux_shrinker_size -
|
splat_linux_shrinker_size = splat_linux_shrinker_size -
|
||||||
|
@ -115,11 +126,17 @@ __splat_linux_shrinker_fn(struct shrinker *shrink, struct shrink_control *sc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Far more calls than expected abort drop_slab as a failsafe */
|
/* Far more calls than expected abort drop_slab as a failsafe */
|
||||||
if ((++failsafe % 1000) == 0) {
|
if (failsafe > 100) {
|
||||||
splat_vprint(splat_linux_shrinker_file, SPLAT_LINUX_TEST3_NAME,
|
splat_vprint(splat_linux_shrinker_file, SPLAT_LINUX_TEST3_NAME,
|
||||||
"Far more calls than expected (%d), size now %lu\n",
|
"Far more calls than expected (%d), size now %lu\n",
|
||||||
failsafe, splat_linux_shrinker_size);
|
failsafe, splat_linux_shrinker_size);
|
||||||
return -1;
|
return -1;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* We only increment failsafe if it doesn't trigger. This
|
||||||
|
* makes any failsafe failure persistent until the next test.
|
||||||
|
*/
|
||||||
|
failsafe++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Shrinker has run, so signal back to test. */
|
/* Shrinker has run, so signal back to test. */
|
||||||
|
@ -180,7 +197,7 @@ splat_linux_test3(struct file *file, void *arg)
|
||||||
*/
|
*/
|
||||||
if (splat_linux_shrinker_size || splat_linux_shrinker_file) {
|
if (splat_linux_shrinker_size || splat_linux_shrinker_file) {
|
||||||
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
||||||
"Failed due to concurrent shrinker test, rc = %d\n", rc);
|
"Failed due to concurrent shrinker test, rc = %d\n", rc);
|
||||||
return (rc);
|
return (rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +219,7 @@ splat_linux_test3(struct file *file, void *arg)
|
||||||
rc = wait_event_timeout(shrinker_wait, !splat_linux_shrinker_size, HZ);
|
rc = wait_event_timeout(shrinker_wait, !splat_linux_shrinker_size, HZ);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
||||||
"Failed cache shrinking timed out, size now %lu",
|
"Failed cache shrinking timed out, size now %lu",
|
||||||
splat_linux_shrinker_size);
|
splat_linux_shrinker_size);
|
||||||
rc = -ETIMEDOUT;
|
rc = -ETIMEDOUT;
|
||||||
} else {
|
} else {
|
||||||
|
@ -211,7 +228,7 @@ splat_linux_test3(struct file *file, void *arg)
|
||||||
|
|
||||||
if (!rc && splat_linux_shrinker_size != 0) {
|
if (!rc && splat_linux_shrinker_size != 0) {
|
||||||
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
splat_vprint(file, SPLAT_LINUX_TEST3_NAME,
|
||||||
"Failed cache was not shrunk to 0, size now %lu",
|
"Failed cache was not shrunk to 0, size now %lu",
|
||||||
splat_linux_shrinker_size);
|
splat_linux_shrinker_size);
|
||||||
rc = -EDOM;
|
rc = -EDOM;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue