aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/avc.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2009-02-12 14:50:43 -0500
committerJames Morris <jmorris@namei.org>2009-02-13 17:22:37 -0500
commit906d27d9d28fd50fb40026e56842d8f6806a7a04 (patch)
tree4f73e1396a09349a307f38b1de19767f558bedb1 /security/selinux/avc.c
parenta5dda683328f99c781f92c66cc52ffc0639bef58 (diff)
SELinux: remove the unused ae.used
Currently SELinux code has an atomic which was intended to track how many times an avc entry was used and to evict entries when they haven't been used recently. Instead we never let this atomic get above 1 and evict when it is first checked for eviction since it hits zero. This is a total waste of time so I'm completely dropping ae.used. This change resulted in about a 3% faster avc_has_perm_noaudit when running oprofile against a tbench benchmark. Signed-off-by: Eric Paris <eparis@redhat.com> Reviewed by: Paul Moore <paul.moore@hp.com> Acked-by: Stephen Smalley <sds@tycho.nsa.gov> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux/avc.c')
-rw-r--r--security/selinux/avc.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c
index 0d00f4874f32..0afb990fdfa4 100644
--- a/security/selinux/avc.c
+++ b/security/selinux/avc.c
@@ -88,7 +88,6 @@ struct avc_entry {
88 u32 tsid; 88 u32 tsid;
89 u16 tclass; 89 u16 tclass;
90 struct av_decision avd; 90 struct av_decision avd;
91 atomic_t used; /* used recently */
92}; 91};
93 92
94struct avc_node { 93struct avc_node {
@@ -316,16 +315,13 @@ static inline int avc_reclaim_node(void)
316 315
317 rcu_read_lock(); 316 rcu_read_lock();
318 list_for_each_entry(node, &avc_cache.slots[hvalue], list) { 317 list_for_each_entry(node, &avc_cache.slots[hvalue], list) {
319 if (atomic_dec_and_test(&node->ae.used)) { 318 avc_node_delete(node);
320 /* Recently Unused */ 319 avc_cache_stats_incr(reclaims);
321 avc_node_delete(node); 320 ecx++;
322 avc_cache_stats_incr(reclaims); 321 if (ecx >= AVC_CACHE_RECLAIM) {
323 ecx++; 322 rcu_read_unlock();
324 if (ecx >= AVC_CACHE_RECLAIM) { 323 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flags);
325 rcu_read_unlock(); 324 goto out;
326 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flags);
327 goto out;
328 }
329 } 325 }
330 } 326 }
331 rcu_read_unlock(); 327 rcu_read_unlock();
@@ -345,7 +341,6 @@ static struct avc_node *avc_alloc_node(void)
345 341
346 INIT_RCU_HEAD(&node->rhead); 342 INIT_RCU_HEAD(&node->rhead);
347 INIT_LIST_HEAD(&node->list); 343 INIT_LIST_HEAD(&node->list);
348 atomic_set(&node->ae.used, 1);
349 avc_cache_stats_incr(allocations); 344 avc_cache_stats_incr(allocations);
350 345
351 if (atomic_inc_return(&avc_cache.active_nodes) > avc_cache_threshold) 346 if (atomic_inc_return(&avc_cache.active_nodes) > avc_cache_threshold)
@@ -378,15 +373,6 @@ static inline struct avc_node *avc_search_node(u32 ssid, u32 tsid, u16 tclass)
378 } 373 }
379 } 374 }
380 375
381 if (ret == NULL) {
382 /* cache miss */
383 goto out;
384 }
385
386 /* cache hit */
387 if (atomic_read(&ret->ae.used) != 1)
388 atomic_set(&ret->ae.used, 1);
389out:
390 return ret; 376 return ret;
391} 377}
392 378