aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/dso.c
diff options
context:
space:
mode:
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);