Commit | Line | Data |
---|---|---|
2522fe45 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
e7fd4179 DT |
2 | /****************************************************************************** |
3 | ******************************************************************************* | |
4 | ** | |
5 | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. | |
52bda2b5 | 6 | ** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. |
e7fd4179 | 7 | ** |
e7fd4179 DT |
8 | ** |
9 | ******************************************************************************* | |
10 | ******************************************************************************/ | |
11 | ||
12 | #include "dlm_internal.h" | |
6c547f26 | 13 | #include "midcomms.h" |
3af2326c | 14 | #include "lowcomms.h" |
e7fd4179 DT |
15 | #include "config.h" |
16 | #include "memory.h" | |
61bed0ba | 17 | #include "ast.h" |
e7fd4179 | 18 | |
3af2326c | 19 | static struct kmem_cache *writequeue_cache; |
6c547f26 | 20 | static struct kmem_cache *mhandle_cache; |
e4dc81ed | 21 | static struct kmem_cache *msg_cache; |
e18b890b | 22 | static struct kmem_cache *lkb_cache; |
3881ac04 | 23 | static struct kmem_cache *rsb_cache; |
61bed0ba | 24 | static struct kmem_cache *cb_cache; |
e7fd4179 DT |
25 | |
26 | ||
30727174 | 27 | int __init dlm_memory_init(void) |
e7fd4179 | 28 | { |
3af2326c AA |
29 | writequeue_cache = dlm_lowcomms_writequeue_cache_create(); |
30 | if (!writequeue_cache) | |
31 | goto out; | |
32 | ||
6c547f26 AA |
33 | mhandle_cache = dlm_midcomms_cache_create(); |
34 | if (!mhandle_cache) | |
3af2326c | 35 | goto mhandle; |
6c547f26 | 36 | |
e7fd4179 | 37 | lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb), |
20c2df83 | 38 | __alignof__(struct dlm_lkb), 0, NULL); |
e7fd4179 | 39 | if (!lkb_cache) |
6c547f26 | 40 | goto lkb; |
3881ac04 | 41 | |
e4dc81ed AA |
42 | msg_cache = dlm_lowcomms_msg_cache_create(); |
43 | if (!msg_cache) | |
44 | goto msg; | |
45 | ||
3881ac04 DT |
46 | rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb), |
47 | __alignof__(struct dlm_rsb), 0, NULL); | |
6c547f26 AA |
48 | if (!rsb_cache) |
49 | goto rsb; | |
3881ac04 | 50 | |
61bed0ba AA |
51 | cb_cache = kmem_cache_create("dlm_cb", sizeof(struct dlm_callback), |
52 | __alignof__(struct dlm_callback), 0, | |
53 | NULL); | |
8113aa91 | 54 | if (!cb_cache) |
61bed0ba AA |
55 | goto cb; |
56 | ||
75af271e | 57 | return 0; |
6c547f26 | 58 | |
61bed0ba AA |
59 | cb: |
60 | kmem_cache_destroy(rsb_cache); | |
6c547f26 | 61 | rsb: |
e4dc81ed AA |
62 | kmem_cache_destroy(msg_cache); |
63 | msg: | |
6c547f26 AA |
64 | kmem_cache_destroy(lkb_cache); |
65 | lkb: | |
66 | kmem_cache_destroy(mhandle_cache); | |
3af2326c AA |
67 | mhandle: |
68 | kmem_cache_destroy(writequeue_cache); | |
6c547f26 AA |
69 | out: |
70 | return -ENOMEM; | |
e7fd4179 DT |
71 | } |
72 | ||
73 | void dlm_memory_exit(void) | |
74 | { | |
3af2326c | 75 | kmem_cache_destroy(writequeue_cache); |
6c547f26 | 76 | kmem_cache_destroy(mhandle_cache); |
e4dc81ed | 77 | kmem_cache_destroy(msg_cache); |
f31a8969 WY |
78 | kmem_cache_destroy(lkb_cache); |
79 | kmem_cache_destroy(rsb_cache); | |
61bed0ba | 80 | kmem_cache_destroy(cb_cache); |
e7fd4179 DT |
81 | } |
82 | ||
52bda2b5 | 83 | char *dlm_allocate_lvb(struct dlm_ls *ls) |
e7fd4179 DT |
84 | { |
85 | char *p; | |
86 | ||
573c24c4 | 87 | p = kzalloc(ls->ls_lvblen, GFP_NOFS); |
e7fd4179 DT |
88 | return p; |
89 | } | |
90 | ||
52bda2b5 | 91 | void dlm_free_lvb(char *p) |
e7fd4179 DT |
92 | { |
93 | kfree(p); | |
94 | } | |
95 | ||
3881ac04 | 96 | struct dlm_rsb *dlm_allocate_rsb(struct dlm_ls *ls) |
e7fd4179 DT |
97 | { |
98 | struct dlm_rsb *r; | |
99 | ||
3881ac04 | 100 | r = kmem_cache_zalloc(rsb_cache, GFP_NOFS); |
e7fd4179 DT |
101 | return r; |
102 | } | |
103 | ||
52bda2b5 | 104 | void dlm_free_rsb(struct dlm_rsb *r) |
e7fd4179 DT |
105 | { |
106 | if (r->res_lvbptr) | |
52bda2b5 | 107 | dlm_free_lvb(r->res_lvbptr); |
3881ac04 | 108 | kmem_cache_free(rsb_cache, r); |
e7fd4179 DT |
109 | } |
110 | ||
52bda2b5 | 111 | struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls) |
e7fd4179 DT |
112 | { |
113 | struct dlm_lkb *lkb; | |
114 | ||
573c24c4 | 115 | lkb = kmem_cache_zalloc(lkb_cache, GFP_NOFS); |
e7fd4179 DT |
116 | return lkb; |
117 | } | |
118 | ||
52bda2b5 | 119 | void dlm_free_lkb(struct dlm_lkb *lkb) |
e7fd4179 | 120 | { |
8a39dcd9 | 121 | if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) { |
597d0cae | 122 | struct dlm_user_args *ua; |
d292c0cc | 123 | ua = lkb->lkb_ua; |
597d0cae | 124 | if (ua) { |
f31a8969 | 125 | kfree(ua->lksb.sb_lvbptr); |
597d0cae DT |
126 | kfree(ua); |
127 | } | |
128 | } | |
61bed0ba AA |
129 | |
130 | /* drop references if they are set */ | |
131 | dlm_callback_set_last_ptr(&lkb->lkb_last_cast, NULL); | |
132 | dlm_callback_set_last_ptr(&lkb->lkb_last_cb, NULL); | |
133 | ||
e7fd4179 DT |
134 | kmem_cache_free(lkb_cache, lkb); |
135 | } | |
136 | ||
e1711fe3 | 137 | struct dlm_mhandle *dlm_allocate_mhandle(gfp_t allocation) |
6c547f26 | 138 | { |
e1711fe3 | 139 | return kmem_cache_alloc(mhandle_cache, allocation); |
6c547f26 AA |
140 | } |
141 | ||
142 | void dlm_free_mhandle(struct dlm_mhandle *mhandle) | |
143 | { | |
144 | kmem_cache_free(mhandle_cache, mhandle); | |
145 | } | |
3af2326c AA |
146 | |
147 | struct writequeue_entry *dlm_allocate_writequeue(void) | |
148 | { | |
149 | return kmem_cache_alloc(writequeue_cache, GFP_ATOMIC); | |
150 | } | |
151 | ||
152 | void dlm_free_writequeue(struct writequeue_entry *writequeue) | |
153 | { | |
154 | kmem_cache_free(writequeue_cache, writequeue); | |
155 | } | |
e4dc81ed AA |
156 | |
157 | struct dlm_msg *dlm_allocate_msg(gfp_t allocation) | |
158 | { | |
159 | return kmem_cache_alloc(msg_cache, allocation); | |
160 | } | |
161 | ||
162 | void dlm_free_msg(struct dlm_msg *msg) | |
163 | { | |
164 | kmem_cache_free(msg_cache, msg); | |
165 | } | |
61bed0ba AA |
166 | |
167 | struct dlm_callback *dlm_allocate_cb(void) | |
168 | { | |
169 | return kmem_cache_alloc(cb_cache, GFP_ATOMIC); | |
170 | } | |
171 | ||
172 | void dlm_free_cb(struct dlm_callback *cb) | |
173 | { | |
174 | kmem_cache_free(cb_cache, cb); | |
175 | } |