mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
refcount: introduce __refcount_{add|inc}_not_zero_limited_acquire
Introduce functions to increase refcount but with a top limit above which they will fail to increase (the limit is inclusive). Setting the limit to INT_MAX indicates no limit. Link: https://lkml.kernel.org/r/20250213224655.1680278-12-surenb@google.com Signed-off-by: Suren Baghdasaryan <surenb@google.com> Tested-by: Shivank Garg <shivankg@amd.com> Link: https://lkml.kernel.org/r/5e19ec93-8307-47c2-bb13-3ddf7150624e@amd.com Cc: Christian Brauner <brauner@kernel.org> Cc: David Hildenbrand <david@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Hugh Dickins <hughd@google.com> Cc: Jann Horn <jannh@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Klara Modin <klarasmodin@gmail.com> Cc: Liam R. Howlett <Liam.Howlett@Oracle.com> Cc: Lokesh Gidra <lokeshgidra@google.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Mateusz Guzik <mjguzik@gmail.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@suse.com> Cc: Minchan Kim <minchan@google.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Cc: "Paul E . McKenney" <paulmck@kernel.org> Cc: Peter Xu <peterx@redhat.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Sourav Panda <souravpanda@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: Will Deacon <will@kernel.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
7f8ceea0c5
commit
4e0dbe105d
1 changed files with 20 additions and 1 deletions
|
@ -213,13 +213,20 @@ static inline __must_check bool refcount_add_not_zero(int i, refcount_t *r)
|
|||
}
|
||||
|
||||
static inline __must_check __signed_wrap
|
||||
bool __refcount_add_not_zero_acquire(int i, refcount_t *r, int *oldp)
|
||||
bool __refcount_add_not_zero_limited_acquire(int i, refcount_t *r, int *oldp,
|
||||
int limit)
|
||||
{
|
||||
int old = refcount_read(r);
|
||||
|
||||
do {
|
||||
if (!old)
|
||||
break;
|
||||
|
||||
if (i > limit - old) {
|
||||
if (oldp)
|
||||
*oldp = old;
|
||||
return false;
|
||||
}
|
||||
} while (!atomic_try_cmpxchg_acquire(&r->refs, &old, old + i));
|
||||
|
||||
if (oldp)
|
||||
|
@ -231,6 +238,18 @@ bool __refcount_add_not_zero_acquire(int i, refcount_t *r, int *oldp)
|
|||
return old;
|
||||
}
|
||||
|
||||
static inline __must_check bool
|
||||
__refcount_inc_not_zero_limited_acquire(refcount_t *r, int *oldp, int limit)
|
||||
{
|
||||
return __refcount_add_not_zero_limited_acquire(1, r, oldp, limit);
|
||||
}
|
||||
|
||||
static inline __must_check __signed_wrap
|
||||
bool __refcount_add_not_zero_acquire(int i, refcount_t *r, int *oldp)
|
||||
{
|
||||
return __refcount_add_not_zero_limited_acquire(i, r, oldp, INT_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* refcount_add_not_zero_acquire - add a value to a refcount with acquire ordering unless it is 0
|
||||
*
|
||||
|
|
Loading…
Add table
Reference in a new issue