* [PATCH RESEND 0/2] ucount: Fix and improve atomic_long_inc_below @ 2022-10-17 14:40 Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak 0 siblings, 2 replies; 4+ messages in thread From: Uros Bizjak @ 2022-10-17 14:40 UTC (permalink / raw) To: linux-kernel; +Cc: Uros Bizjak, Eric W. Biederman The series fixes wrong argument type and improves atomic_long_inc_below by using atomic_long_try_cmpxchg instead of atomic_long_cmpxchg. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Uros Bizjak (2): ucount: Fix atomic_long_inc_below argument type ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below kernel/ucount.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) -- 2.37.3 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH RESEND 1/2] ucount: Fix atomic_long_inc_below argument type 2022-10-17 14:40 [PATCH RESEND 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak @ 2022-10-17 14:40 ` Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak 1 sibling, 0 replies; 4+ messages in thread From: Uros Bizjak @ 2022-10-17 14:40 UTC (permalink / raw) To: linux-kernel; +Cc: Uros Bizjak, Eric W. Biederman The type of u argument of atomic_long_inc_below should be long to avoid unwanted truncation to int. Fixes: f9c82a4ea89c ("Increase size of ucounts to atomic_long_t") Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> --- kernel/ucount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/ucount.c b/kernel/ucount.c index ee8e57fd6f90..74f5b4959feb 100644 --- a/kernel/ucount.c +++ b/kernel/ucount.c @@ -212,7 +212,7 @@ void put_ucounts(struct ucounts *ucounts) } } -static inline bool atomic_long_inc_below(atomic_long_t *v, int u) +static inline bool atomic_long_inc_below(atomic_long_t *v, long u) { long c, old; c = atomic_long_read(v); -- 2.37.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below 2022-10-17 14:40 [PATCH RESEND 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak @ 2022-10-17 14:40 ` Uros Bizjak 2022-10-31 19:02 ` Alexey Gladkov 1 sibling, 1 reply; 4+ messages in thread From: Uros Bizjak @ 2022-10-17 14:40 UTC (permalink / raw) To: linux-kernel; +Cc: Uros Bizjak, Eric W. Biederman Use atomic_long_try_cmpxchg instead of atomic_long_cmpxchg (*ptr, old, new) == old in atomic_long_inc_below. x86 CMPXCHG instruction returns success in ZF flag, so this change saves a compare after cmpxchg (and related move instruction in front of cmpxchg). Also, atomic_long_try_cmpxchg implicitly assigns old *ptr value to "old" when cmpxchg fails, enabling further code simplifications. No functional change intended. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> --- kernel/ucount.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/kernel/ucount.c b/kernel/ucount.c index 74f5b4959feb..2c04589a61ff 100644 --- a/kernel/ucount.c +++ b/kernel/ucount.c @@ -214,16 +214,14 @@ void put_ucounts(struct ucounts *ucounts) static inline bool atomic_long_inc_below(atomic_long_t *v, long u) { - long c, old; - c = atomic_long_read(v); - for (;;) { + long c = atomic_long_read(v); + + do { if (unlikely(c >= u)) return false; - old = atomic_long_cmpxchg(v, c, c+1); - if (likely(old == c)) - return true; - c = old; - } + } while (!atomic_long_try_cmpxchg(v, &c, c+1)); + + return true; } struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid, -- 2.37.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below 2022-10-17 14:40 ` [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak @ 2022-10-31 19:02 ` Alexey Gladkov 0 siblings, 0 replies; 4+ messages in thread From: Alexey Gladkov @ 2022-10-31 19:02 UTC (permalink / raw) To: Eric W. Biederman; +Cc: linux-kernel, Uros Bizjak On Mon, Oct 17, 2022 at 04:40:49PM +0200, Uros Bizjak wrote: > Use atomic_long_try_cmpxchg instead of > atomic_long_cmpxchg (*ptr, old, new) == old in atomic_long_inc_below. > x86 CMPXCHG instruction returns success in ZF flag, so this change saves > a compare after cmpxchg (and related move instruction in front of cmpxchg). > > Also, atomic_long_try_cmpxchg implicitly assigns old *ptr value to "old" > when cmpxchg fails, enabling further code simplifications. > > No functional change intended. > > Signed-off-by: Uros Bizjak <ubizjak@gmail.com> > Cc: "Eric W. Biederman" <ebiederm@xmission.com> Reviewed-by: Alexey Gladkov <legion@kernel.org> Eric, I think the patch looks good. You already reviewed the previous version [1]. What do you think about this version? [1] https://lore.kernel.org/lkml/87pmi6z143.fsf@email.froward.int.ebiederm.org/ > --- > kernel/ucount.c | 14 ++++++-------- > 1 file changed, 6 insertions(+), 8 deletions(-) > > diff --git a/kernel/ucount.c b/kernel/ucount.c > index 74f5b4959feb..2c04589a61ff 100644 > --- a/kernel/ucount.c > +++ b/kernel/ucount.c > @@ -214,16 +214,14 @@ void put_ucounts(struct ucounts *ucounts) > > static inline bool atomic_long_inc_below(atomic_long_t *v, long u) > { > - long c, old; > - c = atomic_long_read(v); > - for (;;) { > + long c = atomic_long_read(v); > + > + do { > if (unlikely(c >= u)) > return false; > - old = atomic_long_cmpxchg(v, c, c+1); > - if (likely(old == c)) > - return true; > - c = old; > - } > + } while (!atomic_long_try_cmpxchg(v, &c, c+1)); > + > + return true; > } > > struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid, > -- > 2.37.3 > -- Rgrds, legion ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-31 19:02 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-10-17 14:40 [PATCH RESEND 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak 2022-10-17 14:40 ` [PATCH RESEND 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak 2022-10-31 19:02 ` Alexey Gladkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox