@@ -1819,6 +1819,9 @@ static void __perf_event_read_size(struct perf_event *event, int nr_siblings)
1819
1819
if (event -> attr .read_format & PERF_FORMAT_ID )
1820
1820
entry += sizeof (u64 );
1821
1821
1822
+ if (event -> attr .read_format & PERF_FORMAT_LOST )
1823
+ entry += sizeof (u64 );
1824
+
1822
1825
if (event -> attr .read_format & PERF_FORMAT_GROUP ) {
1823
1826
nr += nr_siblings ;
1824
1827
size += sizeof (u64 );
@@ -5260,11 +5263,15 @@ static int __perf_read_group_add(struct perf_event *leader,
5260
5263
values [n ++ ] += perf_event_count (leader );
5261
5264
if (read_format & PERF_FORMAT_ID )
5262
5265
values [n ++ ] = primary_event_id (leader );
5266
+ if (read_format & PERF_FORMAT_LOST )
5267
+ values [n ++ ] = atomic64_read (& leader -> lost_samples );
5263
5268
5264
5269
for_each_sibling_event (sub , leader ) {
5265
5270
values [n ++ ] += perf_event_count (sub );
5266
5271
if (read_format & PERF_FORMAT_ID )
5267
5272
values [n ++ ] = primary_event_id (sub );
5273
+ if (read_format & PERF_FORMAT_LOST )
5274
+ values [n ++ ] = atomic64_read (& sub -> lost_samples );
5268
5275
}
5269
5276
5270
5277
raw_spin_unlock_irqrestore (& ctx -> lock , flags );
@@ -5321,7 +5328,7 @@ static int perf_read_one(struct perf_event *event,
5321
5328
u64 read_format , char __user * buf )
5322
5329
{
5323
5330
u64 enabled , running ;
5324
- u64 values [4 ];
5331
+ u64 values [5 ];
5325
5332
int n = 0 ;
5326
5333
5327
5334
values [n ++ ] = __perf_event_read_value (event , & enabled , & running );
@@ -5331,6 +5338,8 @@ static int perf_read_one(struct perf_event *event,
5331
5338
values [n ++ ] = running ;
5332
5339
if (read_format & PERF_FORMAT_ID )
5333
5340
values [n ++ ] = primary_event_id (event );
5341
+ if (read_format & PERF_FORMAT_LOST )
5342
+ values [n ++ ] = atomic64_read (& event -> lost_samples );
5334
5343
5335
5344
if (copy_to_user (buf , values , n * sizeof (u64 )))
5336
5345
return - EFAULT ;
@@ -6858,7 +6867,7 @@ static void perf_output_read_one(struct perf_output_handle *handle,
6858
6867
u64 enabled , u64 running )
6859
6868
{
6860
6869
u64 read_format = event -> attr .read_format ;
6861
- u64 values [4 ];
6870
+ u64 values [5 ];
6862
6871
int n = 0 ;
6863
6872
6864
6873
values [n ++ ] = perf_event_count (event );
@@ -6872,6 +6881,8 @@ static void perf_output_read_one(struct perf_output_handle *handle,
6872
6881
}
6873
6882
if (read_format & PERF_FORMAT_ID )
6874
6883
values [n ++ ] = primary_event_id (event );
6884
+ if (read_format & PERF_FORMAT_LOST )
6885
+ values [n ++ ] = atomic64_read (& event -> lost_samples );
6875
6886
6876
6887
__output_copy (handle , values , n * sizeof (u64 ));
6877
6888
}
@@ -6882,7 +6893,7 @@ static void perf_output_read_group(struct perf_output_handle *handle,
6882
6893
{
6883
6894
struct perf_event * leader = event -> group_leader , * sub ;
6884
6895
u64 read_format = event -> attr .read_format ;
6885
- u64 values [5 ];
6896
+ u64 values [6 ];
6886
6897
int n = 0 ;
6887
6898
6888
6899
values [n ++ ] = 1 + leader -> nr_siblings ;
@@ -6900,6 +6911,8 @@ static void perf_output_read_group(struct perf_output_handle *handle,
6900
6911
values [n ++ ] = perf_event_count (leader );
6901
6912
if (read_format & PERF_FORMAT_ID )
6902
6913
values [n ++ ] = primary_event_id (leader );
6914
+ if (read_format & PERF_FORMAT_LOST )
6915
+ values [n ++ ] = atomic64_read (& leader -> lost_samples );
6903
6916
6904
6917
__output_copy (handle , values , n * sizeof (u64 ));
6905
6918
@@ -6913,6 +6926,8 @@ static void perf_output_read_group(struct perf_output_handle *handle,
6913
6926
values [n ++ ] = perf_event_count (sub );
6914
6927
if (read_format & PERF_FORMAT_ID )
6915
6928
values [n ++ ] = primary_event_id (sub );
6929
+ if (read_format & PERF_FORMAT_LOST )
6930
+ values [n ++ ] = atomic64_read (& sub -> lost_samples );
6916
6931
6917
6932
__output_copy (handle , values , n * sizeof (u64 ));
6918
6933
}
0 commit comments