mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 10:40:53 +07:00
Orangefs: clean up slab allocation.
A couple of caches were no longer needed: - iov_iter improvements to orangefs_devreq_write_iter eliminated the need for the dev_req_cache. - removal (months ago) of the old AIO code eliminated the need for the kiocb_cache. Also, deobfuscation of use of GFP_KERNEL when calling kmem_cache_(z)alloc for remaining caches. Signed-off-by: Mike Marshall <hubcap@omnibond.com>
This commit is contained in:
parent
5090c9670d
commit
2d4cae0d17
@ -16,12 +16,6 @@ static DEFINE_SPINLOCK(next_tag_value_lock);
|
|||||||
/* a cache for orangefs upcall/downcall operations */
|
/* a cache for orangefs upcall/downcall operations */
|
||||||
static struct kmem_cache *op_cache;
|
static struct kmem_cache *op_cache;
|
||||||
|
|
||||||
/* a cache for device (/dev/pvfs2-req) communication */
|
|
||||||
static struct kmem_cache *dev_req_cache;
|
|
||||||
|
|
||||||
/* a cache for orangefs_kiocb objects (i.e orangefs iocb structures ) */
|
|
||||||
static struct kmem_cache *orangefs_kiocb_cache;
|
|
||||||
|
|
||||||
int op_cache_initialize(void)
|
int op_cache_initialize(void)
|
||||||
{
|
{
|
||||||
op_cache = kmem_cache_create("orangefs_op_cache",
|
op_cache = kmem_cache_create("orangefs_op_cache",
|
||||||
@ -111,7 +105,7 @@ struct orangefs_kernel_op_s *op_alloc(__s32 type)
|
|||||||
{
|
{
|
||||||
struct orangefs_kernel_op_s *new_op = NULL;
|
struct orangefs_kernel_op_s *new_op = NULL;
|
||||||
|
|
||||||
new_op = kmem_cache_zalloc(op_cache, ORANGEFS_CACHE_ALLOC_FLAGS);
|
new_op = kmem_cache_zalloc(op_cache, GFP_KERNEL);
|
||||||
if (new_op) {
|
if (new_op) {
|
||||||
INIT_LIST_HEAD(&new_op->list);
|
INIT_LIST_HEAD(&new_op->list);
|
||||||
spin_lock_init(&new_op->lock);
|
spin_lock_init(&new_op->lock);
|
||||||
@ -148,7 +142,7 @@ struct orangefs_kernel_op_s *op_alloc(__s32 type)
|
|||||||
new_op->upcall.gid = from_kgid(current_user_ns(),
|
new_op->upcall.gid = from_kgid(current_user_ns(),
|
||||||
current_fsgid());
|
current_fsgid());
|
||||||
} else {
|
} else {
|
||||||
gossip_err("op_alloc: kmem_cache_alloc failed!\n");
|
gossip_err("op_alloc: kmem_cache_zalloc failed!\n");
|
||||||
}
|
}
|
||||||
return new_op;
|
return new_op;
|
||||||
}
|
}
|
||||||
@ -165,85 +159,3 @@ void __op_release(struct orangefs_kernel_op_s *orangefs_op)
|
|||||||
gossip_err("NULL pointer in op_release\n");
|
gossip_err("NULL pointer in op_release\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int dev_req_cache_initialize(void)
|
|
||||||
{
|
|
||||||
dev_req_cache = kmem_cache_create("orangefs_devreqcache",
|
|
||||||
MAX_DEV_REQ_DOWNSIZE,
|
|
||||||
0,
|
|
||||||
ORANGEFS_CACHE_CREATE_FLAGS,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (!dev_req_cache) {
|
|
||||||
gossip_err("Cannot create orangefs_dev_req_cache\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dev_req_cache_finalize(void)
|
|
||||||
{
|
|
||||||
kmem_cache_destroy(dev_req_cache);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *dev_req_alloc(void)
|
|
||||||
{
|
|
||||||
void *buffer;
|
|
||||||
|
|
||||||
buffer = kmem_cache_alloc(dev_req_cache, ORANGEFS_CACHE_ALLOC_FLAGS);
|
|
||||||
if (buffer == NULL)
|
|
||||||
gossip_err("Failed to allocate from dev_req_cache\n");
|
|
||||||
else
|
|
||||||
memset(buffer, 0, sizeof(MAX_DEV_REQ_DOWNSIZE));
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dev_req_release(void *buffer)
|
|
||||||
{
|
|
||||||
if (buffer)
|
|
||||||
kmem_cache_free(dev_req_cache, buffer);
|
|
||||||
else
|
|
||||||
gossip_err("NULL pointer passed to dev_req_release\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int kiocb_cache_initialize(void)
|
|
||||||
{
|
|
||||||
orangefs_kiocb_cache = kmem_cache_create("orangefs_kiocbcache",
|
|
||||||
sizeof(struct orangefs_kiocb_s),
|
|
||||||
0,
|
|
||||||
ORANGEFS_CACHE_CREATE_FLAGS,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (!orangefs_kiocb_cache) {
|
|
||||||
gossip_err("Cannot create orangefs_kiocb_cache!\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int kiocb_cache_finalize(void)
|
|
||||||
{
|
|
||||||
kmem_cache_destroy(orangefs_kiocb_cache);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct orangefs_kiocb_s *kiocb_alloc(void)
|
|
||||||
{
|
|
||||||
struct orangefs_kiocb_s *x = NULL;
|
|
||||||
|
|
||||||
x = kmem_cache_alloc(orangefs_kiocb_cache, ORANGEFS_CACHE_ALLOC_FLAGS);
|
|
||||||
if (x == NULL)
|
|
||||||
gossip_err("kiocb_alloc: kmem_cache_alloc failed!\n");
|
|
||||||
else
|
|
||||||
memset(x, 0, sizeof(struct orangefs_kiocb_s));
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
void kiocb_release(struct orangefs_kiocb_s *x)
|
|
||||||
{
|
|
||||||
if (x)
|
|
||||||
kmem_cache_free(orangefs_kiocb_cache, x);
|
|
||||||
else
|
|
||||||
gossip_err("kiocb_release: kmem_cache_free NULL pointer!\n");
|
|
||||||
}
|
|
||||||
|
@ -128,7 +128,6 @@ struct client_debug_mask {
|
|||||||
#define ORANGEFS_CACHE_CREATE_FLAGS 0
|
#define ORANGEFS_CACHE_CREATE_FLAGS 0
|
||||||
#endif /* ((defined ORANGEFS_KERNEL_DEBUG) && (defined CONFIG_DEBUG_SLAB)) */
|
#endif /* ((defined ORANGEFS_KERNEL_DEBUG) && (defined CONFIG_DEBUG_SLAB)) */
|
||||||
|
|
||||||
#define ORANGEFS_CACHE_ALLOC_FLAGS (GFP_KERNEL)
|
|
||||||
#define ORANGEFS_GFP_FLAGS (GFP_KERNEL)
|
#define ORANGEFS_GFP_FLAGS (GFP_KERNEL)
|
||||||
#define ORANGEFS_BUFMAP_GFP_FLAGS (GFP_KERNEL)
|
#define ORANGEFS_BUFMAP_GFP_FLAGS (GFP_KERNEL)
|
||||||
|
|
||||||
@ -207,9 +206,6 @@ struct orangefs_kernel_op_s {
|
|||||||
|
|
||||||
/* VFS aio fields */
|
/* VFS aio fields */
|
||||||
|
|
||||||
/* used by the async I/O code to stash the orangefs_kiocb_s structure */
|
|
||||||
void *priv;
|
|
||||||
|
|
||||||
int attempts;
|
int attempts;
|
||||||
|
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
@ -217,6 +213,7 @@ struct orangefs_kernel_op_s {
|
|||||||
|
|
||||||
#define set_op_state_waiting(op) ((op)->op_state = OP_VFS_STATE_WAITING)
|
#define set_op_state_waiting(op) ((op)->op_state = OP_VFS_STATE_WAITING)
|
||||||
#define set_op_state_inprogress(op) ((op)->op_state = OP_VFS_STATE_INPROGR)
|
#define set_op_state_inprogress(op) ((op)->op_state = OP_VFS_STATE_INPROGR)
|
||||||
|
#define set_op_state_given_up(op) ((op)->op_state = OP_VFS_STATE_GIVEN_UP)
|
||||||
static inline void set_op_state_serviced(struct orangefs_kernel_op_s *op)
|
static inline void set_op_state_serviced(struct orangefs_kernel_op_s *op)
|
||||||
{
|
{
|
||||||
op->op_state = OP_VFS_STATE_SERVICED;
|
op->op_state = OP_VFS_STATE_SERVICED;
|
||||||
@ -453,19 +450,9 @@ int op_cache_finalize(void);
|
|||||||
struct orangefs_kernel_op_s *op_alloc(__s32 type);
|
struct orangefs_kernel_op_s *op_alloc(__s32 type);
|
||||||
char *get_opname_string(struct orangefs_kernel_op_s *new_op);
|
char *get_opname_string(struct orangefs_kernel_op_s *new_op);
|
||||||
|
|
||||||
int dev_req_cache_initialize(void);
|
|
||||||
int dev_req_cache_finalize(void);
|
|
||||||
void *dev_req_alloc(void);
|
|
||||||
void dev_req_release(void *);
|
|
||||||
|
|
||||||
int orangefs_inode_cache_initialize(void);
|
int orangefs_inode_cache_initialize(void);
|
||||||
int orangefs_inode_cache_finalize(void);
|
int orangefs_inode_cache_finalize(void);
|
||||||
|
|
||||||
int kiocb_cache_initialize(void);
|
|
||||||
int kiocb_cache_finalize(void);
|
|
||||||
struct orangefs_kiocb_s *kiocb_alloc(void);
|
|
||||||
void kiocb_release(struct orangefs_kiocb_s *ptr);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* defined in orangefs-mod.c
|
* defined in orangefs-mod.c
|
||||||
*/
|
*/
|
||||||
|
@ -140,24 +140,16 @@ static int __init orangefs_init(void)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
ret = dev_req_cache_initialize();
|
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup_op;
|
|
||||||
|
|
||||||
ret = orangefs_inode_cache_initialize();
|
ret = orangefs_inode_cache_initialize();
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto cleanup_req;
|
goto cleanup_op;
|
||||||
|
|
||||||
ret = kiocb_cache_initialize();
|
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup_inode;
|
|
||||||
|
|
||||||
/* Initialize the orangefsdev subsystem. */
|
/* Initialize the orangefsdev subsystem. */
|
||||||
ret = orangefs_dev_init();
|
ret = orangefs_dev_init();
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
gossip_err("orangefs: could not initialize device subsystem %d!\n",
|
gossip_err("orangefs: could not initialize device subsystem %d!\n",
|
||||||
ret);
|
ret);
|
||||||
goto cleanup_kiocb;
|
goto cleanup_inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
htable_ops_in_progress =
|
htable_ops_in_progress =
|
||||||
@ -214,15 +206,9 @@ static int __init orangefs_init(void)
|
|||||||
cleanup_device:
|
cleanup_device:
|
||||||
orangefs_dev_cleanup();
|
orangefs_dev_cleanup();
|
||||||
|
|
||||||
cleanup_kiocb:
|
|
||||||
kiocb_cache_finalize();
|
|
||||||
|
|
||||||
cleanup_inode:
|
cleanup_inode:
|
||||||
orangefs_inode_cache_finalize();
|
orangefs_inode_cache_finalize();
|
||||||
|
|
||||||
cleanup_req:
|
|
||||||
dev_req_cache_finalize();
|
|
||||||
|
|
||||||
cleanup_op:
|
cleanup_op:
|
||||||
op_cache_finalize();
|
op_cache_finalize();
|
||||||
|
|
||||||
@ -247,9 +233,7 @@ static void __exit orangefs_exit(void)
|
|||||||
for (i = 0; i < hash_table_size; i++)
|
for (i = 0; i < hash_table_size; i++)
|
||||||
BUG_ON(!list_empty(&htable_ops_in_progress[i]));
|
BUG_ON(!list_empty(&htable_ops_in_progress[i]));
|
||||||
|
|
||||||
kiocb_cache_finalize();
|
|
||||||
orangefs_inode_cache_finalize();
|
orangefs_inode_cache_finalize();
|
||||||
dev_req_cache_finalize();
|
|
||||||
op_cache_finalize();
|
op_cache_finalize();
|
||||||
|
|
||||||
kfree(htable_ops_in_progress);
|
kfree(htable_ops_in_progress);
|
||||||
|
@ -92,8 +92,7 @@ static struct inode *orangefs_alloc_inode(struct super_block *sb)
|
|||||||
{
|
{
|
||||||
struct orangefs_inode_s *orangefs_inode;
|
struct orangefs_inode_s *orangefs_inode;
|
||||||
|
|
||||||
orangefs_inode = kmem_cache_alloc(orangefs_inode_cache,
|
orangefs_inode = kmem_cache_alloc(orangefs_inode_cache, GFP_KERNEL);
|
||||||
ORANGEFS_CACHE_ALLOC_FLAGS);
|
|
||||||
if (orangefs_inode == NULL) {
|
if (orangefs_inode == NULL) {
|
||||||
gossip_err("Failed to allocate orangefs_inode\n");
|
gossip_err("Failed to allocate orangefs_inode\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user