Skip to contentSkip to conversation

tools/memory-model: Add atomic_and()/or()/xor() and add_negative

PATCH In review Puranjay Mohan 5 participants 6 messages May 8, 2024

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 88a39601f525..d1f11930ec51 100644
@@ -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
maintainer Acked-by on v1 1/1
#1 lore raw
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

Thanks,
Andrea

maintainer
#2 lore raw
Quoted 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

Queued for review and testing, and thank you both!

Thanx, Paul

Reviewed-by on v1 1/1
#3 lore raw
In reply to Puranjay Mohan
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.

[1] https://github.com/herd/herdtools7/pull/849

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
---
 tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
tools/memory-model/linux-kernel.def +21 -0
index 88a39601f525..d1f11930ec51 100644
@@ -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
#4 lore raw
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.

[1] https://github.com/herd/herdtools7/pull/849

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 in tools/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
---
 tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
maintainer
#5 lore raw
Quoted 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.

[1] https://github.com/herd/herdtools7/pull/849

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 in tools/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
---
 tools/memory-model/linux-kernel.def | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)