Patch "perf tools: Use readdir() instead of deprecated readdir_r() again" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf tools: Use readdir() instead of deprecated readdir_r() again
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-tools-use-readdir-instead-of-deprecated-readdir_r-again.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
22a9f41b555673e7499b97acf3ffb07bf0af31adMon Sep 17 00:00:00 2001
From: Arnaldo Carvalho de Melo <[email protected]>
Date: Fri, 8 Apr 2016 11:53:02 -0300
Subject: perf tools: Use readdir() instead of deprecated readdir_r() again
From: Arnaldo Carvalho de Melo <[email protected]>
commit 22a9f41b555673e7499b97acf3ffb07bf0af31ad upstream.
The readdir() function is thread safe as long as just one thread uses a DIR, which is the case when parsing tracepoint event definitions, to avoid breaking the build with glibc-2.23.90 (upcoming 2.24), use it instead of readdir_r().
See: http://man7.org/linux/man-pages/man3/readdir.3.html
"However, in modern implementations (including the glibc implementation), concurrent calls to readdir() that specify different directory streams are thread-safe. In cases where multiple threads must read from the same directory stream, using readdir() with external synchronization is still preferable to the use of the deprecated readdir_r(3) function."
Noticed while building on a Fedora Rawhide docker container.
--- tools/perf/util/parse-events.c | 60 ++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-)
tools/perf/util/parse-events.c +30 -30
@@ -138,11 +138,11 @@ struct event_symbol event_symbols_sw[PER#define PERF_EVENT_TYPE (config) __PERF_EVENT_FIELD(config, TYPE)#define PERF_EVENT_ID (config) __PERF_EVENT_FIELD(config, EVENT) -#define for_each_subsystem (sys_dir, sys_dirent, sys_next) \ - while (!readdir_r(sys_dir, &sys_dirent, &sys_next) && sys_next) \ - if (sys_dirent.d_type == DT_DIR && \ - (strcmp(sys_dirent.d_name, ".")) && \ - (strcmp(sys_dirent.d_name, ".."))) +#define for_each_subsystem (sys_dir, sys_dirent) \ + while ((sys_dirent = readdir(sys_dir)) != NULL) \ + if (sys_dirent->d_type == DT_DIR && \ + (strcmp(sys_dirent->d_name, ".")) && \ + (strcmp(sys_dirent->d_name, "..")))static int tp_event_has_id (struct dirent *sys_dir,struct dirent *evt_dir) {
@@ -159,12 +159,12 @@ static int tp_event_has_id(struct direntreturn 0 ; } -#define for_each_event (sys_dirent, evt_dir, evt_dirent, evt_next) \ - while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next) \ - if (evt_dirent.d_type == DT_DIR && \ - (strcmp(evt_dirent.d_name, ".")) && \ - (strcmp(evt_dirent.d_name, "..")) && \ - (!tp_event_has_id(&sys_dirent, &evt_dirent))) +#define for_each_event (sys_dirent, evt_dir, evt_dirent) \ + while ((evt_dirent = readdir(evt_dir)) != NULL) \ + if (evt_dirent->d_type == DT_DIR && \ + (strcmp(evt_dirent->d_name, ".")) && \ + (strcmp(evt_dirent->d_name, "..")) && \ + (!tp_event_has_id(sys_dirent, evt_dirent)))#define MAX_EVENT_LENGTH 512
@@ -173,7 +173,7 @@ struct tracepoint_path *tracepoint_id_to {struct tracepoint_path *path =NULL ;DIR *sys_dir, *evt_dir; -struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; +struct dirent *sys_dirent, *evt_dirent;char id_buf[24 ];int fd;u64 id;
@@ -184,18 +184,18 @@ struct tracepoint_path *tracepoint_id_toif (!sys_dir)return NULL ; -for_each_subsystem (sys_dir, sys_dirent, sys_next) { +for_each_subsystem (sys_dir, sys_dirent) {snprintf (dir_path,MAXPATHLEN ,"%s/%s" , tracing_events_path, - sys_dirent.d_name); + sys_dirent->d_name); evt_dir =opendir (dir_path);if (!evt_dir)continue ; -for_each_event (sys_dirent, evt_dir, evt_dirent, evt_next) { +for_each_event (sys_dirent, evt_dir, evt_dirent) {snprintf (evt_path,MAXPATHLEN ,"%s/%s/id" , dir_path, - evt_dirent.d_name); + evt_dirent->d_name); fd =open (evt_path,O_RDONLY );if (fd <0 )continue ;
@@ -220,9 +220,9 @@ struct tracepoint_path *tracepoint_id_tofree (path);return NULL ; } -strncpy (path->system, sys_dirent.d_name, +strncpy (path->system, sys_dirent->d_name,MAX_EVENT_LENGTH ); -strncpy (path->name, evt_dirent.d_name, +strncpy (path->name, evt_dirent->d_name,MAX_EVENT_LENGTH );return path; }
@@ -1629,7 +1629,7 @@ void print_tracepoint_events(const char bool name_only) {DIR *sys_dir, *evt_dir; -struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; +struct dirent *sys_dirent, *evt_dirent;char evt_path[MAXPATHLEN ];char dir_path[MAXPATHLEN ];char **evt_list =NULL ;
@@ -1647,20 +1647,20 @@ restart: goto out_close_sys_dir; } -for_each_subsystem (sys_dir, sys_dirent, sys_next) { +for_each_subsystem (sys_dir, sys_dirent) {if (subsys_glob !=NULL && - !strglobmatch (sys_dirent.d_name, subsys_glob)) + !strglobmatch (sys_dirent->d_name, subsys_glob))continue ;snprintf (dir_path,MAXPATHLEN ,"%s/%s" , tracing_events_path, - sys_dirent.d_name); + sys_dirent->d_name); evt_dir =opendir (dir_path);if (!evt_dir)continue ; -for_each_event (sys_dirent, evt_dir, evt_dirent, evt_next) { +for_each_event (sys_dirent, evt_dir, evt_dirent) {if (event_glob !=NULL && - !strglobmatch (evt_dirent.d_name, event_glob)) + !strglobmatch (evt_dirent->d_name, event_glob))continue ;if (!evt_num_known) {
@@ -1669,7 +1669,7 @@ restart: }snprintf (evt_path,MAXPATHLEN ,"%s:%s" , - sys_dirent.d_name, evt_dirent.d_name); + sys_dirent->d_name, evt_dirent->d_name); evt_list[evt_i] =strdup (evt_path);if (evt_list[evt_i] ==NULL )
@@ -1722,7 +1722,7 @@ out_close_sys_dir:int is_valid_tracepoint (const char *event_string) {DIR *sys_dir, *evt_dir; -struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent; +struct dirent *sys_dirent, *evt_dirent;char evt_path[MAXPATHLEN ];char dir_path[MAXPATHLEN ];
@@ -1730,17 +1730,17 @@ int is_valid_tracepoint(const char *evenif (!sys_dir)return 0 ; -for_each_subsystem (sys_dir, sys_dirent, sys_next) { +for_each_subsystem (sys_dir, sys_dirent) {snprintf (dir_path,MAXPATHLEN ,"%s/%s" , tracing_events_path, - sys_dirent.d_name); + sys_dirent->d_name); evt_dir =opendir (dir_path);if (!evt_dir)continue ; -for_each_event (sys_dirent, evt_dir, evt_dirent, evt_next) { +for_each_event (sys_dirent, evt_dir, evt_dirent) {snprintf (evt_path,MAXPATHLEN ,"%s:%s" , - sys_dirent.d_name, evt_dirent.d_name); + sys_dirent->d_name, evt_dirent->d_name);if (!strcmp (evt_path, event_string)) {closedir (evt_dir);closedir (sys_dir);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/perf-tools-use-readdir-instead-of-deprecated-readdir_r.patch queue-4.4/perf-thread_map-correctly-size-buffer-used-with-dirent-dt_name.patch queue-4.4/perf-tests-remove-wrong-semicolon-in-while-loop-in-cqm-test.patch queue-4.4/perf-annotate-browser-fix-behaviour-of-shift-tab-with-nothing-focussed.patch queue-4.4/perf-tests-avoid-possible-truncation-with-dirent-d_name-snprintf.patch queue-4.4/perf-top-use-__fallthrough.patch queue-4.4/perf-scripting-perl-fix-compile-error-with-some-perl5-versions.patch queue-4.4/perf-bench-numa-avoid-possible-truncation-when-using-snprintf.patch queue-4.4/perf-tools-use-readdir-instead-of-deprecated-readdir_r-again.patch queue-4.4/perf-thread_map-use-readdir-instead-of-deprecated-readdir_r.patch queue-4.4/perf-tools-remove-duplicate-const-qualifier.patch queue-4.4/tools-string-use-__fallthrough-in-perf_atoll.patch queue-4.4/perf-intel-pt-use-__fallthrough.patch queue-4.4/perf-script-use-readdir-instead-of-deprecated-readdir_r.patch queue-4.4/tools-include-add-a-__fallthrough-statement.patch queue-4.4/tools-strfilter-use-__fallthrough.patch queue-4.4/perf-dwarf-guard-x86_64-definitions-under-ifdef-else-clause.patch queue-4.4/perf-pmu-fix-misleadingly-indented-assignment-whitespace.patch queue-4.4/perf-trace-do-not-process-perf_record_lost-twice.patch