From: jooseong.lee Date: Wed, 25 Mar 2015 02:00:22 +0000 (+0900) Subject: security: smack: add kmem_cache for smack_master_list allocations X-Git-Tag: submit/tizen/20160422.055611~1^2~71 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6c04bd0bfa920697a17d64a3b0314e3fc9cf9597;p=sdk%2Femulator%2Femulator-kernel.git security: smack: add kmem_cache for smack_master_list allocations On ARM, sizeof(struct smack_master_list) == 12. Allocation by kmalloc() uses a 32-byte-long chunk to allocate 12 bytes. Just ask ksize(). It means that 63% of memory is simply wasted for padding bytes. The problem is fixed in this patch by using kmem_cache. The cache allocates struct smack_master_list using 16-byte-long chunks according to ksize(). This reduces amount of used memory by 50%. Change-Id: Ice10c7eb1099931a82200081110275c5717b12be Signed-off-by: jooseong.lee --- diff --git a/security/smack/smack.h b/security/smack/smack.h index 45aa224b91ae..7b912f552cac 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h @@ -223,6 +223,12 @@ struct smk_audit_info { struct smack_audit_data sad; #endif }; + +struct smack_master_list { + struct list_head list; + struct smack_rule *smk_rule; +}; + /* * These functions are in smack_lsm.c */ @@ -268,6 +274,7 @@ extern struct list_head smk_netlbladdr_list; /* Cache for fast and thrifty allocations */ extern struct kmem_cache *smack_rule_cache; +extern struct kmem_cache *smack_master_list_cache; extern struct security_operations smack_ops; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 523e106a274c..df3f6035c622 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4018,6 +4018,7 @@ static __init void init_smack_known_list(void) /* KMEM caches for fast and thrifty allocations */ struct kmem_cache *smack_rule_cache; +struct kmem_cache *smack_master_list_cache; /** * smack_init - initialize the smack system @@ -4036,9 +4037,16 @@ static __init int smack_init(void) if (!smack_rule_cache) return -ENOMEM; + smack_master_list_cache = KMEM_CACHE(smack_master_list, 0); + if (!smack_master_list_cache) { + kmem_cache_destroy(smack_rule_cache); + return -ENOMEM; + } + tsp = new_task_smack(&smack_known_floor, &smack_known_floor, GFP_KERNEL); if (tsp == NULL) { + kmem_cache_destroy(smack_master_list_cache); kmem_cache_destroy(smack_rule_cache); return -ENOMEM; } diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index e602a34bf7e1..39af4bf3f29a 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -122,11 +122,6 @@ LIST_HEAD(smk_netlbladdr_list); * Rule lists are maintained for each label. * This master list is just for reading /smack/load and /smack/load2. */ -struct smack_master_list { - struct list_head list; - struct smack_rule *smk_rule; -}; - LIST_HEAD(smack_rule_list); struct smack_parsed_rule { @@ -251,7 +246,8 @@ static int smk_set_access(struct smack_parsed_rule *srp, * it needs to get added for reporting. */ if (global) { - smlp = kzalloc(sizeof(*smlp), GFP_KERNEL); + smlp = kmem_cache_zalloc(smack_master_list_cache, + GFP_KERNEL); if (smlp != NULL) { smlp->smk_rule = sp; list_add_rcu(&smlp->list, &smack_rule_list);