diff options
Diffstat (limited to 'meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0043-Security-smack-replace-kzalloc-with-kmem_cache-for-i.patch')
-rw-r--r-- | meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0043-Security-smack-replace-kzalloc-with-kmem_cache-for-i.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0043-Security-smack-replace-kzalloc-with-kmem_cache-for-i.patch b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0043-Security-smack-replace-kzalloc-with-kmem_cache-for-i.patch new file mode 100644 index 0000000..1a5b545 --- /dev/null +++ b/meta-rcar-gen2/recipes-kernel/linux/linux-renesas/smack/0043-Security-smack-replace-kzalloc-with-kmem_cache-for-i.patch @@ -0,0 +1,79 @@ +From f85163c82300f68eb73002d1b0e1a92288ff41fe Mon Sep 17 00:00:00 2001 +From: Rohit <rohit.kr@samsung.com> +Date: Wed, 15 Oct 2014 17:40:41 +0530 +Subject: [PATCH 43/54] Security: smack: replace kzalloc with kmem_cache for + inode_smack + +The patch use kmem_cache to allocate/free inode_smack since they are +alloced in high volumes making it a perfect case for kmem_cache. + +As per analysis, 24 bytes of memory is wasted per allocation due +to internal fragmentation. With kmem_cache, this can be avoided. + +Accounting of memory allocation is below : + total slack net count-alloc/free caller +Before (with kzalloc) +1919872 719952 1919872 29998/0 new_inode_smack+0x14 + +After (with kmem_cache) +1201680 0 1201680 30042/0 new_inode_smack+0x18 + +>From above data, we found that 719952 bytes(~700 KB) of memory is +saved on allocation of 29998 smack inodes. + +Signed-off-by: Rohit <rohit.kr@samsung.com> +--- + security/smack/smack_lsm.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index 2f62a68..b3978ea 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -53,6 +53,7 @@ + #define SMK_SENDING 2 + + LIST_HEAD(smk_ipv6_port_list); ++static struct kmem_cache *smack_inode_cache; + + #ifdef CONFIG_SECURITY_SMACK_BRINGUP + static void smk_bu_mode(int mode, char *s) +@@ -240,7 +241,7 @@ struct inode_smack *new_inode_smack(struct smack_known *skp) + { + struct inode_smack *isp; + +- isp = kzalloc(sizeof(struct inode_smack), GFP_NOFS); ++ isp = kmem_cache_zalloc(smack_inode_cache, GFP_NOFS); + if (isp == NULL) + return NULL; + +@@ -767,7 +768,7 @@ static int smack_inode_alloc_security(struct inode *inode) + */ + static void smack_inode_free_security(struct inode *inode) + { +- kfree(inode->i_security); ++ kmem_cache_free(smack_inode_cache, inode->i_security); + inode->i_security = NULL; + } + +@@ -4266,10 +4267,16 @@ static __init int smack_init(void) + if (!security_module_enable(&smack_ops)) + return 0; + ++ smack_inode_cache = KMEM_CACHE(inode_smack, 0); ++ if (!smack_inode_cache) ++ return -ENOMEM; ++ + tsp = new_task_smack(&smack_known_floor, &smack_known_floor, + GFP_KERNEL); +- if (tsp == NULL) ++ if (tsp == NULL) { ++ kmem_cache_destroy(smack_inode_cache); + return -ENOMEM; ++ } + + printk(KERN_INFO "Smack: Initializing.\n"); + +-- +2.1.4 + |