All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below
@ 2022-07-13 15:54 Uros Bizjak
  2022-07-13 15:54 ` [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Uros Bizjak @ 2022-07-13 15:54 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.35.3


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type
  2022-07-13 15:54 [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak
@ 2022-07-13 15:54 ` Uros Bizjak
  2022-07-15 18:23   ` Eric W. Biederman
  2022-07-13 15:54 ` [PATCH 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak
  2022-07-15 18:25 ` [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Eric W. Biederman
  2 siblings, 1 reply; 5+ messages in thread
From: Uros Bizjak @ 2022-07-13 15:54 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 06ea04d44685..974ac1585009 100644
--- a/kernel/ucount.c
+++ b/kernel/ucount.c
@@ -216,7 +216,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.35.3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below
  2022-07-13 15:54 [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak
  2022-07-13 15:54 ` [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak
@ 2022-07-13 15:54 ` Uros Bizjak
  2022-07-15 18:25 ` [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Eric W. Biederman
  2 siblings, 0 replies; 5+ messages in thread
From: Uros Bizjak @ 2022-07-13 15:54 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 974ac1585009..5d980460104e 100644
--- a/kernel/ucount.c
+++ b/kernel/ucount.c
@@ -218,16 +218,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.35.3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type
  2022-07-13 15:54 ` [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak
@ 2022-07-15 18:23   ` Eric W. Biederman
  0 siblings, 0 replies; 5+ messages in thread
From: Eric W. Biederman @ 2022-07-15 18:23 UTC (permalink / raw)
  To: Uros Bizjak; +Cc: linux-kernel, Alexey Gladkov

Uros Bizjak <ubizjak@gmail.com> writes:

> The type of u argument of atomic_long_inc_below should be long
> to avoid unwanted truncation to int.

Reviewed-by: "Eric W. Biederman" <ebiederm@xmission.com>

>
> 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 06ea04d44685..974ac1585009 100644
> --- a/kernel/ucount.c
> +++ b/kernel/ucount.c
> @@ -216,7 +216,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);

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below
  2022-07-13 15:54 [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak
  2022-07-13 15:54 ` [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak
  2022-07-13 15:54 ` [PATCH 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak
@ 2022-07-15 18:25 ` Eric W. Biederman
  2 siblings, 0 replies; 5+ messages in thread
From: Eric W. Biederman @ 2022-07-15 18:25 UTC (permalink / raw)
  To: Uros Bizjak; +Cc: linux-kernel, Alexey Gladkov

Uros Bizjak <ubizjak@gmail.com> writes:

> 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>

The bug fix at least looks correct.  I haven't reviewed the
atomic_long_try_cmpxchg yet.

Thanks,
Eric


>
> 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(-)

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-07-15 18:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-13 15:54 [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Uros Bizjak
2022-07-13 15:54 ` [PATCH 1/2] ucount: Fix atomic_long_inc_below argument type Uros Bizjak
2022-07-15 18:23   ` Eric W. Biederman
2022-07-13 15:54 ` [PATCH 2/2] ucount: Use atomic_long_try_cmpxchg in atomic_long_inc_below Uros Bizjak
2022-07-15 18:25 ` [PATCH 0/2] ucount: Fix and improve atomic_long_inc_below Eric W. Biederman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.