diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-19 21:59:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-19 21:59:47 -0400 |
commit | 044aea9b83614948c98564000db07d1d32b2d29b (patch) | |
tree | b1f13ed2f4bb0bd40f7915a89aafaf449b6145cd /security/selinux | |
parent | 39ab05c8e0b519ff0a04a869f065746e6e8c3d95 (diff) |
selinux: de-crapify avc cache stat code generation
You can turn off the avc cache stats, but distributions seem to not do
that (perhaps because several performance tuning how-to's talk about the
avc cache statistics).
Which is sad, because the code it generates is truly horrendous, with
the statistics update being sandwitched between get_cpu/put_cpu which in
turn causes preemption disables etc. We're talking ten+ instructions
just to increment a per-cpu variable in some pretty hot code.
Fix the craziness by just using 'this_cpu_inc()' instead. Suddenly we
only need a single 'inc' instruction to increment the statistics. This
is quite noticeable in the incredibly hot avc_has_perm_noaudit()
function (which triggers all the statistics by virtue of doing an
avc_lookup() call).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'security/selinux')
-rw-r--r-- | security/selinux/avc.c | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index 1d027e29ce8d..5971e30e8239 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
@@ -38,11 +38,7 @@ | |||
38 | #define AVC_CACHE_RECLAIM 16 | 38 | #define AVC_CACHE_RECLAIM 16 |
39 | 39 | ||
40 | #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS | 40 | #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS |
41 | #define avc_cache_stats_incr(field) \ | 41 | #define avc_cache_stats_incr(field) this_cpu_inc(avc_cache_stats.field) |
42 | do { \ | ||
43 | per_cpu(avc_cache_stats, get_cpu()).field++; \ | ||
44 | put_cpu(); \ | ||
45 | } while (0) | ||
46 | #else | 42 | #else |
47 | #define avc_cache_stats_incr(field) do {} while (0) | 43 | #define avc_cache_stats_incr(field) do {} while (0) |
48 | #endif | 44 | #endif |