aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/dso.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2015-02-05 09:40:25 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-03-21 13:53:41 -0400
commit3c8a67f50a1e68b912d1d74db6b455cac54ec4b4 (patch)
tree1d03faa7eaa676cf7eefa53f2f938409929dee72 /tools/perf/util/dso.c
parent80a32e5b498a7547073e5e4b2b804edc7219979d (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.c66
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 */
230int __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 */
217static LIST_HEAD(dso__data_open); 283static LIST_HEAD(dso__data_open);