On Wed, 2026-04-29 at 18:03 +0200, Roberto Sassu wrote: > From: Roberto Sassu <[email protected]> > > The IMA hash table is a fixed-size array of hlist_head buckets: > > struct hlist_head ima_htable[IMA_MEASURE_HTABLE_SIZE]; > > IMA_MEASURE_HTABLE_SIZE is (1 << IMA_HASH_BITS) = 1024 buckets, each a > struct hlist_head (one pointer, 8 bytes on 64-bit). That is 8 KiB allocated > in BSS for every kernel, regardless of whether IMA is ever used, and > regardless of how many measurements are actually made. > > Replace the fixed-size array with a RCU-protected pointer to a dynamically > allocated array that is initialized in ima_init_htable(), which is called > from ima_init() during early boot. ima_init_htable() calls the static > function ima_alloc_replace_htable() which, other than initializing the hash > table the first time, can also hot-swap the existing hash table with a > blank one. > > The allocation in ima_alloc_replace_htable() uses kcalloc() so the buckets > are zero-initialised (equivalent to HLIST_HEAD_INIT { .first = NULL }). > Callers of ima_alloc_replace_htable() must call synchronize_rcu() and free > the returned hash table. > > Finally, access the hash table with rcu_dereference() in > ima_lookup_digest_entry() (reader side) and with > rcu_dereference_protected() in ima_add_digest_entry() (writer side). > > No functional change: bucket count, hash function, and all locking remain > identical. > > Link: https://github.com/linux-integrity/linux/issues/1 > Signed-off-by: Roberto Sassu <[email protected]>
Reviewed-by: Mimi Zohar <[email protected]>

