• Andrey Albershteyn's avatar
    fsverity: remove hash page spin lock · 8e43fb06
    Andrey Albershteyn authored
    The spin lock is not necessary here as it can be replaced with
    memory barrier which should be better performance-wise.
    
    When Merkle tree block size differs from page size, in
    is_hash_block_verified() two things are modified during check - a
    bitmap and PG_checked flag of the page.
    
    Each bit in the bitmap represent verification status of the Merkle
    tree blocks. PG_checked flag tells if page was just re-instantiated
    or was in pagecache. Both of this states are shared between
    verification threads. Page which was re-instantiated can not have
    already verified blocks (bit set in bitmap).
    
    The spin lock was used to allow only one thread to modify both of
    these states and keep order of operations. The only requirement here
    is that PG_Checked is set strictly after bitmap is updated.
    This way other threads which see that PG_Checked=1 (page cached)
    knows that bitmap is up-to-date. Otherwise, if PG_Checked is set
    before bitmap is cleared, other threads can see bit=1 and therefore
    will not perform verification of that Merkle tree block.
    
    However, there's still the case when one thread is setting a bit in
    verify_data_block() and other thread is clearing it in
    is_hash_block_verified(). This can happen if two threads get to
    !PageChecked branch and one of the threads is rescheduled before
    resetting the bitmap. This is fine as at worst blocks are
    re-verified in each thread.
    Signed-off-by: default avatarAndrey Albershteyn <aalbersh@redhat.com>
    [ebiggers: improved the comment and removed the 'verified' variable]
    Link: https://lore.kernel.org/r/20240201052813.68380-1-ebiggers@kernel.orgSigned-off-by: default avatarEric Biggers <ebiggers@google.com>
    8e43fb06
verify.c 12 KB