On Tuesday 15 November 2016 02:27 AM, Eric W. Biederman wrote:
Peter Zijlstra <[email protected]> writes:

On Mon, Nov 14, 2016 at 04:02:30PM +0530, Hari Bathini wrote:

        PERF_RECORD_SWITCH_CPU_WIDE             = 15,
+       /*
+        * struct {
+        *      struct perf_event_header        header;
+        *
+        *      u32                             pid, tid;
+        *      u64                             time;
+        *      u32                             uts_ns_inum;
+        *      u32                             ipc_ns_inum;
+        *      u32                             mnt_ns_inum;
+        *      u32                             pid_ns_inum;
+        *      u32                             net_ns_inum;
+        *      u32                             cgroup_ns_inum;
+        *      u32                             user_ns_inum;
+        *      struct sample_id                sample_id;
+        * };
+        */
+       PERF_RECORD_NAMESPACES                  = 16,
So this format is not extensible, that is, if someone adds yet another
namespace, we'll need to introduce PERF_RECORD_NAMESPACES2.

Is there a 'natural' and exposed namespace index that we can use to
change it like:

        u32     nr_nss;
        u32     namespace[nr_nss];

?
Nothing of that sort exists, currently.
Maybe, time to introduce with this patch-set..?
Would be good, but you'll have to sort that with the namespace folks.
The somewhat easy answer is to use the unshare flags.  AKA CLONE_NEWNS,
CLONE_NEWUSER, ...

In the worst case things may get extended to the point where perf would
have to use a different set of values than we use to unshare, clone, and
setns (as the clone flags are effectively all used up) but for the
existing namespaces that index should work just fine.

That won't allow for a natural array in the record but it will allow for
an array with that has a tag for which namespace it is in, or
alternative it will allow for one record per namespace.

struct namespace_info {
        u64     flags;
        u32     inode_num;
        /* any other essential namespace info */
};

struct {

        struct perf_event_header        header;

        u32                             pid, tid;
        u64                             time;
        struct namespace_info           ns_info[];
        struct sample_id                sample_id;
};

Something of this sort should do..?

Thanks
Hari

Reply via email to