Commit 641e0217 authored by Hongru Zhang's avatar Hongru Zhang Committed by Paul Moore
Browse files

selinux: Introduce a new config to make avc cache slot size adjustable



On mobile device high-load situations, permission check can happen
more than 90,000/s (8 core system). With default 512 cache nodes
configuration, avc cache miss happens more often and occasionally
leads to long time (>2ms) irqs off on both big and little cores,
which decreases system real-time capability.

An actual call stack is as follows:
 => avc_compute_av
 => avc_perm_nonode
 => avc_has_perm_noaudit
 => selinux_capable
 => security_capable
 => capable
 => __sched_setscheduler
 => do_sched_setscheduler
 => __arm64_sys_sched_setscheduler
 => invoke_syscall
 => el0_svc_common
 => do_el0_svc
 => el0_svc
 => el0t_64_sync_handler
 => el0t_64_sync

Although we can expand avc nodes through /sys/fs/selinux/cache_threshold
to mitigate long time irqs off, hash conflicts make the bucket average
length longer because of the fixed size of cache slots, leading to
avc_search_node() latency increase.

So introduce a new config to make avc cache slot size also configurable,
and with fine tuning, we can mitigate long time irqs off with slightly
avc_search_node() performance regression.

Theoretically, the main overhead is memory consumption.

Signed-off-by: default avatarHongru Zhang <zhanghongru@xiaomi.com>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 094e94d1
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -69,6 +69,17 @@ config SECURITY_SELINUX_SID2STR_CACHE_SIZE

	  If unsure, keep the default value.

config SECURITY_SELINUX_AVC_HASH_BITS
	int "SELinux avc hashtable size"
	depends on SECURITY_SELINUX
	range 9 14
	default 9
	help
	  This option sets the number of buckets used in the AVC hash table
	  to 2^SECURITY_SELINUX_AVC_HASH_BITS. A higher value helps maintain
	  shorter chain lengths especially when expanding AVC nodes via
	  /sys/fs/selinux/avc/cache_threshold.

config SECURITY_SELINUX_DEBUG
	bool "SELinux kernel debugging support"
	depends on SECURITY_SELINUX
+3 −3
Original line number Diff line number Diff line
@@ -34,8 +34,8 @@
#define CREATE_TRACE_POINTS
#include <trace/events/avc.h>

#define AVC_CACHE_SLOTS			512
#define AVC_DEF_CACHE_THRESHOLD		512
#define AVC_CACHE_SLOTS		(1 << CONFIG_SECURITY_SELINUX_AVC_HASH_BITS)
#define AVC_DEF_CACHE_THRESHOLD	AVC_CACHE_SLOTS
#define AVC_CACHE_RECLAIM	16

#ifdef CONFIG_SECURITY_SELINUX_AVC_STATS