diff options
author | Mark Rutland <mark.rutland@arm.com> | 2024-02-09 12:40:10 +0000 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2024-02-20 09:55:09 +0100 |
commit | 6dfee110c6cc7a6c3c1f45a07428c15820b87c1d (patch) | |
tree | 0b2250a9838dc5b57e2fa55b5ff7932c946149db /scripts/atomic | |
parent | b401b621758e46812da61fa58a67c3fd8d91de0d (diff) |
locking/atomic: scripts: Clarify ordering of conditional atomics
Conditional atomic operations (e.g. cmpxchg()) only provide ordering
when the condition holds; when the condition does not hold, the location
is not modified and relaxed ordering is provided. Where ordering is
needed for failed conditional atomics, it is necessary to use
smp_mb__before_atomic() and/or smp_mb__after_atomic().
This is explained tersely in memory-barriers.txt, and is implied but not
explicitly stated in the kerneldoc comments for the conditional
operations. The lack of an explicit statement has lead to some off-list
queries about the ordering semantics of failing conditional operations,
so evidently this is confusing.
Update the kerneldoc comments to explicitly describe the lack of ordering
for failed conditional atomic operations.
For most conditional atomic operations, this is written as:
| If (${condition}), atomically updates @v to (${new}) with ${desc_order} ordering.
| Otherwise, @v is not modified and relaxed ordering is provided.
For the try_cmpxchg() operations, this is written as:
| If (${condition}), atomically updates @v to @new with ${desc_order} ordering.
| Otherwise, @v is not modified, @old is updated to the current value of @v,
| and relaxed ordering is provided.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Nhat Pham <nphamcs@gmail.com>
Link: https://lore.kernel.org/r/20240209124010.2096198-1-mark.rutland@arm.com
Diffstat (limited to 'scripts/atomic')
-rw-r--r-- | scripts/atomic/kerneldoc/add_unless | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/cmpxchg | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/dec_if_positive | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/dec_unless_positive | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/inc_not_zero | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/inc_unless_negative | 1 | ||||
-rw-r--r-- | scripts/atomic/kerneldoc/try_cmpxchg | 3 |
7 files changed, 8 insertions, 1 deletions
diff --git a/scripts/atomic/kerneldoc/add_unless b/scripts/atomic/kerneldoc/add_unless index f828e5f6750c..fbc2fadfbdc4 100644 --- a/scripts/atomic/kerneldoc/add_unless +++ b/scripts/atomic/kerneldoc/add_unless @@ -10,6 +10,7 @@ cat <<EOF * @u: ${int} value to compare with * * If (@v != @u), atomically updates @v to (@v + @a) with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/cmpxchg b/scripts/atomic/kerneldoc/cmpxchg index 3bce328f50cf..02b24ee9d8a4 100644 --- a/scripts/atomic/kerneldoc/cmpxchg +++ b/scripts/atomic/kerneldoc/cmpxchg @@ -6,6 +6,7 @@ cat <<EOF * @new: ${int} value to assign * * If (@v == @old), atomically updates @v to @new with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/dec_if_positive b/scripts/atomic/kerneldoc/dec_if_positive index 04f1aed3cf83..9468b4a69603 100644 --- a/scripts/atomic/kerneldoc/dec_if_positive +++ b/scripts/atomic/kerneldoc/dec_if_positive @@ -4,6 +4,7 @@ cat <<EOF * @v: pointer to ${atomic}_t * * If (@v > 0), atomically updates @v to (@v - 1) with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/dec_unless_positive b/scripts/atomic/kerneldoc/dec_unless_positive index ee73612f0354..06a678678f71 100644 --- a/scripts/atomic/kerneldoc/dec_unless_positive +++ b/scripts/atomic/kerneldoc/dec_unless_positive @@ -4,6 +4,7 @@ cat <<EOF * @v: pointer to ${atomic}_t * * If (@v <= 0), atomically updates @v to (@v - 1) with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/inc_not_zero b/scripts/atomic/kerneldoc/inc_not_zero index 618be08e653e..c1a30fc66ee9 100644 --- a/scripts/atomic/kerneldoc/inc_not_zero +++ b/scripts/atomic/kerneldoc/inc_not_zero @@ -4,6 +4,7 @@ cat <<EOF * @v: pointer to ${atomic}_t * * If (@v != 0), atomically updates @v to (@v + 1) with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/inc_unless_negative b/scripts/atomic/kerneldoc/inc_unless_negative index 597f23d4dc8d..ece0d2c7b38f 100644 --- a/scripts/atomic/kerneldoc/inc_unless_negative +++ b/scripts/atomic/kerneldoc/inc_unless_negative @@ -4,6 +4,7 @@ cat <<EOF * @v: pointer to ${atomic}_t * * If (@v >= 0), atomically updates @v to (@v + 1) with ${desc_order} ordering. + * Otherwise, @v is not modified and relaxed ordering is provided. * * ${desc_noinstr} * diff --git a/scripts/atomic/kerneldoc/try_cmpxchg b/scripts/atomic/kerneldoc/try_cmpxchg index 296553206c06..3ccff29538f5 100644 --- a/scripts/atomic/kerneldoc/try_cmpxchg +++ b/scripts/atomic/kerneldoc/try_cmpxchg @@ -6,7 +6,8 @@ cat <<EOF * @new: ${int} value to assign * * If (@v == @old), atomically updates @v to @new with ${desc_order} ordering. - * Otherwise, updates @old to the current value of @v. + * Otherwise, @v is not modified, @old is updated to the current value of @v, + * and relaxed ordering is provided. * * ${desc_noinstr} * |