perf buildid-cache: Support binary objects from other namespaces
Teach buildid-cache how to add, remove, and update binary objects from other mount namespaces. Allow probe events tracing binaries in different namespaces to add their objects to the probe and build-id caches too. As a handy side effect, this also lets us access SDT probes in binaries from alternate mount namespaces. Signed-off-by: Krister Johansen <kjlx@templeofstupid.com> Tested-by: Brendan Gregg <brendan.d.gregg@gmail.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/1499305693-1599-5-git-send-email-kjlx@templeofstupid.com [ Add util/namespaces.c to tools/perf/util/python-ext-sources, to fix the python binding 'perf test' ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
544abd44c7
commit
f045b8c4b3
@@ -143,13 +143,17 @@ out:
|
||||
return list;
|
||||
}
|
||||
|
||||
static int slow_copyfile(const char *from, const char *to)
|
||||
static int slow_copyfile(const char *from, const char *to, struct nsinfo *nsi)
|
||||
{
|
||||
int err = -1;
|
||||
char *line = NULL;
|
||||
size_t n;
|
||||
FILE *from_fp = fopen(from, "r"), *to_fp;
|
||||
FILE *from_fp, *to_fp;
|
||||
struct nscookie nsc;
|
||||
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
from_fp = fopen(from, "r");
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (from_fp == NULL)
|
||||
goto out;
|
||||
|
||||
@@ -198,15 +202,21 @@ int copyfile_offset(int ifd, loff_t off_in, int ofd, loff_t off_out, u64 size)
|
||||
return size ? -1 : 0;
|
||||
}
|
||||
|
||||
int copyfile_mode(const char *from, const char *to, mode_t mode)
|
||||
static int copyfile_mode_ns(const char *from, const char *to, mode_t mode,
|
||||
struct nsinfo *nsi)
|
||||
{
|
||||
int fromfd, tofd;
|
||||
struct stat st;
|
||||
int err = -1;
|
||||
int err;
|
||||
char *tmp = NULL, *ptr = NULL;
|
||||
struct nscookie nsc;
|
||||
|
||||
if (stat(from, &st))
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
err = stat(from, &st);
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (err)
|
||||
goto out;
|
||||
err = -1;
|
||||
|
||||
/* extra 'x' at the end is to reserve space for '.' */
|
||||
if (asprintf(&tmp, "%s.XXXXXXx", to) < 0) {
|
||||
@@ -227,11 +237,13 @@ int copyfile_mode(const char *from, const char *to, mode_t mode)
|
||||
goto out_close_to;
|
||||
|
||||
if (st.st_size == 0) { /* /proc? do it slowly... */
|
||||
err = slow_copyfile(from, tmp);
|
||||
err = slow_copyfile(from, tmp, nsi);
|
||||
goto out_close_to;
|
||||
}
|
||||
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
fromfd = open(from, O_RDONLY);
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (fromfd < 0)
|
||||
goto out_close_to;
|
||||
|
||||
@@ -248,6 +260,16 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
int copyfile_ns(const char *from, const char *to, struct nsinfo *nsi)
|
||||
{
|
||||
return copyfile_mode_ns(from, to, 0755, nsi);
|
||||
}
|
||||
|
||||
int copyfile_mode(const char *from, const char *to, mode_t mode)
|
||||
{
|
||||
return copyfile_mode_ns(from, to, mode, NULL);
|
||||
}
|
||||
|
||||
int copyfile(const char *from, const char *to)
|
||||
{
|
||||
return copyfile_mode(from, to, 0755);
|
||||
|
Reference in New Issue
Block a user