{
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
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);