brintos

brintos / linux-shallow public Read only

0
0
Text · 3.8 KiB · 5c35cc6 Raw
178 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/******************************************************************************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#include "ast.h"18 19static struct kmem_cache *writequeue_cache;20static struct kmem_cache *mhandle_cache;21static struct kmem_cache *msg_cache;22static struct kmem_cache *lkb_cache;23static struct kmem_cache *rsb_cache;24static struct kmem_cache *cb_cache;25 26 27int __init dlm_memory_init(void)28{29	writequeue_cache = dlm_lowcomms_writequeue_cache_create();30	if (!writequeue_cache)31		goto out;32 33	mhandle_cache = dlm_midcomms_cache_create();34	if (!mhandle_cache)35		goto mhandle;36 37	lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb),38				__alignof__(struct dlm_lkb), 0, NULL);39	if (!lkb_cache)40		goto lkb;41 42	msg_cache = dlm_lowcomms_msg_cache_create();43	if (!msg_cache)44		goto msg;45 46	rsb_cache = kmem_cache_create("dlm_rsb", sizeof(struct dlm_rsb),47				__alignof__(struct dlm_rsb), 0, NULL);48	if (!rsb_cache)49		goto rsb;50 51	cb_cache = kmem_cache_create("dlm_cb", sizeof(struct dlm_callback),52				     __alignof__(struct dlm_callback), 0,53				     NULL);54	if (!cb_cache)55		goto cb;56 57	return 0;58 59cb:60	kmem_cache_destroy(rsb_cache);61rsb:62	kmem_cache_destroy(msg_cache);63msg:64	kmem_cache_destroy(lkb_cache);65lkb:66	kmem_cache_destroy(mhandle_cache);67mhandle:68	kmem_cache_destroy(writequeue_cache);69out:70	return -ENOMEM;71}72 73void dlm_memory_exit(void)74{75	rcu_barrier();76 77	kmem_cache_destroy(writequeue_cache);78	kmem_cache_destroy(mhandle_cache);79	kmem_cache_destroy(msg_cache);80	kmem_cache_destroy(lkb_cache);81	kmem_cache_destroy(rsb_cache);82	kmem_cache_destroy(cb_cache);83}84 85char *dlm_allocate_lvb(struct dlm_ls *ls)86{87	return kzalloc(ls->ls_lvblen, GFP_ATOMIC);88}89 90void dlm_free_lvb(char *p)91{92	kfree(p);93}94 95struct dlm_rsb *dlm_allocate_rsb(void)96{97	return kmem_cache_zalloc(rsb_cache, GFP_ATOMIC);98}99 100static void __free_rsb_rcu(struct rcu_head *rcu)101{102	struct dlm_rsb *r = container_of(rcu, struct dlm_rsb, rcu);103	if (r->res_lvbptr)104		dlm_free_lvb(r->res_lvbptr);105	kmem_cache_free(rsb_cache, r);106}107 108void dlm_free_rsb(struct dlm_rsb *r)109{110	call_rcu(&r->rcu, __free_rsb_rcu);111}112 113struct dlm_lkb *dlm_allocate_lkb(void)114{115	return kmem_cache_zalloc(lkb_cache, GFP_ATOMIC);116}117 118static void __free_lkb_rcu(struct rcu_head *rcu)119{120	struct dlm_lkb *lkb = container_of(rcu, struct dlm_lkb, rcu);121 122	if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {123		struct dlm_user_args *ua;124		ua = lkb->lkb_ua;125		if (ua) {126			kfree(ua->lksb.sb_lvbptr);127			kfree(ua);128		}129	}130 131	kmem_cache_free(lkb_cache, lkb);132}133 134void dlm_free_lkb(struct dlm_lkb *lkb)135{136	call_rcu(&lkb->rcu, __free_lkb_rcu);137}138 139struct dlm_mhandle *dlm_allocate_mhandle(void)140{141	return kmem_cache_alloc(mhandle_cache, GFP_ATOMIC);142}143 144void dlm_free_mhandle(struct dlm_mhandle *mhandle)145{146	kmem_cache_free(mhandle_cache, mhandle);147}148 149struct writequeue_entry *dlm_allocate_writequeue(void)150{151	return kmem_cache_alloc(writequeue_cache, GFP_ATOMIC);152}153 154void dlm_free_writequeue(struct writequeue_entry *writequeue)155{156	kmem_cache_free(writequeue_cache, writequeue);157}158 159struct dlm_msg *dlm_allocate_msg(void)160{161	return kmem_cache_alloc(msg_cache, GFP_ATOMIC);162}163 164void dlm_free_msg(struct dlm_msg *msg)165{166	kmem_cache_free(msg_cache, msg);167}168 169struct dlm_callback *dlm_allocate_cb(void)170{171	return kmem_cache_alloc(cb_cache, GFP_ATOMIC);172}173 174void dlm_free_cb(struct dlm_callback *cb)175{176	kmem_cache_free(cb_cache, cb);177}178