diff options
author | Jiri Olsa <jolsa@kernel.org> | 2015-02-05 09:40:25 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-03-21 13:53:41 -0400 |
commit | 3c8a67f50a1e68b912d1d74db6b455cac54ec4b4 (patch) | |
tree | 1d03faa7eaa676cf7eefa53f2f938409929dee72 /tools/perf/util/dso.c | |
parent | 80a32e5b498a7547073e5e4b2b804edc7219979d (diff) |
perf tools: Add kmod_path__parse function
Provides united way of parsing kernel module path
into several components.
The new kmod_path__parse function and few defines:
int __kmod_path__parse(struct kmod_path *m, const char *path,
bool alloc_name, bool alloc_ext);
#define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false, false)
#define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true , false)
#define kmod_path__parse_ext(__m, __p) __kmod_path__parse(__m, __p, false, true)
parse kernel module @path and updates @m argument like:
@comp - true if @path contains supported compression suffix,
false otherwise
@kmod - true if @path contains '.ko' suffix in right position,
false otherwise
@name - if (@alloc_name && @kmod) is true, it contains strdup-ed base name
of the kernel module without suffixes, otherwise strudup-ed
base name of @path
@ext - if (@alloc_ext && @comp) is true, it contains strdup-ed string
the compression suffix
It returns 0 if there's no strdup error, -ENOMEM otherwise.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-9t6eqg8j610r94l743hkntiv@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/dso.c')
-rw-r--r-- | tools/perf/util/dso.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index be368414036c..3e6863feb066 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c | |||
@@ -212,6 +212,72 @@ bool dso__needs_decompress(struct dso *dso) | |||
212 | } | 212 | } |
213 | 213 | ||
214 | /* | 214 | /* |
215 | * Parses kernel module specified in @path and updates | ||
216 | * @m argument like: | ||
217 | * | ||
218 | * @comp - true if @path contains supported compression suffix, | ||
219 | * false otherwise | ||
220 | * @kmod - true if @path contains '.ko' suffix in right position, | ||
221 | * false otherwise | ||
222 | * @name - if (@alloc_name && @kmod) is true, it contains strdup-ed base name | ||
223 | * of the kernel module without suffixes, otherwise strudup-ed | ||
224 | * base name of @path | ||
225 | * @ext - if (@alloc_ext && @comp) is true, it contains strdup-ed string | ||
226 | * the compression suffix | ||
227 | * | ||
228 | * Returns 0 if there's no strdup error, -ENOMEM otherwise. | ||
229 | */ | ||
230 | int __kmod_path__parse(struct kmod_path *m, const char *path, | ||
231 | bool alloc_name, bool alloc_ext) | ||
232 | { | ||
233 | const char *name = strrchr(path, '/'); | ||
234 | const char *ext = strrchr(path, '.'); | ||
235 | |||
236 | memset(m, 0x0, sizeof(*m)); | ||
237 | name = name ? name + 1 : path; | ||
238 | |||
239 | /* No extension, just return name. */ | ||
240 | if (ext == NULL) { | ||
241 | if (alloc_name) { | ||
242 | m->name = strdup(name); | ||
243 | return m->name ? 0 : -ENOMEM; | ||
244 | } | ||
245 | return 0; | ||
246 | } | ||
247 | |||
248 | if (is_supported_compression(ext + 1)) { | ||
249 | m->comp = true; | ||
250 | ext -= 3; | ||
251 | } | ||
252 | |||
253 | /* Check .ko extension only if there's enough name left. */ | ||
254 | if (ext > name) | ||
255 | m->kmod = !strncmp(ext, ".ko", 3); | ||
256 | |||
257 | if (alloc_name) { | ||
258 | if (m->kmod) { | ||
259 | if (asprintf(&m->name, "[%.*s]", (int) (ext - name), name) == -1) | ||
260 | return -ENOMEM; | ||
261 | } else { | ||
262 | if (asprintf(&m->name, "%s", name) == -1) | ||
263 | return -ENOMEM; | ||
264 | } | ||
265 | |||
266 | strxfrchar(m->name, '-', '_'); | ||
267 | } | ||
268 | |||
269 | if (alloc_ext && m->comp) { | ||
270 | m->ext = strdup(ext + 4); | ||
271 | if (!m->ext) { | ||
272 | free((void *) m->name); | ||
273 | return -ENOMEM; | ||
274 | } | ||
275 | } | ||
276 | |||
277 | return 0; | ||
278 | } | ||
279 | |||
280 | /* | ||
215 | * Global list of open DSOs and the counter. | 281 | * Global list of open DSOs and the counter. |
216 | */ | 282 | */ |
217 | static LIST_HEAD(dso__data_open); | 283 | static LIST_HEAD(dso__data_open); |