Re: [PATCH 17/27] Documentation: x86: convert resctrl_ui.txt to reST

From: Mauro Carvalho Chehab
Date: Sat Apr 27 2019 - 14:09:37 EST


Em Fri, 26 Apr 2019 23:31:40 +0800
Changbin Du <changbin.du@xxxxxxxxx> escreveu:

> This converts the plain text documentation to reStructuredText format and
> add it to Sphinx TOC tree. No essential content change.
>
> Signed-off-by: Changbin Du <changbin.du@xxxxxxxxx>
> ---
> Documentation/x86/index.rst | 1 +
> .../x86/{resctrl_ui.txt => resctrl_ui.rst} | 913 ++++++++++--------
> 2 files changed, 490 insertions(+), 424 deletions(-)
> rename Documentation/x86/{resctrl_ui.txt => resctrl_ui.rst} (68%)
>
> diff --git a/Documentation/x86/index.rst b/Documentation/x86/index.rst
> index 2fcd10f29b87..4e9fa2b046df 100644
> --- a/Documentation/x86/index.rst
> +++ b/Documentation/x86/index.rst
> @@ -23,3 +23,4 @@ Linux x86 Support
> amd-memory-encryption
> pti
> microcode
> + resctrl_ui
> diff --git a/Documentation/x86/resctrl_ui.txt b/Documentation/x86/resctrl_ui.rst
> similarity index 68%
> rename from Documentation/x86/resctrl_ui.txt
> rename to Documentation/x86/resctrl_ui.rst
> index c1f95b59e14d..81aaa271d5ea 100644
> --- a/Documentation/x86/resctrl_ui.txt
> +++ b/Documentation/x86/resctrl_ui.rst
> @@ -1,33 +1,39 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +.. include:: <isonum.txt>
> +
> +===========================================
> User Interface for Resource Control feature
> +===========================================
>
> -Intel refers to this feature as Intel Resource Director Technology(Intel(R) RDT).
> -AMD refers to this feature as AMD Platform Quality of Service(AMD QoS).
> +:Copyright: |copy| 2016 Intel Corporation
> +:Authors: - Fenghua Yu <fenghua.yu@xxxxxxxxx>
> + - Tony Luck <tony.luck@xxxxxxxxx>
> + - Vikas Shivappa <vikas.shivappa@xxxxxxxxx>
>
> -Copyright (C) 2016 Intel Corporation
>
> -Fenghua Yu <fenghua.yu@xxxxxxxxx>
> -Tony Luck <tony.luck@xxxxxxxxx>
> -Vikas Shivappa <vikas.shivappa@xxxxxxxxx>
> +Intel refers to this feature as Intel Resource Director Technology(Intel(R) RDT).
> +AMD refers to this feature as AMD Platform Quality of Service(AMD QoS).
>
> This feature is enabled by the CONFIG_X86_CPU_RESCTRL and the x86 /proc/cpuinfo
> -flag bits:
> -RDT (Resource Director Technology) Allocation - "rdt_a"
> -CAT (Cache Allocation Technology) - "cat_l3", "cat_l2"
> -CDP (Code and Data Prioritization ) - "cdp_l3", "cdp_l2"
> -CQM (Cache QoS Monitoring) - "cqm_llc", "cqm_occup_llc"
> -MBM (Memory Bandwidth Monitoring) - "cqm_mbm_total", "cqm_mbm_local"
> -MBA (Memory Bandwidth Allocation) - "mba"
> +flag bits::
> +
> + RDT (Resource Director Technology) Allocation - "rdt_a"
> + CAT (Cache Allocation Technology) - "cat_l3", "cat_l2"
> + CDP (Code and Data Prioritization ) - "cdp_l3", "cdp_l2"
> + CQM (Cache QoS Monitoring) - "cqm_llc", "cqm_occup_llc"
> + MBM (Memory Bandwidth Monitoring) - "cqm_mbm_total", "cqm_mbm_local"
> + MBA (Memory Bandwidth Allocation) - "mba"

I don't see any reason to convert this into a literal block. I
would either convert it into a table or into something like:

RDT
(Resource Director Technology) Allocation - "rdt_a"
CAT
(Cache Allocation Technology) - "cat_l3", "cat_l2"
CDP
(Code and Data Prioritization ) - "cdp_l3", "cdp_l2"
CQM
(Cache QoS Monitoring) - "cqm_llc", "cqm_occup_llc"
MBM
(Memory Bandwidth Monitoring) - "cqm_mbm_total", "cqm_mbm_local"
MBA
(Memory Bandwidth Allocation) - "mba"


A table seems to be the best approach, though:

============================================= ================================
RDT (Resource Director Technology) Allocation "rdt_a"
CAT (Cache Allocation Technology) "cat_l3", "cat_l2"
CDP (Code and Data Prioritization) "cdp_l3", "cdp_l2"
CQM (Cache QoS Monitoring) "cqm_llc", "cqm_occup_llc"
MBM (Memory Bandwidth Monitoring) "cqm_mbm_total", "cqm_mbm_local"
MBA (Memory Bandwidth Allocation) "mba"
============================================= ================================

>
> -To use the feature mount the file system:
> +To use the feature mount the file system::
>
> # mount -t resctrl resctrl [-o cdp[,cdpl2][,mba_MBps]] /sys/fs/resctrl
>
> mount options are:
>
> -"cdp": Enable code/data prioritization in L3 cache allocations.
> -"cdpl2": Enable code/data prioritization in L2 cache allocations.
> -"mba_MBps": Enable the MBA Software Controller(mba_sc) to specify MBA
> - bandwidth in MBps
> +* "cdp": Enable code/data prioritization in L3 cache allocations.
> +* "cdpl2": Enable code/data prioritization in L2 cache allocations.
> +* "mba_MBps": Enable the MBA Software Controller(mba_sc) to specify MBA
> + bandwidth in MBps

I would add a \n\t after each :, in order to show the options in
bold and the explanation on a separate indented line, just like what
you did with the next similar set of options.

>
> L2 and L3 CDP are controlled seperately.
>
> @@ -44,7 +50,7 @@ For more details on the behavior of the interface during monitoring
> and allocation, see the "Resource alloc and monitor groups" section.
>
> Info directory
> ---------------
> +==============
>
> The 'info' directory contains information about the enabled
> resources. Each resource has its own subdirectory. The subdirectory
> @@ -56,77 +62,93 @@ allocation:
> Cache resource(L3/L2) subdirectory contains the following files
> related to allocation:
>
> -"num_closids": The number of CLOSIDs which are valid for this
> - resource. The kernel uses the smallest number of
> - CLOSIDs of all enabled resources as limit.
> -
> -"cbm_mask": The bitmask which is valid for this resource.
> - This mask is equivalent to 100%.
> -
> -"min_cbm_bits": The minimum number of consecutive bits which
> - must be set when writing a mask.
> -
> -"shareable_bits": Bitmask of shareable resource with other executing
> - entities (e.g. I/O). User can use this when
> - setting up exclusive cache partitions. Note that
> - some platforms support devices that have their
> - own settings for cache use which can over-ride
> - these bits.
> -"bit_usage": Annotated capacity bitmasks showing how all
> - instances of the resource are used. The legend is:
> - "0" - Corresponding region is unused. When the system's
> +"num_closids":
> + The number of CLOSIDs which are valid for this
> + resource. The kernel uses the smallest number of
> + CLOSIDs of all enabled resources as limit.
> +"cbm_mask":
> + The bitmask which is valid for this resource.
> + This mask is equivalent to 100%.
> +"min_cbm_bits":
> + The minimum number of consecutive bits which
> + must be set when writing a mask.
> +
> +"shareable_bits":
> + Bitmask of shareable resource with other executing
> + entities (e.g. I/O). User can use this when
> + setting up exclusive cache partitions. Note that
> + some platforms support devices that have their
> + own settings for cache use which can over-ride
> + these bits.
> +"bit_usage":
> + Annotated capacity bitmasks showing how all
> + instances of the resource are used. The legend is:
> +
> + "0":
> + Corresponding region is unused. When the system's
> resources have been allocated and a "0" is found
> in "bit_usage" it is a sign that resources are
> wasted.
> - "H" - Corresponding region is used by hardware only
> +
> + "H":
> + Corresponding region is used by hardware only
> but available for software use. If a resource
> has bits set in "shareable_bits" but not all
> of these bits appear in the resource groups'
> schematas then the bits appearing in
> "shareable_bits" but no resource group will
> be marked as "H".
> - "X" - Corresponding region is available for sharing and
> + "X":
> + Corresponding region is available for sharing and
> used by hardware and software. These are the
> bits that appear in "shareable_bits" as
> well as a resource group's allocation.
> - "S" - Corresponding region is used by software
> + "S":
> + Corresponding region is used by software
> and available for sharing.
> - "E" - Corresponding region is used exclusively by
> + "E":
> + Corresponding region is used exclusively by
> one resource group. No sharing allowed.
> - "P" - Corresponding region is pseudo-locked. No
> + "P":
> + Corresponding region is pseudo-locked. No
> sharing allowed.
>
> Memory bandwitdh(MB) subdirectory contains the following files
> with respect to allocation:
>
> -"min_bandwidth": The minimum memory bandwidth percentage which
> - user can request.
> +"min_bandwidth":
> + The minimum memory bandwidth percentage which
> + user can request.
>
> -"bandwidth_gran": The granularity in which the memory bandwidth
> - percentage is allocated. The allocated
> - b/w percentage is rounded off to the next
> - control step available on the hardware. The
> - available bandwidth control steps are:
> - min_bandwidth + N * bandwidth_gran.
> +"bandwidth_gran":
> + The granularity in which the memory bandwidth
> + percentage is allocated. The allocated
> + b/w percentage is rounded off to the next
> + control step available on the hardware. The
> + available bandwidth control steps are:
> + min_bandwidth + N * bandwidth_gran.
>
> -"delay_linear": Indicates if the delay scale is linear or
> - non-linear. This field is purely informational
> - only.
> +"delay_linear":
> + Indicates if the delay scale is linear or
> + non-linear. This field is purely informational
> + only.
>
> If RDT monitoring is available there will be an "L3_MON" directory
> with the following files:
>
> -"num_rmids": The number of RMIDs available. This is the
> - upper bound for how many "CTRL_MON" + "MON"
> - groups can be created.
> +"num_rmids":
> + The number of RMIDs available. This is the
> + upper bound for how many "CTRL_MON" + "MON"
> + groups can be created.
>
> -"mon_features": Lists the monitoring events if
> - monitoring is enabled for the resource.
> +"mon_features":
> + Lists the monitoring events if
> + monitoring is enabled for the resource.
>
> "max_threshold_occupancy":
> - Read/write file provides the largest value (in
> - bytes) at which a previously used LLC_occupancy
> - counter can be considered for re-use.
> + Read/write file provides the largest value (in
> + bytes) at which a previously used LLC_occupancy
> + counter can be considered for re-use.
>
> Finally, in the top level of the "info" directory there is a file
> named "last_cmd_status". This is reset with every "command" issued
> @@ -134,6 +156,7 @@ via the file system (making new directories or writing to any of the
> control files). If the command was successful, it will read as "ok".
> If the command failed, it will provide more information that can be
> conveyed in the error returns from file operations. E.g.
> +::
>
> # echo L3:0=f7 > schemata
> bash: echo: write error: Invalid argument
> @@ -141,7 +164,7 @@ conveyed in the error returns from file operations. E.g.
> mask f7 has non-consecutive 1-bits
>
> Resource alloc and monitor groups
> ----------------------------------
> +=================================
>
> Resource groups are represented as directories in the resctrl file
> system. The default group is the root directory which, immediately
> @@ -226,6 +249,7 @@ When monitoring is enabled all MON groups will also contain:
>
> Resource allocation rules
> -------------------------
> +
> When a task is running the following rules define which resources are
> available to it:
>
> @@ -252,7 +276,7 @@ Resource monitoring rules
>
>
> Notes on cache occupancy monitoring and control
> ------------------------------------------------
> +===============================================
> When moving a task from one group to another you should remember that
> this only affects *new* cache allocations by the task. E.g. you may have
> a task in a monitor group showing 3 MB of cache occupancy. If you move
> @@ -321,7 +345,7 @@ of the capacity of the cache. You could partition the cache into four
> equal parts with masks: 0x1f, 0x3e0, 0x7c00, 0xf8000.
>
> Memory bandwidth Allocation and monitoring
> -------------------------------------------
> +==========================================
>
> For Memory bandwidth resource, by default the user controls the resource
> by indicating the percentage of total memory bandwidth.
> @@ -369,7 +393,7 @@ In order to mitigate this and make the interface more user friendly,
> resctrl added support for specifying the bandwidth in MBps as well. The
> kernel underneath would use a software feedback mechanism or a "Software
> Controller(mba_sc)" which reads the actual bandwidth using MBM counters
> -and adjust the memowy bandwidth percentages to ensure
> +and adjust the memowy bandwidth percentages to ensure::
>
> "actual bandwidth < user specified bandwidth".
>
> @@ -380,14 +404,14 @@ sections.
>
> L3 schemata file details (code and data prioritization disabled)
> ----------------------------------------------------------------
> -With CDP disabled the L3 schemata format is:
> +With CDP disabled the L3 schemata format is::
>
> L3:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...
>
> L3 schemata file details (CDP enabled via mount option to resctrl)
> ------------------------------------------------------------------
> When CDP is enabled L3 control is split into two separate resources
> -so you can specify independent masks for code and data like this:
> +so you can specify independent masks for code and data like this::
>
> L3data:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...
> L3code:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...
> @@ -395,7 +419,7 @@ so you can specify independent masks for code and data like this:
> L2 schemata file details
> ------------------------
> L2 cache does not support code and data prioritization, so the
> -schemata format is always:
> +schemata format is always::
>
> L2:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...
>
> @@ -403,6 +427,7 @@ Memory bandwidth Allocation (default mode)
> ------------------------------------------
>
> Memory b/w domain is L3 cache.
> +::
>
> MB:<cache_id0>=bandwidth0;<cache_id1>=bandwidth1;...
>
> @@ -410,6 +435,7 @@ Memory bandwidth Allocation specified in MBps
> ---------------------------------------------
>
> Memory bandwidth domain is L3 cache.
> +::
>
> MB:<cache_id0>=bw_MBps0;<cache_id1>=bw_MBps1;...
>
> @@ -418,17 +444,18 @@ Reading/writing the schemata file
> Reading the schemata file will show the state of all resources
> on all domains. When writing you only need to specify those values
> which you wish to change. E.g.
> +::
>
> -# cat schemata
> -L3DATA:0=fffff;1=fffff;2=fffff;3=fffff
> -L3CODE:0=fffff;1=fffff;2=fffff;3=fffff
> -# echo "L3DATA:2=3c0;" > schemata
> -# cat schemata
> -L3DATA:0=fffff;1=fffff;2=3c0;3=fffff
> -L3CODE:0=fffff;1=fffff;2=fffff;3=fffff
> + # cat schemata
> + L3DATA:0=fffff;1=fffff;2=fffff;3=fffff
> + L3CODE:0=fffff;1=fffff;2=fffff;3=fffff
> + # echo "L3DATA:2=3c0;" > schemata
> + # cat schemata
> + L3DATA:0=fffff;1=fffff;2=3c0;3=fffff
> + L3CODE:0=fffff;1=fffff;2=fffff;3=fffff
>
> Cache Pseudo-Locking
> ---------------------
> +====================
> CAT enables a user to specify the amount of cache space that an
> application can fill. Cache pseudo-locking builds on the fact that a
> CPU can still read and write data pre-allocated outside its current
> @@ -442,6 +469,7 @@ a region of memory with reduced average read latency.
> The creation of a cache pseudo-locked region is triggered by a request
> from the user to do so that is accompanied by a schemata of the region
> to be pseudo-locked. The cache pseudo-locked region is created as follows:
> +
> - Create a CAT allocation CLOSNEW with a CBM matching the schemata
> from the user of the cache region that will contain the pseudo-locked
> memory. This region must not overlap with any current CAT allocation/CLOS
> @@ -480,6 +508,7 @@ initial mmap() handling, there is no enforcement afterwards and the
> application self needs to ensure it remains affine to the correct cores.
>
> Pseudo-locking is accomplished in two stages:
> +
> 1) During the first stage the system administrator allocates a portion
> of cache that should be dedicated to pseudo-locking. At this time an
> equivalent portion of memory is allocated, loaded into allocated
> @@ -506,7 +535,7 @@ by user space in order to obtain access to the pseudo-locked memory region.
> An example of cache pseudo-locked region creation and usage can be found below.
>
> Cache Pseudo-Locking Debugging Interface
> ----------------------------------------
> +----------------------------------------
> The pseudo-locking debugging interface is enabled by default (if
> CONFIG_DEBUG_FS is enabled) and can be found in /sys/kernel/debug/resctrl.
>
> @@ -514,6 +543,7 @@ There is no explicit way for the kernel to test if a provided memory
> location is present in the cache. The pseudo-locking debugging interface uses
> the tracing infrastructure to provide two ways to measure cache residency of
> the pseudo-locked region:
> +
> 1) Memory access latency using the pseudo_lock_mem_latency tracepoint. Data
> from these measurements are best visualized using a hist trigger (see
> example below). In this test the pseudo-locked region is traversed at
> @@ -529,87 +559,97 @@ it in debugfs as /sys/kernel/debug/resctrl/<newdir>. A single
> write-only file, pseudo_lock_measure, is present in this directory. The
> measurement of the pseudo-locked region depends on the number written to this
> debugfs file:
> -1 - writing "1" to the pseudo_lock_measure file will trigger the latency
> +
> +1:
> + writing "1" to the pseudo_lock_measure file will trigger the latency
> measurement captured in the pseudo_lock_mem_latency tracepoint. See
> example below.
> -2 - writing "2" to the pseudo_lock_measure file will trigger the L2 cache
> +2:
> + writing "2" to the pseudo_lock_measure file will trigger the L2 cache
> residency (cache hits and misses) measurement captured in the
> pseudo_lock_l2 tracepoint. See example below.
> -3 - writing "3" to the pseudo_lock_measure file will trigger the L3 cache
> +3:
> + writing "3" to the pseudo_lock_measure file will trigger the L3 cache
> residency (cache hits and misses) measurement captured in the
> pseudo_lock_l3 tracepoint.
>
> All measurements are recorded with the tracing infrastructure. This requires
> the relevant tracepoints to be enabled before the measurement is triggered.
>
> -Example of latency debugging interface:
> +Example of latency debugging interface
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> In this example a pseudo-locked region named "newlock" was created. Here is
> how we can measure the latency in cycles of reading from this region and
> visualize this data with a histogram that is available if CONFIG_HIST_TRIGGERS
> -is set:
> -# :> /sys/kernel/debug/tracing/trace
> -# echo 'hist:keys=latency' > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/trigger
> -# echo 1 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/enable
> -# echo 1 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
> -# echo 0 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/enable
> -# cat /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/hist
> -
> -# event histogram
> -#
> -# trigger info: hist:keys=latency:vals=hitcount:sort=hitcount:size=2048 [active]
> -#
> -
> -{ latency: 456 } hitcount: 1
> -{ latency: 50 } hitcount: 83
> -{ latency: 36 } hitcount: 96
> -{ latency: 44 } hitcount: 174
> -{ latency: 48 } hitcount: 195
> -{ latency: 46 } hitcount: 262
> -{ latency: 42 } hitcount: 693
> -{ latency: 40 } hitcount: 3204
> -{ latency: 38 } hitcount: 3484
> -
> -Totals:
> - Hits: 8192
> - Entries: 9
> - Dropped: 0
> -
> -Example of cache hits/misses debugging:
> +is set::
> +
> + # :> /sys/kernel/debug/tracing/trace
> + # echo 'hist:keys=latency' > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/trigger
> + # echo 1 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/enable
> + # echo 1 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
> + # echo 0 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/enable
> + # cat /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_mem_latency/hist
> +
> + # event histogram
> + #
> + # trigger info: hist:keys=latency:vals=hitcount:sort=hitcount:size=2048 [active]
> + #
> +
> + { latency: 456 } hitcount: 1
> + { latency: 50 } hitcount: 83
> + { latency: 36 } hitcount: 96
> + { latency: 44 } hitcount: 174
> + { latency: 48 } hitcount: 195
> + { latency: 46 } hitcount: 262
> + { latency: 42 } hitcount: 693
> + { latency: 40 } hitcount: 3204
> + { latency: 38 } hitcount: 3484
> +
> + Totals:
> + Hits: 8192
> + Entries: 9
> + Dropped: 0
> +
> +Example of cache hits/misses debugging
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> In this example a pseudo-locked region named "newlock" was created on the L2
> cache of a platform. Here is how we can obtain details of the cache hits
> and misses using the platform's precision counters.
> +::
>
> -# :> /sys/kernel/debug/tracing/trace
> -# echo 1 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_l2/enable
> -# echo 2 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
> -# echo 0 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_l2/enable
> -# cat /sys/kernel/debug/tracing/trace
> + # :> /sys/kernel/debug/tracing/trace
> + # echo 1 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_l2/enable
> + # echo 2 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
> + # echo 0 > /sys/kernel/debug/tracing/events/resctrl/pseudo_lock_l2/enable
> + # cat /sys/kernel/debug/tracing/trace
>
> -# tracer: nop
> -#
> -# _-----=> irqs-off
> -# / _----=> need-resched
> -# | / _---=> hardirq/softirq
> -# || / _--=> preempt-depth
> -# ||| / delay
> -# TASK-PID CPU# |||| TIMESTAMP FUNCTION
> -# | | | |||| | |
> - pseudo_lock_mea-1672 [002] .... 3132.860500: pseudo_lock_l2: hits=4097 miss=0
> + # tracer: nop
> + #
> + # _-----=> irqs-off
> + # / _----=> need-resched
> + # | / _---=> hardirq/softirq
> + # || / _--=> preempt-depth
> + # ||| / delay
> + # TASK-PID CPU# |||| TIMESTAMP FUNCTION
> + # | | | |||| | |
> + pseudo_lock_mea-1672 [002] .... 3132.860500: pseudo_lock_l2: hits=4097 miss=0
>
>
> -Examples for RDT allocation usage:
> +Examples for RDT allocation usage
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +1) Example 1
>
> -Example 1
> ----------
> On a two socket machine (one L3 cache per socket) with just four bits
> for cache bit masks, minimum b/w of 10% with a memory bandwidth
> -granularity of 10%
> +granularity of 10%.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> -# mkdir p0 p1
> -# echo "L3:0=3;1=c\nMB:0=50;1=50" > /sys/fs/resctrl/p0/schemata
> -# echo "L3:0=3;1=3\nMB:0=50;1=50" > /sys/fs/resctrl/p1/schemata
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
> + # mkdir p0 p1
> + # echo "L3:0=3;1=c\nMB:0=50;1=50" > /sys/fs/resctrl/p0/schemata
> + # echo "L3:0=3;1=3\nMB:0=50;1=50" > /sys/fs/resctrl/p1/schemata
>
> The default resource group is unmodified, so we have access to all parts
> of all caches (its schemata file reads "L3:0=f;1=f").
> @@ -628,100 +668,106 @@ the b/w accordingly.
>
> If the MBA is specified in MB(megabytes) then user can enter the max b/w in MB
> rather than the percentage values.
> +::
>
> -# echo "L3:0=3;1=c\nMB:0=1024;1=500" > /sys/fs/resctrl/p0/schemata
> -# echo "L3:0=3;1=3\nMB:0=1024;1=500" > /sys/fs/resctrl/p1/schemata
> + # echo "L3:0=3;1=c\nMB:0=1024;1=500" > /sys/fs/resctrl/p0/schemata
> + # echo "L3:0=3;1=3\nMB:0=1024;1=500" > /sys/fs/resctrl/p1/schemata
>
> In the above example the tasks in "p1" and "p0" on socket 0 would use a max b/w
> of 1024MB where as on socket 1 they would use 500MB.
>
> -Example 2
> ----------
> +2) Example 2
> +
> Again two sockets, but this time with a more realistic 20-bit mask.
>
> Two real time tasks pid=1234 running on processor 0 and pid=5678 running on
> processor 1 on socket 0 on a 2-socket and dual core machine. To avoid noisy
> neighbors, each of the two real-time tasks exclusively occupies one quarter
> of L3 cache on socket 0.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
>
> First we reset the schemata for the default group so that the "upper"
> 50% of the L3 cache on socket 0 and 50% of memory b/w cannot be used by
> -ordinary tasks:
> +ordinary tasks::
>
> -# echo "L3:0=3ff;1=fffff\nMB:0=50;1=100" > schemata
> + # echo "L3:0=3ff;1=fffff\nMB:0=50;1=100" > schemata
>
> Next we make a resource group for our first real time task and give
> it access to the "top" 25% of the cache on socket 0.
> +::
>
> -# mkdir p0
> -# echo "L3:0=f8000;1=fffff" > p0/schemata
> + # mkdir p0
> + # echo "L3:0=f8000;1=fffff" > p0/schemata
>
> Finally we move our first real time task into this resource group. We
> also use taskset(1) to ensure the task always runs on a dedicated CPU
> on socket 0. Most uses of resource groups will also constrain which
> processors tasks run on.
> +::
>
> -# echo 1234 > p0/tasks
> -# taskset -cp 1 1234
> + # echo 1234 > p0/tasks
> + # taskset -cp 1 1234
>
> -Ditto for the second real time task (with the remaining 25% of cache):
> +Ditto for the second real time task (with the remaining 25% of cache)::
>
> -# mkdir p1
> -# echo "L3:0=7c00;1=fffff" > p1/schemata
> -# echo 5678 > p1/tasks
> -# taskset -cp 2 5678
> + # mkdir p1
> + # echo "L3:0=7c00;1=fffff" > p1/schemata
> + # echo 5678 > p1/tasks
> + # taskset -cp 2 5678
>
> For the same 2 socket system with memory b/w resource and CAT L3 the
> schemata would look like(Assume min_bandwidth 10 and bandwidth_gran is
> 10):
>
> -For our first real time task this would request 20% memory b/w on socket
> -0.
> +For our first real time task this would request 20% memory b/w on socket 0.
> +::
>
> -# echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata
> + # echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata
>
> For our second real time task this would request an other 20% memory b/w
> on socket 0.
> +::
>
> -# echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata
> + # echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata
>
> -Example 3
> ----------
> +3) Example 3
>
> A single socket system which has real-time tasks running on core 4-7 and
> non real-time workload assigned to core 0-3. The real-time tasks share text
> and data, so a per task association is not required and due to interaction
> with the kernel it's desired that the kernel on these cores shares L3 with
> the tasks.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
>
> First we reset the schemata for the default group so that the "upper"
> 50% of the L3 cache on socket 0, and 50% of memory bandwidth on socket 0
> -cannot be used by ordinary tasks:
> +cannot be used by ordinary tasks::
>
> -# echo "L3:0=3ff\nMB:0=50" > schemata
> + # echo "L3:0=3ff\nMB:0=50" > schemata
>
> Next we make a resource group for our real time cores and give it access
> to the "top" 50% of the cache on socket 0 and 50% of memory bandwidth on
> socket 0.
> +::
>
> -# mkdir p0
> -# echo "L3:0=ffc00\nMB:0=50" > p0/schemata
> + # mkdir p0
> + # echo "L3:0=ffc00\nMB:0=50" > p0/schemata
>
> Finally we move core 4-7 over to the new group and make sure that the
> kernel and the tasks running there get 50% of the cache. They should
> also get 50% of memory bandwidth assuming that the cores 4-7 are SMT
> siblings and only the real time threads are scheduled on the cores 4-7.
> +::
>
> -# echo F0 > p0/cpus
> + # echo F0 > p0/cpus
>
> -Example 4
> ----------
> +4) Example 4
>
> The resource groups in previous examples were all in the default "shareable"
> mode allowing sharing of their cache allocations. If one resource group
> @@ -732,157 +778,168 @@ In this example a new exclusive resource group will be created on a L2 CAT
> system with two L2 cache instances that can be configured with an 8-bit
> capacity bitmask. The new exclusive resource group will be configured to use
> 25% of each cache instance.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl/
> -# cd /sys/fs/resctrl
> + # mount -t resctrl resctrl /sys/fs/resctrl/
> + # cd /sys/fs/resctrl
>
> First, we observe that the default group is configured to allocate to all L2
> -cache:
> +cache::
>
> -# cat schemata
> -L2:0=ff;1=ff
> + # cat schemata
> + L2:0=ff;1=ff
>
> We could attempt to create the new resource group at this point, but it will
> -fail because of the overlap with the schemata of the default group:
> -# mkdir p0
> -# echo 'L2:0=0x3;1=0x3' > p0/schemata
> -# cat p0/mode
> -shareable
> -# echo exclusive > p0/mode
> --sh: echo: write error: Invalid argument
> -# cat info/last_cmd_status
> -schemata overlaps
> +fail because of the overlap with the schemata of the default group::
> +
> + # mkdir p0
> + # echo 'L2:0=0x3;1=0x3' > p0/schemata
> + # cat p0/mode
> + shareable
> + # echo exclusive > p0/mode
> + -sh: echo: write error: Invalid argument
> + # cat info/last_cmd_status
> + schemata overlaps
>
> To ensure that there is no overlap with another resource group the default
> resource group's schemata has to change, making it possible for the new
> resource group to become exclusive.
> -# echo 'L2:0=0xfc;1=0xfc' > schemata
> -# echo exclusive > p0/mode
> -# grep . p0/*
> -p0/cpus:0
> -p0/mode:exclusive
> -p0/schemata:L2:0=03;1=03
> -p0/size:L2:0=262144;1=262144
> +::
> +
> + # echo 'L2:0=0xfc;1=0xfc' > schemata
> + # echo exclusive > p0/mode
> + # grep . p0/*
> + p0/cpus:0
> + p0/mode:exclusive
> + p0/schemata:L2:0=03;1=03
> + p0/size:L2:0=262144;1=262144
>
> A new resource group will on creation not overlap with an exclusive resource
> -group:
> -# mkdir p1
> -# grep . p1/*
> -p1/cpus:0
> -p1/mode:shareable
> -p1/schemata:L2:0=fc;1=fc
> -p1/size:L2:0=786432;1=786432
> -
> -The bit_usage will reflect how the cache is used:
> -# cat info/L2/bit_usage
> -0=SSSSSSEE;1=SSSSSSEE
> -
> -A resource group cannot be forced to overlap with an exclusive resource group:
> -# echo 'L2:0=0x1;1=0x1' > p1/schemata
> --sh: echo: write error: Invalid argument
> -# cat info/last_cmd_status
> -overlaps with exclusive group
> +group::
> +
> + # mkdir p1
> + # grep . p1/*
> + p1/cpus:0
> + p1/mode:shareable
> + p1/schemata:L2:0=fc;1=fc
> + p1/size:L2:0=786432;1=786432
> +
> +The bit_usage will reflect how the cache is used::
> +
> + # cat info/L2/bit_usage
> + 0=SSSSSSEE;1=SSSSSSEE
> +
> +A resource group cannot be forced to overlap with an exclusive resource group::
> +
> + # echo 'L2:0=0x1;1=0x1' > p1/schemata
> + -sh: echo: write error: Invalid argument
> + # cat info/last_cmd_status
> + overlaps with exclusive group
>
> Example of Cache Pseudo-Locking
> --------------------------------
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Lock portion of L2 cache from cache id 1 using CBM 0x3. Pseudo-locked
> region is exposed at /dev/pseudo_lock/newlock that can be provided to
> application for argument to mmap().
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl/
> -# cd /sys/fs/resctrl
> + # mount -t resctrl resctrl /sys/fs/resctrl/
> + # cd /sys/fs/resctrl
>
> Ensure that there are bits available that can be pseudo-locked, since only
> unused bits can be pseudo-locked the bits to be pseudo-locked needs to be
> -removed from the default resource group's schemata:
> -# cat info/L2/bit_usage
> -0=SSSSSSSS;1=SSSSSSSS
> -# echo 'L2:1=0xfc' > schemata
> -# cat info/L2/bit_usage
> -0=SSSSSSSS;1=SSSSSS00
> +removed from the default resource group's schemata::
> +
> + # cat info/L2/bit_usage
> + 0=SSSSSSSS;1=SSSSSSSS
> + # echo 'L2:1=0xfc' > schemata
> + # cat info/L2/bit_usage
> + 0=SSSSSSSS;1=SSSSSS00
>
> Create a new resource group that will be associated with the pseudo-locked
> region, indicate that it will be used for a pseudo-locked region, and
> -configure the requested pseudo-locked region capacity bitmask:
> +configure the requested pseudo-locked region capacity bitmask::
>
> -# mkdir newlock
> -# echo pseudo-locksetup > newlock/mode
> -# echo 'L2:1=0x3' > newlock/schemata
> + # mkdir newlock
> + # echo pseudo-locksetup > newlock/mode
> + # echo 'L2:1=0x3' > newlock/schemata
>
> On success the resource group's mode will change to pseudo-locked, the
> bit_usage will reflect the pseudo-locked region, and the character device
> -exposing the pseudo-locked region will exist:
> -
> -# cat newlock/mode
> -pseudo-locked
> -# cat info/L2/bit_usage
> -0=SSSSSSSS;1=SSSSSSPP
> -# ls -l /dev/pseudo_lock/newlock
> -crw------- 1 root root 243, 0 Apr 3 05:01 /dev/pseudo_lock/newlock
> -
> -/*
> - * Example code to access one page of pseudo-locked cache region
> - * from user space.
> - */
> -#define _GNU_SOURCE
> -#include <fcntl.h>
> -#include <sched.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <sys/mman.h>
> -
> -/*
> - * It is required that the application runs with affinity to only
> - * cores associated with the pseudo-locked region. Here the cpu
> - * is hardcoded for convenience of example.
> - */
> -static int cpuid = 2;
> -
> -int main(int argc, char *argv[])
> -{
> - cpu_set_t cpuset;
> - long page_size;
> - void *mapping;
> - int dev_fd;
> - int ret;
> -
> - page_size = sysconf(_SC_PAGESIZE);
> -
> - CPU_ZERO(&cpuset);
> - CPU_SET(cpuid, &cpuset);
> - ret = sched_setaffinity(0, sizeof(cpuset), &cpuset);
> - if (ret < 0) {
> - perror("sched_setaffinity");
> - exit(EXIT_FAILURE);
> - }
> -
> - dev_fd = open("/dev/pseudo_lock/newlock", O_RDWR);
> - if (dev_fd < 0) {
> - perror("open");
> - exit(EXIT_FAILURE);
> - }
> -
> - mapping = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED,
> - dev_fd, 0);
> - if (mapping == MAP_FAILED) {
> - perror("mmap");
> - close(dev_fd);
> - exit(EXIT_FAILURE);
> - }
> -
> - /* Application interacts with pseudo-locked memory @mapping */
> -
> - ret = munmap(mapping, page_size);
> - if (ret < 0) {
> - perror("munmap");
> - close(dev_fd);
> - exit(EXIT_FAILURE);
> - }
> -
> - close(dev_fd);
> - exit(EXIT_SUCCESS);
> -}
> +exposing the pseudo-locked region will exist::
> +
> + # cat newlock/mode
> + pseudo-locked
> + # cat info/L2/bit_usage
> + 0=SSSSSSSS;1=SSSSSSPP
> + # ls -l /dev/pseudo_lock/newlock
> + crw------- 1 root root 243, 0 Apr 3 05:01 /dev/pseudo_lock/newlock
> +
> +::
> +
> + /*
> + * Example code to access one page of pseudo-locked cache region
> + * from user space.
> + */
> + #define _GNU_SOURCE
> + #include <fcntl.h>
> + #include <sched.h>
> + #include <stdio.h>
> + #include <stdlib.h>
> + #include <unistd.h>
> + #include <sys/mman.h>
> +
> + /*
> + * It is required that the application runs with affinity to only
> + * cores associated with the pseudo-locked region. Here the cpu
> + * is hardcoded for convenience of example.
> + */
> + static int cpuid = 2;
> +
> + int main(int argc, char *argv[])
> + {
> + cpu_set_t cpuset;
> + long page_size;
> + void *mapping;
> + int dev_fd;
> + int ret;
> +
> + page_size = sysconf(_SC_PAGESIZE);
> +
> + CPU_ZERO(&cpuset);
> + CPU_SET(cpuid, &cpuset);
> + ret = sched_setaffinity(0, sizeof(cpuset), &cpuset);
> + if (ret < 0) {
> + perror("sched_setaffinity");
> + exit(EXIT_FAILURE);
> + }
> +
> + dev_fd = open("/dev/pseudo_lock/newlock", O_RDWR);
> + if (dev_fd < 0) {
> + perror("open");
> + exit(EXIT_FAILURE);
> + }
> +
> + mapping = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED,
> + dev_fd, 0);
> + if (mapping == MAP_FAILED) {
> + perror("mmap");
> + close(dev_fd);
> + exit(EXIT_FAILURE);
> + }
> +
> + /* Application interacts with pseudo-locked memory @mapping */
> +
> + ret = munmap(mapping, page_size);
> + if (ret < 0) {
> + perror("munmap");
> + close(dev_fd);
> + exit(EXIT_FAILURE);
> + }
> +
> + close(dev_fd);
> + exit(EXIT_SUCCESS);
> + }
>
> Locking between applications
> ----------------------------
> @@ -921,86 +978,86 @@ Read lock:
> B) If success read the directory structure.
> C) funlock
>
> -Example with bash:
> -
> -# Atomically read directory structure
> -$ flock -s /sys/fs/resctrl/ find /sys/fs/resctrl
> -
> -# Read directory contents and create new subdirectory
> -
> -$ cat create-dir.sh
> -find /sys/fs/resctrl/ > output.txt
> -mask = function-of(output.txt)
> -mkdir /sys/fs/resctrl/newres/
> -echo mask > /sys/fs/resctrl/newres/schemata
> -
> -$ flock /sys/fs/resctrl/ ./create-dir.sh
> -
> -Example with C:
> -
> -/*
> - * Example code do take advisory locks
> - * before accessing resctrl filesystem
> - */
> -#include <sys/file.h>
> -#include <stdlib.h>
> -
> -void resctrl_take_shared_lock(int fd)
> -{
> - int ret;
> -
> - /* take shared lock on resctrl filesystem */
> - ret = flock(fd, LOCK_SH);
> - if (ret) {
> - perror("flock");
> - exit(-1);
> - }
> -}
> -
> -void resctrl_take_exclusive_lock(int fd)
> -{
> - int ret;
> -
> - /* release lock on resctrl filesystem */
> - ret = flock(fd, LOCK_EX);
> - if (ret) {
> - perror("flock");
> - exit(-1);
> - }
> -}
> -
> -void resctrl_release_lock(int fd)
> -{
> - int ret;
> -
> - /* take shared lock on resctrl filesystem */
> - ret = flock(fd, LOCK_UN);
> - if (ret) {
> - perror("flock");
> - exit(-1);
> - }
> -}
> -
> -void main(void)
> -{
> - int fd, ret;
> -
> - fd = open("/sys/fs/resctrl", O_DIRECTORY);
> - if (fd == -1) {
> - perror("open");
> - exit(-1);
> - }
> - resctrl_take_shared_lock(fd);
> - /* code to read directory contents */
> - resctrl_release_lock(fd);
> -
> - resctrl_take_exclusive_lock(fd);
> - /* code to read and write directory contents */
> - resctrl_release_lock(fd);
> -}
> -
> -Examples for RDT Monitoring along with allocation usage:
> -
> +Example with bash::
> +
> + # Atomically read directory structure
> + $ flock -s /sys/fs/resctrl/ find /sys/fs/resctrl
> +
> + # Read directory contents and create new subdirectory
> +
> + $ cat create-dir.sh
> + find /sys/fs/resctrl/ > output.txt
> + mask = function-of(output.txt)
> + mkdir /sys/fs/resctrl/newres/
> + echo mask > /sys/fs/resctrl/newres/schemata
> +
> + $ flock /sys/fs/resctrl/ ./create-dir.sh
> +
> +Example with C::
> +
> + /*
> + * Example code do take advisory locks
> + * before accessing resctrl filesystem
> + */
> + #include <sys/file.h>
> + #include <stdlib.h>
> +
> + void resctrl_take_shared_lock(int fd)
> + {
> + int ret;
> +
> + /* take shared lock on resctrl filesystem */
> + ret = flock(fd, LOCK_SH);
> + if (ret) {
> + perror("flock");
> + exit(-1);
> + }
> + }
> +
> + void resctrl_take_exclusive_lock(int fd)
> + {
> + int ret;
> +
> + /* release lock on resctrl filesystem */
> + ret = flock(fd, LOCK_EX);
> + if (ret) {
> + perror("flock");
> + exit(-1);
> + }
> + }
> +
> + void resctrl_release_lock(int fd)
> + {
> + int ret;
> +
> + /* take shared lock on resctrl filesystem */
> + ret = flock(fd, LOCK_UN);
> + if (ret) {
> + perror("flock");
> + exit(-1);
> + }
> + }
> +
> + void main(void)
> + {
> + int fd, ret;
> +
> + fd = open("/sys/fs/resctrl", O_DIRECTORY);
> + if (fd == -1) {
> + perror("open");
> + exit(-1);
> + }
> + resctrl_take_shared_lock(fd);
> + /* code to read directory contents */
> + resctrl_release_lock(fd);
> +
> + resctrl_take_exclusive_lock(fd);
> + /* code to read and write directory contents */
> + resctrl_release_lock(fd);
> + }
> +
> +Examples for RDT Monitoring along with allocation usage
> +=======================================================
> Reading monitored data
> ----------------------
> Reading an event file (for ex: mon_data/mon_L3_00/llc_occupancy) would
> @@ -1009,17 +1066,17 @@ group or CTRL_MON group.
>
>
> Example 1 (Monitor CTRL_MON group and subset of tasks in CTRL_MON group)
> ----------
> +------------------------------------------------------------------------
> On a two socket machine (one L3 cache per socket) with just four bits
> -for cache bit masks
> +for cache bit masks::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> -# mkdir p0 p1
> -# echo "L3:0=3;1=c" > /sys/fs/resctrl/p0/schemata
> -# echo "L3:0=3;1=3" > /sys/fs/resctrl/p1/schemata
> -# echo 5678 > p1/tasks
> -# echo 5679 > p1/tasks
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
> + # mkdir p0 p1
> + # echo "L3:0=3;1=c" > /sys/fs/resctrl/p0/schemata
> + # echo "L3:0=3;1=3" > /sys/fs/resctrl/p1/schemata
> + # echo 5678 > p1/tasks
> + # echo 5679 > p1/tasks
>
> The default resource group is unmodified, so we have access to all parts
> of all caches (its schemata file reads "L3:0=f;1=f").
> @@ -1029,47 +1086,51 @@ Tasks that are under the control of group "p0" may only allocate from the
> Tasks in group "p1" use the "lower" 50% of cache on both sockets.
>
> Create monitor groups and assign a subset of tasks to each monitor group.
> +::
>
> -# cd /sys/fs/resctrl/p1/mon_groups
> -# mkdir m11 m12
> -# echo 5678 > m11/tasks
> -# echo 5679 > m12/tasks
> + # cd /sys/fs/resctrl/p1/mon_groups
> + # mkdir m11 m12
> + # echo 5678 > m11/tasks
> + # echo 5679 > m12/tasks
>
> fetch data (data shown in bytes)
> +::
>
> -# cat m11/mon_data/mon_L3_00/llc_occupancy
> -16234000
> -# cat m11/mon_data/mon_L3_01/llc_occupancy
> -14789000
> -# cat m12/mon_data/mon_L3_00/llc_occupancy
> -16789000
> + # cat m11/mon_data/mon_L3_00/llc_occupancy
> + 16234000
> + # cat m11/mon_data/mon_L3_01/llc_occupancy
> + 14789000
> + # cat m12/mon_data/mon_L3_00/llc_occupancy
> + 16789000
>
> The parent ctrl_mon group shows the aggregated data.
> +::
>
> -# cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
> -31234000
> + # cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
> + 31234000
>
> Example 2 (Monitor a task from its creation)
> ----------
> -On a two socket machine (one L3 cache per socket)
> +--------------------------------------------
> +On a two socket machine (one L3 cache per socket)::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> -# mkdir p0 p1
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
> + # mkdir p0 p1
>
> An RMID is allocated to the group once its created and hence the <cmd>
> below is monitored from its creation.
> +::
>
> -# echo $$ > /sys/fs/resctrl/p1/tasks
> -# <cmd>
> + # echo $$ > /sys/fs/resctrl/p1/tasks
> + # <cmd>
>
> -Fetch the data
> +Fetch the data::
>
> -# cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
> -31789000
> + # cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
> + 31789000
>
> Example 3 (Monitor without CAT support or before creating CAT groups)
> ----------
> +---------------------------------------------------------------------
>
> Assume a system like HSW has only CQM and no CAT support. In this case
> the resctrl will still mount but cannot create CTRL_MON directories.
> @@ -1078,27 +1139,29 @@ able to monitor all tasks including kernel threads.
>
> This can also be used to profile jobs cache size footprint before being
> able to allocate them to different allocation groups.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> -# mkdir mon_groups/m01
> -# mkdir mon_groups/m02
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
> + # mkdir mon_groups/m01
> + # mkdir mon_groups/m02
>
> -# echo 3478 > /sys/fs/resctrl/mon_groups/m01/tasks
> -# echo 2467 > /sys/fs/resctrl/mon_groups/m02/tasks
> + # echo 3478 > /sys/fs/resctrl/mon_groups/m01/tasks
> + # echo 2467 > /sys/fs/resctrl/mon_groups/m02/tasks
>
> Monitor the groups separately and also get per domain data. From the
> below its apparent that the tasks are mostly doing work on
> domain(socket) 0.
> +::
>
> -# cat /sys/fs/resctrl/mon_groups/m01/mon_L3_00/llc_occupancy
> -31234000
> -# cat /sys/fs/resctrl/mon_groups/m01/mon_L3_01/llc_occupancy
> -34555
> -# cat /sys/fs/resctrl/mon_groups/m02/mon_L3_00/llc_occupancy
> -31234000
> -# cat /sys/fs/resctrl/mon_groups/m02/mon_L3_01/llc_occupancy
> -32789
> + # cat /sys/fs/resctrl/mon_groups/m01/mon_L3_00/llc_occupancy
> + 31234000
> + # cat /sys/fs/resctrl/mon_groups/m01/mon_L3_01/llc_occupancy
> + 34555
> + # cat /sys/fs/resctrl/mon_groups/m02/mon_L3_00/llc_occupancy
> + 31234000
> + # cat /sys/fs/resctrl/mon_groups/m02/mon_L3_01/llc_occupancy
> + 32789
>
>
> Example 4 (Monitor real time tasks)
> @@ -1107,15 +1170,17 @@ Example 4 (Monitor real time tasks)
> A single socket system which has real time tasks running on cores 4-7
> and non real time tasks on other cpus. We want to monitor the cache
> occupancy of the real time threads on these cores.
> +::
>
> -# mount -t resctrl resctrl /sys/fs/resctrl
> -# cd /sys/fs/resctrl
> -# mkdir p1
> + # mount -t resctrl resctrl /sys/fs/resctrl
> + # cd /sys/fs/resctrl
> + # mkdir p1
>
> -Move the cpus 4-7 over to p1
> -# echo f0 > p1/cpus
> +Move the cpus 4-7 over to p1::
> +

There are extra whitespaces at the tail of the above line.


After fixing the above:

Reviewed-by: Mauro Carvalho Chehab <mchehab+samsung@xxxxxxxxxx>

> + # echo f0 > p1/cpus
>
> -View the llc occupancy snapshot
> +View the llc occupancy snapshot::
>
> -# cat /sys/fs/resctrl/p1/mon_data/mon_L3_00/llc_occupancy
> -11234000
> + # cat /sys/fs/resctrl/p1/mon_data/mon_L3_00/llc_occupancy
> + 11234000



Thanks,
Mauro