lab.nexedi.com will be down from Thursday, 20 March 2025, 07:30:00 UTC for a duration of approximately 2 hours

  • Hugh Dickins's avatar
    shmem,percpu_counter: add _limited_add(fbc, limit, amount) · beb98686
    Hugh Dickins authored
    Percpu counter's compare and add are separate functions: without locking
    around them (which would defeat their purpose), it has been possible to
    overflow the intended limit.  Imagine all the other CPUs fallocating tmpfs
    huge pages to the limit, in between this CPU's compare and its add.
    
    I have not seen reports of that happening; but tmpfs's recent addition of
    dquot_alloc_block_nodirty() in between the compare and the add makes it
    even more likely, and I'd be uncomfortable to leave it unfixed.
    
    Introduce percpu_counter_limited_add(fbc, limit, amount) to prevent it.
    
    I believe this implementation is correct, and slightly more efficient than
    the combination of compare and add (taking the lock once rather than twice
    when nearing full - the last 128MiB of a tmpfs volume on a machine with
    128 CPUs and 4KiB pages); but it does beg for a better design - when
    nearing full, there is no new batching, but the costly percpu counter sum
    across CPUs still has to be done, while locked.
    
    Follow __percpu_counter_sum()'s example, including cpu_dying_mask as well
    as cpu_online_mask: but shouldn't __percpu_counter_compare() and
    __percpu_counter_limited_add() then be adding a num_dying_cpus() to
    num_online_cpus(), when they calculate the maximum which could be held
    across CPUs?  But the times when it matters would be vanishingly rare.
    
    Link: https://lkml.kernel.org/r/bb817848-2d19-bcc8-39ca-ea179af0f0b4@google.comSigned-off-by: default avatarHugh Dickins <hughd@google.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Cc: Tim Chen <tim.c.chen@intel.com>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Darrick J. Wong <djwong@kernel.org>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Carlos Maiolino <cem@kernel.org>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Chuck Lever <chuck.lever@oracle.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    beb98686
shmem.c 128 KB