Commit b4958c89 authored by Junil Lee's avatar Junil Lee Committed by Paul Moore

selinux: use kmem_cache for ebitmap

The allocated size for each ebitmap_node is 192byte by kzalloc().
Then, ebitmap_node size is fixed, so it's possible to use only 144byte
for each object by kmem_cache_zalloc().
It can reduce some dynamic allocation size.
Signed-off-by: default avatarJunil Lee <junil0814.lee@lge.com>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 8e71bf75
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#define BITS_PER_U64 (sizeof(u64) * 8) #define BITS_PER_U64 (sizeof(u64) * 8)
static struct kmem_cache *ebitmap_node_cachep;
int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2) int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2)
{ {
struct ebitmap_node *n1, *n2; struct ebitmap_node *n1, *n2;
...@@ -54,7 +56,7 @@ int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src) ...@@ -54,7 +56,7 @@ int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src)
n = src->node; n = src->node;
prev = NULL; prev = NULL;
while (n) { while (n) {
new = kzalloc(sizeof(*new), GFP_ATOMIC); new = kmem_cache_zalloc(ebitmap_node_cachep, GFP_ATOMIC);
if (!new) { if (!new) {
ebitmap_destroy(dst); ebitmap_destroy(dst);
return -ENOMEM; return -ENOMEM;
...@@ -162,7 +164,7 @@ int ebitmap_netlbl_import(struct ebitmap *ebmap, ...@@ -162,7 +164,7 @@ int ebitmap_netlbl_import(struct ebitmap *ebmap,
if (e_iter == NULL || if (e_iter == NULL ||
offset >= e_iter->startbit + EBITMAP_SIZE) { offset >= e_iter->startbit + EBITMAP_SIZE) {
e_prev = e_iter; e_prev = e_iter;
e_iter = kzalloc(sizeof(*e_iter), GFP_ATOMIC); e_iter = kmem_cache_zalloc(ebitmap_node_cachep, GFP_ATOMIC);
if (e_iter == NULL) if (e_iter == NULL)
goto netlbl_import_failure; goto netlbl_import_failure;
e_iter->startbit = offset - (offset % EBITMAP_SIZE); e_iter->startbit = offset - (offset % EBITMAP_SIZE);
...@@ -288,7 +290,7 @@ int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value) ...@@ -288,7 +290,7 @@ int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value)
prev->next = n->next; prev->next = n->next;
else else
e->node = n->next; e->node = n->next;
kfree(n); kmem_cache_free(ebitmap_node_cachep, n);
} }
return 0; return 0;
} }
...@@ -299,7 +301,7 @@ int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value) ...@@ -299,7 +301,7 @@ int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value)
if (!value) if (!value)
return 0; return 0;
new = kzalloc(sizeof(*new), GFP_ATOMIC); new = kmem_cache_zalloc(ebitmap_node_cachep, GFP_ATOMIC);
if (!new) if (!new)
return -ENOMEM; return -ENOMEM;
...@@ -332,7 +334,7 @@ void ebitmap_destroy(struct ebitmap *e) ...@@ -332,7 +334,7 @@ void ebitmap_destroy(struct ebitmap *e)
while (n) { while (n) {
temp = n; temp = n;
n = n->next; n = n->next;
kfree(temp); kmem_cache_free(ebitmap_node_cachep, temp);
} }
e->highbit = 0; e->highbit = 0;
...@@ -400,7 +402,7 @@ int ebitmap_read(struct ebitmap *e, void *fp) ...@@ -400,7 +402,7 @@ int ebitmap_read(struct ebitmap *e, void *fp)
if (!n || startbit >= n->startbit + EBITMAP_SIZE) { if (!n || startbit >= n->startbit + EBITMAP_SIZE) {
struct ebitmap_node *tmp; struct ebitmap_node *tmp;
tmp = kzalloc(sizeof(*tmp), GFP_KERNEL); tmp = kmem_cache_zalloc(ebitmap_node_cachep, GFP_KERNEL);
if (!tmp) { if (!tmp) {
printk(KERN_ERR printk(KERN_ERR
"SELinux: ebitmap: out of memory\n"); "SELinux: ebitmap: out of memory\n");
...@@ -519,3 +521,15 @@ int ebitmap_write(struct ebitmap *e, void *fp) ...@@ -519,3 +521,15 @@ int ebitmap_write(struct ebitmap *e, void *fp)
} }
return 0; return 0;
} }
void ebitmap_cache_init(void)
{
ebitmap_node_cachep = kmem_cache_create("ebitmap_node",
sizeof(struct ebitmap_node),
0, SLAB_PANIC, NULL);
}
void ebitmap_cache_destroy(void)
{
kmem_cache_destroy(ebitmap_node_cachep);
}
...@@ -130,6 +130,9 @@ void ebitmap_destroy(struct ebitmap *e); ...@@ -130,6 +130,9 @@ void ebitmap_destroy(struct ebitmap *e);
int ebitmap_read(struct ebitmap *e, void *fp); int ebitmap_read(struct ebitmap *e, void *fp);
int ebitmap_write(struct ebitmap *e, void *fp); int ebitmap_write(struct ebitmap *e, void *fp);
void ebitmap_cache_init(void);
void ebitmap_cache_destroy(void);
#ifdef CONFIG_NETLABEL #ifdef CONFIG_NETLABEL
int ebitmap_netlbl_export(struct ebitmap *ebmap, int ebitmap_netlbl_export(struct ebitmap *ebmap,
struct netlbl_lsm_catmap **catmap); struct netlbl_lsm_catmap **catmap);
......
...@@ -2054,9 +2054,11 @@ int security_load_policy(void *data, size_t len) ...@@ -2054,9 +2054,11 @@ int security_load_policy(void *data, size_t len)
if (!ss_initialized) { if (!ss_initialized) {
avtab_cache_init(); avtab_cache_init();
ebitmap_cache_init();
rc = policydb_read(&policydb, fp); rc = policydb_read(&policydb, fp);
if (rc) { if (rc) {
avtab_cache_destroy(); avtab_cache_destroy();
ebitmap_cache_destroy();
goto out; goto out;
} }
...@@ -2067,6 +2069,7 @@ int security_load_policy(void *data, size_t len) ...@@ -2067,6 +2069,7 @@ int security_load_policy(void *data, size_t len)
if (rc) { if (rc) {
policydb_destroy(&policydb); policydb_destroy(&policydb);
avtab_cache_destroy(); avtab_cache_destroy();
ebitmap_cache_destroy();
goto out; goto out;
} }
...@@ -2074,6 +2077,7 @@ int security_load_policy(void *data, size_t len) ...@@ -2074,6 +2077,7 @@ int security_load_policy(void *data, size_t len)
if (rc) { if (rc) {
policydb_destroy(&policydb); policydb_destroy(&policydb);
avtab_cache_destroy(); avtab_cache_destroy();
ebitmap_cache_destroy();
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment