1e0f1c0afSOlaf Faaland /* 2e0f1c0afSOlaf Faaland * CDDL HEADER START 3e0f1c0afSOlaf Faaland * 4e0f1c0afSOlaf Faaland * This file and its contents are supplied under the terms of the 5e0f1c0afSOlaf Faaland * Common Development and Distribution License ("CDDL"), version 1.0. 6e0f1c0afSOlaf Faaland * You may only use this file in accordance with the terms of version 7e0f1c0afSOlaf Faaland * 1.0 of the CDDL. 8e0f1c0afSOlaf Faaland * 9e0f1c0afSOlaf Faaland * A full copy of the text of the CDDL should have accompanied this 10e0f1c0afSOlaf Faaland * source. A copy of the CDDL is also available via the Internet at 11e0f1c0afSOlaf Faaland * http://www.illumos.org/license/CDDL. 12e0f1c0afSOlaf Faaland * 13e0f1c0afSOlaf Faaland * CDDL HEADER END 14e0f1c0afSOlaf Faaland */ 15e0f1c0afSOlaf Faaland /* 16e0f1c0afSOlaf Faaland * Copyright (C) 2017 by Lawrence Livermore National Security, LLC. 17e0f1c0afSOlaf Faaland */ 18e0f1c0afSOlaf Faaland 19e0f1c0afSOlaf Faaland #ifndef _SYS_MMP_H 20e0f1c0afSOlaf Faaland #define _SYS_MMP_H 21e0f1c0afSOlaf Faaland 22e0f1c0afSOlaf Faaland #include <sys/spa.h> 23e0f1c0afSOlaf Faaland #include <sys/zfs_context.h> 24e0f1c0afSOlaf Faaland #include <sys/uberblock_impl.h> 25e0f1c0afSOlaf Faaland 26e0f1c0afSOlaf Faaland #ifdef __cplusplus 27e0f1c0afSOlaf Faaland extern "C" { 28e0f1c0afSOlaf Faaland #endif 29e0f1c0afSOlaf Faaland 30e0f1c0afSOlaf Faaland #define MMP_MIN_INTERVAL 100 /* ms */ 31e0f1c0afSOlaf Faaland #define MMP_DEFAULT_INTERVAL 1000 /* ms */ 32*4348eb90SOlaf Faaland #define MMP_DEFAULT_IMPORT_INTERVALS 20 33*4348eb90SOlaf Faaland #define MMP_DEFAULT_FAIL_INTERVALS 10 34*4348eb90SOlaf Faaland #define MMP_MIN_FAIL_INTERVALS 2 /* min if != 0 */ 35*4348eb90SOlaf Faaland #define MMP_IMPORT_SAFETY_FACTOR 200 /* pct */ 36*4348eb90SOlaf Faaland #define MMP_INTERVAL_OK(interval) MAX(interval, MMP_MIN_INTERVAL) 37*4348eb90SOlaf Faaland #define MMP_FAIL_INTVS_OK(fails) (fails == 0 ? 0 : MAX(fails, \ 38*4348eb90SOlaf Faaland MMP_MIN_FAIL_INTERVALS)) 39e0f1c0afSOlaf Faaland 40e0f1c0afSOlaf Faaland typedef struct mmp_thread { 41e0f1c0afSOlaf Faaland kmutex_t mmp_thread_lock; /* protect thread mgmt fields */ 42e0f1c0afSOlaf Faaland kcondvar_t mmp_thread_cv; 43e0f1c0afSOlaf Faaland kthread_t *mmp_thread; 44e0f1c0afSOlaf Faaland uint8_t mmp_thread_exiting; 45e0f1c0afSOlaf Faaland kmutex_t mmp_io_lock; /* protect below */ 46e0f1c0afSOlaf Faaland hrtime_t mmp_last_write; /* last successful MMP write */ 47e0f1c0afSOlaf Faaland uint64_t mmp_delay; /* decaying avg ns between MMP writes */ 48e0f1c0afSOlaf Faaland uberblock_t mmp_ub; /* last ub written by sync */ 49e0f1c0afSOlaf Faaland zio_t *mmp_zio_root; /* root of mmp write zios */ 50e0f1c0afSOlaf Faaland uint64_t mmp_kstat_id; /* unique id for next MMP write kstat */ 51e0f1c0afSOlaf Faaland int mmp_skip_error; /* reason for last skipped write */ 52e0f1c0afSOlaf Faaland vdev_t *mmp_last_leaf; /* last mmp write sent here */ 53e0f1c0afSOlaf Faaland uint64_t mmp_leaf_last_gen; /* last mmp write sent here */ 54*4348eb90SOlaf Faaland uint32_t mmp_seq; /* intra-second update counter */ 55e0f1c0afSOlaf Faaland } mmp_thread_t; 56e0f1c0afSOlaf Faaland 57e0f1c0afSOlaf Faaland 58e0f1c0afSOlaf Faaland extern void mmp_init(struct spa *spa); 59e0f1c0afSOlaf Faaland extern void mmp_fini(struct spa *spa); 60e0f1c0afSOlaf Faaland extern void mmp_thread_start(struct spa *spa); 61e0f1c0afSOlaf Faaland extern void mmp_thread_stop(struct spa *spa); 62e0f1c0afSOlaf Faaland extern void mmp_update_uberblock(struct spa *spa, struct uberblock *ub); 63e0f1c0afSOlaf Faaland extern void mmp_signal_all_threads(void); 64e0f1c0afSOlaf Faaland 65e0f1c0afSOlaf Faaland /* Global tuning */ 66e0f1c0afSOlaf Faaland extern ulong_t zfs_multihost_interval; 67e0f1c0afSOlaf Faaland extern uint_t zfs_multihost_fail_intervals; 68e0f1c0afSOlaf Faaland extern uint_t zfs_multihost_import_intervals; 69e0f1c0afSOlaf Faaland 70e0f1c0afSOlaf Faaland #ifdef __cplusplus 71e0f1c0afSOlaf Faaland } 72e0f1c0afSOlaf Faaland #endif 73e0f1c0afSOlaf Faaland 74e0f1c0afSOlaf Faaland #endif /* _SYS_MMP_H */ 75