fs: dlm: memory cache for writequeue_entry
This patch introduces a kmem cache for writequeue entry. A writequeue entry get quite a lot allocated if dlm transmit messages. Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
6c547f2640
commit
3af2326ca0
@ -58,6 +58,7 @@
|
||||
#include "dlm_internal.h"
|
||||
#include "lowcomms.h"
|
||||
#include "midcomms.h"
|
||||
#include "memory.h"
|
||||
#include "config.h"
|
||||
|
||||
#define NEEDED_RMEM (4*1024*1024)
|
||||
@ -190,6 +191,19 @@ static const struct dlm_proto_ops *dlm_proto_ops;
|
||||
static void process_recv_sockets(struct work_struct *work);
|
||||
static void process_send_sockets(struct work_struct *work);
|
||||
|
||||
static void writequeue_entry_ctor(void *data)
|
||||
{
|
||||
struct writequeue_entry *entry = data;
|
||||
|
||||
INIT_LIST_HEAD(&entry->msgs);
|
||||
}
|
||||
|
||||
struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void)
|
||||
{
|
||||
return kmem_cache_create("dlm_writequeue", sizeof(struct writequeue_entry),
|
||||
0, 0, writequeue_entry_ctor);
|
||||
}
|
||||
|
||||
/* need to held writequeue_lock */
|
||||
static struct writequeue_entry *con_next_wq(struct connection *con)
|
||||
{
|
||||
@ -728,7 +742,7 @@ static void dlm_page_release(struct kref *kref)
|
||||
ref);
|
||||
|
||||
__free_page(e->page);
|
||||
kfree(e);
|
||||
dlm_free_writequeue(e);
|
||||
}
|
||||
|
||||
static void dlm_msg_release(struct kref *kref)
|
||||
@ -1177,21 +1191,23 @@ static struct writequeue_entry *new_writequeue_entry(struct connection *con)
|
||||
{
|
||||
struct writequeue_entry *entry;
|
||||
|
||||
entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
|
||||
entry = dlm_allocate_writequeue();
|
||||
if (!entry)
|
||||
return NULL;
|
||||
|
||||
entry->page = alloc_page(GFP_ATOMIC | __GFP_ZERO);
|
||||
if (!entry->page) {
|
||||
kfree(entry);
|
||||
dlm_free_writequeue(entry);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
entry->offset = 0;
|
||||
entry->len = 0;
|
||||
entry->end = 0;
|
||||
entry->dirty = false;
|
||||
entry->con = con;
|
||||
entry->users = 1;
|
||||
kref_init(&entry->ref);
|
||||
INIT_LIST_HEAD(&entry->msgs);
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ int dlm_lowcomms_connect_node(int nodeid);
|
||||
int dlm_lowcomms_nodes_set_mark(int nodeid, unsigned int mark);
|
||||
int dlm_lowcomms_addr(int nodeid, struct sockaddr_storage *addr, int len);
|
||||
void dlm_midcomms_receive_done(int nodeid);
|
||||
struct kmem_cache *dlm_lowcomms_writequeue_cache_create(void);
|
||||
|
||||
#endif /* __LOWCOMMS_DOT_H__ */
|
||||
|
||||
|
@ -11,9 +11,11 @@
|
||||
|
||||
#include "dlm_internal.h"
|
||||
#include "midcomms.h"
|
||||
#include "lowcomms.h"
|
||||
#include "config.h"
|
||||
#include "memory.h"
|
||||
|
||||
static struct kmem_cache *writequeue_cache;
|
||||
static struct kmem_cache *mhandle_cache;
|
||||
static struct kmem_cache *lkb_cache;
|
||||
static struct kmem_cache *rsb_cache;
|
||||
@ -21,9 +23,13 @@ static struct kmem_cache *rsb_cache;
|
||||
|
||||
int __init dlm_memory_init(void)
|
||||
{
|
||||
writequeue_cache = dlm_lowcomms_writequeue_cache_create();
|
||||
if (!writequeue_cache)
|
||||
goto out;
|
||||
|
||||
mhandle_cache = dlm_midcomms_cache_create();
|
||||
if (!mhandle_cache)
|
||||
goto out;
|
||||
goto mhandle;
|
||||
|
||||
lkb_cache = kmem_cache_create("dlm_lkb", sizeof(struct dlm_lkb),
|
||||
__alignof__(struct dlm_lkb), 0, NULL);
|
||||
@ -41,12 +47,15 @@ rsb:
|
||||
kmem_cache_destroy(lkb_cache);
|
||||
lkb:
|
||||
kmem_cache_destroy(mhandle_cache);
|
||||
mhandle:
|
||||
kmem_cache_destroy(writequeue_cache);
|
||||
out:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void dlm_memory_exit(void)
|
||||
{
|
||||
kmem_cache_destroy(writequeue_cache);
|
||||
kmem_cache_destroy(mhandle_cache);
|
||||
kmem_cache_destroy(lkb_cache);
|
||||
kmem_cache_destroy(rsb_cache);
|
||||
@ -110,3 +119,13 @@ void dlm_free_mhandle(struct dlm_mhandle *mhandle)
|
||||
{
|
||||
kmem_cache_free(mhandle_cache, mhandle);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -22,6 +22,8 @@ char *dlm_allocate_lvb(struct dlm_ls *ls);
|
||||
void dlm_free_lvb(char *l);
|
||||
struct dlm_mhandle *dlm_allocate_mhandle(void);
|
||||
void dlm_free_mhandle(struct dlm_mhandle *mhandle);
|
||||
struct writequeue_entry *dlm_allocate_writequeue(void);
|
||||
void dlm_free_writequeue(struct writequeue_entry *writequeue);
|
||||
|
||||
#endif /* __MEMORY_DOT_H__ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user