X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Farc.c;h=ce4a0239c0c0ba18370fd9ea43cb2b176fb90e05;hb=68121a03daf58a7d5b9351f110196b8ce806e1fa;hp=e6e31eccb4d6a6294eb04ca4c593093ca44fbead;hpb=4e59f475118b7081a3f950ebf7c70b5bfc7c9778;p=zfs.git diff --git a/module/zfs/arc.c b/module/zfs/arc.c index e6e31ec..ce4a023 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -550,7 +550,8 @@ static arc_buf_hdr_t arc_eviction_hdr; static void arc_get_data_buf(arc_buf_t *buf); static void arc_access(arc_buf_hdr_t *buf, kmutex_t *hash_lock); static int arc_evict_needed(arc_buf_contents_t type); -static void arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes); +static void arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes, + arc_buf_contents_t type); static boolean_t l2arc_write_eligible(uint64_t spa_guid, arc_buf_hdr_t *ab); @@ -1864,12 +1865,14 @@ arc_evict(arc_state_t *state, uint64_t spa, int64_t bytes, boolean_t recycle, if (mru_over > 0 && arc_mru_ghost->arcs_lsize[type] > 0) { int64_t todelete = MIN(arc_mru_ghost->arcs_lsize[type], mru_over); - arc_evict_ghost(arc_mru_ghost, 0, todelete); + arc_evict_ghost(arc_mru_ghost, 0, todelete, + ARC_BUFC_DATA); } else if (arc_mfu_ghost->arcs_lsize[type] > 0) { int64_t todelete = MIN(arc_mfu_ghost->arcs_lsize[type], arc_mru_ghost->arcs_size + arc_mfu_ghost->arcs_size - arc_c); - arc_evict_ghost(arc_mfu_ghost, 0, todelete); + arc_evict_ghost(arc_mfu_ghost, 0, todelete, + ARC_BUFC_DATA); } } @@ -1881,11 +1884,12 @@ arc_evict(arc_state_t *state, uint64_t spa, int64_t bytes, boolean_t recycle, * bytes. Destroy the buffers that are removed. */ static void -arc_evict_ghost(arc_state_t *state, uint64_t spa, int64_t bytes) +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; - list_t *list = &state->arcs_list[ARC_BUFC_DATA]; + list_t *list = &state->arcs_list[type]; kmutex_t *hash_lock; uint64_t bytes_deleted = 0; uint64_t bufs_skipped = 0; @@ -2015,7 +2019,7 @@ arc_adjust(void) if (adjustment > 0 && arc_mru_ghost->arcs_size > 0) { delta = MIN(arc_mru_ghost->arcs_size, adjustment); - arc_evict_ghost(arc_mru_ghost, 0, delta); + arc_evict_ghost(arc_mru_ghost, 0, delta, ARC_BUFC_DATA); } adjustment = @@ -2023,7 +2027,7 @@ arc_adjust(void) if (adjustment > 0 && arc_mfu_ghost->arcs_size > 0) { delta = MIN(arc_mfu_ghost->arcs_size, adjustment); - arc_evict_ghost(arc_mfu_ghost, 0, delta); + arc_evict_ghost(arc_mfu_ghost, 0, delta, ARC_BUFC_DATA); } } @@ -2151,8 +2155,8 @@ arc_flush(spa_t *spa) break; } - arc_evict_ghost(arc_mru_ghost, guid, -1); - arc_evict_ghost(arc_mfu_ghost, guid, -1); + arc_evict_ghost(arc_mru_ghost, guid, -1, ARC_BUFC_DATA); + arc_evict_ghost(arc_mfu_ghost, guid, -1, ARC_BUFC_DATA); mutex_enter(&arc_reclaim_thr_lock); arc_do_user_evicts();