xref: /illumos-gate/usr/src/uts/common/fs/zfs/sys/mmp.h (revision 4348eb90)
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