{
zevent_t *ev;
- ev = kmem_zalloc(sizeof(zevent_t), KM_SLEEP);
+ ev = kmem_zalloc(sizeof(zevent_t), KM_PUSHPAGE);
if (ev == NULL)
return NULL;
static void
zfs_zevent_insert(zevent_t *ev)
{
- mutex_enter(&zevent_lock);
+ ASSERT(MUTEX_HELD(&zevent_lock));
list_insert_head(&zevent_list, ev);
+
if (zevent_len_cur >= zfs_zevent_len_max)
zfs_zevent_drain(list_tail(&zevent_list));
else
zevent_len_cur++;
-
- mutex_exit(&zevent_lock);
}
/*
ev->ev_nvl = nvl;
ev->ev_detector = detector;
ev->ev_cb = cb;
+
+ mutex_enter(&zevent_lock);
zfs_zevent_insert(ev);
cv_broadcast(&zevent_cv);
+ mutex_exit(&zevent_lock);
}
static int
static void *
i_fm_alloc(nv_alloc_t *nva, size_t size)
{
- return (kmem_zalloc(size, KM_SLEEP));
+ return (kmem_zalloc(size, KM_PUSHPAGE));
}
/* ARGSUSED */
nv_alloc_t *nvhdl;
if (nva == NULL) {
- nvhdl = kmem_zalloc(sizeof (nv_alloc_t), KM_SLEEP);
+ nvhdl = kmem_zalloc(sizeof (nv_alloc_t), KM_PUSHPAGE);
if (nv_alloc_init(nvhdl, &fm_mem_alloc_ops, NULL, 0) != 0) {
kmem_free(nvhdl, sizeof (nv_alloc_t));
int count;
zfs_zevent_drain_all(&count);
- cv_broadcast(&zevent_cv);
mutex_enter(&zevent_lock);
+ cv_broadcast(&zevent_cv);
+
zevent_flags |= ZEVENT_SHUTDOWN;
while (zevent_waiters > 0) {
mutex_exit(&zevent_lock);