diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-05-13 12:51:06 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-05-14 15:09:34 -0400 |
| commit | 93a05e65c090dda9cbd79d0cf57b65c4dbd8da55 (patch) | |
| tree | bcffc5640b3038292362afb4283965b94f60cc0f | |
| parent | d300a41ef1c39cc5e6b90fd8834ea7ab16b5c48f (diff) | |
SUNRPC: Ensure memory shrinker doesn't waste time in rpcauth_prune_expired()
The 'cred_unused' list, that is traversed by rpcauth_cache_shrinker is
ordered by time. If we hit a credential that is under the 60 second garbage
collection moratorium, we should exit because we know at that point that
all successive credentials are subject to the same moratorium...
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | net/sunrpc/auth.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 0667a36aee78..c40856f589f0 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
| @@ -236,10 +236,13 @@ rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | |||
| 236 | 236 | ||
| 237 | list_for_each_entry_safe(cred, next, &cred_unused, cr_lru) { | 237 | list_for_each_entry_safe(cred, next, &cred_unused, cr_lru) { |
| 238 | 238 | ||
| 239 | /* Enforce a 60 second garbage collection moratorium */ | 239 | /* |
| 240 | * Enforce a 60 second garbage collection moratorium | ||
| 241 | * Note that the cred_unused list must be time-ordered. | ||
| 242 | */ | ||
| 240 | if (time_in_range(cred->cr_expire, expired, jiffies) && | 243 | if (time_in_range(cred->cr_expire, expired, jiffies) && |
| 241 | test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) | 244 | test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) |
| 242 | continue; | 245 | return 0; |
| 243 | 246 | ||
| 244 | list_del_init(&cred->cr_lru); | 247 | list_del_init(&cred->cr_lru); |
| 245 | number_cred_unused--; | 248 | number_cred_unused--; |
| @@ -258,7 +261,7 @@ rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | |||
| 258 | if (nr_to_scan == 0) | 261 | if (nr_to_scan == 0) |
| 259 | break; | 262 | break; |
| 260 | } | 263 | } |
| 261 | return nr_to_scan; | 264 | return (number_cred_unused / 100) * sysctl_vfs_cache_pressure; |
| 262 | } | 265 | } |
| 263 | 266 | ||
| 264 | /* | 267 | /* |
| @@ -275,8 +278,7 @@ rpcauth_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) | |||
| 275 | if (list_empty(&cred_unused)) | 278 | if (list_empty(&cred_unused)) |
| 276 | return 0; | 279 | return 0; |
| 277 | spin_lock(&rpc_credcache_lock); | 280 | spin_lock(&rpc_credcache_lock); |
| 278 | nr_to_scan = rpcauth_prune_expired(&free, nr_to_scan); | 281 | res = rpcauth_prune_expired(&free, nr_to_scan); |
| 279 | res = (number_cred_unused / 100) * sysctl_vfs_cache_pressure; | ||
| 280 | spin_unlock(&rpc_credcache_lock); | 282 | spin_unlock(&rpc_credcache_lock); |
| 281 | rpcauth_destroy_credlist(&free); | 283 | rpcauth_destroy_credlist(&free); |
| 282 | return res; | 284 | return res; |
