memory.c (3182B)
1// SPDX-License-Identifier: GPL-2.0-only 2/****************************************************************************** 3******************************************************************************* 4** 5** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 6** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. 7** 8** 9******************************************************************************* 10******************************************************************************/ 11 12#include "dlm_internal.h" 13#include "midcomms.h" 14#include "lowcomms.h" 15#include "config.h" 16#include "memory.h" 17 18static struct kmem_cache *writequeue_cache; 19static struct kmem_cache *mhandle_cache; 20static struct kmem_cache *msg_cache; 21static struct kmem_cache *lkb_cache; 22static struct kmem_cache *rsb_cache; 23 24 25int __init dlm_memory_init(void) 26{ 27 writequeue_cache = dlm_lowcomms_writequeue_cache_create(); 28 if (!writequeue_cache) 29 goto out; 30 31 mhandle_cache = dlm_midcomms_cache_create(); 32 if (!mhandle_cache) 33 goto mhandle; 34 35 lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb), 36 __alignof__(struct dlm_lkb), 0, NULL); 37 if (!lkb_cache) 38 goto lkb; 39 40 msg_cache = dlm_lowcomms_msg_cache_create(); 41 if (!msg_cache) 42 goto msg; 43 44 rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb), 45 __alignof__(struct dlm_rsb), 0, NULL); 46 if (!rsb_cache) 47 goto rsb; 48 49 return 0; 50 51rsb: 52 kmem_cache_destroy(msg_cache); 53msg: 54 kmem_cache_destroy(lkb_cache); 55lkb: 56 kmem_cache_destroy(mhandle_cache); 57mhandle: 58 kmem_cache_destroy(writequeue_cache); 59out: 60 return -ENOMEM; 61} 62 63void dlm_memory_exit(void) 64{ 65 kmem_cache_destroy(writequeue_cache); 66 kmem_cache_destroy(mhandle_cache); 67 kmem_cache_destroy(msg_cache); 68 kmem_cache_destroy(lkb_cache); 69 kmem_cache_destroy(rsb_cache); 70} 71 72char *dlm_allocate_lvb(struct dlm_ls *ls) 73{ 74 char *p; 75 76 p = kzalloc(ls->ls_lvblen, GFP_NOFS); 77 return p; 78} 79 80void dlm_free_lvb(char *p) 81{ 82 kfree(p); 83} 84 85struct dlm_rsb *dlm_allocate_rsb(struct dlm_ls *ls) 86{ 87 struct dlm_rsb *r; 88 89 r = kmem_cache_zalloc(rsb_cache, GFP_NOFS); 90 return r; 91} 92 93void dlm_free_rsb(struct dlm_rsb *r) 94{ 95 if (r->res_lvbptr) 96 dlm_free_lvb(r->res_lvbptr); 97 kmem_cache_free(rsb_cache, r); 98} 99 100struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls) 101{ 102 struct dlm_lkb *lkb; 103 104 lkb = kmem_cache_zalloc(lkb_cache, GFP_NOFS); 105 return lkb; 106} 107 108void dlm_free_lkb(struct dlm_lkb *lkb) 109{ 110 if (lkb->lkb_flags & DLM_IFL_USER) { 111 struct dlm_user_args *ua; 112 ua = lkb->lkb_ua; 113 if (ua) { 114 kfree(ua->lksb.sb_lvbptr); 115 kfree(ua); 116 } 117 } 118 kmem_cache_free(lkb_cache, lkb); 119} 120 121struct dlm_mhandle *dlm_allocate_mhandle(void) 122{ 123 return kmem_cache_alloc(mhandle_cache, GFP_NOFS); 124} 125 126void dlm_free_mhandle(struct dlm_mhandle *mhandle) 127{ 128 kmem_cache_free(mhandle_cache, mhandle); 129} 130 131struct writequeue_entry *dlm_allocate_writequeue(void) 132{ 133 return kmem_cache_alloc(writequeue_cache, GFP_ATOMIC); 134} 135 136void dlm_free_writequeue(struct writequeue_entry *writequeue) 137{ 138 kmem_cache_free(writequeue_cache, writequeue); 139} 140 141struct dlm_msg *dlm_allocate_msg(gfp_t allocation) 142{ 143 return kmem_cache_alloc(msg_cache, allocation); 144} 145 146void dlm_free_msg(struct dlm_msg *msg) 147{ 148 kmem_cache_free(msg_cache, msg); 149}