@@ -1188,8 +1188,8 @@ static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt,
1188
1188
static void hw_perf_event_update (struct perf_event * event , int flush_all )
1189
1189
{
1190
1190
unsigned long long event_overflow , sampl_overflow , num_sdb ;
1191
- union hws_trailer_header old , prev , new ;
1192
1191
struct hw_perf_event * hwc = & event -> hw ;
1192
+ union hws_trailer_header prev , new ;
1193
1193
struct hws_trailer_entry * te ;
1194
1194
unsigned long * sdbt , sdb ;
1195
1195
int done ;
@@ -1233,13 +1233,11 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
1233
1233
/* Reset trailer (using compare-double-and-swap) */
1234
1234
prev .val = READ_ONCE_ALIGNED_128 (te -> header .val );
1235
1235
do {
1236
- old .val = prev .val ;
1237
1236
new .val = prev .val ;
1238
1237
new .f = 0 ;
1239
1238
new .a = 1 ;
1240
1239
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 ));
1243
1241
1244
1242
/* Advance to next sample-data-block */
1245
1243
sdbt ++ ;
@@ -1405,16 +1403,15 @@ static int aux_output_begin(struct perf_output_handle *handle,
1405
1403
static bool aux_set_alert (struct aux_buffer * aux , unsigned long alert_index ,
1406
1404
unsigned long long * overflow )
1407
1405
{
1408
- union hws_trailer_header old , prev , new ;
1406
+ union hws_trailer_header prev , new ;
1409
1407
struct hws_trailer_entry * te ;
1410
1408
1411
1409
te = aux_sdb_trailer (aux , alert_index );
1412
1410
prev .val = READ_ONCE_ALIGNED_128 (te -> header .val );
1413
1411
do {
1414
- old .val = prev .val ;
1415
1412
new .val = prev .val ;
1416
- * overflow = old .overflow ;
1417
- if (old .f ) {
1413
+ * overflow = prev .overflow ;
1414
+ if (prev .f ) {
1418
1415
/*
1419
1416
* SDB is already set by hardware.
1420
1417
* Abort and try to set somewhere
@@ -1424,8 +1421,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
1424
1421
}
1425
1422
new .a = 1 ;
1426
1423
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 ));
1429
1425
return true;
1430
1426
}
1431
1427
@@ -1454,7 +1450,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
1454
1450
static bool aux_reset_buffer (struct aux_buffer * aux , unsigned long range ,
1455
1451
unsigned long long * overflow )
1456
1452
{
1457
- union hws_trailer_header old , prev , new ;
1453
+ union hws_trailer_header prev , new ;
1458
1454
unsigned long i , range_scan , idx ;
1459
1455
unsigned long long orig_overflow ;
1460
1456
struct hws_trailer_entry * te ;
@@ -1486,17 +1482,15 @@ static bool aux_reset_buffer(struct aux_buffer *aux, unsigned long range,
1486
1482
te = aux_sdb_trailer (aux , idx );
1487
1483
prev .val = READ_ONCE_ALIGNED_128 (te -> header .val );
1488
1484
do {
1489
- old .val = prev .val ;
1490
1485
new .val = prev .val ;
1491
- orig_overflow = old .overflow ;
1486
+ orig_overflow = prev .overflow ;
1492
1487
new .f = 0 ;
1493
1488
new .overflow = 0 ;
1494
1489
if (idx == aux -> alert_mark )
1495
1490
new .a = 1 ;
1496
1491
else
1497
1492
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 ));
1500
1494
* overflow += orig_overflow ;
1501
1495
}
1502
1496
0 commit comments