Re: [PATCH 3/3] Tweak avtab hash table parameters for better performance

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/12/2015 12:47 PM, Stephen Smalley wrote:
> On 01/07/2015 05:03 PM, John Brooks wrote:
>> Using the Fedora 20 targeted policy, running check_assertions requires
>> an avtab with around 22 million elements. With the default limit of 4096
>> buckets, performance is abysmal: it takes more than an hour to populate
>> the hash. Profiling shows most of that time under avtab_search_node.
>>
>> This patch increases the hash from 13 to 20 bits and to a maximum of
>> 1048576 buckets. The time for check_assertions on that policy is reduced
>> to about 3 minutes, which is enough to re-enable those checks as part of
>> the build process.
>>
>> A full size table will allocate 4-8 MB of memory, up from 16-32 KB. In a
>> cursory review, these tables are usually short-lived and only 1-3 are
>> allocated together. Compared to the cost of entries in this table (up to
>> 1 GB using the same policy), this isn't a significant increase.
>> ---
>>  libsepol/include/sepol/policydb/avtab.h | 4 ++--
>>  libsepol/src/avtab.c                    | 4 +---
>>  2 files changed, 3 insertions(+), 5 deletions(-)
>>
>> diff --git a/libsepol/include/sepol/policydb/avtab.h b/libsepol/include/sepol/policydb/avtab.h
>> index 6955ecf..158112f 100644
>> --- a/libsepol/include/sepol/policydb/avtab.h
>> +++ b/libsepol/include/sepol/policydb/avtab.h
>> @@ -81,7 +81,7 @@ typedef struct avtab {
>>  	avtab_ptr_t *htable;
>>  	uint32_t nel;		/* number of elements */
>>  	uint32_t nslot;         /* number of hash slots */
>> -	uint16_t mask;          /* mask to compute hash func */
>> +	uint32_t mask;          /* mask to compute hash func */
>>  } avtab_t;
>>  
>>  extern int avtab_init(avtab_t *);
>> @@ -117,7 +117,7 @@ extern avtab_ptr_t avtab_search_node(avtab_t * h, avtab_key_t * key);
>>  
>>  extern avtab_ptr_t avtab_search_node_next(avtab_ptr_t node, int specified);
>>  
>> -#define MAX_AVTAB_HASH_BITS 13
>> +#define MAX_AVTAB_HASH_BITS 20
>>  #define MAX_AVTAB_HASH_BUCKETS (1 << MAX_AVTAB_HASH_BITS)
>>  #define MAX_AVTAB_HASH_MASK (MAX_AVTAB_HASH_BUCKETS-1)
>>  #define MAX_AVTAB_SIZE MAX_AVTAB_HASH_BUCKETS
>> diff --git a/libsepol/src/avtab.c b/libsepol/src/avtab.c
>> index 9c01a8d..65b3c48 100644
>> --- a/libsepol/src/avtab.c
>> +++ b/libsepol/src/avtab.c
>> @@ -329,7 +329,7 @@ int avtab_init(avtab_t * h)
>>  
>>  int avtab_alloc(avtab_t *h, uint32_t nrules)
>>  {
>> -	uint16_t mask = 0;
>> +	uint32_t mask = 0;
>>  	uint32_t shift = 0;
>>  	uint32_t work = nrules;
>>  	uint32_t nslot = 0;
>> @@ -341,8 +341,6 @@ int avtab_alloc(avtab_t *h, uint32_t nrules)
>>  		work  = work >> 1;
>>  		shift++;
>>  	}
>> -	if (shift > 2)
>> -		shift = shift - 2;
>>  	nslot = 1 << shift;
>>  	if (nslot > MAX_AVTAB_SIZE)
>>  		nslot = MAX_AVTAB_SIZE;
>>
> 
> Here again, looking at impact on regular usage of the avtab (without
> full expansion of all attributes), running checkpolicy -Mb
> /etc/selinux/targeted/policy/policy.29 on Fedora 20 before and after
> this patch, I see:
> 
> before.txt:rules:  101401 entries and 8169/8192 buckets used, longest
> chain length 84
> 
> betterhash.txt:rules:  101401 entries and 8192/8192 buckets used,
> longest chain length 27
> 
> tweakavtab.txt:rules:  101401 entries and 68460/131072 buckets used,
> longest chain length 7

Trying this on the Android policy, I get:
before.txt:rules:  6033 entries and 1811/2048 buckets used, longest
chain length 25

betterhash.txt:rules:  6033 entries and 1923/2048 buckets used, longest
chain length 11

tweakavtab.txt:rules:  6033 entries and 4232/8192 buckets used, longest
chain length 6

Also makes sepolicy-analyze neverallow feasible on Fedora policy;
previously I could only run it on Android policy and expect it to
complete in a sane amount of time.
_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux