diff mbox series

[v2,3/4] coresight: etm4x: Don't trace PID for non-root PID namespace

Message ID 20211213121323.1887180-4-leo.yan@linaro.org (mailing list archive)
State New, archived
Headers show
Series coresight: etm: Correct PID tracing for non-root namespace | expand

Commit Message

Leo Yan Dec. 13, 2021, 12:13 p.m. UTC
When runs in perf mode, the driver always enables the PID tracing.  This
can lead confusion when the profiling session runs in non-root PID
namespace, whereas it records the PIDs from the root PID namespace.

To avoid confusion for PID tracing, when runs in perf mode, this patch
changes to only enable PID tracing for root PID namespace.

As result, after apply this patch, the perf tool reports PID as '-1' for
all samples:

  # unshare --fork --pid perf record -e cs_etm// -m 64K,64K -a \
	-o perf_test.data -- uname
  # perf report -i perf_test.data --itrace=Zi1000i --stdio

  # Total Lost Samples: 0
  #
  # Samples: 94  of event 'instructions'
  # Event count (approx.): 94000
  #
  # Overhead  Command  Shared Object      Symbol
  # ........  .......  .................  ..............................
  #
      68.09%  :-1      [kernel.kallsyms]  [k] __sched_text_end
       3.19%  :-1      [kernel.kallsyms]  [k] hrtimer_interrupt
       2.13%  :-1      [kernel.kallsyms]  [k] __bitmap_and
       2.13%  :-1      [kernel.kallsyms]  [k] trace_vbprintk
       1.06%  :-1      [kernel.kallsyms]  [k] __fget_files
       1.06%  :-1      [kernel.kallsyms]  [k] __schedule
       1.06%  :-1      [kernel.kallsyms]  [k] __softirqentry_text_start
       1.06%  :-1      [kernel.kallsyms]  [k] __update_load_avg_cfs_rq
       1.06%  :-1      [kernel.kallsyms]  [k] __update_load_avg_se
       1.06%  :-1      [kernel.kallsyms]  [k] arch_counter_get_cntpct
       1.06%  :-1      [kernel.kallsyms]  [k] check_and_switch_context
       1.06%  :-1      [kernel.kallsyms]  [k] format_decode
       1.06%  :-1      [kernel.kallsyms]  [k] handle_percpu_devid_irq
       1.06%  :-1      [kernel.kallsyms]  [k] irq_enter_rcu
       1.06%  :-1      [kernel.kallsyms]  [k] irqtime_account_irq
       1.06%  :-1      [kernel.kallsyms]  [k] ktime_get
       1.06%  :-1      [kernel.kallsyms]  [k] ktime_get_coarse_real_ts64
       1.06%  :-1      [kernel.kallsyms]  [k] memmove
       1.06%  :-1      [kernel.kallsyms]  [k] perf_ioctl
       1.06%  :-1      [kernel.kallsyms]  [k] perf_output_begin
       1.06%  :-1      [kernel.kallsyms]  [k] perf_output_copy
       1.06%  :-1      [kernel.kallsyms]  [k] profile_tick
       1.06%  :-1      [kernel.kallsyms]  [k] sched_clock
       1.06%  :-1      [kernel.kallsyms]  [k] timerqueue_add
       1.06%  :-1      [kernel.kallsyms]  [k] trace_save_cmdline
       1.06%  :-1      [kernel.kallsyms]  [k] update_load_avg
       1.06%  :-1      [kernel.kallsyms]  [k] vbin_printf

Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
 drivers/hwtracing/coresight/coresight-etm4x-core.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

kernel test robot Dec. 13, 2021, 9:45 p.m. UTC | #1
Hi Leo,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.16-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Leo-Yan/coresight-etm-Correct-PID-tracing-for-non-root-namespace/20211213-201632
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2585cf9dfaaddf00b069673f27bb3f8530e2039c
config: arm64-randconfig-r034-20211213 (https://download.01.org/0day-ci/archive/20211214/202112140527.RSkgSFCc-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project b6a2ddb6c8ac29412b1361810972e15221fa021c)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm64 cross compiling tool for clang build
        # apt-get install binutils-aarch64-linux-gnu
        # https://github.com/0day-ci/linux/commit/dd716cd12b2f0e47fcc2b0e3e9172e4e70ad4877
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Leo-Yan/coresight-etm-Correct-PID-tracing-for-non-root-namespace/20211213-201632
        git checkout dd716cd12b2f0e47fcc2b0e3e9172e4e70ad4877
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/hwtracing/coresight/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/hwtracing/coresight/coresight-etm4x-core.c:661:6: error: implicit declaration of function 'task_is_in_init_pid_ns' [-Werror,-Wimplicit-function-declaration]
               task_is_in_init_pid_ns(current))
               ^
   1 error generated.


vim +/task_is_in_init_pid_ns +661 drivers/hwtracing/coresight/coresight-etm4x-core.c

   606	
   607	static int etm4_parse_event_config(struct coresight_device *csdev,
   608					   struct perf_event *event)
   609	{
   610		int ret = 0;
   611		struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
   612		struct etmv4_config *config = &drvdata->config;
   613		struct perf_event_attr *attr = &event->attr;
   614		unsigned long cfg_hash;
   615		int preset;
   616	
   617		/* Clear configuration from previous run */
   618		memset(config, 0, sizeof(struct etmv4_config));
   619	
   620		if (attr->exclude_kernel)
   621			config->mode = ETM_MODE_EXCL_KERN;
   622	
   623		if (attr->exclude_user)
   624			config->mode = ETM_MODE_EXCL_USER;
   625	
   626		/* Always start from the default config */
   627		etm4_set_default_config(config);
   628	
   629		/* Configure filters specified on the perf cmd line, if any. */
   630		ret = etm4_set_event_filters(drvdata, event);
   631		if (ret)
   632			goto out;
   633	
   634		/* Go from generic option to ETMv4 specifics */
   635		if (attr->config & BIT(ETM_OPT_CYCACC)) {
   636			config->cfg |= BIT(4);
   637			/* TRM: Must program this for cycacc to work */
   638			config->ccctlr = ETM_CYC_THRESHOLD_DEFAULT;
   639		}
   640		if (attr->config & BIT(ETM_OPT_TS)) {
   641			/*
   642			 * Configure timestamps to be emitted at regular intervals in
   643			 * order to correlate instructions executed on different CPUs
   644			 * (CPU-wide trace scenarios).
   645			 */
   646			ret = etm4_config_timestamp_event(drvdata);
   647	
   648			/*
   649			 * No need to go further if timestamp intervals can't
   650			 * be configured.
   651			 */
   652			if (ret)
   653				goto out;
   654	
   655			/* bit[11], Global timestamp tracing bit */
   656			config->cfg |= BIT(11);
   657		}
   658	
   659		/* Only trace contextID when runs in root PID namespace */
   660		if ((attr->config & BIT(ETM_OPT_CTXTID)) &&
 > 661		    task_is_in_init_pid_ns(current))
   662			/* bit[6], Context ID tracing bit */
   663			config->cfg |= BIT(ETM4_CFG_BIT_CTXTID);
   664	
   665		/*
   666		 * If set bit ETM_OPT_CTXTID2 in perf config, this asks to trace VMID
   667		 * for recording CONTEXTIDR_EL2.  Do not enable VMID tracing if the
   668		 * kernel is not running in EL2.
   669		 */
   670		if (attr->config & BIT(ETM_OPT_CTXTID2)) {
   671			if (!is_kernel_in_hyp_mode()) {
   672				ret = -EINVAL;
   673				goto out;
   674			}
   675	
   676			/* Only trace virtual contextID when runs in root PID namespace */
   677			if (task_is_in_init_pid_ns(current))
   678				config->cfg |= BIT(ETM4_CFG_BIT_VMID) |
   679					       BIT(ETM4_CFG_BIT_VMID_OPT);
   680		}
   681	
   682		/* return stack - enable if selected and supported */
   683		if ((attr->config & BIT(ETM_OPT_RETSTK)) && drvdata->retstack)
   684			/* bit[12], Return stack enable bit */
   685			config->cfg |= BIT(12);
   686	
   687		/*
   688		 * Set any selected configuration and preset.
   689		 *
   690		 * This extracts the values of PMU_FORMAT_ATTR(configid) and PMU_FORMAT_ATTR(preset)
   691		 * in the perf attributes defined in coresight-etm-perf.c.
   692		 * configid uses bits 63:32 of attr->config2, preset uses bits 3:0 of attr->config.
   693		 * A zero configid means no configuration active, preset = 0 means no preset selected.
   694		 */
   695		if (attr->config2 & GENMASK_ULL(63, 32)) {
   696			cfg_hash = (u32)(attr->config2 >> 32);
   697			preset = attr->config & 0xF;
   698			ret = cscfg_csdev_enable_active_config(csdev, cfg_hash, preset);
   699		}
   700	
   701	out:
   702		return ret;
   703	}
   704	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index 86a313857b58..f3eda536267c 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -656,7 +656,9 @@  static int etm4_parse_event_config(struct coresight_device *csdev,
 		config->cfg |= BIT(11);
 	}
 
-	if (attr->config & BIT(ETM_OPT_CTXTID))
+	/* Only trace contextID when runs in root PID namespace */
+	if ((attr->config & BIT(ETM_OPT_CTXTID)) &&
+	    task_is_in_init_pid_ns(current))
 		/* bit[6], Context ID tracing bit */
 		config->cfg |= BIT(ETM4_CFG_BIT_CTXTID);
 
@@ -670,7 +672,11 @@  static int etm4_parse_event_config(struct coresight_device *csdev,
 			ret = -EINVAL;
 			goto out;
 		}
-		config->cfg |= BIT(ETM4_CFG_BIT_VMID) | BIT(ETM4_CFG_BIT_VMID_OPT);
+
+		/* Only trace virtual contextID when runs in root PID namespace */
+		if (task_is_in_init_pid_ns(current))
+			config->cfg |= BIT(ETM4_CFG_BIT_VMID) |
+				       BIT(ETM4_CFG_BIT_VMID_OPT);
 	}
 
 	/* return stack - enable if selected and supported */