lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <25c7236e-d888-4cdc-be19-5e582220097d@linux.intel.com>
Date: Mon, 4 Nov 2024 15:29:09 -0500
From: "Liang, Kan" <kan.liang@...ux.intel.com>
To: peterz@...radead.org, mingo@...nel.org, acme@...nel.org,
 namhyung@...nel.org, irogers@...gle.com, adrian.hunter@...el.com,
 linux-kernel@...r.kernel.org
Cc: eranian@...gle.com, Andi Kleen <ak@...ux.intel.com>
Subject: Re: [RESEND PATCH V4] perf/x86/intel: Support RDPMC metrics clear
 mode

Hi Peter,

Ping. Could you please let me know if you have any comments.

Thanks,
Kan

On 2024-10-09 3:31 p.m., Liang, Kan wrote:
> Hi Peter,
> 
> Gentle ping. Please let me know if you have any comments.
> 
> Thanks,
> Kan
> 
> On 2024-09-26 2:45 p.m., kan.liang@...ux.intel.com wrote:
>> From: Kan Liang <kan.liang@...ux.intel.com>
>>
>> The new RDPMC enhancement, metrics clear mode, is to clear the
>> PERF_METRICS-related resources as well as the fixed-function performance
>> monitoring counter 3 after the read is performed. It is available for
>> ring 3. The feature is enumerated by the
>> IA32_PERF_CAPABILITIES.RDPMC_CLEAR_METRICS[bit 19]. To enable the
>> feature, the IA32_FIXED_CTR_CTRL.METRICS_CLEAR_EN[bit 14] must be set.
>>
>> Two ways were considered to enable the feature.
>> - Expose a knob in the sysfs globally. One user may affect the
>>   measurement of other users when changing the knob. The solution is
>>   dropped.
>> - Introduce a new event format, metrics_clear, for the slots event to
>>   disable/enable the feature only for the current process. Users can
>>   utilize the feature as needed.
>> The latter solution is implemented in the patch.
>>
>> The current KVM doesn't support the perf metrics yet. For
>> virtualization, the feature can be enabled later separately.
>>
>> Update the document of perf metrics.
>>
>> Suggested-by: Andi Kleen <ak@...ux.intel.com>
>> Reviewed-by: Andi Kleen <ak@...ux.intel.com>
>> Reviewed-by: Ian Rogers <irogers@...gle.com>
>> Signed-off-by: Kan Liang <kan.liang@...ux.intel.com>
>> ---
>>
>> The original V4 can be found at
>> https://lore.kernel.org/lkml/20240731143835.771618-6-kan.liang@linux.intel.com/
>>
>> The patch was one of the PMU features in the LNL enabling patch set.
>> The other feature is now blocked. Send the patch separately.
>>
>>  arch/x86/events/intel/core.c         | 20 +++++++++++++++++++-
>>  arch/x86/events/perf_event.h         |  1 +
>>  arch/x86/include/asm/perf_event.h    |  4 ++++
>>  tools/perf/Documentation/topdown.txt |  9 +++++++--
>>  4 files changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
>> index 5182075e111b..342f8b1a2f93 100644
>> --- a/arch/x86/events/intel/core.c
>> +++ b/arch/x86/events/intel/core.c
>> @@ -2816,6 +2816,9 @@ static void intel_pmu_enable_fixed(struct perf_event *event)
>>  			return;
>>  
>>  		idx = INTEL_PMC_IDX_FIXED_SLOTS;
>> +
>> +		if (event->attr.config1 & INTEL_TD_CFG_METRIC_CLEAR)
>> +			bits |= INTEL_FIXED_3_METRICS_CLEAR;
>>  	}
>>  
>>  	intel_set_masks(event, idx);
>> @@ -4067,7 +4070,12 @@ static int intel_pmu_hw_config(struct perf_event *event)
>>  	 * is used in a metrics group, it too cannot support sampling.
>>  	 */
>>  	if (intel_pmu_has_cap(event, PERF_CAP_METRICS_IDX) && is_topdown_event(event)) {
>> -		if (event->attr.config1 || event->attr.config2)
>> +		/* The metrics_clear can only be set for the slots event */
>> +		if (event->attr.config1 &&
>> +		    (!is_slots_event(event) || (event->attr.config1 & ~INTEL_TD_CFG_METRIC_CLEAR)))
>> +			return -EINVAL;
>> +
>> +		if (event->attr.config2)
>>  			return -EINVAL;
>>  
>>  		/*
>> @@ -4676,6 +4684,8 @@ PMU_FORMAT_ATTR(in_tx,  "config:32"	);
>>  PMU_FORMAT_ATTR(in_tx_cp, "config:33"	);
>>  PMU_FORMAT_ATTR(eq,	"config:36"	); /* v6 + */
>>  
>> +PMU_FORMAT_ATTR(metrics_clear,	"config1:0"); /* PERF_CAPABILITIES.RDPMC_METRICS_CLEAR */
>> +
>>  static ssize_t umask2_show(struct device *dev,
>>  			   struct device_attribute *attr,
>>  			   char *page)
>> @@ -4695,6 +4705,7 @@ static struct device_attribute format_attr_umask2  =
>>  static struct attribute *format_evtsel_ext_attrs[] = {
>>  	&format_attr_umask2.attr,
>>  	&format_attr_eq.attr,
>> +	&format_attr_metrics_clear.attr,
>>  	NULL
>>  };
>>  
>> @@ -4719,6 +4730,13 @@ evtsel_ext_is_visible(struct kobject *kobj, struct attribute *attr, int i)
>>  	if (i == 1)
>>  		return (mask & ARCH_PERFMON_EVENTSEL_EQ) ? attr->mode : 0;
>>  
>> +	/* PERF_CAPABILITIES.RDPMC_METRICS_CLEAR */
>> +	if (i == 2) {
>> +		union perf_capabilities intel_cap = hybrid(dev_get_drvdata(dev), intel_cap);
>> +
>> +		return intel_cap.rdpmc_metrics_clear ? attr->mode : 0;
>> +	}
>> +
>>  	return 0;
>>  }
>>  
>> diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
>> index 82c6f45ce975..31c2771545a6 100644
>> --- a/arch/x86/events/perf_event.h
>> +++ b/arch/x86/events/perf_event.h
>> @@ -624,6 +624,7 @@ union perf_capabilities {
>>  		u64	pebs_output_pt_available:1;
>>  		u64	pebs_timing_info:1;
>>  		u64	anythread_deprecated:1;
>> +		u64	rdpmc_metrics_clear:1;
>>  	};
>>  	u64	capabilities;
>>  };
>> diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h
>> index 91b73571412f..e3b5e8e96fb3 100644
>> --- a/arch/x86/include/asm/perf_event.h
>> +++ b/arch/x86/include/asm/perf_event.h
>> @@ -41,6 +41,7 @@
>>  #define INTEL_FIXED_0_USER				(1ULL << 1)
>>  #define INTEL_FIXED_0_ANYTHREAD			(1ULL << 2)
>>  #define INTEL_FIXED_0_ENABLE_PMI			(1ULL << 3)
>> +#define INTEL_FIXED_3_METRICS_CLEAR			(1ULL << 2)
>>  
>>  #define HSW_IN_TX					(1ULL << 32)
>>  #define HSW_IN_TX_CHECKPOINTED				(1ULL << 33)
>> @@ -372,6 +373,9 @@ static inline bool use_fixed_pseudo_encoding(u64 code)
>>  #define INTEL_TD_METRIC_MAX			INTEL_TD_METRIC_MEM_BOUND
>>  #define INTEL_TD_METRIC_NUM			8
>>  
>> +#define INTEL_TD_CFG_METRIC_CLEAR_BIT		0
>> +#define INTEL_TD_CFG_METRIC_CLEAR		BIT_ULL(INTEL_TD_CFG_METRIC_CLEAR_BIT)
>> +
>>  static inline bool is_metric_idx(int idx)
>>  {
>>  	return (unsigned)(idx - INTEL_PMC_IDX_METRIC_BASE) < INTEL_TD_METRIC_NUM;
>> diff --git a/tools/perf/Documentation/topdown.txt b/tools/perf/Documentation/topdown.txt
>> index ae0aee86844f..f36c8ca1dc53 100644
>> --- a/tools/perf/Documentation/topdown.txt
>> +++ b/tools/perf/Documentation/topdown.txt
>> @@ -280,8 +280,13 @@ with no longer interval than a few seconds
>>  
>>  	perf stat -I 1000 --topdown ...
>>  
>> -For user programs using RDPMC directly the counter can
>> -be reset explicitly using ioctl:
>> +Starting from the Lunar Lake p-core, a RDPMC metrics clear mode is
>> +introduced. The metrics and the fixed counter 3 are automatically
>> +cleared after the read is performed. It is recommended to always enable
>> +the mode. To enable the mode, the config1 of slots event is set to 1.
>> +
>> +On the previous platforms, for user programs using RDPMC directly, the
>> +counter has to be reset explicitly using ioctl:
>>  
>>  	ioctl(perf_fd, PERF_EVENT_IOC_RESET, 0);
>>  
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ