selinux: simplify avtab slot calculation
authorChristian Göttsche <cgzones@googlemail.com>
Fri, 18 Aug 2023 15:12:15 +0000 (17:12 +0200)
committerPaul Moore <paul@paul-moore.com>
Wed, 13 Sep 2023 17:46:57 +0000 (13:46 -0400)
Instead of dividing by 8 and then performing log2 by hand, use a more
readable calculation.

The behavior of rounddown_pow_of_two() for an input of 0 is undefined,
so handle that case and small values manually to achieve the same
results.

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
Reviewed-by: Stephen Smalley <stephen.smalley.work@gmail.com>
Signed-off-by: Paul Moore <paul@paul-moore.com>
security/selinux/ss/avtab.c

index 955cfe4956067e37a5c3ebbbbe5e45deb92e8fcd..1d1ffe085b35cdf9926846d498314c10ff0da32d 100644 (file)
@@ -298,13 +298,7 @@ int avtab_alloc(struct avtab *h, u32 nrules)
        u32 nslot = 0;
 
        if (nrules != 0) {
-               u32 shift = 1;
-               u32 work = nrules >> 3;
-               while (work) {
-                       work >>= 1;
-                       shift++;
-               }
-               nslot = 1 << shift;
+               nslot = nrules > 3 ? rounddown_pow_of_two(nrules / 2) : 2;
                if (nslot > MAX_AVTAB_HASH_BUCKETS)
                        nslot = MAX_AVTAB_HASH_BUCKETS;