perf cgroup: Make the cgroup name be const char *
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 3b5692864da3a8dec95d8c757147f436d19f8ff7 Gitweb: https://git.kernel.org/tip/3b5692864da3a8dec95d8c757147f436d19f8ff7 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 6 Mar 2018 15:53:22 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 7 Mar 2018 10:22:26 -0300
perf cgroup: Make the cgroup name be const char *
The usual thing is for a constructor to allocate space for its members, not to require that the caller pass a pre-allocated 'name' and then, at its destructor, to free something not allocated by it.
Fix it by making cgroup__new() to receive a const char pointer, then allocate cgroup->name that then can continue to be freed at cgroup__delete(), balancing the alloc/free operations inside the cgroup struct methods.
This eases calling evlist__findnew_cgroup() from the custom 'perf trace' cgroup parser, that will only call parse_cgroups() when the '-G cgroup' is passed on the command line after '-e event' entries, when it'll behave just like 'perf stat' and 'perf record', i.e. the previous parse_cgroup() users that mandate that -G only can come after a -e.
--- tools/perf/util/cgroup.c | 24 ++++++++++++++---------- tools/perf/util/cgroup.h | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-)
tools/perf/util/cgroup.c +14 -10
@@ -71,7 +71,7 @@ cgroupfs_find_mountpoint(char *buf, size_t maxlen)return -1 ; } -static int open_cgroup (char *name) +static int open_cgroup (const char *name) {char path[PATH_MAX +1 ];char mnt[PATH_MAX +1 ];
@@ -90,7 +90,7 @@ static int open_cgroup(char *name)return fd; } -static struct cgroup *evlist__find_cgroup (struct perf_evlist *evlist,char *str) +static struct cgroup *evlist__find_cgroup (struct perf_evlist *evlist,const char *str) {struct perf_evsel *counter;struct cgroup *cgrp =NULL ;
@@ -109,33 +109,38 @@ static struct cgroup *evlist__find_cgroup(struct perf_evlist *evlist, char *str)return cgrp; } -static struct cgroup *cgroup__new (char *name) +static struct cgroup *cgroup__new (const char *name) {struct cgroup *cgroup =zalloc (sizeof (*cgroup));if (cgroup !=NULL ) { - cgroup->name = name;refcount_set (&cgroup->refcnt,1 ); + cgroup->name =strdup (name); +if (!cgroup->name) + goto out_err; cgroup->fd =open_cgroup (name);if (cgroup->fd ==-1 ) - goto out_err; + goto out_free_name; }return cgroup; + +out_free_name: +free (cgroup->name); out_err:free (cgroup);return NULL ; } -struct cgroup *evlist__findnew_cgroup (struct perf_evlist *evlist,char *name) +struct cgroup *evlist__findnew_cgroup (struct perf_evlist *evlist,const char *name) {struct cgroup *cgroup =evlist__find_cgroup (evlist, name);return cgroup ?:cgroup__new (name); } -static int add_cgroup (struct perf_evlist *evlist,char *str) +static int add_cgroup (struct perf_evlist *evlist,const char *str) {struct perf_evsel *counter;struct cgroup *cgrp =evlist__findnew_cgroup (evlist, str);
@@ -222,10 +227,9 @@ int parse_cgroups(const struct option *opt, const char *str,if (!s)return -1 ; ret =add_cgroup (evlist, s); -if (ret) { -free (s); +free (s); +if (ret)return -1 ; - } }/* nr_cgroups is increased een for empty cgroups */ nr_cgroups++;
tools/perf/util/cgroup.h +1 -1
@@ -20,7 +20,7 @@ void cgroup__put(struct cgroup *cgroup);struct perf_evlist ; -struct cgroup *evlist__findnew_cgroup (struct perf_evlist *evlist,char *name); +struct cgroup *evlist__findnew_cgroup (struct perf_evlist *evlist,const char *name);void evlist__set_default_cgroup (struct perf_evlist *evlist,struct cgroup *cgroup);