Skip to content

Commit

Permalink
Revert "arc_evict, arc_evict_ghost: reduce stack usage using kmem_zal…
Browse files Browse the repository at this point in the history
…loc"

This reverts commit 16fcdea in preparation
for the illumos 5497 "lock contention on arcs_mtx" patch which eliminates
"marker" within the ARC code.

Signed-off-by: Tim Chase <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
  • Loading branch information
dweeezil authored and behlendorf committed Jun 11, 2015
1 parent 44de2f0 commit 7807028
Showing 1 changed file with 12 additions and 20 deletions.
32 changes: 12 additions & 20 deletions module/zfs/arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1825,15 +1825,13 @@ arc_evict(arc_state_t *state, uint64_t spa, int64_t bytes, boolean_t recycle,
kmutex_t *hash_lock;
boolean_t have_lock;
void *stolen = NULL;
arc_buf_hdr_t *marker;
arc_buf_hdr_t marker = {{{ 0 }}};
int count = 0;

ASSERT(state == arc_mru || state == arc_mfu);

evicted_state = (state == arc_mru) ? arc_mru_ghost : arc_mfu_ghost;

marker = kmem_zalloc(sizeof (arc_buf_hdr_t), KM_SLEEP);

top:
mutex_enter(&state->arcs_mtx);
mutex_enter(&evicted_state->arcs_mtx);
Expand Down Expand Up @@ -1868,14 +1866,14 @@ arc_evict(arc_state_t *state, uint64_t spa, int64_t bytes, boolean_t recycle,
* the hot code path, so don't sleep.
*/
if (!recycle && count++ > arc_evict_iterations) {
list_insert_after(list, ab, marker);
list_insert_after(list, ab, &marker);
mutex_exit(&evicted_state->arcs_mtx);
mutex_exit(&state->arcs_mtx);
kpreempt(KPREEMPT_SYNC);
mutex_enter(&state->arcs_mtx);
mutex_enter(&evicted_state->arcs_mtx);
ab_prev = list_prev(list, marker);
list_remove(list, marker);
ab_prev = list_prev(list, &marker);
list_remove(list, &marker);
count = 0;
continue;
}
Expand Down Expand Up @@ -1959,8 +1957,6 @@ arc_evict(arc_state_t *state, uint64_t spa, int64_t bytes, boolean_t recycle,
goto top;
}

kmem_free(marker, sizeof (arc_buf_hdr_t));

if (bytes_evicted < bytes)
dprintf("only evicted %lld bytes from %x\n",
(longlong_t)bytes_evicted, state->arcs_state);
Expand Down Expand Up @@ -1990,17 +1986,15 @@ arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes,
arc_buf_contents_t type)
{
arc_buf_hdr_t *ab, *ab_prev;
arc_buf_hdr_t *marker;
arc_buf_hdr_t marker;
list_t *list = &state->arcs_list[type];
kmutex_t *hash_lock;
uint64_t bytes_deleted = 0;
uint64_t bufs_skipped = 0;
int count = 0;

ASSERT(GHOST_STATE(state));

marker = kmem_zalloc(sizeof (arc_buf_hdr_t), KM_SLEEP);

bzero(&marker, sizeof (marker));
top:
mutex_enter(&state->arcs_mtx);
for (ab = list_tail(list); ab; ab = ab_prev) {
Expand All @@ -2026,12 +2020,12 @@ arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes,
* before reacquiring the lock.
*/
if (count++ > arc_evict_iterations) {
list_insert_after(list, ab, marker);
list_insert_after(list, ab, &marker);
mutex_exit(&state->arcs_mtx);
kpreempt(KPREEMPT_SYNC);
mutex_enter(&state->arcs_mtx);
ab_prev = list_prev(list, marker);
list_remove(list, marker);
ab_prev = list_prev(list, &marker);
list_remove(list, &marker);
count = 0;
continue;
}
Expand Down Expand Up @@ -2063,13 +2057,13 @@ arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes,
* hash lock to become available. Once its
* available, restart from where we left off.
*/
list_insert_after(list, ab, marker);
list_insert_after(list, ab, &marker);
mutex_exit(&state->arcs_mtx);
mutex_enter(hash_lock);
mutex_exit(hash_lock);
mutex_enter(&state->arcs_mtx);
ab_prev = list_prev(list, marker);
list_remove(list, marker);
ab_prev = list_prev(list, &marker);
list_remove(list, &marker);
} else {
bufs_skipped += 1;
}
Expand All @@ -2082,8 +2076,6 @@ arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes,
goto top;
}

kmem_free(marker, sizeof (arc_buf_hdr_t));

if (bufs_skipped) {
ARCSTAT_INCR(arcstat_mutex_miss, bufs_skipped);
ASSERT(bytes >= 0);
Expand Down

0 comments on commit 7807028

Please sign in to comment.