X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=module%2Fzfs%2Ffm.c;h=c004032f8dc89f3eb256620be4081404bec15121;hb=refs%2Fheads%2Frertzinger%2Ffeature-zpool-get--p;hp=b91516e7aa9f8ee437c8bacb81cb85b546c8a3e2;hpb=b404a3f07f430710b92a380cd24dd2d48443d2f4;p=zfs.git diff --git a/module/zfs/fm.c b/module/zfs/fm.c index b91516e..c004032 100644 --- a/module/zfs/fm.c +++ b/module/zfs/fm.c @@ -418,7 +418,7 @@ zfs_zevent_alloc(void) { zevent_t *ev; - ev = kmem_zalloc(sizeof(zevent_t), KM_SLEEP); + ev = kmem_zalloc(sizeof(zevent_t), KM_PUSHPAGE); if (ev == NULL) return NULL; @@ -481,14 +481,13 @@ zfs_zevent_drain_all(int *count) 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); } /* @@ -528,8 +527,11 @@ zfs_zevent_post(nvlist_t *nvl, nvlist_t *detector, zevent_cb_t *cb) 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 @@ -1520,9 +1522,10 @@ fm_fini(void) 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);