From 055f5cc88fbb7d454bdf68831ebf603651c1d39c Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 20 Jan 2010 08:00:07 -0800 Subject: [PATCH] kernel - Fix bug in recent defered-zap namecache code. * The NCF_DEFEREDZAP code could get into a degenerate situation where every name lookup ate tons of system cpu. Reset the numdefered variable after cleaning defered-zap entries to fix. --- sys/kern/vfs_cache.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index c88c87c5ac..6a0d3b6dc9 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -484,6 +484,7 @@ _cache_drop(struct namecache *ncp) if (refs == 1) { if (_cache_lock_nonblock(ncp) == 0) { + ncp->nc_flag &= ~NCF_DEFEREDZAP; if ((ncp->nc_flag & NCF_UNRESOLVED) && TAILQ_EMPTY(&ncp->nc_list)) { ncp = cache_zap(ncp, 1); @@ -2624,6 +2625,7 @@ _cache_cleandefered(void) struct namecache dummy; int i; + numdefered = 0; bzero(&dummy, sizeof(dummy)); dummy.nc_flag = NCF_DESTROYED; @@ -2640,6 +2642,10 @@ _cache_cleandefered(void) LIST_INSERT_AFTER(ncp, &dummy, nc_hash); _cache_hold(ncp); spin_unlock_wr(&nchpp->spin); + if (_cache_lock_nonblock(ncp) == 0) { + ncp->nc_flag &= ~NCF_DEFEREDZAP; + _cache_unlock(ncp); + } _cache_drop(ncp); spin_lock_wr(&nchpp->spin); ncp = &dummy; -- 2.41.0