@@ -57,7 +57,7 @@ static int evlist__count_evsel_fds(struct evlist *evlist)
57
57
return cnt ;
58
58
}
59
59
60
- static struct evlist * bench__create_evlist (char * evstr )
60
+ static struct evlist * bench__create_evlist (char * evstr , const char * uid_str )
61
61
{
62
62
struct parse_events_error err ;
63
63
struct evlist * evlist = evlist__new ();
@@ -78,6 +78,18 @@ static struct evlist *bench__create_evlist(char *evstr)
78
78
goto out_delete_evlist ;
79
79
}
80
80
parse_events_error__exit (& err );
81
+ if (uid_str ) {
82
+ uid_t uid = parse_uid (uid_str );
83
+
84
+ if (uid == UINT_MAX ) {
85
+ pr_err ("Invalid User: %s" , uid_str );
86
+ ret = - EINVAL ;
87
+ goto out_delete_evlist ;
88
+ }
89
+ ret = parse_uid_filter (evlist , uid );
90
+ if (ret )
91
+ goto out_delete_evlist ;
92
+ }
81
93
ret = evlist__create_maps (evlist , & opts .target );
82
94
if (ret < 0 ) {
83
95
pr_err ("Not enough memory to create thread/cpu maps\n" );
@@ -117,10 +129,10 @@ static int bench__do_evlist_open_close(struct evlist *evlist)
117
129
return 0 ;
118
130
}
119
131
120
- static int bench_evlist_open_close__run (char * evstr )
132
+ static int bench_evlist_open_close__run (char * evstr , const char * uid_str )
121
133
{
122
134
// used to print statistics only
123
- struct evlist * evlist = bench__create_evlist (evstr );
135
+ struct evlist * evlist = bench__create_evlist (evstr , uid_str );
124
136
double time_average , time_stddev ;
125
137
struct timeval start , end , diff ;
126
138
struct stats time_stats ;
@@ -142,7 +154,7 @@ static int bench_evlist_open_close__run(char *evstr)
142
154
143
155
for (i = 0 ; i < iterations ; i ++ ) {
144
156
pr_debug ("Started iteration %d\n" , i );
145
- evlist = bench__create_evlist (evstr );
157
+ evlist = bench__create_evlist (evstr , uid_str );
146
158
if (!evlist )
147
159
return - ENOMEM ;
148
160
@@ -206,6 +218,7 @@ static char *bench__repeat_event_string(const char *evstr, int n)
206
218
207
219
int bench_evlist_open_close (int argc , const char * * argv )
208
220
{
221
+ const char * uid_str = NULL ;
209
222
const struct option options [] = {
210
223
OPT_STRING ('e' , "event" , & event_string , "event" ,
211
224
"event selector. use 'perf list' to list available events" ),
@@ -221,7 +234,7 @@ int bench_evlist_open_close(int argc, const char **argv)
221
234
"record events on existing process id" ),
222
235
OPT_STRING ('t' , "tid" , & opts .target .tid , "tid" ,
223
236
"record events on existing thread id" ),
224
- OPT_STRING ('u' , "uid" , & opts . target . uid_str , "user" , "user to profile" ),
237
+ OPT_STRING ('u' , "uid" , & uid_str , "user" , "user to profile" ),
225
238
OPT_BOOLEAN (0 , "per-thread" , & opts .target .per_thread , "use per-thread mmaps" ),
226
239
OPT_END ()
227
240
};
@@ -245,23 +258,16 @@ int bench_evlist_open_close(int argc, const char **argv)
245
258
goto out ;
246
259
}
247
260
248
- err = target__parse_uid (& opts .target );
249
- if (err ) {
250
- target__strerror (& opts .target , err , errbuf , sizeof (errbuf ));
251
- pr_err ("%s" , errbuf );
252
- goto out ;
253
- }
254
-
255
- /* Enable ignoring missing threads when -u/-p option is defined. */
256
- opts .ignore_missing_thread = opts .target .uid != UINT_MAX || opts .target .pid ;
261
+ /* Enable ignoring missing threads when -p option is defined. */
262
+ opts .ignore_missing_thread = opts .target .pid ;
257
263
258
264
evstr = bench__repeat_event_string (event_string , nr_events );
259
265
if (!evstr ) {
260
266
err = - ENOMEM ;
261
267
goto out ;
262
268
}
263
269
264
- err = bench_evlist_open_close__run (evstr );
270
+ err = bench_evlist_open_close__run (evstr , uid_str );
265
271
266
272
free (evstr );
267
273
out :
0 commit comments