1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
14 */
15
16 #ifndef _KRRP_DBLK_H
17 #define _KRRP_DBLK_H
18
19 #include <sys/types.h>
20 #include <sys/ddi.h>
21 #include <sys/sunddi.h>
22 #include <sys/time.h>
23 #include <sys/sysmacros.h>
24 #include <sys/kmem.h>
25 #include <sys/modctl.h>
26 #include <sys/class.h>
27 #include <sys/cmn_err.h>
28
29 #include <krrp_error.h>
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 typedef struct krrp_dblk_engine_s krrp_dblk_engine_t;
36 typedef struct krrp_dblk_s krrp_dblk_t;
37
38 typedef void (krrp_dblk_free_notify_cb_t)(void *);
39 typedef void (krrp_dblk_alloc_func_t)(krrp_dblk_engine_t *,
40 krrp_dblk_t **, size_t);
41
42
43 typedef enum {
44 KRRP_DET_KMEM_ALLOC,
45 KRRP_DET_KMEM_CACHE,
46 } krrp_dblk_engine_type_t;
47
48 typedef struct krrp_dblk_list_s {
49 krrp_dblk_t *head;
50 krrp_dblk_t *tail;
51 size_t cnt;
52 } krrp_dblk_list_t;
53
54 struct krrp_dblk_engine_s {
55 krrp_dblk_engine_type_t type;
56
57 kmutex_t mtx;
58 kcondvar_t cv;
59
60 boolean_t destroying;
61 krrp_dblk_alloc_func_t *alloc_func;
62
63 kmem_cache_t *dblk_cache;
64
65 krrp_dblk_list_t free_dblks;
66
67 size_t cur_dblk_cnt;
68 size_t max_dblk_cnt;
69
70 size_t dblk_head_sz;
71 size_t dblk_data_sz;
72 size_t dblk_tail_sz;
73
74 struct {
75 krrp_dblk_free_notify_cb_t *cb;
76 void *cb_arg;
77 size_t init_value;
78 size_t cnt;
79 } notify_free;
80 };
81
82 struct krrp_dblk_s {
83 /* These fields are common for krrp_dblk_t and kreplication_buffer_t */
84 void *data;
85 size_t max_data_sz;
86 size_t cur_data_sz;
87 krrp_dblk_t *next;
88
89 /* Private dblk's fields */
90 krrp_dblk_engine_t *engine;
91 size_t total_sz;
92 frtn_t free_rtns;
93
94 /* This field is used by TCP/IP stack as part of mblk_t */
95 void *head;
96 };
97
98 int krrp_dblk_engine_create(krrp_dblk_engine_t **result_engine,
99 boolean_t prealloc, size_t max_dblk_cnt, size_t dblk_head_sz,
100 size_t dblk_data_sz, size_t notify_free_value,
101 krrp_dblk_free_notify_cb_t *notify_free_cb, void *notify_free_cb_arg,
102 krrp_error_t *error);
103 void krrp_dblk_engine_destroy(krrp_dblk_engine_t *engine);
104
105 void krrp_dblk_alloc(krrp_dblk_engine_t *, krrp_dblk_t **, size_t);
106 void krrp_dblk_rele(krrp_dblk_t *);
107
108 int krrp_dblk_get_data(krrp_dblk_t *dblk, void *buf, size_t buf_sz);
109
110 #ifdef __cplusplus
111 }
112 #endif
113
114 #endif /* _KRRP_DBLK_H */