Skip to content

Commit e449399

Browse files
committed
s390/perf_cpum_sf: Convert to use try_cmpxchg128()
Convert cmpxchg128() usages to try_cmpxchg128() in order to generate slightly better code. Reviewed-by: Juergen Christ <[email protected]> Signed-off-by: Heiko Carstens <[email protected]>
1 parent b59f103 commit e449399

File tree

1 file changed

+9
-15
lines changed

1 file changed

+9
-15
lines changed

arch/s390/kernel/perf_cpum_sf.c

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,8 +1188,8 @@ static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt,
11881188
static void hw_perf_event_update(struct perf_event *event, int flush_all)
11891189
{
11901190
unsigned long long event_overflow, sampl_overflow, num_sdb;
1191-
union hws_trailer_header old, prev, new;
11921191
struct hw_perf_event *hwc = &event->hw;
1192+
union hws_trailer_header prev, new;
11931193
struct hws_trailer_entry *te;
11941194
unsigned long *sdbt, sdb;
11951195
int done;
@@ -1233,13 +1233,11 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
12331233
/* Reset trailer (using compare-double-and-swap) */
12341234
prev.val = READ_ONCE_ALIGNED_128(te->header.val);
12351235
do {
1236-
old.val = prev.val;
12371236
new.val = prev.val;
12381237
new.f = 0;
12391238
new.a = 1;
12401239
new.overflow = 0;
1241-
prev.val = cmpxchg128(&te->header.val, old.val, new.val);
1242-
} while (prev.val != old.val);
1240+
} while (!try_cmpxchg128(&te->header.val, &prev.val, new.val));
12431241

12441242
/* Advance to next sample-data-block */
12451243
sdbt++;
@@ -1405,16 +1403,15 @@ static int aux_output_begin(struct perf_output_handle *handle,
14051403
static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
14061404
unsigned long long *overflow)
14071405
{
1408-
union hws_trailer_header old, prev, new;
1406+
union hws_trailer_header prev, new;
14091407
struct hws_trailer_entry *te;
14101408

14111409
te = aux_sdb_trailer(aux, alert_index);
14121410
prev.val = READ_ONCE_ALIGNED_128(te->header.val);
14131411
do {
1414-
old.val = prev.val;
14151412
new.val = prev.val;
1416-
*overflow = old.overflow;
1417-
if (old.f) {
1413+
*overflow = prev.overflow;
1414+
if (prev.f) {
14181415
/*
14191416
* SDB is already set by hardware.
14201417
* Abort and try to set somewhere
@@ -1424,8 +1421,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
14241421
}
14251422
new.a = 1;
14261423
new.overflow = 0;
1427-
prev.val = cmpxchg128(&te->header.val, old.val, new.val);
1428-
} while (prev.val != old.val);
1424+
} while (!try_cmpxchg128(&te->header.val, &prev.val, new.val));
14291425
return true;
14301426
}
14311427

@@ -1454,7 +1450,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
14541450
static bool aux_reset_buffer(struct aux_buffer *aux, unsigned long range,
14551451
unsigned long long *overflow)
14561452
{
1457-
union hws_trailer_header old, prev, new;
1453+
union hws_trailer_header prev, new;
14581454
unsigned long i, range_scan, idx;
14591455
unsigned long long orig_overflow;
14601456
struct hws_trailer_entry *te;
@@ -1486,17 +1482,15 @@ static bool aux_reset_buffer(struct aux_buffer *aux, unsigned long range,
14861482
te = aux_sdb_trailer(aux, idx);
14871483
prev.val = READ_ONCE_ALIGNED_128(te->header.val);
14881484
do {
1489-
old.val = prev.val;
14901485
new.val = prev.val;
1491-
orig_overflow = old.overflow;
1486+
orig_overflow = prev.overflow;
14921487
new.f = 0;
14931488
new.overflow = 0;
14941489
if (idx == aux->alert_mark)
14951490
new.a = 1;
14961491
else
14971492
new.a = 0;
1498-
prev.val = cmpxchg128(&te->header.val, old.val, new.val);
1499-
} while (prev.val != old.val);
1493+
} while (!try_cmpxchg128(&te->header.val, &prev.val, new.val));
15001494
*overflow += orig_overflow;
15011495
}
15021496

0 commit comments

Comments
 (0)