RE: [PATCH V7 6/8] perf/x86/intel/uncore: Support IIO free running counters on SKX
From: Liang, Kan
Date: Fri Apr 20 2018 - 09:04:47 EST
>
> From: Kan Liang <kan.liang@xxxxxxxxx>
>
> As of Skylake Server, there are a number of free-running counters in
> each IIO Box that collect counts for per box IO clocks and per Port
> Input/Output x BW/Utilization.
> Add a new PMU for these free-running counters. Don't let them share with
> the GP counters of IIO box. Otherwise, it will result in some (probably)
> unexpected scheduling artifacts.
>
> The free running counter is read-only and always active. Counting will
> be suspended only when the IIO Box is powered down.
>
> There are three types of IIO free running counters on Skylake server, IO
> CLOCKS counter, BANDWIDTH counters and UTILIZATION counters.
> IO CLOCKS counter is to count IO clocks.
> BANDWIDTH counters are to count inbound(PCIe->CPU)/outbound(CPU-
> >PCIe)
> bandwidth.
> UTILIZATION counters are to count input/output utilization.
>
> The bit width of the free running counters is 36-bits.
>
> Signed-off-by: Kan Liang <kan.liang@xxxxxxxxx>
> ---
>
> Changes since V6:
> - Add a new PMU for IIO free-running counters.
>
Hi Peter,
Could you please review the patch?
If it's OK for you, could you please merge the patch set?
Thanks,
Kan
> arch/x86/events/intel/uncore_snbep.c | 82
> ++++++++++++++++++++++++++++++++++++
> 1 file changed, 82 insertions(+)
>
> diff --git a/arch/x86/events/intel/uncore_snbep.c
> b/arch/x86/events/intel/uncore_snbep.c
> index 22ec65b..d6b302e 100644
> --- a/arch/x86/events/intel/uncore_snbep.c
> +++ b/arch/x86/events/intel/uncore_snbep.c
> @@ -3484,6 +3484,87 @@ static struct intel_uncore_type skx_uncore_iio = {
> .format_group = &skx_uncore_iio_format_group,
> };
>
> +enum perf_uncore_iio_freerunning_type_id {
> + SKX_IIO_MSR_IOCLK = 0,
> + SKX_IIO_MSR_BW = 1,
> + SKX_IIO_MSR_UTIL = 2,
> +
> + SKX_IIO_FREERUNNING_TYPE_MAX,
> +};
> +
> +
> +static struct freerunning_counters skx_iio_freerunning[] = {
> + [SKX_IIO_MSR_IOCLK] = { 0xa45, 0x1, 0x20, 1, 36 },
> + [SKX_IIO_MSR_BW] = { 0xb00, 0x1, 0x10, 8, 36 },
> + [SKX_IIO_MSR_UTIL] = { 0xb08, 0x1, 0x10, 8, 36 },
> +};
> +
> +static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = {
> + /* Free-Running IO CLOCKS Counter */
> + INTEL_UNCORE_EVENT_DESC(ioclk,
> "event=0xff,umask=0x10"),
> + /* Free-Running IIO BANDWIDTH Counters */
> + INTEL_UNCORE_EVENT_DESC(bw_in_port0,
> "event=0xff,umask=0x20"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port1,
> "event=0xff,umask=0x21"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port2,
> "event=0xff,umask=0x22"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port3,
> "event=0xff,umask=0x23"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port0,
> "event=0xff,umask=0x24"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port1,
> "event=0xff,umask=0x25"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port2,
> "event=0xff,umask=0x26"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit, "MiB"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port3,
> "event=0xff,umask=0x27"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale,
> "3.814697266e-6"),
> + INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit, "MiB"),
> + /* Free-running IIO UTILIZATION Counters */
> + INTEL_UNCORE_EVENT_DESC(util_in_port0,
> "event=0xff,umask=0x30"),
> + INTEL_UNCORE_EVENT_DESC(util_out_port0,
> "event=0xff,umask=0x31"),
> + INTEL_UNCORE_EVENT_DESC(util_in_port1,
> "event=0xff,umask=0x32"),
> + INTEL_UNCORE_EVENT_DESC(util_out_port1,
> "event=0xff,umask=0x33"),
> + INTEL_UNCORE_EVENT_DESC(util_in_port2,
> "event=0xff,umask=0x34"),
> + INTEL_UNCORE_EVENT_DESC(util_out_port2,
> "event=0xff,umask=0x35"),
> + INTEL_UNCORE_EVENT_DESC(util_in_port3,
> "event=0xff,umask=0x36"),
> + INTEL_UNCORE_EVENT_DESC(util_out_port3,
> "event=0xff,umask=0x37"),
> + { /* end: all zeroes */ },
> +};
> +
> +static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = {
> + .read_counter = uncore_msr_read_counter,
> +};
> +
> +static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = {
> + &format_attr_event.attr,
> + &format_attr_umask.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group
> skx_uncore_iio_freerunning_format_group = {
> + .name = "format",
> + .attrs = skx_uncore_iio_freerunning_formats_attr,
> +};
> +
> +static struct intel_uncore_type skx_uncore_iio_free_running = {
> + .name = "iio_free_running",
> + .num_counters = 17,
> + .num_boxes = 6,
> + .num_freerunning_types = SKX_IIO_FREERUNNING_TYPE_MAX,
> + .freerunning = skx_iio_freerunning,
> + .ops = &skx_uncore_iio_freerunning_ops,
> + .event_descs = skx_uncore_iio_freerunning_events,
> + .format_group =
> &skx_uncore_iio_freerunning_format_group,
> +};
> +
> static struct attribute *skx_uncore_formats_attr[] = {
> &format_attr_event.attr,
> &format_attr_umask.attr,
> @@ -3557,6 +3638,7 @@ static struct intel_uncore_type *skx_msr_uncores[]
> = {
> &skx_uncore_ubox,
> &skx_uncore_chabox,
> &skx_uncore_iio,
> + &skx_uncore_iio_free_running,
> &skx_uncore_irp,
> &skx_uncore_pcu,
> NULL,
> --
> 2.7.4