Thomas Gleixner | 2522fe4 | 2019-05-28 09:57:20 -0700 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0-only |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 2 | /****************************************************************************** |
| 3 | ******************************************************************************* |
| 4 | ** |
| 5 | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 6 | ** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 7 | ** |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 8 | ** |
| 9 | ******************************************************************************* |
| 10 | ******************************************************************************/ |
| 11 | |
| 12 | #include "dlm_internal.h" |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 13 | #include "midcomms.h" |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 14 | #include "lowcomms.h" |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 15 | #include "config.h" |
| 16 | #include "memory.h" |
| 17 | |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 18 | static struct kmem_cache *writequeue_cache; |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 19 | static struct kmem_cache *mhandle_cache; |
Alexander Aring | e4dc81e | 2021-11-30 14:47:20 -0500 | [diff] [blame] | 20 | static struct kmem_cache *msg_cache; |
Christoph Lameter | e18b890 | 2006-12-06 20:33:20 -0800 | [diff] [blame] | 21 | static struct kmem_cache *lkb_cache; |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 22 | static struct kmem_cache *rsb_cache; |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 23 | |
| 24 | |
Denis Cheng | 3072717 | 2008-02-02 01:53:46 +0800 | [diff] [blame] | 25 | int __init dlm_memory_init(void) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 26 | { |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 27 | writequeue_cache = dlm_lowcomms_writequeue_cache_create(); |
| 28 | if (!writequeue_cache) |
| 29 | goto out; |
| 30 | |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 31 | mhandle_cache = dlm_midcomms_cache_create(); |
| 32 | if (!mhandle_cache) |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 33 | goto mhandle; |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 34 | |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 35 | lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb), |
Paul Mundt | 20c2df8 | 2007-07-20 10:11:58 +0900 | [diff] [blame] | 36 | __alignof__(struct dlm_lkb), 0, NULL); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 37 | if (!lkb_cache) |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 38 | goto lkb; |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 39 | |
Alexander Aring | e4dc81e | 2021-11-30 14:47:20 -0500 | [diff] [blame] | 40 | msg_cache = dlm_lowcomms_msg_cache_create(); |
| 41 | if (!msg_cache) |
| 42 | goto msg; |
| 43 | |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 44 | rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb), |
| 45 | __alignof__(struct dlm_rsb), 0, NULL); |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 46 | if (!rsb_cache) |
| 47 | goto rsb; |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 48 | |
Dan Carpenter | 75af271e | 2012-05-15 11:58:12 +0300 | [diff] [blame] | 49 | return 0; |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 50 | |
| 51 | rsb: |
Alexander Aring | e4dc81e | 2021-11-30 14:47:20 -0500 | [diff] [blame] | 52 | kmem_cache_destroy(msg_cache); |
| 53 | msg: |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 54 | kmem_cache_destroy(lkb_cache); |
| 55 | lkb: |
| 56 | kmem_cache_destroy(mhandle_cache); |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 57 | mhandle: |
| 58 | kmem_cache_destroy(writequeue_cache); |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 59 | out: |
| 60 | return -ENOMEM; |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | void dlm_memory_exit(void) |
| 64 | { |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 65 | kmem_cache_destroy(writequeue_cache); |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 66 | kmem_cache_destroy(mhandle_cache); |
Alexander Aring | e4dc81e | 2021-11-30 14:47:20 -0500 | [diff] [blame] | 67 | kmem_cache_destroy(msg_cache); |
Wen Yang | f31a896 | 2018-11-28 15:25:00 +0800 | [diff] [blame] | 68 | kmem_cache_destroy(lkb_cache); |
| 69 | kmem_cache_destroy(rsb_cache); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 70 | } |
| 71 | |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 72 | char *dlm_allocate_lvb(struct dlm_ls *ls) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 73 | { |
| 74 | char *p; |
| 75 | |
David Teigland | 573c24c | 2009-11-30 16:34:43 -0600 | [diff] [blame] | 76 | p = kzalloc(ls->ls_lvblen, GFP_NOFS); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 77 | return p; |
| 78 | } |
| 79 | |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 80 | void dlm_free_lvb(char *p) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 81 | { |
| 82 | kfree(p); |
| 83 | } |
| 84 | |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 85 | struct dlm_rsb *dlm_allocate_rsb(struct dlm_ls *ls) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 86 | { |
| 87 | struct dlm_rsb *r; |
| 88 | |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 89 | r = kmem_cache_zalloc(rsb_cache, GFP_NOFS); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 90 | return r; |
| 91 | } |
| 92 | |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 93 | void dlm_free_rsb(struct dlm_rsb *r) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 94 | { |
| 95 | if (r->res_lvbptr) |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 96 | dlm_free_lvb(r->res_lvbptr); |
David Teigland | 3881ac0 | 2011-07-07 14:05:03 -0500 | [diff] [blame] | 97 | kmem_cache_free(rsb_cache, r); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 98 | } |
| 99 | |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 100 | struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 101 | { |
| 102 | struct dlm_lkb *lkb; |
| 103 | |
David Teigland | 573c24c | 2009-11-30 16:34:43 -0600 | [diff] [blame] | 104 | lkb = kmem_cache_zalloc(lkb_cache, GFP_NOFS); |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 105 | return lkb; |
| 106 | } |
| 107 | |
David Teigland | 52bda2b | 2007-11-07 09:06:49 -0600 | [diff] [blame] | 108 | void dlm_free_lkb(struct dlm_lkb *lkb) |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 109 | { |
David Teigland | 597d0ca | 2006-07-12 16:44:04 -0500 | [diff] [blame] | 110 | if (lkb->lkb_flags & DLM_IFL_USER) { |
| 111 | struct dlm_user_args *ua; |
David Teigland | d292c0c | 2008-02-06 23:27:04 -0600 | [diff] [blame] | 112 | ua = lkb->lkb_ua; |
David Teigland | 597d0ca | 2006-07-12 16:44:04 -0500 | [diff] [blame] | 113 | if (ua) { |
Wen Yang | f31a896 | 2018-11-28 15:25:00 +0800 | [diff] [blame] | 114 | kfree(ua->lksb.sb_lvbptr); |
David Teigland | 597d0ca | 2006-07-12 16:44:04 -0500 | [diff] [blame] | 115 | kfree(ua); |
| 116 | } |
| 117 | } |
David Teigland | e7fd417 | 2006-01-18 09:30:29 +0000 | [diff] [blame] | 118 | kmem_cache_free(lkb_cache, lkb); |
| 119 | } |
| 120 | |
Alexander Aring | 6c547f2 | 2021-11-30 14:47:18 -0500 | [diff] [blame] | 121 | struct dlm_mhandle *dlm_allocate_mhandle(void) |
| 122 | { |
| 123 | return kmem_cache_alloc(mhandle_cache, GFP_NOFS); |
| 124 | } |
| 125 | |
| 126 | void dlm_free_mhandle(struct dlm_mhandle *mhandle) |
| 127 | { |
| 128 | kmem_cache_free(mhandle_cache, mhandle); |
| 129 | } |
Alexander Aring | 3af2326 | 2021-11-30 14:47:19 -0500 | [diff] [blame] | 130 | |
| 131 | struct writequeue_entry *dlm_allocate_writequeue(void) |
| 132 | { |
| 133 | return kmem_cache_alloc(writequeue_cache, GFP_ATOMIC); |
| 134 | } |
| 135 | |
| 136 | void dlm_free_writequeue(struct writequeue_entry *writequeue) |
| 137 | { |
| 138 | kmem_cache_free(writequeue_cache, writequeue); |
| 139 | } |
Alexander Aring | e4dc81e | 2021-11-30 14:47:20 -0500 | [diff] [blame] | 140 | |
| 141 | struct dlm_msg *dlm_allocate_msg(gfp_t allocation) |
| 142 | { |
| 143 | return kmem_cache_alloc(msg_cache, allocation); |
| 144 | } |
| 145 | |
| 146 | void dlm_free_msg(struct dlm_msg *msg) |
| 147 | { |
| 148 | kmem_cache_free(msg_cache, msg); |
| 149 | } |