Skip to content

Commit 5618c53

Browse files
committed
KVM: s390: Use try_cmpxchg() instead of cmpxchg() loops
Convert all cmpxchg() loops to try_cmpxchg() loops. With gcc 14 and the usage of flag output operands in try_cmpxchg() this allows the compiler to generate slightly better code. Acked-by: Claudio Imbrenda <[email protected]> Acked-by: Janosch Frank <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Heiko Carstens <[email protected]>
1 parent 7726b55 commit 5618c53

File tree

4 files changed

+18
-19
lines changed

4 files changed

+18
-19
lines changed

arch/s390/kvm/gaccess.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,16 @@ static void ipte_lock_simple(struct kvm *kvm)
129129
retry:
130130
read_lock(&kvm->arch.sca_lock);
131131
ic = kvm_s390_get_ipte_control(kvm);
132+
old = READ_ONCE(*ic);
132133
do {
133-
old = READ_ONCE(*ic);
134134
if (old.k) {
135135
read_unlock(&kvm->arch.sca_lock);
136136
cond_resched();
137137
goto retry;
138138
}
139139
new = old;
140140
new.k = 1;
141-
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
141+
} while (!try_cmpxchg(&ic->val, &old.val, new.val));
142142
read_unlock(&kvm->arch.sca_lock);
143143
out:
144144
mutex_unlock(&kvm->arch.ipte_mutex);
@@ -154,11 +154,11 @@ static void ipte_unlock_simple(struct kvm *kvm)
154154
goto out;
155155
read_lock(&kvm->arch.sca_lock);
156156
ic = kvm_s390_get_ipte_control(kvm);
157+
old = READ_ONCE(*ic);
157158
do {
158-
old = READ_ONCE(*ic);
159159
new = old;
160160
new.k = 0;
161-
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
161+
} while (!try_cmpxchg(&ic->val, &old.val, new.val));
162162
read_unlock(&kvm->arch.sca_lock);
163163
wake_up(&kvm->arch.ipte_wq);
164164
out:
@@ -172,8 +172,8 @@ static void ipte_lock_siif(struct kvm *kvm)
172172
retry:
173173
read_lock(&kvm->arch.sca_lock);
174174
ic = kvm_s390_get_ipte_control(kvm);
175+
old = READ_ONCE(*ic);
175176
do {
176-
old = READ_ONCE(*ic);
177177
if (old.kg) {
178178
read_unlock(&kvm->arch.sca_lock);
179179
cond_resched();
@@ -182,7 +182,7 @@ static void ipte_lock_siif(struct kvm *kvm)
182182
new = old;
183183
new.k = 1;
184184
new.kh++;
185-
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
185+
} while (!try_cmpxchg(&ic->val, &old.val, new.val));
186186
read_unlock(&kvm->arch.sca_lock);
187187
}
188188

@@ -192,13 +192,13 @@ static void ipte_unlock_siif(struct kvm *kvm)
192192

193193
read_lock(&kvm->arch.sca_lock);
194194
ic = kvm_s390_get_ipte_control(kvm);
195+
old = READ_ONCE(*ic);
195196
do {
196-
old = READ_ONCE(*ic);
197197
new = old;
198198
new.kh--;
199199
if (!new.kh)
200200
new.k = 0;
201-
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
201+
} while (!try_cmpxchg(&ic->val, &old.val, new.val));
202202
read_unlock(&kvm->arch.sca_lock);
203203
if (!new.kh)
204204
wake_up(&kvm->arch.ipte_wq);

arch/s390/kvm/interrupt.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,12 @@ static inline int gisa_set_iam(struct kvm_s390_gisa *gisa, u8 iam)
247247
{
248248
u64 word, _word;
249249

250+
word = READ_ONCE(gisa->u64.word[0]);
250251
do {
251-
word = READ_ONCE(gisa->u64.word[0]);
252252
if ((u64)gisa != word >> 32)
253253
return -EBUSY;
254254
_word = (word & ~0xffUL) | iam;
255-
} while (cmpxchg(&gisa->u64.word[0], word, _word) != word);
255+
} while (!try_cmpxchg(&gisa->u64.word[0], &word, _word));
256256

257257
return 0;
258258
}
@@ -270,10 +270,10 @@ static inline void gisa_clear_ipm(struct kvm_s390_gisa *gisa)
270270
{
271271
u64 word, _word;
272272

273+
word = READ_ONCE(gisa->u64.word[0]);
273274
do {
274-
word = READ_ONCE(gisa->u64.word[0]);
275275
_word = word & ~(0xffUL << 24);
276-
} while (cmpxchg(&gisa->u64.word[0], word, _word) != word);
276+
} while (!try_cmpxchg(&gisa->u64.word[0], &word, _word));
277277
}
278278

279279
/**
@@ -291,14 +291,14 @@ static inline u8 gisa_get_ipm_or_restore_iam(struct kvm_s390_gisa_interrupt *gi)
291291
u8 pending_mask, alert_mask;
292292
u64 word, _word;
293293

294+
word = READ_ONCE(gi->origin->u64.word[0]);
294295
do {
295-
word = READ_ONCE(gi->origin->u64.word[0]);
296296
alert_mask = READ_ONCE(gi->alert.mask);
297297
pending_mask = (u8)(word >> 24) & alert_mask;
298298
if (pending_mask)
299299
return pending_mask;
300300
_word = (word & ~0xffUL) | alert_mask;
301-
} while (cmpxchg(&gi->origin->u64.word[0], word, _word) != word);
301+
} while (!try_cmpxchg(&gi->origin->u64.word[0], &word, _word));
302302

303303
return 0;
304304
}

arch/s390/kvm/kvm-s390.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,11 +1907,11 @@ static void kvm_s390_update_topology_change_report(struct kvm *kvm, bool val)
19071907

19081908
read_lock(&kvm->arch.sca_lock);
19091909
sca = kvm->arch.sca;
1910+
old = READ_ONCE(sca->utility);
19101911
do {
1911-
old = READ_ONCE(sca->utility);
19121912
new = old;
19131913
new.mtcr = val;
1914-
} while (cmpxchg(&sca->utility.val, old.val, new.val) != old.val);
1914+
} while (!try_cmpxchg(&sca->utility.val, &old.val, new.val));
19151915
read_unlock(&kvm->arch.sca_lock);
19161916
}
19171917

arch/s390/kvm/pci.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,12 @@ static inline int account_mem(unsigned long nr_pages)
208208

209209
page_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
210210

211+
cur_pages = atomic_long_read(&user->locked_vm);
211212
do {
212-
cur_pages = atomic_long_read(&user->locked_vm);
213213
new_pages = cur_pages + nr_pages;
214214
if (new_pages > page_limit)
215215
return -ENOMEM;
216-
} while (atomic_long_cmpxchg(&user->locked_vm, cur_pages,
217-
new_pages) != cur_pages);
216+
} while (!atomic_long_try_cmpxchg(&user->locked_vm, &cur_pages, new_pages));
218217

219218
atomic64_add(nr_pages, &current->mm->pinned_vm);
220219

0 commit comments

Comments
 (0)