git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Allow arc_evict_ghost() to only evict meta data
[zfs.git]
/
module
/
zfs
/
arc.c
diff --git
a/module/zfs/arc.c
b/module/zfs/arc.c
index
e6e31ec
..
ce4a023
100644
(file)
--- 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_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);
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);
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);
} 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
* 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;
{
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;
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);
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 =
}
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);
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;
}
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();
mutex_enter(&arc_reclaim_thr_lock);
arc_do_user_evicts();