2019-05-28 09:57:20 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2006-01-18 09:30:29 +00:00
/******************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* * Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2007-11-07 09:06:49 -06:00
* * Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2006-01-18 09:30:29 +00:00
* *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "dlm_internal.h"
2021-11-30 14:47:18 -05:00
# include "midcomms.h"
2021-11-30 14:47:19 -05:00
# include "lowcomms.h"
2006-01-18 09:30:29 +00:00
# include "config.h"
# include "memory.h"
2022-10-27 16:45:21 -04:00
# include "ast.h"
2006-01-18 09:30:29 +00:00
2021-11-30 14:47:19 -05:00
static struct kmem_cache * writequeue_cache ;
2021-11-30 14:47:18 -05:00
static struct kmem_cache * mhandle_cache ;
2021-11-30 14:47:20 -05:00
static struct kmem_cache * msg_cache ;
2006-12-06 20:33:20 -08:00
static struct kmem_cache * lkb_cache ;
2011-07-07 14:05:03 -05:00
static struct kmem_cache * rsb_cache ;
2022-10-27 16:45:21 -04:00
static struct kmem_cache * cb_cache ;
2006-01-18 09:30:29 +00:00
2008-02-02 01:53:46 +08:00
int __init dlm_memory_init ( void )
2006-01-18 09:30:29 +00:00
{
2021-11-30 14:47:19 -05:00
writequeue_cache = dlm_lowcomms_writequeue_cache_create ( ) ;
if ( ! writequeue_cache )
goto out ;
2021-11-30 14:47:18 -05:00
mhandle_cache = dlm_midcomms_cache_create ( ) ;
if ( ! mhandle_cache )
2021-11-30 14:47:19 -05:00
goto mhandle ;
2021-11-30 14:47:18 -05:00
2006-01-18 09:30:29 +00:00
lkb_cache = kmem_cache_create ( " dlm_lkb " , sizeof ( struct dlm_lkb ) ,
2007-07-20 10:11:58 +09:00
__alignof__ ( struct dlm_lkb ) , 0 , NULL ) ;
2006-01-18 09:30:29 +00:00
if ( ! lkb_cache )
2021-11-30 14:47:18 -05:00
goto lkb ;
2011-07-07 14:05:03 -05:00
2021-11-30 14:47:20 -05:00
msg_cache = dlm_lowcomms_msg_cache_create ( ) ;
if ( ! msg_cache )
goto msg ;
2011-07-07 14:05:03 -05:00
rsb_cache = kmem_cache_create ( " dlm_rsb " , sizeof ( struct dlm_rsb ) ,
__alignof__ ( struct dlm_rsb ) , 0 , NULL ) ;
2021-11-30 14:47:18 -05:00
if ( ! rsb_cache )
goto rsb ;
2011-07-07 14:05:03 -05:00
2022-10-27 16:45:21 -04:00
cb_cache = kmem_cache_create ( " dlm_cb " , sizeof ( struct dlm_callback ) ,
__alignof__ ( struct dlm_callback ) , 0 ,
NULL ) ;
2023-01-03 19:37:49 +08:00
if ( ! cb_cache )
2022-10-27 16:45:21 -04:00
goto cb ;
2012-05-15 11:58:12 +03:00
return 0 ;
2021-11-30 14:47:18 -05:00
2022-10-27 16:45:21 -04:00
cb :
kmem_cache_destroy ( rsb_cache ) ;
2021-11-30 14:47:18 -05:00
rsb :
2021-11-30 14:47:20 -05:00
kmem_cache_destroy ( msg_cache ) ;
msg :
2021-11-30 14:47:18 -05:00
kmem_cache_destroy ( lkb_cache ) ;
lkb :
kmem_cache_destroy ( mhandle_cache ) ;
2021-11-30 14:47:19 -05:00
mhandle :
kmem_cache_destroy ( writequeue_cache ) ;
2021-11-30 14:47:18 -05:00
out :
return - ENOMEM ;
2006-01-18 09:30:29 +00:00
}
void dlm_memory_exit ( void )
{
2021-11-30 14:47:19 -05:00
kmem_cache_destroy ( writequeue_cache ) ;
2021-11-30 14:47:18 -05:00
kmem_cache_destroy ( mhandle_cache ) ;
2021-11-30 14:47:20 -05:00
kmem_cache_destroy ( msg_cache ) ;
2018-11-28 15:25:00 +08:00
kmem_cache_destroy ( lkb_cache ) ;
kmem_cache_destroy ( rsb_cache ) ;
2022-10-27 16:45:21 -04:00
kmem_cache_destroy ( cb_cache ) ;
2006-01-18 09:30:29 +00:00
}
2007-11-07 09:06:49 -06:00
char * dlm_allocate_lvb ( struct dlm_ls * ls )
2006-01-18 09:30:29 +00:00
{
char * p ;
2009-11-30 16:34:43 -06:00
p = kzalloc ( ls - > ls_lvblen , GFP_NOFS ) ;
2006-01-18 09:30:29 +00:00
return p ;
}
2007-11-07 09:06:49 -06:00
void dlm_free_lvb ( char * p )
2006-01-18 09:30:29 +00:00
{
kfree ( p ) ;
}
2011-07-07 14:05:03 -05:00
struct dlm_rsb * dlm_allocate_rsb ( struct dlm_ls * ls )
2006-01-18 09:30:29 +00:00
{
struct dlm_rsb * r ;
2011-07-07 14:05:03 -05:00
r = kmem_cache_zalloc ( rsb_cache , GFP_NOFS ) ;
2006-01-18 09:30:29 +00:00
return r ;
}
2007-11-07 09:06:49 -06:00
void dlm_free_rsb ( struct dlm_rsb * r )
2006-01-18 09:30:29 +00:00
{
if ( r - > res_lvbptr )
2007-11-07 09:06:49 -06:00
dlm_free_lvb ( r - > res_lvbptr ) ;
2011-07-07 14:05:03 -05:00
kmem_cache_free ( rsb_cache , r ) ;
2006-01-18 09:30:29 +00:00
}
2007-11-07 09:06:49 -06:00
struct dlm_lkb * dlm_allocate_lkb ( struct dlm_ls * ls )
2006-01-18 09:30:29 +00:00
{
struct dlm_lkb * lkb ;
2009-11-30 16:34:43 -06:00
lkb = kmem_cache_zalloc ( lkb_cache , GFP_NOFS ) ;
2006-01-18 09:30:29 +00:00
return lkb ;
}
2007-11-07 09:06:49 -06:00
void dlm_free_lkb ( struct dlm_lkb * lkb )
2006-01-18 09:30:29 +00:00
{
2023-03-06 15:48:15 -05:00
if ( test_bit ( DLM_DFL_USER_BIT , & lkb - > lkb_dflags ) ) {
2006-07-12 16:44:04 -05:00
struct dlm_user_args * ua ;
2008-02-06 23:27:04 -06:00
ua = lkb - > lkb_ua ;
2006-07-12 16:44:04 -05:00
if ( ua ) {
2018-11-28 15:25:00 +08:00
kfree ( ua - > lksb . sb_lvbptr ) ;
2006-07-12 16:44:04 -05:00
kfree ( ua ) ;
}
}
2022-10-27 16:45:21 -04:00
/* drop references if they are set */
dlm_callback_set_last_ptr ( & lkb - > lkb_last_cast , NULL ) ;
dlm_callback_set_last_ptr ( & lkb - > lkb_last_cb , NULL ) ;
2006-01-18 09:30:29 +00:00
kmem_cache_free ( lkb_cache , lkb ) ;
}
2022-10-27 16:45:22 -04:00
struct dlm_mhandle * dlm_allocate_mhandle ( gfp_t allocation )
2021-11-30 14:47:18 -05:00
{
2022-10-27 16:45:22 -04:00
return kmem_cache_alloc ( mhandle_cache , allocation ) ;
2021-11-30 14:47:18 -05:00
}
void dlm_free_mhandle ( struct dlm_mhandle * mhandle )
{
kmem_cache_free ( mhandle_cache , mhandle ) ;
}
2021-11-30 14:47:19 -05:00
struct writequeue_entry * dlm_allocate_writequeue ( void )
{
return kmem_cache_alloc ( writequeue_cache , GFP_ATOMIC ) ;
}
void dlm_free_writequeue ( struct writequeue_entry * writequeue )
{
kmem_cache_free ( writequeue_cache , writequeue ) ;
}
2021-11-30 14:47:20 -05:00
struct dlm_msg * dlm_allocate_msg ( gfp_t allocation )
{
return kmem_cache_alloc ( msg_cache , allocation ) ;
}
void dlm_free_msg ( struct dlm_msg * msg )
{
kmem_cache_free ( msg_cache , msg ) ;
}
2022-10-27 16:45:21 -04:00
struct dlm_callback * dlm_allocate_cb ( void )
{
return kmem_cache_alloc ( cb_cache , GFP_ATOMIC ) ;
}
void dlm_free_cb ( struct dlm_callback * cb )
{
kmem_cache_free ( cb_cache , cb ) ;
}