]>
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 | { | |
89b01913 AA |
75 | rcu_barrier(); |
76 | ||
3af2326c | 77 | kmem_cache_destroy(writequeue_cache); |
6c547f26 | 78 | kmem_cache_destroy(mhandle_cache); |
e4dc81ed | 79 | kmem_cache_destroy(msg_cache); |
f31a8969 WY |
80 | kmem_cache_destroy(lkb_cache); |
81 | kmem_cache_destroy(rsb_cache); | |
61bed0ba | 82 | kmem_cache_destroy(cb_cache); |
e7fd4179 DT |
83 | } |
84 | ||
52bda2b5 | 85 | char *dlm_allocate_lvb(struct dlm_ls *ls) |
e7fd4179 | 86 | { |
11697885 | 87 | return kzalloc(ls->ls_lvblen, GFP_ATOMIC); |
e7fd4179 DT |
88 | } |
89 | ||
52bda2b5 | 90 | void dlm_free_lvb(char *p) |
e7fd4179 DT |
91 | { |
92 | kfree(p); | |
93 | } | |
94 | ||
11697885 | 95 | struct dlm_rsb *dlm_allocate_rsb(void) |
e7fd4179 | 96 | { |
11697885 | 97 | return kmem_cache_zalloc(rsb_cache, GFP_ATOMIC); |
e7fd4179 DT |
98 | } |
99 | ||
01fdeca1 | 100 | static void __free_rsb_rcu(struct rcu_head *rcu) |
e7fd4179 | 101 | { |
01fdeca1 | 102 | struct dlm_rsb *r = container_of(rcu, struct dlm_rsb, rcu); |
e7fd4179 | 103 | if (r->res_lvbptr) |
52bda2b5 | 104 | dlm_free_lvb(r->res_lvbptr); |
3881ac04 | 105 | kmem_cache_free(rsb_cache, r); |
e7fd4179 DT |
106 | } |
107 | ||
01fdeca1 AA |
108 | void dlm_free_rsb(struct dlm_rsb *r) |
109 | { | |
110 | call_rcu(&r->rcu, __free_rsb_rcu); | |
111 | } | |
112 | ||
11697885 | 113 | struct dlm_lkb *dlm_allocate_lkb(void) |
e7fd4179 | 114 | { |
11697885 | 115 | return kmem_cache_zalloc(lkb_cache, GFP_ATOMIC); |
e7fd4179 DT |
116 | } |
117 | ||
c846f732 | 118 | static void __free_lkb_rcu(struct rcu_head *rcu) |
e7fd4179 | 119 | { |
c846f732 AA |
120 | struct dlm_lkb *lkb = container_of(rcu, struct dlm_lkb, rcu); |
121 | ||
8a39dcd9 | 122 | if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) { |
597d0cae | 123 | struct dlm_user_args *ua; |
d292c0cc | 124 | ua = lkb->lkb_ua; |
597d0cae | 125 | if (ua) { |
f31a8969 | 126 | kfree(ua->lksb.sb_lvbptr); |
597d0cae DT |
127 | kfree(ua); |
128 | } | |
129 | } | |
61bed0ba | 130 | |
e7fd4179 DT |
131 | kmem_cache_free(lkb_cache, lkb); |
132 | } | |
133 | ||
c846f732 AA |
134 | void dlm_free_lkb(struct dlm_lkb *lkb) |
135 | { | |
136 | call_rcu(&lkb->rcu, __free_lkb_rcu); | |
137 | } | |
138 | ||
98808644 | 139 | struct dlm_mhandle *dlm_allocate_mhandle(void) |
6c547f26 | 140 | { |
98808644 | 141 | return kmem_cache_alloc(mhandle_cache, GFP_ATOMIC); |
6c547f26 AA |
142 | } |
143 | ||
144 | void dlm_free_mhandle(struct dlm_mhandle *mhandle) | |
145 | { | |
146 | kmem_cache_free(mhandle_cache, mhandle); | |
147 | } | |
3af2326c AA |
148 | |
149 | struct writequeue_entry *dlm_allocate_writequeue(void) | |
150 | { | |
151 | return kmem_cache_alloc(writequeue_cache, GFP_ATOMIC); | |
152 | } | |
153 | ||
154 | void dlm_free_writequeue(struct writequeue_entry *writequeue) | |
155 | { | |
156 | kmem_cache_free(writequeue_cache, writequeue); | |
157 | } | |
e4dc81ed | 158 | |
98808644 | 159 | struct dlm_msg *dlm_allocate_msg(void) |
e4dc81ed | 160 | { |
98808644 | 161 | return kmem_cache_alloc(msg_cache, GFP_ATOMIC); |
e4dc81ed AA |
162 | } |
163 | ||
164 | void dlm_free_msg(struct dlm_msg *msg) | |
165 | { | |
166 | kmem_cache_free(msg_cache, msg); | |
167 | } | |
61bed0ba AA |
168 | |
169 | struct dlm_callback *dlm_allocate_cb(void) | |
170 | { | |
171 | return kmem_cache_alloc(cb_cache, GFP_ATOMIC); | |
172 | } | |
173 | ||
174 | void dlm_free_cb(struct dlm_callback *cb) | |
175 | { | |
176 | kmem_cache_free(cb_cache, cb); | |
177 | } |