MFV r319741: 8156 dbuf_evict_notify() does not need dbuf_evict_lock

illumos/illumos-gate@dbfd9f9300
dbfd9f9300

https://www.illumos.org/issues/8156
  dbuf_evict_notify() holds the dbuf_evict_lock while checking if it should do
  the eviction itself (because the evict thread is not able to keep up).
  This can result in massive lock contention.
  It isn't necessary to hold the lock, because if we make the wrong choice
  occasionally, nothing bad will happen.

Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Author: Matthew Ahrens <mahrens@delphix.com>
MFC after:	1 week
This commit is contained in:
Andriy Gapon 2017-06-09 15:28:57 +00:00
commit 667002fa27
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=319750

View File

@ -560,19 +560,15 @@ dbuf_evict_notify(void)
if (tsd_get(zfs_dbuf_evict_key) != NULL)
return;
/*
* We check if we should evict without holding the dbuf_evict_lock,
* because it's OK to occasionally make the wrong decision here,
* and grabbing the lock results in massive lock contention.
*/
if (refcount_count(&dbuf_cache_size) > dbuf_cache_max_bytes) {
boolean_t evict_now = B_FALSE;
mutex_enter(&dbuf_evict_lock);
if (refcount_count(&dbuf_cache_size) > dbuf_cache_max_bytes) {
evict_now = dbuf_cache_above_hiwater();
cv_signal(&dbuf_evict_cv);
}
mutex_exit(&dbuf_evict_lock);
if (evict_now) {
if (dbuf_cache_above_hiwater())
dbuf_evict_one();
}
cv_signal(&dbuf_evict_cv);
}
}