diff options
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); |