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