Fix hangs with processes stuck sleeping on btalloc on i386.
[freebsd.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / sys / aggsum.h
1 /*
2  * CDDL HEADER START
3  *
4  * This file and its contents are supplied under the terms of the
5  * Common Development and Distribution License ("CDDL"), version 1.0.
6  * You may only use this file in accordance with the terms of version
7  * 1.0 of the CDDL.
8  *
9  * A full copy of the text of the CDDL should have accompanied this
10  * source.  A copy of the CDDL is also available via the Internet at
11  * http://www.illumos.org/license/CDDL.
12  *
13  * CDDL HEADER END
14  */
15 /*
16  * Copyright (c) 2017 by Delphix. All rights reserved.
17  */
18
19 #ifndef _SYS_AGGSUM_H
20 #define _SYS_AGGSUM_H
21
22 #include <sys/zfs_context.h>
23
24 #ifdef  __cplusplus
25 extern "C" {
26 #endif
27
28 typedef struct aggsum_bucket {
29         kmutex_t asc_lock;
30         int64_t asc_delta;
31         uint64_t asc_borrowed;
32         uint64_t asc_pad[2]; /* pad out to cache line (64 bytes) */
33 } aggsum_bucket_t __aligned(CACHE_LINE_SIZE);
34
35 /*
36  * Fan out over FANOUT cpus.
37  */
38 typedef struct aggsum {
39         kmutex_t as_lock;
40         int64_t as_lower_bound;
41         int64_t as_upper_bound;
42         uint_t as_numbuckets;
43         aggsum_bucket_t *as_buckets;
44 } aggsum_t;
45
46 void aggsum_init(aggsum_t *, uint64_t);
47 void aggsum_fini(aggsum_t *);
48 int64_t aggsum_lower_bound(aggsum_t *);
49 int64_t aggsum_upper_bound(aggsum_t *);
50 int aggsum_compare(aggsum_t *, uint64_t);
51 uint64_t aggsum_value(aggsum_t *);
52 void aggsum_add(aggsum_t *, int64_t);
53
54 #ifdef  __cplusplus
55 }
56 #endif
57
58 #endif /* _SYS_AGGSUM_H */