X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Ffm.c;h=c004032f8dc89f3eb256620be4081404bec15121;hb=refs%2Fheads%2Frertzinger%2Ffeature-zpool-get--p;hp=d409b2974ace52bd734bb04492b7b43a31b9b665;hpb=baa40d45cbb336765b2f89d934cd9ea690e4f7c9;p=zfs.git diff --git a/module/zfs/fm.c b/module/zfs/fm.c index d409b29..c004032 100644 --- a/module/zfs/fm.c +++ b/module/zfs/fm.c @@ -76,9 +76,9 @@ #include #include -int zevent_len_max = 0; -int zevent_cols = 80; -int zevent_console = 0; +int zfs_zevent_len_max = 0; +int zfs_zevent_cols = 80; +int zfs_zevent_console = 0; static int zevent_len_cur = 0; static int zevent_waiters = 0; @@ -405,9 +405,9 @@ fm_nvprint(nvlist_t *nvl) console_printf("\n"); if (nvlist_lookup_string(nvl, FM_CLASS, &class) == 0) - c = fm_printf(0, c, zevent_cols, "%s", class); + c = fm_printf(0, c, zfs_zevent_cols, "%s", class); - if (fm_nvprintr(nvl, 0, c, zevent_cols) != 0) + if (fm_nvprintr(nvl, 0, c, zfs_zevent_cols) != 0) console_printf("\n"); console_printf("\n"); @@ -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 >= zevent_len_max) + + if (zevent_len_cur >= zfs_zevent_len_max) zfs_zevent_drain(list_tail(&zevent_list)); else zevent_len_cur++; - - mutex_exit(&zevent_lock); } /* @@ -516,7 +515,7 @@ zfs_zevent_post(nvlist_t *nvl, nvlist_t *detector, zevent_cb_t *cb) return; } - if (zevent_console) + if (zfs_zevent_console) fm_nvprint(nvl); ev = zfs_zevent_alloc(); @@ -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 @@ -672,7 +674,7 @@ zfs_zevent_destroy(zfs_zevent_t *ze) 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 */ @@ -740,7 +742,7 @@ fm_nvlist_create(nv_alloc_t *nva) 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)); @@ -1413,7 +1415,13 @@ fm_ena_generate_cpu(uint64_t timestamp, processorid_t cpuid, uchar_t format) uint64_t fm_ena_generate(uint64_t timestamp, uchar_t format) { - return (fm_ena_generate_cpu(timestamp, getcpuid(), format)); + uint64_t ena; + + kpreempt_disable(); + ena = fm_ena_generate_cpu(timestamp, getcpuid(), format); + kpreempt_enable(); + + return (ena); } uint64_t @@ -1488,8 +1496,8 @@ fm_init(void) zevent_len_cur = 0; zevent_flags = 0; - if (zevent_len_max == 0) - zevent_len_max = ERPT_MAX_ERRS * MAX(max_ncpus, 4); + if (zfs_zevent_len_max == 0) + zfs_zevent_len_max = ERPT_MAX_ERRS * MAX(max_ncpus, 4); /* Initialize zevent allocation and generation kstats */ fm_ksp = kstat_create("zfs", 0, "fm", "misc", KSTAT_TYPE_NAMED, @@ -1514,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); @@ -1535,13 +1544,13 @@ fm_fini(void) } } -module_param(zevent_len_max, int, 0644); -MODULE_PARM_DESC(zevent_len_max, "Maximum event queue length"); +module_param(zfs_zevent_len_max, int, 0644); +MODULE_PARM_DESC(zfs_zevent_len_max, "Max event queue length"); -module_param(zevent_cols, int, 0644); -MODULE_PARM_DESC(zevent_cols, "Maximum event column width"); +module_param(zfs_zevent_cols, int, 0644); +MODULE_PARM_DESC(zfs_zevent_cols, "Max event column width"); -module_param(zevent_console, int, 0644); -MODULE_PARM_DESC(zevent_console, "Log events to the console"); +module_param(zfs_zevent_console, int, 0644); +MODULE_PARM_DESC(zfs_zevent_console, "Log events to the console"); #endif /* _KERNEL */