tools/memory-model: Add atomic_and()/or()/xor() and add_negative
PATCH 1/1 tools/memory-model: Add atomic_and()/or()/xor() and add_negative
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
atomic_add_negative() is already available so add its acquire, release, and relaxed ordering variants.
[1] https://github.com/herd/herdtools7/pull/849
--- tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
tools/memory-model/linux-kernel.def +21 -0
@@ -65,6 +65,9 @@ atomic_set_release(X,V) { smp_store_release(X,V); } atomic_add(V,X) { __atomic_op(X,+,V); } atomic_sub(V,X) { __atomic_op(X,-,V); } +atomic_and(V,X) { __atomic_op(X,&,V); } +atomic_or(V,X) { __atomic_op(X,|,V); } +atomic_xor(V,X) { __atomic_op(X,^,V); } atomic_inc(X) { __atomic_op(X,+,1); } atomic_dec(X) { __atomic_op(X,-,1); }
@@ -77,6 +80,21 @@ atomic_fetch_add_relaxed(V,X) __atomic_fetch_op{once}(X,+,V) atomic_fetch_add_acquire(V,X) __atomic_fetch_op{acquire}(X,+,V) atomic_fetch_add_release(V,X) __atomic_fetch_op{release}(X,+,V) +atomic_fetch_and(V,X) __atomic_fetch_op{mb}(X,&,V) +atomic_fetch_and_relaxed(V,X) __atomic_fetch_op{once}(X,&,V) +atomic_fetch_and_acquire(V,X) __atomic_fetch_op{acquire}(X,&,V) +atomic_fetch_and_release(V,X) __atomic_fetch_op{release}(X,&,V) + +atomic_fetch_or(V,X) __atomic_fetch_op{mb}(X,|,V) +atomic_fetch_or_relaxed(V,X) __atomic_fetch_op{once}(X,|,V) +atomic_fetch_or_acquire(V,X) __atomic_fetch_op{acquire}(X,|,V) +atomic_fetch_or_release(V,X) __atomic_fetch_op{release}(X,|,V) + +atomic_fetch_xor(V,X) __atomic_fetch_op{mb}(X,^,V) +atomic_fetch_xor_relaxed(V,X) __atomic_fetch_op{once}(X,^,V) +atomic_fetch_xor_acquire(V,X) __atomic_fetch_op{acquire}(X,^,V) +atomic_fetch_xor_release(V,X) __atomic_fetch_op{release}(X,^,V) + atomic_inc_return(X) __atomic_op_return{mb}(X,+,1) atomic_inc_return_relaxed(X) __atomic_op_return{once}(X,+,1) atomic_inc_return_acquire(X) __atomic_op_return{acquire}(X,+,1)
@@ -117,3 +135,6 @@ atomic_sub_and_test(V,X) __atomic_op_return{mb}(X,-,V) == 0 atomic_dec_and_test(X) __atomic_op_return{mb}(X,-,1) == 0 atomic_inc_and_test(X) __atomic_op_return{mb}(X,+,1) == 0 atomic_add_negative(V,X) __atomic_op_return{mb}(X,+,V) < 0 +atomic_add_negative_relaxed(V,X) __atomic_op_return{once}(X,+,V) < 0 +atomic_add_negative_acquire(V,X) __atomic_op_return{acquire}(X,+,V) < 0 +atomic_add_negative_release(V,X) __atomic_op_return{release}(X,+,V) < 0
Signature · 1 line
2.40.1
Quoted 6 lines · Puranjay Mohan
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
Quoted 6 lines
atomic_add_negative()is already available so add its acquire, release, and relaxed ordering variants.[1] https://github.com/herd/herdtools7/pull/849
Signed-off-by Puranjay Mohan <[email protected]>
Thanks,
Andrea
Paul E. McKenney
maintainerQuoted 7 lines · Andrea Parri
Quoted 6 lines · Puranjay Mohan
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
Quoted 8 lines
Quoted 6 lines
atomic_add_negative()is already available so add its acquire, release, and relaxed ordering variants.[1] https://github.com/herd/herdtools7/pull/849
Signed-off-by Puranjay Mohan <[email protected]>Acked-by Andrea Parri <[email protected]>
Queued for review and testing, and thank you both!
Thanx, Paul
Quoted 10 lines · Puranjay Mohan
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
atomic_add_negative()is already available so add its acquire, release, and relaxed ordering variants.
A newer version of herd is required for this feature, right? So please also do a change in tools/memory-model/README "REQUIREMENTS" session when the new version released.
Needless to say, this patch looks good to me.
Regards,
Boqun
Quoted 52 lines
Signed-off-by Puranjay Mohan <[email protected]>--- tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)tools/memory-model/linux-kernel.def +21
-0@@ -65,6 +65,9 @@ atomic_set_release(X,V) { smp_store_release(X,V); } atomic_add(V,X) { __atomic_op(X,+,V); } atomic_sub(V,X) { __atomic_op(X,-,V); } +atomic_and(V,X) { __atomic_op(X,&,V); } +atomic_or(V,X) { __atomic_op(X,|,V); } +atomic_xor(V,X) { __atomic_op(X,^,V); } atomic_inc(X) { __atomic_op(X,+,1); } atomic_dec(X) { __atomic_op(X,-,1); }@@ -77,6 +80,21 @@ atomic_fetch_add_relaxed(V,X) __atomic_fetch_op{once}(X,+,V) atomic_fetch_add_acquire(V,X) __atomic_fetch_op{acquire}(X,+,V) atomic_fetch_add_release(V,X) __atomic_fetch_op{release}(X,+,V) +atomic_fetch_and(V,X) __atomic_fetch_op{mb}(X,&,V) +atomic_fetch_and_relaxed(V,X) __atomic_fetch_op{once}(X,&,V) +atomic_fetch_and_acquire(V,X) __atomic_fetch_op{acquire}(X,&,V) +atomic_fetch_and_release(V,X) __atomic_fetch_op{release}(X,&,V) + +atomic_fetch_or(V,X) __atomic_fetch_op{mb}(X,|,V) +atomic_fetch_or_relaxed(V,X) __atomic_fetch_op{once}(X,|,V) +atomic_fetch_or_acquire(V,X) __atomic_fetch_op{acquire}(X,|,V) +atomic_fetch_or_release(V,X) __atomic_fetch_op{release}(X,|,V) + +atomic_fetch_xor(V,X) __atomic_fetch_op{mb}(X,^,V) +atomic_fetch_xor_relaxed(V,X) __atomic_fetch_op{once}(X,^,V) +atomic_fetch_xor_acquire(V,X) __atomic_fetch_op{acquire}(X,^,V) +atomic_fetch_xor_release(V,X) __atomic_fetch_op{release}(X,^,V) + atomic_inc_return(X) __atomic_op_return{mb}(X,+,1) atomic_inc_return_relaxed(X) __atomic_op_return{once}(X,+,1) atomic_inc_return_acquire(X) __atomic_op_return{acquire}(X,+,1)@@ -117,3 +135,6 @@ atomic_sub_and_test(V,X) __atomic_op_return{mb}(X,-,V) == 0 atomic_dec_and_test(X) __atomic_op_return{mb}(X,-,1) == 0 atomic_inc_and_test(X) __atomic_op_return{mb}(X,+,1) == 0 atomic_add_negative(V,X) __atomic_op_return{mb}(X,+,V) < 0 +atomic_add_negative_relaxed(V,X) __atomic_op_return{once}(X,+,V) < 0 +atomic_add_negative_acquire(V,X) __atomic_op_return{acquire}(X,+,V) < 0 +atomic_add_negative_release(V,X) __atomic_op_return{release}(X,+,V) < 0Signature · 1 line
2.40.1
Akira Yokosawa
reviewerQuoted 7 lines · Boqun Feng
Quoted 6 lines · Puranjay Mohan
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
Quoted 6 lines
Quoted 4 lines
atomic_add_negative()is already available so add its acquire, release, and relaxed ordering variants.A newer version of herd is required for this feature, right?
Yes, this requires building herd7 from latest source.
herdtools7 7.57 (released recently) happened before pull 849.
Luc, what is your plan on a next release (7.57.1?) ?
Quoted 3 lines
So please
also do a change intools/memory-model/README"REQUIREMENTS" session when the new version released.
Puranjay, it would be great if you add some litmus tests which use additional atomic primitives under tools/memory-model/litmus-tests/ as well.
Thanks, Akira
Quoted 7 lines
Boqun
Quoted 5 lines
Signed-off-by Puranjay Mohan <[email protected]>--- tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
Paul E. McKenney
maintainerQuoted 21 lines · Akira Yokosawa
Quoted 7 lines · Boqun Feng
Quoted 6 lines · Puranjay Mohan
Pull-849[1] added the support of '&', '|', and '^' to the herd7 tool's atomics operations.
Use these in linux-kernel.def to implement atomic_and()/or()/xor() with all their ordering variants.
Quoted 6 lines
Quoted 4 lines
atomic_add_negative()is already available so add its acquire, release, and relaxed ordering variants.A newer version of herd is required for this feature, right?
Yes, this requires building herd7 from latest source.
herdtools7 7.57 (released recently) happened before pull 849.
Luc, what is your plan on a next release (7.57.1?) ?
Quoted 7 lines
Quoted 3 lines
So please
also do a change intools/memory-model/README"REQUIREMENTS" session when the new version released.Puranjay, it would be great if you add some litmus tests which use additional atomic primitives under
tools/memory-model/litmus-tests/as well.
Thank you for checking, Akira! I need to hold off sending this upstream until there is a herdtools7 release that supports it. So not the merge window that is likely to open this weekend. ;-)
Thanx, Paul
Quoted 10 lines
Thanks, Akira
Quoted 7 lines
Boqun
Quoted 5 lines
Signed-off-by Puranjay Mohan <[email protected]>--- tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)