]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/pgtable: Make crdte() and cspg() return a value
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Tue, 25 Jun 2024 15:13:30 +0000 (17:13 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 2 Jul 2024 08:17:16 +0000 (10:17 +0200)
Make the crdte() and cspg() wrappers return a boolean to indicate
success, like the other already existing "compare and swap" type of
wrappers.

Add documentation for those functions as well.

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/include/asm/pgtable.h

index 0fd5a9c7e90147fe7e514da00ffce40e55f72b8c..b5632dbe5438388861871b7a2d3507f61dc23a79 100644 (file)
@@ -609,7 +609,15 @@ static inline void csp(unsigned int *ptr, unsigned int old, unsigned int new)
                : "cc");
 }
 
-static inline void cspg(unsigned long *ptr, unsigned long old, unsigned long new)
+/**
+ * cspg() - Compare and Swap and Purge (CSPG)
+ * @ptr: Pointer to the value to be exchanged
+ * @old: The expected old value
+ * @new: The new value
+ *
+ * Return: True if compare and swap was successful, otherwise false.
+ */
+static inline bool cspg(unsigned long *ptr, unsigned long old, unsigned long new)
 {
        union register_pair r1 = { .even = old, .odd = new, };
        unsigned long address = (unsigned long)ptr | 1;
@@ -619,6 +627,7 @@ static inline void cspg(unsigned long *ptr, unsigned long old, unsigned long new
                : [r1] "+&d" (r1.pair), "+m" (*ptr)
                : [address] "d" (address)
                : "cc");
+       return old == r1.even;
 }
 
 #define CRDTE_DTT_PAGE         0x00UL
@@ -627,7 +636,18 @@ static inline void cspg(unsigned long *ptr, unsigned long old, unsigned long new
 #define CRDTE_DTT_REGION2      0x18UL
 #define CRDTE_DTT_REGION1      0x1cUL
 
-static inline void crdte(unsigned long old, unsigned long new,
+/**
+ * crdte() - Compare and Replace DAT Table Entry
+ * @old:     The expected old value
+ * @new:     The new value
+ * @table:   Pointer to the value to be exchanged
+ * @dtt:     Table type of the table to be exchanged
+ * @address: The address mapped by the entry to be replaced
+ * @asce:    The ASCE of this entry
+ *
+ * Return: True if compare and replace was successful, otherwise false.
+ */
+static inline bool crdte(unsigned long old, unsigned long new,
                         unsigned long *table, unsigned long dtt,
                         unsigned long address, unsigned long asce)
 {
@@ -638,6 +658,7 @@ static inline void crdte(unsigned long old, unsigned long new,
                     : [r1] "+&d" (r1.pair)
                     : [r2] "d" (r2.pair), [asce] "a" (asce)
                     : "memory", "cc");
+       return old == r1.even;
 }
 
 /*