perf tools: Introduce dso__decompress_kmodule_{fd,path}
Move decompress_kmodule() to util/dso.c and split it into two functions returning fd and (decompressed) file path. The existing user only wants the fd version but the path version will be used soon. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Wang Nan <wangnan0@huawei.com> Cc: kernel-team@lge.com Link: http://lkml.kernel.org/r/20170608073109.30699-4-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
44ad6b8852
commit
42b3fa6708
|
@ -248,6 +248,64 @@ bool dso__needs_decompress(struct dso *dso)
|
||||||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
|
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf)
|
||||||
|
{
|
||||||
|
int fd = -1;
|
||||||
|
struct kmod_path m;
|
||||||
|
|
||||||
|
if (!dso__needs_decompress(dso))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (kmod_path__parse_ext(&m, dso->long_name))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!m.comp)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
fd = mkstemp(tmpbuf);
|
||||||
|
if (fd < 0) {
|
||||||
|
dso->load_errno = errno;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!decompress_to_file(m.ext, name, fd)) {
|
||||||
|
dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
|
||||||
|
close(fd);
|
||||||
|
fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
free(m.ext);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dso__decompress_kmodule_fd(struct dso *dso, const char *name)
|
||||||
|
{
|
||||||
|
char tmpbuf[] = KMOD_DECOMP_NAME;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = decompress_kmodule(dso, name, tmpbuf);
|
||||||
|
unlink(tmpbuf);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dso__decompress_kmodule_path(struct dso *dso, const char *name,
|
||||||
|
char *pathname, size_t len)
|
||||||
|
{
|
||||||
|
char tmpbuf[] = KMOD_DECOMP_NAME;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = decompress_kmodule(dso, name, tmpbuf);
|
||||||
|
if (fd < 0) {
|
||||||
|
unlink(tmpbuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(pathname, tmpbuf, len);
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parses kernel module specified in @path and updates
|
* Parses kernel module specified in @path and updates
|
||||||
* @m argument like:
|
* @m argument like:
|
||||||
|
|
|
@ -244,6 +244,12 @@ bool is_supported_compression(const char *ext);
|
||||||
bool is_kernel_module(const char *pathname, int cpumode);
|
bool is_kernel_module(const char *pathname, int cpumode);
|
||||||
bool decompress_to_file(const char *ext, const char *filename, int output_fd);
|
bool decompress_to_file(const char *ext, const char *filename, int output_fd);
|
||||||
bool dso__needs_decompress(struct dso *dso);
|
bool dso__needs_decompress(struct dso *dso);
|
||||||
|
int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
|
||||||
|
int dso__decompress_kmodule_path(struct dso *dso, const char *name,
|
||||||
|
char *pathname, size_t len);
|
||||||
|
|
||||||
|
#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
|
||||||
|
#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
|
||||||
|
|
||||||
struct kmod_path {
|
struct kmod_path {
|
||||||
char *name;
|
char *name;
|
||||||
|
|
|
@ -637,40 +637,6 @@ static int dso__swap_init(struct dso *dso, unsigned char eidata)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decompress_kmodule(struct dso *dso, const char *name,
|
|
||||||
enum dso_binary_type type)
|
|
||||||
{
|
|
||||||
int fd = -1;
|
|
||||||
char tmpbuf[] = "/tmp/perf-kmod-XXXXXX";
|
|
||||||
struct kmod_path m;
|
|
||||||
|
|
||||||
if (type != DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP &&
|
|
||||||
type != DSO_BINARY_TYPE__GUEST_KMODULE_COMP &&
|
|
||||||
type != DSO_BINARY_TYPE__BUILD_ID_CACHE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (kmod_path__parse_ext(&m, dso->long_name) || !m.comp)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
fd = mkstemp(tmpbuf);
|
|
||||||
if (fd < 0) {
|
|
||||||
dso->load_errno = errno;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!decompress_to_file(m.ext, name, fd)) {
|
|
||||||
dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
|
|
||||||
close(fd);
|
|
||||||
fd = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unlink(tmpbuf);
|
|
||||||
|
|
||||||
out:
|
|
||||||
free(m.ext);
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool symsrc__possibly_runtime(struct symsrc *ss)
|
bool symsrc__possibly_runtime(struct symsrc *ss)
|
||||||
{
|
{
|
||||||
return ss->dynsym || ss->opdsec;
|
return ss->dynsym || ss->opdsec;
|
||||||
|
@ -702,7 +668,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
if (dso__needs_decompress(dso)) {
|
if (dso__needs_decompress(dso)) {
|
||||||
fd = decompress_kmodule(dso, name, type);
|
fd = dso__decompress_kmodule_fd(dso, name);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue