All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
@ 2022-11-05 23:23 Qais Yousef
  2022-11-06 17:47 ` kernel test robot
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Qais Yousef @ 2022-11-05 23:23 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot
  Cc: linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang, Jonathan JMChen,
	Hank, Paul Bone, Qais Yousef

From: Qais Yousef <qais.yousef@arm.com>

The new util clamp feature needs a document explaining what it is and
how to use it. The new document hopefully covers everything one needs to
know about uclamp.

Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Qais Yousef (Google) <qyousef@layalina.io>
---

Hopefully a not bad first attempt at explaining everything uclamp; what it is
and how to use it.

I have repeated some ideas to help re-enforce them to the readers who're new to
the concept.


 Documentation/scheduler/sched-util-clamp.rst | 678 +++++++++++++++++++
 1 file changed, 678 insertions(+)
 create mode 100644 Documentation/scheduler/sched-util-clamp.rst

diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
new file mode 100644
index 000000000000..e75b69767afb
--- /dev/null
+++ b/Documentation/scheduler/sched-util-clamp.rst
@@ -0,0 +1,678 @@
+====================
+Utilization Clamping
+====================
+
+1.  INTRODUCTION
+================
+
+Utilization clamping is a scheduler feature that allows user space to help in
+managing the performance requirement of tasks. It was introduced in v5.3
+release. The CGroup support was merged in v5.4.
+
+It is often referred to as util clamp and uclamp. You'll find all variations
+used interchangeably in this documentation and in the source code.
+
+Uclamp is a hinting mechanism that allows the scheduler to understand the
+performance requirements and restrictions of the tasks. Hence help it make
+a better placement decision. And when schedutil cpufreq governor is used, util
+clamp will influence the frequency selection as well.
+
+Since scheduler and schedutil are both driven by PELT (util_avg) signals, util
+clamp acts on that to achieve its goal by clamping the signal to a certain
+point; hence the name. I.e: by clamping utilization we are making the system
+run at a certain performance point.
+
+The right way to view util clamp is as a mechanism to make performance
+constraints request/hint. It consists of two components:
+
+        * UCLAMP_MIN, which sets a lower bound.
+        * UCLAMP_MAX, which sets an upper bound.
+
+These two bounds will ensure a task will operate within this performance range
+of the system. UCLAMP_MIN implies boosting a task, while UCLAMP_MAX implies
+capping a task.
+
+One can tell the system (scheduler) that some tasks require a minimum
+performance point to operate at to deliver the desired user experience. Or one
+can tell the system that some tasks should be restricted from consuming too
+much resources and should NOT go above a specific performance point. Viewing
+the uclamp values as performance points rather than utilization is a better
+abstraction from user space point of view.
+
+As an example, a game can use util clamp to form a feedback loop with its
+perceived FPS. It can dynamically increase the minimum performance point
+required by its display pipeline to ensure no frame is dropped. It can also
+dynamically 'prime' up these tasks if it knows in the coming few 100ms
+a computationally intensive scene is about to happen.
+
+On mobile hardware where the capability of the devices varies a lot, this
+dynamic feedback loop offers a great flexibility in ensuring best user
+experience given the capabilities of any system.
+
+Of course a static configuration is possible too. The exact usage will depend
+on the system, application and the desired outcome.
+
+Another example is in Android where tasks are classified as background,
+foreground, top-app, etc. Util clamp can be used to constraint how much
+resources background tasks are consuming by capping the performance point they
+can run at. This constraint helps reserve resources for important tasks, like
+the ones belonging to the currently active app (top-app group). Beside this
+helps in limiting how much power they consume. This can be more obvious in
+heterogeneous systems; the constraint will help bias the background tasks to
+stay on the little cores which will ensure that:
+
+        1. The big cores are free to run top-app tasks immediately. top-app
+           tasks are the tasks the user is currently interacting with, hence
+           the most important tasks in the system.
+        2. They don't run on a power hungry core and drain battery even if they
+           are CPU intensive tasks.
+
+By making these uclamp performance requests, or rather hints, user space can
+ensure system resources are used optimally to deliver the best user experience
+the system is capable of.
+
+Another use case is to help with overcoming the ramp up latency inherit in how
+scheduler utilization signal is calculated.
+
+A busy task for instance that requires to run at maximum performance point will
+suffer a delay of ~200ms (PELT HALFIFE = 32ms) for the scheduler to realize
+that. This is known to affect workloads like gaming on mobile devices where
+frames will drop due to slow response time to select the higher frequency
+required for the tasks to finish their work in time.
+
+The overall visible effect goes beyond better perceived user
+experience/performance and stretches to help achieve a better overall
+performance/watt if used effectively.
+
+User space can form a feedback loop with thermal subsystem too to ensure the
+device doesn't heat up to the point where it will throttle.
+
+Both SCHED_NORMAL/OTHER and SCHED_FIFO/RR honour uclamp requests/hints.
+
+In SCHED_FIFO/RR case, uclamp gives the option to run RT tasks at any
+performance point rather than being tied to MAX frequency all the time. Which
+can be useful on general purpose systems that run on battery powered devices.
+
+Note that by design RT tasks don't have per-task PELT signal and must always
+run at a constant frequency to combat undeterministic DVFS rampup delays.
+
+Note that using schedutil always implies a single delay to modify the frequency
+when an RT task wakes up. This cost is unchanged by using uclamp. Uclamp only
+helps picking what frequency to request instead of schedutil always requesting
+MAX for all RT tasks.
+
+See section 3.4 for default values and 3.4.1 on how to change RT tasks default
+value.
+
+2.  DESIGN:
+===========
+
+Util clamp is a property of every task in the system. It sets the boundaries of
+its utilization signal; acting as a bias mechanism that influences certain
+decisions within the scheduler.
+
+The actual utilization signal of a task is never clamped in reality. If you
+inspect PELT signals at any point of time you should continue to see them as
+they are intact. Clamping happens only when needed, e.g: when a task wakes up
+and the scheduler needs to select a suitable CPU for it to run on.
+
+Since the goal of util clamp is to allow requesting a minimum and maximum
+performance point for a task to run on, it must be able to influence the
+frequency selection as well as task placement to be most effective. Both of
+which have implications on the utilization value at rq level, which brings us
+to the main design challenge.
+
+When a task wakes up on an rq, the utilization signal of the rq will be
+impacted by the uclamp settings of all the tasks enqueued on it. For example if
+a task requests to run at UTIL_MIN = 512, then the util signal of the rq needs
+to respect this request as well as all other requests from all of the enqueued
+tasks.
+
+To be able to aggregate the util clamp value of all the tasks attached to the
+rq, uclamp must do some housekeeping at every enqueue/dequeue, which is the
+scheduler hot path. Hence care must be taken since any slow down will have
+significant impact on a lot of use cases and could hinder its usability in
+practice.
+
+The way this is handled is by dividing the utilization range into buckets
+(struct uclamp_bucket) which allows us to reduce the search space from every
+task on the rq to only a subset of tasks on the top-most bucket.
+
+When a task is enqueued, we increment a counter in the matching bucket. And on
+dequeue we decrement it. This makes keeping track of the effective uclamp value
+at rq level a lot easier.
+
+As we enqueue and dequeue tasks we keep track of the current effective uclamp
+value of the rq. See section 2.1 for details on how this works.
+
+Later at any path that wants to identify the effective uclamp value of the rq,
+it will simply need to read this effective uclamp value of the rq at that exact
+moment of time it needs to take a decision.
+
+For task placement case, only Energy Aware and Capacity Aware Scheduling
+(EAS/CAS) make use of uclamp for now. This implies heterogeneous systems only.
+When a task wakes up, the scheduler will look at the current effective uclamp
+value of every rq and compare it with the potential new value if the task were
+to be enqueued there. Favoring the rq that will end up with the most energy
+efficient combination.
+
+Similarly in schedutil, when it needs to make a frequency update it will look
+at the current effective uclamp value of the rq which is influenced by the set
+of tasks currently enqueued there and select the appropriate frequency that
+will honour uclamp requests.
+
+Other paths like setting overutilization state (which effectively disables EAS)
+make use of uclamp as well. Such cases are considered necessary housekeeping to
+allow the 2 main use cases above and will not be covered in detail here as they
+could change with implementation details.
+
+2.1  BUCKETS:
+-------------
+
+                           [struct rq]
+
+(bottom)                                                    (top)
+
+  0                                                          1024
+  |                                                           |
+  +-----------+-----------+-----------+----   ----+-----------+
+  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
+  +-----------+-----------+-----------+----   ----+-----------+
+     :           :                                   :
+     +- p0       +- p3                               +- p4
+     :                                               :
+     +- p1                                           +- p5
+     :
+     +- p2
+
+
+DISCLAMER:
+   The diagram above is an illustration rather than a true depiction of the
+   internal data structure.
+
+To reduce the search space when trying to decide the effective uclamp value of
+an rq as tasks are enqueued/dequeued, the whole utilization range is divided
+into N buckets where N is configured at compile time by setting
+CONFIG_UCLAMP_BUCKETS_COUNT. By default it is set to 5.
+
+The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
+
+The range of each bucket is 1024/N. For example for the default value of 5 we
+will have 5 buckets, each of which will cover the following range:
+
+        DELTA = round_closest(1024/5) = 204.8 = 205
+
+        Bucket 0: [0:204]
+        Bucket 1: [205:409]
+        Bucket 2: [410:614]
+        Bucket 3: [615:819]
+        Bucket 4: [820:1024]
+
+When a task p
+
+        p->uclamp[UCLAMP_MIN] = 300
+        p->uclamp[UCLAMP_MAX] = 1024
+
+is enqueued into the rq, Bucket 1 will be incremented for UCLAMP_MIN and Bucket
+4 will be incremented for UCLAMP_MAX to reflect the fact the rq has a task in
+this range.
+
+The rq then keeps track of its current effective uclamp value for each
+uclamp_id.
+
+When a task p is enqueued, the rq value changes as follows:
+
+        // update bucket logic goes here
+        rq->uclamp[UCLAMP_MIN] = max(rq->uclamp[UCLAMP_MIN], p->uclamp[UCLAMP_MIN])
+        // repeat for UCLAMP_MAX
+
+When a task is p dequeued the rq value changes as follows:
+
+        // update bucket logic goes here
+        rq->uclamp[UCLAMP_MIN] = search_top_bucket_for_highest_value()
+        // repeat for UCLAMP_MAX
+
+When all buckets are empty, the rq uclamp values are reset to system defaults.
+See section 3.4 for default values.
+
+
+2.2  MAX AGGREGATION:
+---------------------
+
+Util clamp is tuned to honour the request for the task that requires the
+highest performance point.
+
+When multiple tasks are attached to the same rq, then util clamp must make sure
+the task that needs the highest performance point gets it even if there's
+another task that doesn't need it or is disallowed from reaching this point.
+
+For example, if there are multiple tasks attached to an rq with the following
+values:
+
+        p0->uclamp[UCLAMP_MIN] = 300
+        p0->uclamp[UCLAMP_MAX] = 900
+
+        p1->uclamp[UCLAMP_MIN] = 500
+        p1->uclamp[UCLAMP_MAX] = 500
+
+then assuming both p0 and p1 are enqueued to the same rq
+
+        rq->uclamp[UCLAMP_MIN] = max(300, 500) = 500
+        rq->uclamp[UCLAMP_MAX] = max(900, 500) = 900
+
+As we shall see in section 5.1, this max aggregation is the cause of one of the
+limitations when using util clamp. Particularly for UCLAMP_MAX hint when user
+space would like to save power.
+
+2.3  HIERARCHICAL AGGREGATION:
+------------------------------
+
+As stated earlier, util clamp is a property of every task in the system. But
+the actual applied (effective) value can be influenced by more than just the
+request made by the task or another actor on its behalf (middleware library).
+
+The effective util clamp value of any task is restricted as follows:
+
+  1. By the uclamp settings defined by the cgroup CPU controller it is attached
+     to, if any.
+  2. The restricted value in (1) is then further restricted by the system wide
+     uclamp settings.
+
+Section 3 discusses the interfaces and will expand further on that.
+
+For now suffice to say that if a task makes a request, its actual effective
+value will have to adhere to some restrictions imposed by cgroup and system
+wide settings.
+
+The system will still accept the request even if effectively will look
+different; but as soon as the task moves to a different cgroup or a sysadmin
+modifies the system settings, it'll be able to get what it wants if the new
+settings allows it.
+
+In other words, this aggregation will not cause an error when a task changes
+its uclamp values. It just might not be able to achieve it based on those
+factors.
+
+2.4  Range:
+-----------
+
+Uclamp performance request follow the utilization range: [0:1024] inclusive.
+
+For cgroup interface percentage is used: [0:100] inclusive.
+You can use 'max' instead of 100 like other cgroup interfaces.
+
+3.  INTERFACES:
+===============
+
+3.1  PER TASK INTERFACE:
+------------------------
+
+sched_setattr() syscall was extended to accept two new fields:
+
+* sched_util_min: requests the minimum performance point the system should run
+                  at when this task is running. Or lower performance bound.
+* sched_util_max: requests the maximum performance point the system should run
+                  at when this task is running. Or upper performance bound.
+
+For example:
+
+        attr->sched_util_min = 40% * 1024;
+        attr->sched_util_max = 80% * 1024;
+
+Will tell the system that when task @p is running, it should try its best to
+ensure it starts at a performance point no less than 40% of maximum system's
+capability.
+
+And if the task runs for a long enough time so that its actual utilization goes
+above 80%, then it should not cause the system to operate at a performance
+point higher than that.
+
+The special value -1 is used to reset the uclamp settings to the system
+default.
+
+Note that resetting the uclamp value to system default using -1 is not the same
+as setting the uclamp value to system default.
+
+        attr->sched_util_min = -1  // p0 is reset to system default e.g: 0
+
+        not the same as
+
+        attr->sched_util_min = 0   // p0 is set to 0, the fact it is the same
+                                   // as system default is irrelevant
+
+This distinction is important because as we shall see in system interfaces, the
+default value for RT could be changed. SCHED_NORMAL/OTHER might gain similar
+knobs too in the future.
+
+3.2  CGROUP INTERFACE:
+----------------------
+
+There are two uclamp related values in the CPU cgroup controller:
+
+* cpu.uclamp.min
+* cpu.uclamp.max
+
+When a task is attached to a CPU controller, its uclamp values will be impacted
+as follows:
+
+* cpu.uclamp.min is a protection as described in section 3-3 in
+  Documentation/admin-guide/cgroup-v2.rst.
+
+  If a task uclamp_min value is lower than cpu.uclamp.min, then the task will
+  inherit the cgroup cpu.uclamp.min value.
+
+  In a cgroup hierarchy, effective cpu.uclamp.min is the max of (child,
+  parent).
+
+* cpu.uclamp.max is a limit as described in section 3-2 in
+  Documentation/admin-guide/cgroup-v2.rst.
+
+  If a task uclamp_max value is higher than cpu.uclamp.max, then the task will
+  inherit the cgroup cpu.uclamp.max value.
+
+  In a cgroup hierarchy, effective cpu.uclamp.max is the min of (child,
+  parent).
+
+For example:
+
+        p0->uclamp[UCLAMP_MIN] = // system default;
+        p0->uclamp[UCLAMP_MAX] = // system default;
+
+        p1->uclamp[UCLAMP_MIN] = 40% * 1024;
+        p1->uclamp[UCLAMP_MAX] = 50% * 1024;
+
+        cgroup0->cpu.uclamp.min = 20% * 1024;
+        cgroup0->cpu.uclamp.max = 60% * 1024;
+
+        cgroup1->cpu.uclamp.min = 60% * 1024;
+        cgroup1->cpu.uclamp.max = 100% * 1024;
+
+when p0 and p1 are attached to cgroup0
+
+        p0->uclamp[UCLAMP_MIN] = cgroup0->cpu.uclamp.min = 20% * 1024;
+        p0->uclamp[UCLAMP_MAX] = cgroup0->cpu.uclamp.max = 60% * 1024;
+
+        p1->uclamp[UCLAMP_MIN] = 40% * 1024; // intact
+        p1->uclamp[UCLAMP_MAX] = 50% * 1024; // intact
+
+when p0 and p1 are attached to cgroup1
+
+        p0->uclamp[UCLAMP_MIN] = cgroup1->cpu.uclamp.min = 60% * 1024;
+        p0->uclamp[UCLAMP_MAX] = cgroup1->cpu.uclamp.max = 100% * 1024;
+
+        p1->uclamp[UCLAMP_MIN] = cgroup1->cpu.uclamp.min = 60% * 1024;
+        p1->uclamp[UCLAMP_MAX] = 50% * 1024; // intact
+
+Note that cgroup interfaces allows cpu.uclamp.max value to be lower than
+cpu.uclamp.min. Other interfaces don't allow that.
+
+3.3  SYSTEM INTERFACE:
+----------------------
+
+3.3.1  sched_util_clamp_min:
+----------------------------
+
+System wide limit of allowed UCLAMP_MIN range. By default set to 1024, which
+means tasks are allowed to reach an effective UCLAMP_MIN value in the range of
+[0:1024].
+
+By changing it to 512 for example the effective allowed range reduces to
+[0:512].
+
+This is useful to restrict how much boosting tasks are allowed to acquire.
+
+Requests from tasks to go above this point will still succeed, but effectively
+they won't be achieved until this value is >= p->uclamp[UCLAMP_MIN].
+
+The value must be smaller than or equal to sched_util_clamp_max.
+
+3.3.2  sched_util_clamp_max:
+----------------------------
+
+System wide limit of allowed UCLAMP_MAX range. By default set to 1024, which
+means tasks are allowed to reach an effective UCLAMP_MAX value in the range of
+[0:1024].
+
+By changing it to 512 for example the effective allowed range reduces to
+[0:512]. The visible impact of this is that no task can run above 512, which in
+return means that all rqs are restricted too. IOW, the whole system is capped
+to half its performance capacity.
+
+This is useful to restrict the overall maximum performance point of the system.
+
+Can be handy to limit performance when running low on battery.
+
+Requests from tasks to go above this point will still succeed, but effectively
+they won't be achieved until this value is >= p->uclamp[UCLAMP_MAX].
+
+The value must be greater than or equal to sched_util_clamp_min.
+
+3.4  DEFAULT VALUES:
+----------------------
+
+By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
+
+        p_fair->uclamp[UCLAMP_MIN] = 0
+        p_fair->uclamp[UCLAMP_MAX] = 1024
+
+That is no boosting or restriction on any task. These default values can't be
+changed at boot or runtime. No argument was made yet as to why we should
+provide this, but can be added in the future.
+
+For SCHED_FIFO/SCHED_RR tasks:
+
+        p_rt->uclamp[UCLAMP_MIN] = 1024
+        p_rt->uclamp[UCLAMP_MAX] = 1024
+
+That is by default they're boosted to run at the maximum performance point of
+the system which retains the historical behavior of the RT tasks.
+
+RT tasks default uclamp_min value can be modified at boot or runtime via
+sysctl. See section 3.4.1.
+
+3.4.1  sched_util_clamp_min_rt_default:
+---------------------------------------
+
+Running RT tasks at maximum performance point is expensive on battery powered
+devices and not necessary. To allow system designers to offer good performance
+guarantees for RT tasks without pushing it all the way to maximum performance
+point, this sysctl knob allows tuning the best boost value to address the
+system requirement without burning power running at maximum performance point
+all the time.
+
+Application designers are encouraged to use the per task util clamp interface
+to ensure they are performance and power aware. Ideally this knob should be set
+to 0 by system designers and leave the task of managing performance
+requirements to the apps themselves.
+
+4.  HOW TO USE UTIL CLAMP:
+==========================
+
+Util clamp promotes the concept of user space assisted power and performance
+management. At the scheduler level the info required to make the best decision
+are non existent. But with util clamp user space can hint to the scheduler to
+make better decision about task placement and frequency selection.
+
+Best results are achieved by not making any assumptions about the system the
+application is running on and to use it in conjunction with a feedback loop to
+dynamically monitor and adjust. Ultimately this will allow for a better user
+experience at a better perf/watt.
+
+For some systems and use cases, static setup will help to achieve good results.
+Portability will be a problem in this case. After all how much work one can do
+at 100, 200 or 1024 is unknown and a special property of every system. Unless
+there's a specific target system, static setup should be avoided.
+
+All in all there are enough possibilities to create a whole framework based on
+util clamp or self contained app that makes use of it directly.
+
+4.1  BOOST IMPORTANT AND DVFS-LATENCY-SENSITIVE TASKS:
+------------------------------------------------------
+
+A GUI task might not be busy to warrant driving the frequency high when it
+wakes up. But it requires to finish its work within a specific period of time
+to deliver the desired user experience. The right frequency it requires at
+wakeup will be system dependent. On some underpowered systems it will be high,
+on other overpowered ones, it will be low or 0.
+
+This task can increase its UCLAMP_MIN value every time it misses a deadline to
+ensure on next wake up it runs at a higher performance point. It should try to
+approach the lowest UCLAMP_MIN value that allows to meet its deadline on any
+particular system to achieve the best possible perf/watt for that system.
+
+On heterogeneous systems, it might be important for this task to run on
+a bigger CPU.
+
+Generally it is advised to perceive the input as performance level or point
+which will imply both task placement and frequency selection.
+
+4.2  CAP BACKGROUND TASKS:
+--------------------------
+
+Like explained for Android case in the introduction. Any app can lower
+UCLAMP_MAX for some background tasks that don't care about performance but
+could end up being busy and consume unnecessary system resources on the system.
+
+4.3  POWERSAVE MODE:
+--------------------
+
+sched_util_clamp_max system wide interface can be used to limit all tasks from
+operating at the higher performance points which are usually energy
+inefficient.
+
+This is not unique to uclamp as one can achieve the same by reducing max
+frequency of the cpufreq governor. It can be considered a more convenient
+alternative interface.
+
+4.4  PER APP PERFORMANCE RESTRICTIONS:
+--------------------------------------
+
+Middleware/Utility can provide the user an option to set UCLAMP_MIN/MAX for an
+app every time it is executed to guarantee a minimum performance point and/or
+limit it from draining system power at the cost of reduced performance for
+these apps.
+
+If you want to prevent your laptop from heating up while on the go from
+compiling the kernel and happy to sacrifice performance to save power, but
+still would like to keep your browser performance intact; uclamp enables that.
+
+5.  LIMITATIONS:
+================
+
+5.1  CAPPING FREQUENCY WITH UCLAMP_MAX FAILS UNDER CERTAIN CONDITIONS:
+----------------------------------------------------------------------
+
+If task p0 is capped to run at 512
+
+        p0->uclamp[UCLAMP_MAX] = 512
+
+is sharing the rq with p1 which is free to run at any performance point
+
+        p1->uclamp[UCLAMP_MAX] = 1024
+
+then due to max aggregation the rq will be allowed to reach max performance
+point
+
+        rq->uclamp[UCLAMP_MAX] = max(512, 1024) = 1024
+
+Assuming both p0 and p1 have UCLAMP_MIN = 0, then the frequency selection for
+the rq will depend on the actual utilization value of the tasks.
+
+If p1 is a small task but p0 is a CPU intensive task, then due to the fact that
+both are running at the same rq, p1 will cause the frequency capping to be left
+from the rq although p1, which is allowed to run at any performance point,
+doesn't actually need to run at that frequency.
+
+5.2  UCLAMP_MAX CAN BREAK PELT (UTIL_AVG) SIGNAL
+------------------------------------------------
+
+PELT assumes that frequency will always increase as the signals grow to ensure
+there's always some idle time on the CPU. But with UCLAMP_MAX, we will prevent
+this frequency increase which can lead to no idle time in some circumstances.
+When there's no idle time, then a task will look like a busy loop, which would
+result in util_avg being 1024.
+
+Combing with issue described in 5.2, this an lead to unwanted frequency spikes
+when severely capped tasks share the rq with a small non capped task.
+
+As an example if task p
+
+        p0->util_avg = 300
+        p0->uclamp[UCLAMP_MAX] = 0
+
+wakes up on an idle CPU, then it will run at min frequency this CPU is capable
+of.
+
+        rq->uclamp[UCLAMP_MAX] = 0
+
+If the ratio of Fmax/Fmin is 3, then
+
+        300 * (Fmax/Fmin) = 900
+
+Which indicates the CPU will still see idle time since 900 is < 1024. The
+_actual_ util_avg will NOT be 900 though. It will be higher than 300, but won't
+approach 900. As long as there's idle time, p->util_avg updates will be off by
+a some margin, but not proportional to Fmax/Fmin.
+
+        p0->util_avg = 300 + small_error
+
+Now if the ratio of Fmax/Fmin is 4, then
+
+        300 * (Fmax/Fmin) = 1200
+
+which is higher than 1024 and indicates that the CPU has no idle time. When
+this happens, then the _actual_ util_avg will become 1024.
+
+        p0->util_avg = 1024
+
+If task p1 wakes up on this CPU
+
+        p1->util_avg = 200
+        p1->uclamp[UCLAMP_MAX] = 1024
+
+then the effective UCLAMP_MAX for the CPU will be 1024 according to max
+aggregation rule. But since the capped p0 task was running and throttled
+severely, then the rq->util_avg will be 1024.
+
+        p0->util_avg = 1024
+        p1->util_avg = 200
+
+        rq->util_avg = 1024
+        rq->uclamp[UCLAMP_MAX] = 1024
+
+Hence lead to a frequency spike since if p0 wasn't throttled we should get
+
+        p0->util_avg = 300
+        p1->util_avg = 200
+
+        rq->util_avg = 500
+
+and run somewhere near mid performance point of that CPU, not the Fmax we get.
+
+5.3  SCHEDUTIL RESPONSE TIME ISSUES:
+------------------------------------
+
+schedutil has three limitations:
+
+        1. Hardware takes non-zero time to respond to any frequency change
+           request. On some platforms can be in the order of few ms.
+        2. Non fast-switch systems require a worker deadline thread to wake up
+           and perform the frequency change, which adds measurable overhead.
+        3. schedutil rate_limit_us drops any requests during this rate_limit_us
+           window.
+
+If a relatively small task is doing critical job and requires a certain
+performance point when it wakes up and starts running, then all these
+limitations will prevent it from getting what it wants in the time scale it
+expects.
+
+This limitation is not only impactful when using uclamp, but will be more
+prevalent as we no longer gradually ramp up or down. We could easily be
+jumping between frequencies depending on the order tasks wake up, and their
+respective uclamp values.
+
+We regard that as a limitation of the capabilities of the underlying system
+itself.
+
+There is room to improve the behavior of schedutil rate_limit_us, but not much
+to be done for 1 or 2. They are considered hard limitations of the system.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-05 23:23 [PATCH] Documentation: sched: Add a new sched-util-clamp.rst Qais Yousef
@ 2022-11-06 17:47 ` kernel test robot
  2022-11-13 15:26   ` Qais Yousef
  2022-11-14  2:47 ` Bagas Sanjaya
  2022-11-14  9:22 ` Bagas Sanjaya
  2 siblings, 1 reply; 11+ messages in thread
From: kernel test robot @ 2022-11-06 17:47 UTC (permalink / raw)
  To: Qais Yousef, Ingo Molnar, Peter Zijlstra, Dietmar Eggemann,
	Vincent Guittot
  Cc: oe-kbuild-all, linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang,
	Jonathan JMChen, Hank, Paul Bone, Qais Yousef

[-- Attachment #1: Type: text/plain, Size: 2502 bytes --]

Hi Qais,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on lwn/docs-next]
[also build test WARNING on tip/master linus/master v6.1-rc3 next-20221104]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Qais-Yousef/Documentation-sched-Add-a-new-sched-util-clamp-rst/20221106-072619
base:   git://git.lwn.net/linux.git docs-next
patch link:    https://lore.kernel.org/r/20221105232343.887199-1-qyousef%40layalina.io
patch subject: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
reproduce:
        # https://github.com/intel-lab-lkp/linux/commit/18b40e54df3058f348a5df25fad6baad82d28f1a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Qais-Yousef/Documentation-sched-Add-a-new-sched-util-clamp-rst/20221106-072619
        git checkout 18b40e54df3058f348a5df25fad6baad82d28f1a
        make menuconfig
        # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS
        make htmldocs

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

All warnings (new ones prefixed by >>):

>> Documentation/scheduler/sched-util-clamp.rst:181: WARNING: Unexpected indentation.
>> Documentation/scheduler/sched-util-clamp.rst: WARNING: document isn't included in any toctree

vim +181 Documentation/scheduler/sched-util-clamp.rst

   175	
   176	  0                                                          1024
   177	  |                                                           |
   178	  +-----------+-----------+-----------+----   ----+-----------+
   179	  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
   180	  +-----------+-----------+-----------+----   ----+-----------+
 > 181	     :           :                                   :
   182	     +- p0       +- p3                               +- p4
   183	     :                                               :
   184	     +- p1                                           +- p5
   185	     :
   186	     +- p2
   187	
   188	
   189	DISCLAMER:
   190	   The diagram above is an illustration rather than a true depiction of the
   191	   internal data structure.
   192	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

[-- Attachment #2: config --]
[-- Type: text/plain, Size: 38869 bytes --]

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 6.1.0-rc1 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc-11 (Debian 11.3.0-8) 11.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=110300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23900
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23900
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_PAHOLE_VERSION=123
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y

#
# General setup
#
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_COMPILE_TEST=y
# CONFIG_WERROR is not set
CONFIG_LOCALVERSION=""
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
# CONFIG_KERNEL_ZSTD is not set
CONFIG_DEFAULT_INIT=""
CONFIG_DEFAULT_HOSTNAME="(none)"
# CONFIG_SYSVIPC is not set
# CONFIG_WATCH_QUEUE is not set
# CONFIG_CROSS_MEMORY_ATTACH is not set
# CONFIG_USELIB is not set
CONFIG_HAVE_ARCH_AUDITSYSCALL=y

#
# IRQ subsystem
#
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_HARDIRQS_SW_RESEND=y
CONFIG_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN_HIERARCHY=y
CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y
CONFIG_GENERIC_IRQ_RESERVATION_MODE=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
# end of IRQ subsystem

CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_ARCH_CLOCKSOURCE_INIT=y
CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y

#
# Timers subsystem
#
CONFIG_HZ_PERIODIC=y
# CONFIG_NO_HZ_IDLE is not set
# CONFIG_NO_HZ is not set
# CONFIG_HIGH_RES_TIMERS is not set
CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100
# end of Timers subsystem

CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y

#
# BPF subsystem
#
# CONFIG_BPF_SYSCALL is not set
# end of BPF subsystem

CONFIG_PREEMPT_NONE_BUILD=y
CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set
# CONFIG_PREEMPT_DYNAMIC is not set

#
# CPU/Task time and stats accounting
#
CONFIG_TICK_CPU_ACCOUNTING=y
# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
# CONFIG_IRQ_TIME_ACCOUNTING is not set
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_PSI is not set
# end of CPU/Task time and stats accounting

CONFIG_CPU_ISOLATION=y

#
# RCU Subsystem
#
CONFIG_TINY_RCU=y
# CONFIG_RCU_EXPERT is not set
CONFIG_SRCU=y
CONFIG_TINY_SRCU=y
# end of RCU Subsystem

# CONFIG_IKCONFIG is not set
# CONFIG_IKHEADERS is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y

#
# Scheduler features
#
# end of Scheduler features

CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
CONFIG_CC_HAS_INT128=y
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
CONFIG_GCC12_NO_ARRAY_BOUNDS=y
CONFIG_ARCH_SUPPORTS_INT128=y
# CONFIG_CGROUPS is not set
CONFIG_NAMESPACES=y
# CONFIG_UTS_NS is not set
# CONFIG_TIME_NS is not set
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
# CONFIG_CHECKPOINT_RESTORE is not set
# CONFIG_SCHED_AUTOGROUP is not set
# CONFIG_SYSFS_DEPRECATED is not set
# CONFIG_RELAY is not set
# CONFIG_BLK_DEV_INITRD is not set
# CONFIG_BOOT_CONFIG is not set
# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_LD_ORPHAN_WARN=y
CONFIG_SYSCTL=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
# CONFIG_EXPERT is not set
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_SYSFS_SYSCALL=y
CONFIG_FHANDLE=y
CONFIG_POSIX_TIMERS=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_FUTEX_PI=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_IO_URING=y
CONFIG_ADVISE_SYSCALLS=y
CONFIG_MEMBARRIER=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
CONFIG_RSEQ=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# end of Kernel Performance Events And Counters

# CONFIG_PROFILING is not set
# end of General setup

CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_MMU=y
CONFIG_ARCH_MMAP_RND_BITS_MIN=28
CONFIG_ARCH_MMAP_RND_BITS_MAX=32
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_NR_GPIO=1024
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_PGTABLE_LEVELS=4
CONFIG_CC_HAS_SANE_STACKPROTECTOR=y

#
# Processor type and features
#
# CONFIG_SMP is not set
CONFIG_X86_FEATURE_NAMES=y
CONFIG_X86_MPPARSE=y
# CONFIG_GOLDFISH is not set
# CONFIG_X86_CPU_RESCTRL is not set
# CONFIG_X86_EXTENDED_PLATFORM is not set
# CONFIG_SCHED_OMIT_FRAME_POINTER is not set
# CONFIG_HYPERVISOR_GUEST is not set
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_IA32_FEAT_CTL=y
CONFIG_X86_VMX_FEATURE_NAMES=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_HYGON=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_CPU_SUP_ZHAOXIN=y
CONFIG_HPET_TIMER=y
CONFIG_DMI=y
CONFIG_NR_CPUS_RANGE_BEGIN=1
CONFIG_NR_CPUS_RANGE_END=1
CONFIG_NR_CPUS_DEFAULT=1
CONFIG_NR_CPUS=1
CONFIG_UP_LATE_INIT=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set
# CONFIG_X86_MCE is not set

#
# Performance monitoring
#
# CONFIG_PERF_EVENTS_AMD_POWER is not set
# CONFIG_PERF_EVENTS_AMD_UNCORE is not set
# CONFIG_PERF_EVENTS_AMD_BRS is not set
# end of Performance monitoring

CONFIG_X86_16BIT=y
CONFIG_X86_ESPFIX64=y
CONFIG_X86_VSYSCALL_EMULATION=y
# CONFIG_X86_IOPL_IOPERM is not set
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set
# CONFIG_X86_5LEVEL is not set
CONFIG_X86_DIRECT_GBPAGES=y
# CONFIG_AMD_MEM_ENCRYPT is not set
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
CONFIG_MTRR=y
# CONFIG_MTRR_SANITIZER is not set
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_X86_UMIP=y
CONFIG_CC_HAS_IBT=y
# CONFIG_X86_KERNEL_IBT is not set
# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set
CONFIG_X86_INTEL_TSX_MODE_OFF=y
# CONFIG_X86_INTEL_TSX_MODE_ON is not set
# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
# CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not set
CONFIG_PHYSICAL_START=0x1000000
# CONFIG_RELOCATABLE is not set
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_LEGACY_VSYSCALL_XONLY=y
# CONFIG_LEGACY_VSYSCALL_NONE is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_MODIFY_LDT_SYSCALL=y
# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
CONFIG_HAVE_LIVEPATCH=y
# end of Processor type and features

CONFIG_CC_HAS_SLS=y
CONFIG_CC_HAS_RETURN_THUNK=y
# CONFIG_SPECULATION_MITIGATIONS is not set
CONFIG_ARCH_HAS_ADD_PAGES=y
CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y

#
# Power management and ACPI options
#
# CONFIG_SUSPEND is not set
# CONFIG_PM is not set
CONFIG_ARCH_SUPPORTS_ACPI=y
# CONFIG_ACPI is not set

#
# CPU Frequency scaling
#
# CONFIG_CPU_FREQ is not set
# end of CPU Frequency scaling

#
# CPU Idle
#
# CONFIG_CPU_IDLE is not set
# end of CPU Idle
# end of Power management and ACPI options

#
# Bus options (PCI etc.)
#
CONFIG_ISA_DMA_API=y
# end of Bus options (PCI etc.)

#
# Binary Emulations
#
# CONFIG_IA32_EMULATION is not set
# CONFIG_X86_X32_ABI is not set
# end of Binary Emulations

CONFIG_HAVE_KVM=y
# CONFIG_VIRTUALIZATION is not set
CONFIG_AS_AVX512=y
CONFIG_AS_SHA1_NI=y
CONFIG_AS_SHA256_NI=y
CONFIG_AS_TPAUSE=y

#
# General architecture-dependent options
#
CONFIG_GENERIC_ENTRY=y
# CONFIG_JUMP_LABEL is not set
# CONFIG_STATIC_CALL_SELFTEST is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
CONFIG_HAVE_NMI=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_CONTIGUOUS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
CONFIG_ARCH_HAS_SET_MEMORY=y
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
CONFIG_ARCH_WANTS_NO_INSTR=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_RSEQ=y
CONFIG_HAVE_RUST=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y
CONFIG_HAVE_PERF_REGS=y
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
CONFIG_MMU_GATHER_MERGE_VMAS=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y
CONFIG_HAVE_ARCH_SECCOMP=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
# CONFIG_SECCOMP is not set
CONFIG_HAVE_ARCH_STACKLEAK=y
CONFIG_HAVE_STACKPROTECTOR=y
# CONFIG_STACKPROTECTOR is not set
CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
CONFIG_LTO_NONE=y
CONFIG_ARCH_SUPPORTS_CFI_CLANG=y
CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
CONFIG_HAVE_CONTEXT_TRACKING_USER=y
CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
CONFIG_HAVE_MOVE_PUD=y
CONFIG_HAVE_MOVE_PMD=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
CONFIG_SOFTIRQ_ON_OWN_STACK=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
CONFIG_HAVE_EXIT_THREAD=y
CONFIG_ARCH_MMAP_RND_BITS=28
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
CONFIG_HAVE_OBJTOOL=y
CONFIG_HAVE_JUMP_LABEL_HACK=y
CONFIG_HAVE_NOINSTR_HACK=y
CONFIG_HAVE_NOINSTR_VALIDATION=y
CONFIG_HAVE_UACCESS_VALIDATION=y
CONFIG_HAVE_STACK_VALIDATION=y
CONFIG_HAVE_RELIABLE_STACKTRACE=y
# CONFIG_COMPAT_32BIT_TIME is not set
CONFIG_HAVE_ARCH_VMAP_STACK=y
# CONFIG_VMAP_STACK is not set
CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
CONFIG_RANDOMIZE_KSTACK_OFFSET=y
# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
CONFIG_ARCH_HAS_MEM_ENCRYPT=y
CONFIG_HAVE_STATIC_CALL=y
CONFIG_HAVE_STATIC_CALL_INLINE=y
CONFIG_HAVE_PREEMPT_DYNAMIC=y
CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y
CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
CONFIG_DYNAMIC_SIGFRAME=y
CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y

#
# GCOV-based kernel profiling
#
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# end of GCOV-based kernel profiling

CONFIG_HAVE_GCC_PLUGINS=y
# CONFIG_GCC_PLUGINS is not set
# end of General architecture-dependent options

CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
# CONFIG_MODULES is not set
CONFIG_BLOCK=y
# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
# CONFIG_BLK_DEV_BSGLIB is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
# CONFIG_BLK_DEV_ZONED is not set
# CONFIG_BLK_WBT is not set
# CONFIG_BLK_SED_OPAL is not set
# CONFIG_BLK_INLINE_ENCRYPTION is not set

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_EFI_PARTITION=y
# end of Partition Types

#
# IO Schedulers
#
# CONFIG_MQ_IOSCHED_DEADLINE is not set
# CONFIG_MQ_IOSCHED_KYBER is not set
# CONFIG_IOSCHED_BFQ is not set
# end of IO Schedulers

CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
CONFIG_INLINE_READ_UNLOCK=y
CONFIG_INLINE_READ_UNLOCK_IRQ=y
CONFIG_INLINE_WRITE_UNLOCK=y
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y
CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y

#
# Executable file formats
#
# CONFIG_BINFMT_ELF is not set
# CONFIG_BINFMT_SCRIPT is not set
# CONFIG_BINFMT_MISC is not set
CONFIG_COREDUMP=y
# end of Executable file formats

#
# Memory Management options
#
# CONFIG_SWAP is not set

#
# SLAB allocator options
#
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_SLAB_MERGE_DEFAULT is not set
# CONFIG_SLAB_FREELIST_RANDOM is not set
# CONFIG_SLAB_FREELIST_HARDENED is not set
# CONFIG_SLUB_STATS is not set
# end of SLAB allocator options

# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
# CONFIG_COMPAT_BRK is not set
CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
# CONFIG_SPARSEMEM_VMEMMAP is not set
CONFIG_HAVE_FAST_GUP=y
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
# CONFIG_COMPACTION is not set
# CONFIG_PAGE_REPORTING is not set
CONFIG_PHYS_ADDR_T_64BIT=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_ARCH_WANTS_THP_SWAP=y
# CONFIG_TRANSPARENT_HUGEPAGE is not set
CONFIG_NEED_PER_CPU_KM=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
# CONFIG_CMA is not set
CONFIG_GENERIC_EARLY_IOREMAP=y
# CONFIG_IDLE_PAGE_TRACKING is not set
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
CONFIG_ARCH_HAS_PTE_DEVMAP=y
CONFIG_ZONE_DMA=y
CONFIG_ZONE_DMA32=y
CONFIG_VM_EVENT_COUNTERS=y
# CONFIG_PERCPU_STATS is not set

#
# GUP_TEST needs to have DEBUG_FS enabled
#
CONFIG_ARCH_HAS_PTE_SPECIAL=y
CONFIG_SECRETMEM=y
# CONFIG_ANON_VMA_NAME is not set
# CONFIG_USERFAULTFD is not set
# CONFIG_LRU_GEN is not set

#
# Data Access Monitoring
#
# CONFIG_DAMON is not set
# end of Data Access Monitoring
# end of Memory Management options

# CONFIG_NET is not set

#
# Device Drivers
#
CONFIG_HAVE_EISA=y
# CONFIG_EISA is not set
CONFIG_HAVE_PCI=y
# CONFIG_PCI is not set
# CONFIG_PCCARD is not set

#
# Generic Driver Options
#
# CONFIG_UEVENT_HELPER is not set
# CONFIG_DEVTMPFS is not set
# CONFIG_STANDALONE is not set
# CONFIG_PREVENT_FIRMWARE_BUILD is not set

#
# Firmware loader
#
CONFIG_FW_LOADER=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_FW_LOADER_USER_HELPER is not set
# CONFIG_FW_LOADER_COMPRESS is not set
# CONFIG_FW_UPLOAD is not set
# end of Firmware loader

CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_GENERIC_CPU_VULNERABILITIES=y
# end of Generic Driver Options

#
# Bus devices
#
# CONFIG_ARM_INTEGRATOR_LM is not set
# CONFIG_BT1_APB is not set
# CONFIG_BT1_AXI is not set
# CONFIG_HISILICON_LPC is not set
# CONFIG_INTEL_IXP4XX_EB is not set
# CONFIG_QCOM_EBI2 is not set
# CONFIG_MHI_BUS is not set
# CONFIG_MHI_BUS_EP is not set
# end of Bus devices

#
# Firmware Drivers
#

#
# ARM System Control and Management Interface Protocol
#
# CONFIG_ARM_SCMI_PROTOCOL is not set
# end of ARM System Control and Management Interface Protocol

# CONFIG_EDD is not set
CONFIG_FIRMWARE_MEMMAP=y
# CONFIG_DMIID is not set
# CONFIG_DMI_SYSFS is not set
CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
# CONFIG_FW_CFG_SYSFS is not set
# CONFIG_SYSFB_SIMPLEFB is not set
# CONFIG_BCM47XX_NVRAM is not set
# CONFIG_GOOGLE_FIRMWARE is not set

#
# Tegra firmware driver
#
# end of Tegra firmware driver
# end of Firmware Drivers

# CONFIG_GNSS is not set
# CONFIG_MTD is not set
# CONFIG_OF is not set
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not set
# CONFIG_BLK_DEV is not set

#
# NVME Support
#
# CONFIG_NVME_FC is not set
# end of NVME Support

#
# Misc devices
#
# CONFIG_DUMMY_IRQ is not set
# CONFIG_ATMEL_SSC is not set
# CONFIG_ENCLOSURE_SERVICES is not set
# CONFIG_QCOM_COINCELL is not set
# CONFIG_SRAM is not set
# CONFIG_XILINX_SDFEC is not set
# CONFIG_C2PORT is not set

#
# EEPROM support
#
# CONFIG_EEPROM_93CX6 is not set
# end of EEPROM support

#
# Texas Instruments shared transport line discipline
#
# end of Texas Instruments shared transport line discipline

#
# Altera FPGA firmware download module (requires I2C)
#
# CONFIG_ECHO is not set
# CONFIG_PVPANIC is not set
# end of Misc devices

#
# SCSI device support
#
CONFIG_SCSI_MOD=y
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set
# end of SCSI device support

# CONFIG_ATA is not set
# CONFIG_MD is not set
# CONFIG_TARGET_CORE is not set

#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# end of IEEE 1394 (FireWire) support

# CONFIG_MACINTOSH_DRIVERS is not set

#
# Input device support
#
CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
# CONFIG_INPUT_SPARSEKMAP is not set
# CONFIG_INPUT_MATRIXKMAP is not set

#
# Userland interfaces
#
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
# CONFIG_RMI4_CORE is not set

#
# Hardware I/O ports
#
# CONFIG_SERIO is not set
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
# CONFIG_GAMEPORT is not set
# end of Hardware I/O ports
# end of Input device support

#
# Character devices
#
CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set
# CONFIG_LDISC_AUTOLOAD is not set

#
# Serial drivers
#
# CONFIG_SERIAL_8250 is not set

#
# Non-8250 serial port support
#
# CONFIG_SERIAL_AMBA_PL010 is not set
# CONFIG_SERIAL_MESON is not set
# CONFIG_SERIAL_CLPS711X is not set
# CONFIG_SERIAL_SAMSUNG is not set
# CONFIG_SERIAL_TEGRA is not set
# CONFIG_SERIAL_IMX is not set
# CONFIG_SERIAL_UARTLITE is not set
# CONFIG_SERIAL_SH_SCI is not set
# CONFIG_SERIAL_MSM is not set
# CONFIG_SERIAL_VT8500 is not set
# CONFIG_SERIAL_OMAP is not set
# CONFIG_SERIAL_LANTIQ is not set
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_TIMBERDALE is not set
# CONFIG_SERIAL_BCM63XX is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
# CONFIG_SERIAL_ALTERA_UART is not set
# CONFIG_SERIAL_MXS_AUART is not set
# CONFIG_SERIAL_MPS2_UART is not set
# CONFIG_SERIAL_ARC is not set
# CONFIG_SERIAL_FSL_LPUART is not set
# CONFIG_SERIAL_FSL_LINFLEXUART is not set
# CONFIG_SERIAL_ST_ASC is not set
# CONFIG_SERIAL_STM32 is not set
# CONFIG_SERIAL_OWL is not set
# CONFIG_SERIAL_RDA is not set
# CONFIG_SERIAL_LITEUART is not set
# CONFIG_SERIAL_SUNPLUS is not set
# end of Serial drivers

# CONFIG_SERIAL_NONSTANDARD is not set
# CONFIG_NULL_TTY is not set
# CONFIG_SERIAL_DEV_BUS is not set
# CONFIG_VIRTIO_CONSOLE is not set
# CONFIG_IPMI_HANDLER is not set
# CONFIG_ASPEED_KCS_IPMI_BMC is not set
# CONFIG_NPCM7XX_KCS_IPMI_BMC is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_MWAVE is not set
# CONFIG_DEVMEM is not set
# CONFIG_NVRAM is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
# CONFIG_RANDOM_TRUST_CPU is not set
# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
# end of Character devices

#
# I2C support
#
# CONFIG_I2C is not set
# end of I2C support

# CONFIG_I3C is not set
# CONFIG_SPI is not set
# CONFIG_SPMI is not set
# CONFIG_HSI is not set
# CONFIG_PPS is not set

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK_OPTIONAL=y

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
# end of PTP clock support

# CONFIG_PINCTRL is not set
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not set
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set
# CONFIG_THERMAL is not set
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y
# CONFIG_SSB is not set
CONFIG_BCMA_POSSIBLE=y
# CONFIG_BCMA is not set

#
# Multifunction device drivers
#
# CONFIG_MFD_SUN4I_GPADC is not set
# CONFIG_MFD_AT91_USART is not set
# CONFIG_MFD_MADERA is not set
# CONFIG_MFD_EXYNOS_LPASS is not set
# CONFIG_MFD_MXS_LRADC is not set
# CONFIG_MFD_MX25_TSADC is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_MFD_KEMPLD is not set
# CONFIG_MFD_MT6397 is not set
# CONFIG_MFD_PM8XXX is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_ABX500_CORE is not set
# CONFIG_MFD_SUN6I_PRCM is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_TI_AM335X_TSCADC is not set
# CONFIG_MFD_TQMX86 is not set
# CONFIG_MFD_STM32_LPTIMER is not set
# CONFIG_MFD_STM32_TIMERS is not set
# end of Multifunction device drivers

# CONFIG_REGULATOR is not set
# CONFIG_RC_CORE is not set

#
# CEC support
#
# CONFIG_MEDIA_CEC_SUPPORT is not set
# end of CEC support

# CONFIG_MEDIA_SUPPORT is not set

#
# Graphics support
#
# CONFIG_IMX_IPUV3_CORE is not set
# CONFIG_DRM is not set

#
# ARM devices
#
# end of ARM devices

#
# Frame buffer Devices
#
# CONFIG_FB is not set
# CONFIG_MMP_DISP is not set
# end of Frame buffer Devices

#
# Backlight & LCD device support
#
# CONFIG_LCD_CLASS_DEVICE is not set
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
# end of Backlight & LCD device support

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
# end of Console display driver support
# end of Graphics support

# CONFIG_SOUND is not set

#
# HID support
#
# CONFIG_HID is not set
# end of HID support

CONFIG_USB_OHCI_LITTLE_ENDIAN=y
# CONFIG_USB_SUPPORT is not set
# CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set
# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
CONFIG_EDAC_ATOMIC_SCRUB=y
CONFIG_EDAC_SUPPORT=y
CONFIG_RTC_LIB=y
CONFIG_RTC_MC146818_LIB=y
# CONFIG_RTC_CLASS is not set
# CONFIG_DMADEVICES is not set

#
# DMABUF options
#
# CONFIG_SYNC_FILE is not set
# CONFIG_DMABUF_HEAPS is not set
# end of DMABUF options

# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
# CONFIG_VFIO is not set
# CONFIG_VIRT_DRIVERS is not set
# CONFIG_VIRTIO_MENU is not set
# CONFIG_VHOST_MENU is not set

#
# Microsoft Hyper-V guest support
#
# end of Microsoft Hyper-V guest support

# CONFIG_GREYBUS is not set
# CONFIG_COMEDI is not set
# CONFIG_STAGING is not set
# CONFIG_CHROME_PLATFORMS is not set
# CONFIG_MELLANOX_PLATFORM is not set
# CONFIG_OLPC_XO175 is not set
# CONFIG_SURFACE_PLATFORMS is not set
# CONFIG_X86_PLATFORM_DEVICES is not set
# CONFIG_COMMON_CLK is not set
# CONFIG_HWSPINLOCK is not set

#
# Clock Source drivers
#
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
# CONFIG_BCM2835_TIMER is not set
# CONFIG_BCM_KONA_TIMER is not set
# CONFIG_DAVINCI_TIMER is not set
# CONFIG_DIGICOLOR_TIMER is not set
# CONFIG_OMAP_DM_TIMER is not set
# CONFIG_DW_APB_TIMER is not set
# CONFIG_FTTMR010_TIMER is not set
# CONFIG_IXP4XX_TIMER is not set
# CONFIG_MESON6_TIMER is not set
# CONFIG_OWL_TIMER is not set
# CONFIG_RDA_TIMER is not set
# CONFIG_SUN4I_TIMER is not set
# CONFIG_TEGRA_TIMER is not set
# CONFIG_VT8500_TIMER is not set
# CONFIG_NPCM7XX_TIMER is not set
# CONFIG_ASM9260_TIMER is not set
# CONFIG_CLKSRC_DBX500_PRCMU is not set
# CONFIG_CLPS711X_TIMER is not set
# CONFIG_MXS_TIMER is not set
# CONFIG_NSPIRE_TIMER is not set
# CONFIG_INTEGRATOR_AP_TIMER is not set
# CONFIG_CLKSRC_PISTACHIO is not set
# CONFIG_CLKSRC_STM32_LP is not set
# CONFIG_ARMV7M_SYSTICK is not set
# CONFIG_ATMEL_PIT is not set
# CONFIG_ATMEL_ST is not set
# CONFIG_CLKSRC_SAMSUNG_PWM is not set
# CONFIG_FSL_FTM_TIMER is not set
# CONFIG_OXNAS_RPS_TIMER is not set
# CONFIG_MTK_TIMER is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_RENESAS_OSTM is not set
# CONFIG_SH_TIMER_TMU is not set
# CONFIG_EM_TIMER_STI is not set
# CONFIG_CLKSRC_PXA is not set
# CONFIG_TIMER_IMX_SYS_CTR is not set
# CONFIG_CLKSRC_ST_LPC is not set
# CONFIG_GXP_TIMER is not set
# CONFIG_MSC313E_TIMER is not set
# CONFIG_MICROCHIP_PIT64B is not set
# end of Clock Source drivers

# CONFIG_MAILBOX is not set
# CONFIG_IOMMU_SUPPORT is not set

#
# Remoteproc drivers
#
# CONFIG_REMOTEPROC is not set
# end of Remoteproc drivers

#
# Rpmsg drivers
#
# CONFIG_RPMSG_VIRTIO is not set
# end of Rpmsg drivers

#
# SOC (System On Chip) specific Drivers
#

#
# Amlogic SoC drivers
#
# CONFIG_MESON_CANVAS is not set
# CONFIG_MESON_CLK_MEASURE is not set
# CONFIG_MESON_GX_SOCINFO is not set
# CONFIG_MESON_MX_SOCINFO is not set
# end of Amlogic SoC drivers

#
# Apple SoC drivers
#
# CONFIG_APPLE_SART is not set
# end of Apple SoC drivers

#
# ASPEED SoC drivers
#
# CONFIG_ASPEED_LPC_CTRL is not set
# CONFIG_ASPEED_LPC_SNOOP is not set
# CONFIG_ASPEED_UART_ROUTING is not set
# CONFIG_ASPEED_P2A_CTRL is not set
# CONFIG_ASPEED_SOCINFO is not set
# end of ASPEED SoC drivers

# CONFIG_AT91_SOC_ID is not set
# CONFIG_AT91_SOC_SFR is not set

#
# Broadcom SoC drivers
#
# CONFIG_SOC_BCM63XX is not set
# CONFIG_SOC_BRCMSTB is not set
# end of Broadcom SoC drivers

#
# NXP/Freescale QorIQ SoC drivers
#
# end of NXP/Freescale QorIQ SoC drivers

#
# fujitsu SoC drivers
#
# end of fujitsu SoC drivers

#
# i.MX SoC drivers
#
# CONFIG_SOC_IMX8M is not set
# CONFIG_SOC_IMX9 is not set
# end of i.MX SoC drivers

#
# IXP4xx SoC drivers
#
# CONFIG_IXP4XX_QMGR is not set
# CONFIG_IXP4XX_NPE is not set
# end of IXP4xx SoC drivers

#
# Enable LiteX SoC Builder specific drivers
#
# CONFIG_LITEX_SOC_CONTROLLER is not set
# end of Enable LiteX SoC Builder specific drivers

#
# MediaTek SoC drivers
#
# CONFIG_MTK_CMDQ is not set
# CONFIG_MTK_DEVAPC is not set
# CONFIG_MTK_INFRACFG is not set
# CONFIG_MTK_MMSYS is not set
# end of MediaTek SoC drivers

#
# Qualcomm SoC drivers
#
# CONFIG_QCOM_GENI_SE is not set
# CONFIG_QCOM_GSBI is not set
# CONFIG_QCOM_LLCC is not set
# CONFIG_QCOM_RPMH is not set
# CONFIG_QCOM_SPM is not set
# CONFIG_QCOM_ICC_BWMON is not set
# end of Qualcomm SoC drivers

# CONFIG_SOC_RENESAS is not set
# CONFIG_ROCKCHIP_GRF is not set
# CONFIG_SOC_SAMSUNG is not set
# CONFIG_SOC_TI is not set
# CONFIG_UX500_SOC_ID is not set

#
# Xilinx SoC drivers
#
# end of Xilinx SoC drivers
# end of SOC (System On Chip) specific Drivers

# CONFIG_PM_DEVFREQ is not set
# CONFIG_EXTCON is not set
# CONFIG_MEMORY is not set
# CONFIG_IIO is not set
# CONFIG_PWM is not set

#
# IRQ chip support
#
# CONFIG_AL_FIC is not set
# CONFIG_RENESAS_INTC_IRQPIN is not set
# CONFIG_RENESAS_IRQC is not set
# CONFIG_RENESAS_RZA1_IRQC is not set
# CONFIG_RENESAS_RZG2L_IRQC is not set
# CONFIG_SL28CPLD_INTC is not set
# CONFIG_TS4800_IRQ is not set
# CONFIG_INGENIC_TCU_IRQ is not set
# CONFIG_IRQ_UNIPHIER_AIDET is not set
# CONFIG_MESON_IRQ_GPIO is not set
# CONFIG_IMX_IRQSTEER is not set
# CONFIG_IMX_INTMUX is not set
# CONFIG_EXYNOS_IRQ_COMBINER is not set
# CONFIG_MST_IRQ is not set
# CONFIG_MCHP_EIC is not set
# CONFIG_SUNPLUS_SP7021_INTC is not set
# end of IRQ chip support

# CONFIG_IPACK_BUS is not set
# CONFIG_RESET_CONTROLLER is not set

#
# PHY Subsystem
#
# CONFIG_GENERIC_PHY is not set
# CONFIG_PHY_PISTACHIO_USB is not set
# CONFIG_PHY_CAN_TRANSCEIVER is not set

#
# PHY drivers for Broadcom platforms
#
# CONFIG_PHY_BCM63XX_USBH is not set
# CONFIG_BCM_KONA_USB2_PHY is not set
# end of PHY drivers for Broadcom platforms

# CONFIG_PHY_HI6220_USB is not set
# CONFIG_PHY_HI3660_USB is not set
# CONFIG_PHY_HI3670_USB is not set
# CONFIG_PHY_HI3670_PCIE is not set
# CONFIG_PHY_HISTB_COMBPHY is not set
# CONFIG_PHY_HISI_INNO_USB2 is not set
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
# CONFIG_PHY_PXA_USB is not set
# CONFIG_PHY_MMP3_USB is not set
# CONFIG_PHY_MMP3_HSIC is not set
# CONFIG_PHY_MT7621_PCI is not set
# CONFIG_PHY_RALINK_USB is not set
# CONFIG_PHY_RCAR_GEN3_USB3 is not set
# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set
# CONFIG_PHY_ROCKCHIP_PCIE is not set
# CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set
# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set
# CONFIG_PHY_SAMSUNG_USB2 is not set
# CONFIG_PHY_ST_SPEAR1310_MIPHY is not set
# CONFIG_PHY_ST_SPEAR1340_MIPHY is not set
# CONFIG_PHY_TEGRA194_P2U is not set
# CONFIG_PHY_DA8XX_USB is not set
# CONFIG_OMAP_CONTROL_PHY is not set
# CONFIG_TI_PIPE3 is not set
# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set
# CONFIG_PHY_INTEL_KEEMBAY_USB is not set
# CONFIG_PHY_INTEL_LGM_EMMC is not set
# CONFIG_PHY_XILINX_ZYNQMP is not set
# end of PHY Subsystem

# CONFIG_POWERCAP is not set
# CONFIG_MCB is not set

#
# Performance monitor support
#
# CONFIG_ARM_CCN is not set
# CONFIG_ARM_CMN is not set
# CONFIG_FSL_IMX8_DDR_PMU is not set
# CONFIG_XGENE_PMU is not set
# CONFIG_ARM_DMC620_PMU is not set
# CONFIG_MARVELL_CN10K_TAD_PMU is not set
# CONFIG_ALIBABA_UNCORE_DRW_PMU is not set
# CONFIG_MARVELL_CN10K_DDR_PMU is not set
# end of Performance monitor support

# CONFIG_RAS is not set

#
# Android
#
# CONFIG_ANDROID_BINDER_IPC is not set
# end of Android

# CONFIG_DAX is not set
# CONFIG_NVMEM is not set

#
# HW tracing support
#
# CONFIG_STM is not set
# CONFIG_INTEL_TH is not set
# end of HW tracing support

# CONFIG_FPGA is not set
# CONFIG_TEE is not set
# CONFIG_SIOX is not set
# CONFIG_SLIMBUS is not set
# CONFIG_INTERCONNECT is not set
# CONFIG_COUNTER is not set
# CONFIG_PECI is not set
# CONFIG_HTE is not set
# end of Device Drivers

#
# File systems
#
CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_VALIDATE_FS_PARSER is not set
# CONFIG_EXT2_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_EXT4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
# CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
# CONFIG_F2FS_FS is not set
CONFIG_EXPORTFS=y
# CONFIG_EXPORTFS_BLOCK_OPS is not set
CONFIG_FILE_LOCKING=y
# CONFIG_FS_ENCRYPTION is not set
# CONFIG_FS_VERITY is not set
# CONFIG_DNOTIFY is not set
# CONFIG_INOTIFY_USER is not set
# CONFIG_FANOTIFY is not set
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_FUSE_FS is not set
# CONFIG_OVERLAY_FS is not set

#
# Caches
#
# CONFIG_FSCACHE is not set
# end of Caches

#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set
# end of CD-ROM/DVD Filesystems

#
# DOS/FAT/EXFAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_EXFAT_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS3_FS is not set
# end of DOS/FAT/EXFAT/NT Filesystems

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
# CONFIG_PROC_KCORE is not set
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
# CONFIG_PROC_CHILDREN is not set
CONFIG_PROC_PID_ARCH_STATUS=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
# CONFIG_TMPFS is not set
# CONFIG_HUGETLBFS is not set
CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
# CONFIG_CONFIGFS_FS is not set
# end of Pseudo filesystems

# CONFIG_MISC_FILESYSTEMS is not set
# CONFIG_NLS is not set
# CONFIG_UNICODE is not set
CONFIG_IO_WQ=y
# end of File systems

#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
# CONFIG_SECURITY is not set
# CONFIG_SECURITYFS is not set
CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
# CONFIG_HARDENED_USERCOPY is not set
# CONFIG_FORTIFY_SOURCE is not set
# CONFIG_STATIC_USERMODEHELPER is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,bpf"

#
# Kernel hardening options
#

#
# Memory initialization
#
CONFIG_INIT_STACK_NONE=y
# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
# CONFIG_ZERO_CALL_USED_REGS is not set
# end of Memory initialization

CONFIG_RANDSTRUCT_NONE=y
# end of Kernel hardening options
# end of Security options

# CONFIG_CRYPTO is not set

#
# Library routines
#
# CONFIG_PACKING is not set
CONFIG_BITREVERSE=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
# CONFIG_CORDIC is not set
# CONFIG_PRIME_NUMBERS is not set
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
CONFIG_ARCH_USE_SYM_ANNOTATIONS=y

#
# Crypto library routines
#
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
# CONFIG_CRYPTO_LIB_CHACHA is not set
# CONFIG_CRYPTO_LIB_CURVE25519 is not set
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
# CONFIG_CRYPTO_LIB_POLY1305 is not set
# end of Crypto library routines

# CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set
# CONFIG_CRC_T10DIF is not set
# CONFIG_CRC64_ROCKSOFT is not set
# CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y
# CONFIG_CRC32_SELFTEST is not set
CONFIG_CRC32_SLICEBY8=y
# CONFIG_CRC32_SLICEBY4 is not set
# CONFIG_CRC32_SARWATE is not set
# CONFIG_CRC32_BIT is not set
# CONFIG_CRC64 is not set
# CONFIG_CRC4 is not set
# CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not set
# CONFIG_CRC8 is not set
# CONFIG_RANDOM32_SELFTEST is not set
# CONFIG_XZ_DEC is not set
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT_MAP=y
CONFIG_HAS_DMA=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_SWIOTLB=y
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_IRQ_POLL is not set
CONFIG_HAVE_GENERIC_VDSO=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_GENERIC_VDSO_TIME_NS=y
CONFIG_ARCH_HAS_PMEM_API=y
CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
CONFIG_ARCH_HAS_COPY_MC=y
CONFIG_ARCH_STACKWALK=y
CONFIG_STACKDEPOT=y
CONFIG_SBITMAP=y
# CONFIG_PARMAN is not set
# CONFIG_OBJAGG is not set
# end of Library routines

#
# Kernel hacking
#

#
# printk and dmesg options
#
# CONFIG_PRINTK_TIME is not set
# CONFIG_PRINTK_CALLER is not set
# CONFIG_STACKTRACE_BUILD_ID is not set
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
CONFIG_CONSOLE_LOGLEVEL_QUIET=4
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
# CONFIG_DYNAMIC_DEBUG is not set
# CONFIG_DYNAMIC_DEBUG_CORE is not set
# CONFIG_SYMBOLIC_ERRNAME is not set
CONFIG_DEBUG_BUGVERBOSE=y
# end of printk and dmesg options

# CONFIG_DEBUG_KERNEL is not set

#
# Compile-time checks and compiler options
#
CONFIG_AS_HAS_NON_CONST_LEB128=y
CONFIG_FRAME_WARN=2048
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_HEADERS_INSTALL is not set
CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
CONFIG_OBJTOOL=y
# end of Compile-time checks and compiler options

#
# Generic Kernel Debugging Instruments
#
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_FS is not set
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
# CONFIG_UBSAN is not set
CONFIG_HAVE_ARCH_KCSAN=y
CONFIG_HAVE_KCSAN_COMPILER=y
# end of Generic Kernel Debugging Instruments

#
# Networking Debugging
#
# end of Networking Debugging

#
# Memory Debugging
#
# CONFIG_PAGE_EXTENSION is not set
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_PAGE_TABLE_CHECK is not set
# CONFIG_PAGE_POISONING is not set
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_ARCH_HAS_DEBUG_WX=y
# CONFIG_DEBUG_WX is not set
CONFIG_GENERIC_PTDUMP=y
CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
# CONFIG_DEBUG_VM_PGTABLE is not set
CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
# CONFIG_KASAN is not set
CONFIG_HAVE_ARCH_KFENCE=y
# CONFIG_KFENCE is not set
CONFIG_HAVE_ARCH_KMSAN=y
# end of Memory Debugging

#
# Debug Oops, Lockups and Hangs
#
# CONFIG_PANIC_ON_OOPS is not set
CONFIG_PANIC_ON_OOPS_VALUE=0
CONFIG_PANIC_TIMEOUT=0
CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
# end of Debug Oops, Lockups and Hangs

#
# Scheduler Debugging
#
# end of Scheduler Debugging

# CONFIG_DEBUG_TIMEKEEPING is not set

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
CONFIG_LOCK_DEBUGGING_SUPPORT=y
# CONFIG_WW_MUTEX_SELFTEST is not set
# end of Lock Debugging (spinlocks, mutexes, etc...)

# CONFIG_DEBUG_IRQFLAGS is not set
CONFIG_STACKTRACE=y
# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set

#
# Debug kernel data structures
#
# CONFIG_BUG_ON_DATA_CORRUPTION is not set
# end of Debug kernel data structures

#
# RCU Debugging
#
# end of RCU Debugging

CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_HAVE_RETHOOK=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_FENTRY=y
CONFIG_HAVE_OBJTOOL_MCOUNT=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y
CONFIG_TRACING_SUPPORT=y
# CONFIG_FTRACE is not set
# CONFIG_SAMPLES is not set
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y

#
# x86 Debugging
#
# CONFIG_X86_VERBOSE_BOOTUP is not set
CONFIG_EARLY_PRINTK=y
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_UNWINDER_ORC=y
# CONFIG_UNWINDER_FRAME_POINTER is not set
# end of x86 Debugging

#
# Kernel Testing and Coverage
#
# CONFIG_KUNIT is not set
CONFIG_ARCH_HAS_KCOV=y
CONFIG_CC_HAS_SANCOV_TRACE_PC=y
# CONFIG_KCOV is not set
# CONFIG_RUNTIME_TESTING_MENU is not set
CONFIG_ARCH_USE_MEMTEST=y
# CONFIG_MEMTEST is not set
# end of Kernel Testing and Coverage

#
# Rust hacking
#
# end of Rust hacking

CONFIG_WARN_MISSING_DOCUMENTS=y
CONFIG_WARN_ABI_ERRORS=y
# end of Kernel hacking

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-06 17:47 ` kernel test robot
@ 2022-11-13 15:26   ` Qais Yousef
  2022-11-14  8:55     ` Bagas Sanjaya
  0 siblings, 1 reply; 11+ messages in thread
From: Qais Yousef @ 2022-11-13 15:26 UTC (permalink / raw)
  To: kernel test robot
  Cc: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot,
	oe-kbuild-all, linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang,
	Jonathan JMChen, Hank, Paul Bone

On 11/07/22 01:47, kernel test robot wrote:
> Hi Qais,
> 
> Thank you for the patch! Perhaps something to improve:
> 
> [auto build test WARNING on lwn/docs-next]
> [also build test WARNING on tip/master linus/master v6.1-rc3 next-20221104]
> [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#_base_tree_information]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Qais-Yousef/Documentation-sched-Add-a-new-sched-util-clamp-rst/20221106-072619
> base:   git://git.lwn.net/linux.git docs-next
> patch link:    https://lore.kernel.org/r/20221105232343.887199-1-qyousef%40layalina.io
> patch subject: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
> reproduce:
>         # https://github.com/intel-lab-lkp/linux/commit/18b40e54df3058f348a5df25fad6baad82d28f1a
>         git remote add linux-review https://github.com/intel-lab-lkp/linux
>         git fetch --no-tags linux-review Qais-Yousef/Documentation-sched-Add-a-new-sched-util-clamp-rst/20221106-072619
>         git checkout 18b40e54df3058f348a5df25fad6baad82d28f1a
>         make menuconfig
>         # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS
>         make htmldocs
> 
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@intel.com>
> 
> All warnings (new ones prefixed by >>):
> 
> >> Documentation/scheduler/sched-util-clamp.rst:181: WARNING: Unexpected indentation.
> >> Documentation/scheduler/sched-util-clamp.rst: WARNING: document isn't included in any toctree

Thanks! I have the below fixup patch that addresses these. It made me realize
my html output could look better. It's cosmetic; so won't post a new version
till some feedback is provided first.


Cheers

--
Qais Yousef


--->8---

diff --git a/Documentation/scheduler/index.rst b/Documentation/scheduler/index.rst
index b430d856056a..f12d0d06de3a 100644
--- a/Documentation/scheduler/index.rst
+++ b/Documentation/scheduler/index.rst
@@ -15,6 +15,7 @@ Linux Scheduler
     sched-capacity
     sched-energy
     schedutil
+    sched-util-clamp
     sched-nice-design
     sched-rt-group
     sched-stats
diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
index e75b69767afb..728ffa364fc7 100644
--- a/Documentation/scheduler/sched-util-clamp.rst
+++ b/Documentation/scheduler/sched-util-clamp.rst
@@ -169,24 +169,27 @@ could change with implementation details.
 2.1  BUCKETS:
 -------------
 
+.. code-block:: c
+
                            [struct rq]
 
-(bottom)                                                    (top)
+  (bottom)                                                    (top)
 
-  0                                                          1024
-  |                                                           |
-  +-----------+-----------+-----------+----   ----+-----------+
-  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
-  +-----------+-----------+-----------+----   ----+-----------+
-     :           :                                   :
-     +- p0       +- p3                               +- p4
-     :                                               :
-     +- p1                                           +- p5
-     :
-     +- p2
+    0                                                          1024
+    |                                                           |
+    +-----------+-----------+-----------+----   ----+-----------+
+    |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
+    +-----------+-----------+-----------+----   ----+-----------+
+       :           :                                   :
+       +- p0       +- p3                               +- p4
+       :                                               :
+       +- p1                                           +- p5
+       :
+       +- p2
 
 
-DISCLAMER:
+.. note::
+  DISCLAMER:
    The diagram above is an illustration rather than a true depiction of the
    internal data structure.
 
@@ -200,6 +203,8 @@ The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
 The range of each bucket is 1024/N. For example for the default value of 5 we
 will have 5 buckets, each of which will cover the following range:
 
+.. code-block:: c
+
         DELTA = round_closest(1024/5) = 204.8 = 205
 
         Bucket 0: [0:204]
@@ -210,6 +215,8 @@ will have 5 buckets, each of which will cover the following range:
 
 When a task p
 
+.. code-block:: c
+
         p->uclamp[UCLAMP_MIN] = 300
         p->uclamp[UCLAMP_MAX] = 1024
 
@@ -222,12 +229,16 @@ uclamp_id.
 
 When a task p is enqueued, the rq value changes as follows:
 
+.. code-block:: c
+
         // update bucket logic goes here
         rq->uclamp[UCLAMP_MIN] = max(rq->uclamp[UCLAMP_MIN], p->uclamp[UCLAMP_MIN])
         // repeat for UCLAMP_MAX
 
 When a task is p dequeued the rq value changes as follows:
 
+.. code-block:: c
+
         // update bucket logic goes here
         rq->uclamp[UCLAMP_MIN] = search_top_bucket_for_highest_value()
         // repeat for UCLAMP_MAX
@@ -249,6 +260,8 @@ another task that doesn't need it or is disallowed from reaching this point.
 For example, if there are multiple tasks attached to an rq with the following
 values:
 
+.. code-block:: c
+
         p0->uclamp[UCLAMP_MIN] = 300
         p0->uclamp[UCLAMP_MAX] = 900
 
@@ -257,6 +270,8 @@ values:
 
 then assuming both p0 and p1 are enqueued to the same rq
 
+.. code-block:: c
+
         rq->uclamp[UCLAMP_MIN] = max(300, 500) = 500
         rq->uclamp[UCLAMP_MAX] = max(900, 500) = 900
 
@@ -316,6 +331,8 @@ sched_setattr() syscall was extended to accept two new fields:
 
 For example:
 
+.. code-block:: c
+
         attr->sched_util_min = 40% * 1024;
         attr->sched_util_max = 80% * 1024;
 
@@ -333,9 +350,13 @@ default.
 Note that resetting the uclamp value to system default using -1 is not the same
 as setting the uclamp value to system default.
 
+.. code-block:: c
+
         attr->sched_util_min = -1  // p0 is reset to system default e.g: 0
 
-        not the same as
+not the same as
+
+.. code-block:: c
 
         attr->sched_util_min = 0   // p0 is set to 0, the fact it is the same
                                    // as system default is irrelevant
@@ -375,6 +396,8 @@ as follows:
 
 For example:
 
+.. code-block:: c
+
         p0->uclamp[UCLAMP_MIN] = // system default;
         p0->uclamp[UCLAMP_MAX] = // system default;
 
@@ -389,6 +412,8 @@ For example:
 
 when p0 and p1 are attached to cgroup0
 
+.. code-block:: c
+
         p0->uclamp[UCLAMP_MIN] = cgroup0->cpu.uclamp.min = 20% * 1024;
         p0->uclamp[UCLAMP_MAX] = cgroup0->cpu.uclamp.max = 60% * 1024;
 
@@ -397,6 +422,8 @@ when p0 and p1 are attached to cgroup0
 
 when p0 and p1 are attached to cgroup1
 
+.. code-block:: c
+
         p0->uclamp[UCLAMP_MIN] = cgroup1->cpu.uclamp.min = 60% * 1024;
         p0->uclamp[UCLAMP_MAX] = cgroup1->cpu.uclamp.max = 100% * 1024;
 
@@ -452,6 +479,8 @@ The value must be greater than or equal to sched_util_clamp_min.
 
 By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
 
+.. code-block:: c
+
         p_fair->uclamp[UCLAMP_MIN] = 0
         p_fair->uclamp[UCLAMP_MAX] = 1024
 
@@ -461,6 +490,8 @@ provide this, but can be added in the future.
 
 For SCHED_FIFO/SCHED_RR tasks:
 
+.. code-block:: c
+
         p_rt->uclamp[UCLAMP_MIN] = 1024
         p_rt->uclamp[UCLAMP_MAX] = 1024
 
@@ -564,15 +595,21 @@ still would like to keep your browser performance intact; uclamp enables that.
 
 If task p0 is capped to run at 512
 
+.. code-block:: c
+
         p0->uclamp[UCLAMP_MAX] = 512
 
 is sharing the rq with p1 which is free to run at any performance point
 
+.. code-block:: c
+
         p1->uclamp[UCLAMP_MAX] = 1024
 
 then due to max aggregation the rq will be allowed to reach max performance
 point
 
+.. code-block:: c
+
         rq->uclamp[UCLAMP_MAX] = max(512, 1024) = 1024
 
 Assuming both p0 and p1 have UCLAMP_MIN = 0, then the frequency selection for
@@ -597,16 +634,22 @@ when severely capped tasks share the rq with a small non capped task.
 
 As an example if task p
 
+.. code-block:: c
+
         p0->util_avg = 300
         p0->uclamp[UCLAMP_MAX] = 0
 
 wakes up on an idle CPU, then it will run at min frequency this CPU is capable
 of.
 
+.. code-block:: c
+
         rq->uclamp[UCLAMP_MAX] = 0
 
 If the ratio of Fmax/Fmin is 3, then
 
+.. code-block:: c
+
         300 * (Fmax/Fmin) = 900
 
 Which indicates the CPU will still see idle time since 900 is < 1024. The
@@ -614,19 +657,27 @@ _actual_ util_avg will NOT be 900 though. It will be higher than 300, but won't
 approach 900. As long as there's idle time, p->util_avg updates will be off by
 a some margin, but not proportional to Fmax/Fmin.
 
+.. code-block:: c
+
         p0->util_avg = 300 + small_error
 
 Now if the ratio of Fmax/Fmin is 4, then
 
+.. code-block:: c
+
         300 * (Fmax/Fmin) = 1200
 
 which is higher than 1024 and indicates that the CPU has no idle time. When
 this happens, then the _actual_ util_avg will become 1024.
 
+.. code-block:: c
+
         p0->util_avg = 1024
 
 If task p1 wakes up on this CPU
 
+.. code-block:: c
+
         p1->util_avg = 200
         p1->uclamp[UCLAMP_MAX] = 1024
 
@@ -634,6 +685,8 @@ then the effective UCLAMP_MAX for the CPU will be 1024 according to max
 aggregation rule. But since the capped p0 task was running and throttled
 severely, then the rq->util_avg will be 1024.
 
+.. code-block:: c
+
         p0->util_avg = 1024
         p1->util_avg = 200
 
@@ -642,6 +695,8 @@ severely, then the rq->util_avg will be 1024.
 
 Hence lead to a frequency spike since if p0 wasn't throttled we should get
 
+.. code-block:: c
+
         p0->util_avg = 300
         p1->util_avg = 200
 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-05 23:23 [PATCH] Documentation: sched: Add a new sched-util-clamp.rst Qais Yousef
  2022-11-06 17:47 ` kernel test robot
@ 2022-11-14  2:47 ` Bagas Sanjaya
  2022-11-15 20:55   ` Qais Yousef
  2022-11-14  9:22 ` Bagas Sanjaya
  2 siblings, 1 reply; 11+ messages in thread
From: Bagas Sanjaya @ 2022-11-14  2:47 UTC (permalink / raw)
  To: Qais Yousef
  Cc: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot,
	linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang, Jonathan JMChen,
	Hank, Paul Bone

[-- Attachment #1: Type: text/plain, Size: 696 bytes --]

On Sat, Nov 05, 2022 at 11:23:43PM +0000, Qais Yousef wrote:
> From: Qais Yousef <qais.yousef@arm.com>
> 
> The new util clamp feature needs a document explaining what it is and
> how to use it. The new document hopefully covers everything one needs to
> know about uclamp.
> 
> Signed-off-by: Qais Yousef <qais.yousef@arm.com>
> Signed-off-by: Qais Yousef (Google) <qyousef@layalina.io>

Hmm, why didn't you send this patch from your arm address instead?
On the other hand, thanks for including SoB from your sending address,
which is different.

I will be commenting for the content on your fixup message.

Thanks.

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-13 15:26   ` Qais Yousef
@ 2022-11-14  8:55     ` Bagas Sanjaya
  2022-11-15 20:55       ` Qais Yousef
  0 siblings, 1 reply; 11+ messages in thread
From: Bagas Sanjaya @ 2022-11-14  8:55 UTC (permalink / raw)
  To: Qais Yousef
  Cc: kernel test robot, Ingo Molnar, Peter Zijlstra, Dietmar Eggemann,
	Vincent Guittot, oe-kbuild-all, linux-kernel, Lukasz Luba,
	Xuewen Yan, Wei Wang, Jonathan JMChen, Hank, Paul Bone,
	Jonathan Corbet, linux-doc

[-- Attachment #1: Type: text/plain, Size: 3530 bytes --]

On Sun, Nov 13, 2022 at 03:26:29PM +0000, Qais Yousef wrote:
> Thanks! I have the below fixup patch that addresses these. It made me realize
> my html output could look better. It's cosmetic; so won't post a new version
> till some feedback is provided first.
> 
> 
> Cheers
> 
> --
> Qais Yousef
> 
> 
> --->8---
> 
> diff --git a/Documentation/scheduler/index.rst b/Documentation/scheduler/index.rst
> index b430d856056a..f12d0d06de3a 100644
> --- a/Documentation/scheduler/index.rst
> +++ b/Documentation/scheduler/index.rst
> @@ -15,6 +15,7 @@ Linux Scheduler
>      sched-capacity
>      sched-energy
>      schedutil
> +    sched-util-clamp
>      sched-nice-design
>      sched-rt-group
>      sched-stats
> diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
> index e75b69767afb..728ffa364fc7 100644
> --- a/Documentation/scheduler/sched-util-clamp.rst
> +++ b/Documentation/scheduler/sched-util-clamp.rst
> @@ -169,24 +169,27 @@ could change with implementation details.
>  2.1  BUCKETS:
>  -------------
>  
> +.. code-block:: c
> +
>                             [struct rq]
>  
> -(bottom)                                                    (top)
> +  (bottom)                                                    (top)
>  
> -  0                                                          1024
> -  |                                                           |
> -  +-----------+-----------+-----------+----   ----+-----------+
> -  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> -  +-----------+-----------+-----------+----   ----+-----------+
> -     :           :                                   :
> -     +- p0       +- p3                               +- p4
> -     :                                               :
> -     +- p1                                           +- p5
> -     :
> -     +- p2
> +    0                                                          1024
> +    |                                                           |
> +    +-----------+-----------+-----------+----   ----+-----------+
> +    |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> +    +-----------+-----------+-----------+----   ----+-----------+
> +       :           :                                   :
> +       +- p0       +- p3                               +- p4
> +       :                                               :
> +       +- p1                                           +- p5
> +       :
> +       +- p2

The code block above is diagram, isn't it? Thus specifying language for
syntax highlighting (in this case ``c``) isn't appropriate.

>  
>  
> -DISCLAMER:
> +.. note::
> +  DISCLAMER:
>     The diagram above is an illustration rather than a true depiction of the
>     internal data structure.

The DISCLAIMER line above isn't needed, since note block should do the
job.

>  
> @@ -200,6 +203,8 @@ The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
>  The range of each bucket is 1024/N. For example for the default value of 5 we
>  will have 5 buckets, each of which will cover the following range:
>  
> +.. code-block:: c
> +

Again, why ``c`` syntax highlighting?

Otherwise no new warnings. Thanks for fixing this up.

However, in the future, for documentation patches you should always Cc:
linux-doc list. Adding it to Cc list now.

Thanks.

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-05 23:23 [PATCH] Documentation: sched: Add a new sched-util-clamp.rst Qais Yousef
  2022-11-06 17:47 ` kernel test robot
  2022-11-14  2:47 ` Bagas Sanjaya
@ 2022-11-14  9:22 ` Bagas Sanjaya
  2022-11-15 20:55   ` Qais Yousef
  2 siblings, 1 reply; 11+ messages in thread
From: Bagas Sanjaya @ 2022-11-14  9:22 UTC (permalink / raw)
  To: Qais Yousef
  Cc: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot,
	linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang, Jonathan JMChen,
	Hank, Paul Bone

[-- Attachment #1: Type: text/plain, Size: 35187 bytes --]

On Sat, Nov 05, 2022 at 11:23:43PM +0000, Qais Yousef wrote:
> +2.  DESIGN:
> +===========

Why ALLCAPS and trailing colon for section title?

> +When a task is attached to a CPU controller, its uclamp values will be impacted
> +as follows:
> +
> +* cpu.uclamp.min is a protection as described in section 3-3 in
> +  Documentation/admin-guide/cgroup-v2.rst.
> <snipped>...
> +* cpu.uclamp.max is a limit as described in section 3-2 in
> +  Documentation/admin-guide/cgroup-v2.rst.
> +

Exactly what section on cgroup doc do you refer? I don't see any section
number there. Did you mean this?:

---- >8 ----

diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst
index dc254a3cb95686..fd448069c11562 100644
--- a/Documentation/admin-guide/cgroup-v2.rst
+++ b/Documentation/admin-guide/cgroup-v2.rst
@@ -619,6 +619,8 @@ process migrations.
 and is an example of this type.
 
 
+.. _cgroupv2-limits-distributor:
+
 Limits
 ------
 
@@ -635,6 +637,7 @@ process migrations.
 "io.max" limits the maximum BPS and/or IOPS that a cgroup can consume
 on an IO device and is an example of this type.
 
+.. _cgroupv2-protections-distributor:
 
 Protections
 -----------
diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
index 6601bda176d16e..5741acb35b7db2 100644
--- a/Documentation/scheduler/sched-util-clamp.rst
+++ b/Documentation/scheduler/sched-util-clamp.rst
@@ -364,8 +364,8 @@ There are two uclamp related values in the CPU cgroup controller:
 When a task is attached to a CPU controller, its uclamp values will be impacted
 as follows:
 
-* cpu.uclamp.min is a protection as described in section 3-3 in
-  Documentation/admin-guide/cgroup-v2.rst.
+* cpu.uclamp.min is a protection as described in :ref:`section 3-3 of cgroup
+  v2 documentation <cgroupv2-protections-distributor>`.
 
   If a task uclamp_min value is lower than cpu.uclamp.min, then the task will
   inherit the cgroup cpu.uclamp.min value.
@@ -373,8 +373,8 @@ as follows:
   In a cgroup hierarchy, effective cpu.uclamp.min is the max of (child,
   parent).
 
-* cpu.uclamp.max is a limit as described in section 3-2 in
-  Documentation/admin-guide/cgroup-v2.rst.
+* cpu.uclamp.max is a limit as described in :ref:`section 3-2 of cgroup v2
+  documentation <cgroupv2-limits-distributor>`.
 
   If a task uclamp_max value is higher than cpu.uclamp.max, then the task will
   inherit the cgroup cpu.uclamp.max value.


IMO, the doc wording can be improved (applied on top of your fixup [1]):

---- >8 ----

diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
index 728ffa364fc7ad..6601bda176d16e 100644
--- a/Documentation/scheduler/sched-util-clamp.rst
+++ b/Documentation/scheduler/sched-util-clamp.rst
@@ -2,31 +2,29 @@
 Utilization Clamping
 ====================
 
-1.  INTRODUCTION
-================
+1. Introduction
+===============
 
-Utilization clamping is a scheduler feature that allows user space to help in
-managing the performance requirement of tasks. It was introduced in v5.3
-release. The CGroup support was merged in v5.4.
-
-It is often referred to as util clamp and uclamp. You'll find all variations
-used interchangeably in this documentation and in the source code.
+Utilization clamping, also known as util clamp or uclamp, is a scheduler
+feature that allows user space to help in managing the performance requirement
+of tasks. It was introduced in v5.3 release. The CGroup support was merged in
+v5.4.
 
 Uclamp is a hinting mechanism that allows the scheduler to understand the
-performance requirements and restrictions of the tasks. Hence help it make
-a better placement decision. And when schedutil cpufreq governor is used, util
-clamp will influence the frequency selection as well.
+performance requirements and restrictions of the tasks, thus it helps the
+scheduler to make a better decision. And when schedutil cpufreq governor is
+used, util clamp will influence the frequency selection as well.
 
 Since scheduler and schedutil are both driven by PELT (util_avg) signals, util
 clamp acts on that to achieve its goal by clamping the signal to a certain
-point; hence the name. I.e: by clamping utilization we are making the system
-run at a certain performance point.
+point; hence the name. That is, by clamping utilization we are making the
+system run at a certain performance point.
 
-The right way to view util clamp is as a mechanism to make performance
-constraints request/hint. It consists of two components:
+The right way to view util clamp is as a mechanism to make request or hint on
+performance constraints. It consists of two tunables:
 
-        * UCLAMP_MIN, which sets a lower bound.
-        * UCLAMP_MAX, which sets an upper bound.
+        * UCLAMP_MIN, which sets the lower bound.
+        * UCLAMP_MAX, which sets the upper bound.
 
 These two bounds will ensure a task will operate within this performance range
 of the system. UCLAMP_MIN implies boosting a task, while UCLAMP_MAX implies
@@ -35,18 +33,18 @@ capping a task.
 One can tell the system (scheduler) that some tasks require a minimum
 performance point to operate at to deliver the desired user experience. Or one
 can tell the system that some tasks should be restricted from consuming too
-much resources and should NOT go above a specific performance point. Viewing
+much resources and should not go above a specific performance point. Viewing
 the uclamp values as performance points rather than utilization is a better
 abstraction from user space point of view.
 
 As an example, a game can use util clamp to form a feedback loop with its
 perceived FPS. It can dynamically increase the minimum performance point
 required by its display pipeline to ensure no frame is dropped. It can also
-dynamically 'prime' up these tasks if it knows in the coming few 100ms
-a computationally intensive scene is about to happen.
+dynamically 'prime' up these tasks if it knows in the coming few hundred
+milliseconds a computationally intensive scene is about to happen.
 
 On mobile hardware where the capability of the devices varies a lot, this
-dynamic feedback loop offers a great flexibility in ensuring best user
+dynamic feedback loop offers a great flexibility to ensure best user
 experience given the capabilities of any system.
 
 Of course a static configuration is possible too. The exact usage will depend
@@ -68,17 +66,17 @@ stay on the little cores which will ensure that:
            are CPU intensive tasks.
 
 By making these uclamp performance requests, or rather hints, user space can
-ensure system resources are used optimally to deliver the best user experience
-the system is capable of.
+ensure system resources are used optimally to deliver the best possible user
+experience.
 
 Another use case is to help with overcoming the ramp up latency inherit in how
 scheduler utilization signal is calculated.
 
-A busy task for instance that requires to run at maximum performance point will
-suffer a delay of ~200ms (PELT HALFIFE = 32ms) for the scheduler to realize
-that. This is known to affect workloads like gaming on mobile devices where
-frames will drop due to slow response time to select the higher frequency
-required for the tasks to finish their work in time.
+On the other hand, a busy task for instance that requires to run at maximum
+performance point will suffer a delay of ~200ms (PELT HALFIFE = 32ms) for the
+scheduler to realize that. This is known to affect workloads like gaming on
+mobile devices where frames will drop due to slow response time to select the
+higher frequency required for the tasks to finish their work in time.
 
 The overall visible effect goes beyond better perceived user
 experience/performance and stretches to help achieve a better overall
@@ -101,11 +99,12 @@ when an RT task wakes up. This cost is unchanged by using uclamp. Uclamp only
 helps picking what frequency to request instead of schedutil always requesting
 MAX for all RT tasks.
 
-See section 3.4 for default values and 3.4.1 on how to change RT tasks default
-value.
+See :ref:`section 3.4 <uclamp-default-values>` for default values and
+:ref:`3.4.1 <sched-util-clamp-min-rt-default>` on how to change RT tasks
+default value.
 
-2.  DESIGN:
-===========
+2. Design
+=========
 
 Util clamp is a property of every task in the system. It sets the boundaries of
 its utilization signal; acting as a bias mechanism that influences certain
@@ -123,10 +122,10 @@ which have implications on the utilization value at rq level, which brings us
 to the main design challenge.
 
 When a task wakes up on an rq, the utilization signal of the rq will be
-impacted by the uclamp settings of all the tasks enqueued on it. For example if
+affected by the uclamp settings of all the tasks enqueued on it. For example if
 a task requests to run at UTIL_MIN = 512, then the util signal of the rq needs
-to respect this request as well as all other requests from all of the enqueued
-tasks.
+to respect to this request as well as all other requests from all of the
+enqueued tasks.
 
 To be able to aggregate the util clamp value of all the tasks attached to the
 rq, uclamp must do some housekeeping at every enqueue/dequeue, which is the
@@ -138,19 +137,21 @@ The way this is handled is by dividing the utilization range into buckets
 (struct uclamp_bucket) which allows us to reduce the search space from every
 task on the rq to only a subset of tasks on the top-most bucket.
 
-When a task is enqueued, we increment a counter in the matching bucket. And on
-dequeue we decrement it. This makes keeping track of the effective uclamp value
-at rq level a lot easier.
+When a task is enqueued, the counter in the matching bucket is incremented,
+and on dequeue it is decremented. This makes keeping track of the effective
+uclamp value at rq level a lot easier.
 
-As we enqueue and dequeue tasks we keep track of the current effective uclamp
-value of the rq. See section 2.1 for details on how this works.
+As tasks are enqueued and dequeued, we keep track of the current effective
+uclamp value of the rq. See :ref:`section 2.1 <uclamp-buckets>` for details on
+how this works.
 
 Later at any path that wants to identify the effective uclamp value of the rq,
 it will simply need to read this effective uclamp value of the rq at that exact
 moment of time it needs to take a decision.
 
 For task placement case, only Energy Aware and Capacity Aware Scheduling
-(EAS/CAS) make use of uclamp for now. This implies heterogeneous systems only.
+(EAS/CAS) make use of uclamp for now, which implies that it is applied on
+heterogeneous systems only.
 When a task wakes up, the scheduler will look at the current effective uclamp
 value of every rq and compare it with the potential new value if the task were
 to be enqueued there. Favoring the rq that will end up with the most energy
@@ -159,17 +160,19 @@ efficient combination.
 Similarly in schedutil, when it needs to make a frequency update it will look
 at the current effective uclamp value of the rq which is influenced by the set
 of tasks currently enqueued there and select the appropriate frequency that
-will honour uclamp requests.
+will satisfy constraints from requests.
 
 Other paths like setting overutilization state (which effectively disables EAS)
 make use of uclamp as well. Such cases are considered necessary housekeeping to
 allow the 2 main use cases above and will not be covered in detail here as they
 could change with implementation details.
 
-2.1  BUCKETS:
--------------
+.. _uclamp-buckets:
 
-.. code-block:: c
+2.1. Buckets
+------------
+
+.. code-block::
 
                            [struct rq]
 
@@ -189,7 +192,6 @@ could change with implementation details.
 
 
 .. note::
-  DISCLAMER:
    The diagram above is an illustration rather than a true depiction of the
    internal data structure.
 
@@ -198,12 +200,11 @@ an rq as tasks are enqueued/dequeued, the whole utilization range is divided
 into N buckets where N is configured at compile time by setting
 CONFIG_UCLAMP_BUCKETS_COUNT. By default it is set to 5.
 
-The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
+The rq has a bucket for each uclamp_id tunables: [UCLAMP_MIN, UCLAMP_MAX].
 
-The range of each bucket is 1024/N. For example for the default value of 5 we
-will have 5 buckets, each of which will cover the following range:
+The range of each bucket is 1024/N. For example, for the default value of 5 there will be 5 buckets, each of which will cover the following range:
 
-.. code-block:: c
+.. code-block::
 
         DELTA = round_closest(1024/5) = 204.8 = 205
 
@@ -213,21 +214,21 @@ will have 5 buckets, each of which will cover the following range:
         Bucket 3: [615:819]
         Bucket 4: [820:1024]
 
-When a task p
+When a task p with following tunable parameters
 
 .. code-block:: c
 
         p->uclamp[UCLAMP_MIN] = 300
         p->uclamp[UCLAMP_MAX] = 1024
 
-is enqueued into the rq, Bucket 1 will be incremented for UCLAMP_MIN and Bucket
+is enqueued into the rq, bucket 1 will be incremented for UCLAMP_MIN and bucket
 4 will be incremented for UCLAMP_MAX to reflect the fact the rq has a task in
 this range.
 
 The rq then keeps track of its current effective uclamp value for each
 uclamp_id.
 
-When a task p is enqueued, the rq value changes as follows:
+When a task p is enqueued, the rq value changes to:
 
 .. code-block:: c
 
@@ -235,7 +236,7 @@ When a task p is enqueued, the rq value changes as follows:
         rq->uclamp[UCLAMP_MIN] = max(rq->uclamp[UCLAMP_MIN], p->uclamp[UCLAMP_MIN])
         // repeat for UCLAMP_MAX
 
-When a task is p dequeued the rq value changes as follows:
+Similarly, when p is dequeued the rq value changes to:
 
 .. code-block:: c
 
@@ -244,11 +245,11 @@ When a task is p dequeued the rq value changes as follows:
         // repeat for UCLAMP_MAX
 
 When all buckets are empty, the rq uclamp values are reset to system defaults.
-See section 3.4 for default values.
+See :ref:`section 3.4 <uclamp-default-values>` for details on default values.
 
 
-2.2  MAX AGGREGATION:
----------------------
+2.2. Max aggregation
+--------------------
 
 Util clamp is tuned to honour the request for the task that requires the
 highest performance point.
@@ -268,19 +269,20 @@ values:
         p1->uclamp[UCLAMP_MIN] = 500
         p1->uclamp[UCLAMP_MAX] = 500
 
-then assuming both p0 and p1 are enqueued to the same rq
+then assuming both p0 and p1 are enqueued to the same rq, both UCLAMP_MIN
+and UCLAMP_MAX become:
 
 .. code-block:: c
 
         rq->uclamp[UCLAMP_MIN] = max(300, 500) = 500
         rq->uclamp[UCLAMP_MAX] = max(900, 500) = 900
 
-As we shall see in section 5.1, this max aggregation is the cause of one of the
-limitations when using util clamp. Particularly for UCLAMP_MAX hint when user
-space would like to save power.
+As we shall see in :ref:`section 5.1 <uclamp-capping-fail>`, this max
+aggregation is the cause of one of limitations when using util clamp, in
+particular for UCLAMP_MAX hint when user space would like to save power.
 
-2.3  HIERARCHICAL AGGREGATION:
-------------------------------
+2.3. Hierarchial aggregation
+----------------------------
 
 As stated earlier, util clamp is a property of every task in the system. But
 the actual applied (effective) value can be influenced by more than just the
@@ -293,80 +295,66 @@ The effective util clamp value of any task is restricted as follows:
   2. The restricted value in (1) is then further restricted by the system wide
      uclamp settings.
 
-Section 3 discusses the interfaces and will expand further on that.
+:ref:`Section 3 <uclamp-interfaces>` discusses the interfaces and will expand further on that.
 
 For now suffice to say that if a task makes a request, its actual effective
 value will have to adhere to some restrictions imposed by cgroup and system
 wide settings.
 
-The system will still accept the request even if effectively will look
-different; but as soon as the task moves to a different cgroup or a sysadmin
-modifies the system settings, it'll be able to get what it wants if the new
-settings allows it.
+The system will still accept the request even if effectively will be
+beyond the constraints, but as soon as the task moves to a different cgroup
+or a sysadmin modifies the system settings, the request will be satisfied
+only if it is within new constraints.
 
 In other words, this aggregation will not cause an error when a task changes
-its uclamp values. It just might not be able to achieve it based on those
-factors.
+its uclamp values, but rather the system may not be able to satisfy requests
+based on those factors.
 
 2.4  Range:
 -----------
 
-Uclamp performance request follow the utilization range: [0:1024] inclusive.
+Uclamp performance request has the range of 0 to 1024 inclusive.
 
-For cgroup interface percentage is used: [0:100] inclusive.
-You can use 'max' instead of 100 like other cgroup interfaces.
+For cgroup interface percentage is used (that is 0 to 100 inclusive).
+Just like other cgroup interfaces, you can use 'max' instead of 100.
 
-3.  INTERFACES:
-===============
+.. _uclamp-interfaces:
 
-3.1  PER TASK INTERFACE:
-------------------------
+3.  Interfaces
+==============
+
+3.1  Per-task interface
+-----------------------
 
 sched_setattr() syscall was extended to accept two new fields:
 
 * sched_util_min: requests the minimum performance point the system should run
-                  at when this task is running. Or lower performance bound.
+  at when this task is running. Or lower performance bound.
 * sched_util_max: requests the maximum performance point the system should run
-                  at when this task is running. Or upper performance bound.
+  at when this task is running. Or upper performance bound.
 
-For example:
+For example, the following scenario have 40% to 80% utilization constraints:
 
 .. code-block:: c
 
         attr->sched_util_min = 40% * 1024;
         attr->sched_util_max = 80% * 1024;
 
-Will tell the system that when task @p is running, it should try its best to
-ensure it starts at a performance point no less than 40% of maximum system's
-capability.
-
-And if the task runs for a long enough time so that its actual utilization goes
-above 80%, then it should not cause the system to operate at a performance
-point higher than that.
+When task @p is running, the scheduler should try its best to ensure it starts
+at 40% utilization. If the task runs for a long enough time so that its actual
+utilization goes above 80%, the utilization will be capped.
 
 The special value -1 is used to reset the uclamp settings to the system
 default.
 
 Note that resetting the uclamp value to system default using -1 is not the same
-as setting the uclamp value to system default.
+as manually setting uclamp value to system default. This distinction is
+important because as we shall see in system interfaces, the default value for
+RT could be changed. SCHED_NORMAL/OTHER might gain similar knobs too in the
+future.
 
-.. code-block:: c
-
-        attr->sched_util_min = -1  // p0 is reset to system default e.g: 0
-
-not the same as
-
-.. code-block:: c
-
-        attr->sched_util_min = 0   // p0 is set to 0, the fact it is the same
-                                   // as system default is irrelevant
-
-This distinction is important because as we shall see in system interfaces, the
-default value for RT could be changed. SCHED_NORMAL/OTHER might gain similar
-knobs too in the future.
-
-3.2  CGROUP INTERFACE:
-----------------------
+3.2. cgroup interface
+---------------------
 
 There are two uclamp related values in the CPU cgroup controller:
 
@@ -394,7 +382,7 @@ as follows:
   In a cgroup hierarchy, effective cpu.uclamp.max is the min of (child,
   parent).
 
-For example:
+For example, given following parameters:
 
 .. code-block:: c
 
@@ -410,7 +398,7 @@ For example:
         cgroup1->cpu.uclamp.min = 60% * 1024;
         cgroup1->cpu.uclamp.max = 100% * 1024;
 
-when p0 and p1 are attached to cgroup0
+when p0 and p1 are attached to cgroup0, the values become:
 
 .. code-block:: c
 
@@ -420,7 +408,7 @@ when p0 and p1 are attached to cgroup0
         p1->uclamp[UCLAMP_MIN] = 40% * 1024; // intact
         p1->uclamp[UCLAMP_MAX] = 50% * 1024; // intact
 
-when p0 and p1 are attached to cgroup1
+when p0 and p1 are attached to cgroup1, these instead become:
 
 .. code-block:: c
 
@@ -433,49 +421,46 @@ when p0 and p1 are attached to cgroup1
 Note that cgroup interfaces allows cpu.uclamp.max value to be lower than
 cpu.uclamp.min. Other interfaces don't allow that.
 
-3.3  SYSTEM INTERFACE:
+3.3.  System interface
 ----------------------
 
-3.3.1  sched_util_clamp_min:
-----------------------------
+3.3.1  sched_util_clamp_min
+---------------------------
 
-System wide limit of allowed UCLAMP_MIN range. By default set to 1024, which
-means tasks are allowed to reach an effective UCLAMP_MIN value in the range of
-[0:1024].
+System wide limit of allowed UCLAMP_MIN range. By default it is set to 1024,
+which means that permitted effective UCLAMP_MIN range for tasks is [0:1024].
+By changing it to 512 for example the range reduces to [0:512]. This is useful
+to restrict how much boosting tasks are allowed to acquire.
 
-By changing it to 512 for example the effective allowed range reduces to
-[0:512].
-
-This is useful to restrict how much boosting tasks are allowed to acquire.
-
-Requests from tasks to go above this point will still succeed, but effectively
-they won't be achieved until this value is >= p->uclamp[UCLAMP_MIN].
+Requests from tasks to go above this knob value will still succeed, but
+they won't be satisfied until it is more than p->uclamp[UCLAMP_MIN].
 
 The value must be smaller than or equal to sched_util_clamp_max.
 
-3.3.2  sched_util_clamp_max:
-----------------------------
+3.3.2  sched_util_clamp_max
+---------------------------
 
-System wide limit of allowed UCLAMP_MAX range. By default set to 1024, which
-means tasks are allowed to reach an effective UCLAMP_MAX value in the range of
-[0:1024].
+System wide limit of allowed UCLAMP_MAX range. By default it is set to 1024,
+which means that permitted effective UCLAMP_MAX range for tasks is [0:1024].
 
 By changing it to 512 for example the effective allowed range reduces to
-[0:512]. The visible impact of this is that no task can run above 512, which in
-return means that all rqs are restricted too. IOW, the whole system is capped
-to half its performance capacity.
+[0:512]. This means is that no task can run above 512, which implies that all
+rqs are restricted too. IOW, the whole system is capped to half its performance
+capacity.
 
-This is useful to restrict the overall maximum performance point of the system.
+This is useful to restrict the overall maximum performance point of the
+system. For example, it can be handy to limit performance when running low on
+battery.
 
-Can be handy to limit performance when running low on battery.
-
-Requests from tasks to go above this point will still succeed, but effectively
-they won't be achieved until this value is >= p->uclamp[UCLAMP_MAX].
+Requests from tasks to go above this knob value will still succeed, but
+they won't be satisfied until it is more than p->uclamp[UCLAMP_MAX].
 
 The value must be greater than or equal to sched_util_clamp_min.
 
-3.4  DEFAULT VALUES:
-----------------------
+.. _uclamp-default-values:
+
+3.4. Default values
+-------------------
 
 By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
 
@@ -484,7 +469,7 @@ By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
         p_fair->uclamp[UCLAMP_MIN] = 0
         p_fair->uclamp[UCLAMP_MAX] = 1024
 
-That is no boosting or restriction on any task. These default values can't be
+That is, no boosting or restriction on any task. These default values can't be
 changed at boot or runtime. No argument was made yet as to why we should
 provide this, but can be added in the future.
 
@@ -495,33 +480,35 @@ For SCHED_FIFO/SCHED_RR tasks:
         p_rt->uclamp[UCLAMP_MIN] = 1024
         p_rt->uclamp[UCLAMP_MAX] = 1024
 
-That is by default they're boosted to run at the maximum performance point of
+That is, by default they're boosted to run at the maximum performance point of
 the system which retains the historical behavior of the RT tasks.
 
 RT tasks default uclamp_min value can be modified at boot or runtime via
-sysctl. See section 3.4.1.
+sysctl. See below section.
+
+.. _sched-util-clamp-min-rt-default:
 
 3.4.1  sched_util_clamp_min_rt_default:
 ---------------------------------------
 
 Running RT tasks at maximum performance point is expensive on battery powered
-devices and not necessary. To allow system designers to offer good performance
-guarantees for RT tasks without pushing it all the way to maximum performance
+devices and not necessary. To allow system developer to offer good performance
+guarantees for these tasks without pushing it all the way to maximum performance
 point, this sysctl knob allows tuning the best boost value to address the
 system requirement without burning power running at maximum performance point
 all the time.
 
-Application designers are encouraged to use the per task util clamp interface
+Application developer are encouraged to use the per task util clamp interface
 to ensure they are performance and power aware. Ideally this knob should be set
 to 0 by system designers and leave the task of managing performance
-requirements to the apps themselves.
+requirements to the apps.
 
-4.  HOW TO USE UTIL CLAMP:
-==========================
+4. How to use util clamp
+========================
 
 Util clamp promotes the concept of user space assisted power and performance
-management. At the scheduler level the info required to make the best decision
-are non existent. But with util clamp user space can hint to the scheduler to
+management. At the scheduler level there is no info required to make the best
+decision. However, with util clamp user space can hint to the scheduler to
 make better decision about task placement and frequency selection.
 
 Best results are achieved by not making any assumptions about the system the
@@ -530,41 +517,41 @@ dynamically monitor and adjust. Ultimately this will allow for a better user
 experience at a better perf/watt.
 
 For some systems and use cases, static setup will help to achieve good results.
-Portability will be a problem in this case. After all how much work one can do
-at 100, 200 or 1024 is unknown and a special property of every system. Unless
-there's a specific target system, static setup should be avoided.
+Portability will be a problem in this case. How much work one can do at 100,
+200 or 1024 is different for each system. Unless there's a specific target
+system, static setup should be avoided.
 
-All in all there are enough possibilities to create a whole framework based on
+There are enough possibilities to create a whole framework based on
 util clamp or self contained app that makes use of it directly.
 
-4.1  BOOST IMPORTANT AND DVFS-LATENCY-SENSITIVE TASKS:
-------------------------------------------------------
+4.1. Boost important and DVFS-latency-sensitive tasks
+-----------------------------------------------------
 
 A GUI task might not be busy to warrant driving the frequency high when it
-wakes up. But it requires to finish its work within a specific period of time
+wakes up. However, it requires to finish its work within a specific time window
 to deliver the desired user experience. The right frequency it requires at
 wakeup will be system dependent. On some underpowered systems it will be high,
-on other overpowered ones, it will be low or 0.
+on other overpowered ones it will be low or 0.
 
-This task can increase its UCLAMP_MIN value every time it misses a deadline to
-ensure on next wake up it runs at a higher performance point. It should try to
-approach the lowest UCLAMP_MIN value that allows to meet its deadline on any
+This task can increase its UCLAMP_MIN value every time it misses the deadline
+to ensure on next wake up it runs at a higher performance point. It should try
+to approach the lowest UCLAMP_MIN value that allows to meet its deadline on any
 particular system to achieve the best possible perf/watt for that system.
 
 On heterogeneous systems, it might be important for this task to run on
-a bigger CPU.
+a faster CPU.
 
 Generally it is advised to perceive the input as performance level or point
 which will imply both task placement and frequency selection.
 
-4.2  CAP BACKGROUND TASKS:
---------------------------
+4.2. Cap background tasks
+-------------------------
 
 Like explained for Android case in the introduction. Any app can lower
 UCLAMP_MAX for some background tasks that don't care about performance but
 could end up being busy and consume unnecessary system resources on the system.
 
-4.3  POWERSAVE MODE:
+4.3.  Powersave mode
 --------------------
 
 sched_util_clamp_max system wide interface can be used to limit all tasks from
@@ -575,8 +562,8 @@ This is not unique to uclamp as one can achieve the same by reducing max
 frequency of the cpufreq governor. It can be considered a more convenient
 alternative interface.
 
-4.4  PER APP PERFORMANCE RESTRICTIONS:
---------------------------------------
+4.4.  Per-app performance restriction
+-------------------------------------
 
 Middleware/Utility can provide the user an option to set UCLAMP_MIN/MAX for an
 app every time it is executed to guarantee a minimum performance point and/or
@@ -585,28 +572,31 @@ these apps.
 
 If you want to prevent your laptop from heating up while on the go from
 compiling the kernel and happy to sacrifice performance to save power, but
-still would like to keep your browser performance intact; uclamp enables that.
+still would like to keep your browser performance intact, uclamp makes it
+possible.
 
-5.  LIMITATIONS:
-================
+5. Limitations
+==============
 
-5.1  CAPPING FREQUENCY WITH UCLAMP_MAX FAILS UNDER CERTAIN CONDITIONS:
-----------------------------------------------------------------------
+.. _uclamp-capping-fail:
 
-If task p0 is capped to run at 512
+5.1. Capping frequency with uclamp_max fails under certain conditions
+---------------------------------------------------------------------
+
+If task p0 is capped to run at 512:
 
 .. code-block:: c
 
         p0->uclamp[UCLAMP_MAX] = 512
 
-is sharing the rq with p1 which is free to run at any performance point
+and it shares the rq with p1 which is free to run at any performance point:
 
 .. code-block:: c
 
         p1->uclamp[UCLAMP_MAX] = 1024
 
 then due to max aggregation the rq will be allowed to reach max performance
-point
+point:
 
 .. code-block:: c
 
@@ -620,19 +610,19 @@ both are running at the same rq, p1 will cause the frequency capping to be left
 from the rq although p1, which is allowed to run at any performance point,
 doesn't actually need to run at that frequency.
 
-5.2  UCLAMP_MAX CAN BREAK PELT (UTIL_AVG) SIGNAL
+5.2. UCLAMP_MAX can break pelt (util_avg) signal
 ------------------------------------------------
 
 PELT assumes that frequency will always increase as the signals grow to ensure
-there's always some idle time on the CPU. But with UCLAMP_MAX, we will prevent
-this frequency increase which can lead to no idle time in some circumstances.
-When there's no idle time, then a task will look like a busy loop, which would
-result in util_avg being 1024.
+there's always some idle time on the CPU. But with UCLAMP_MAX, this frequency
+increase will be prevented which can lead to no idle time in some
+circumstances. When there's no idle time, a task will stuck in a busy loop,
+which would result in util_avg being 1024.
 
-Combing with issue described in 5.2, this an lead to unwanted frequency spikes
+Combing with issue described below, this an lead to unwanted frequency spikes
 when severely capped tasks share the rq with a small non capped task.
 
-As an example if task p
+As an example if task p, which have:
 
 .. code-block:: c
 
@@ -646,35 +636,35 @@ of.
 
         rq->uclamp[UCLAMP_MAX] = 0
 
-If the ratio of Fmax/Fmin is 3, then
+If the ratio of Fmax/Fmin is 3, then maximum value will be:
 
 .. code-block:: c
 
         300 * (Fmax/Fmin) = 900
 
-Which indicates the CPU will still see idle time since 900 is < 1024. The
-_actual_ util_avg will NOT be 900 though. It will be higher than 300, but won't
-approach 900. As long as there's idle time, p->util_avg updates will be off by
-a some margin, but not proportional to Fmax/Fmin.
+which indicates the CPU will still see idle time since 900 is < 1024. The
+_actual_ util_avg will not be 900 though, but somewhere between 300 and 900. As
+long as there's idle time, p->util_avg updates will be off by a some margin,
+but not proportional to Fmax/Fmin.
 
 .. code-block:: c
 
         p0->util_avg = 300 + small_error
 
-Now if the ratio of Fmax/Fmin is 4, then
+Now if the ratio of Fmax/Fmin is 4, the maximum value becomes:
 
 .. code-block:: c
 
         300 * (Fmax/Fmin) = 1200
 
 which is higher than 1024 and indicates that the CPU has no idle time. When
-this happens, then the _actual_ util_avg will become 1024.
+this happens, then the _actual_ util_avg will become:
 
 .. code-block:: c
 
         p0->util_avg = 1024
 
-If task p1 wakes up on this CPU
+If task p1 wakes up on this CPU, which have:
 
 .. code-block:: c
 
@@ -683,7 +673,7 @@ If task p1 wakes up on this CPU
 
 then the effective UCLAMP_MAX for the CPU will be 1024 according to max
 aggregation rule. But since the capped p0 task was running and throttled
-severely, then the rq->util_avg will be 1024.
+severely, then the rq->util_avg will be:
 
 .. code-block:: c
 
@@ -693,7 +683,7 @@ severely, then the rq->util_avg will be 1024.
         rq->util_avg = 1024
         rq->uclamp[UCLAMP_MAX] = 1024
 
-Hence lead to a frequency spike since if p0 wasn't throttled we should get
+Hence lead to a frequency spike since if p0 wasn't throttled we should get:
 
 .. code-block:: c
 

Thanks.

[1]: https://lore.kernel.org/lkml/20221113152629.3wbyeejsj5v33rvu@airbuntu/

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-14  9:22 ` Bagas Sanjaya
@ 2022-11-15 20:55   ` Qais Yousef
  0 siblings, 0 replies; 11+ messages in thread
From: Qais Yousef @ 2022-11-15 20:55 UTC (permalink / raw)
  To: Bagas Sanjaya
  Cc: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot,
	linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang, Jonathan JMChen,
	Hank, Paul Bone

On 11/14/22 16:22, Bagas Sanjaya wrote:
> On Sat, Nov 05, 2022 at 11:23:43PM +0000, Qais Yousef wrote:
> > +2.  DESIGN:
> > +===========
> 
> Why ALLCAPS and trailing colon for section title?

Fixed.

> 
> > +When a task is attached to a CPU controller, its uclamp values will be impacted
> > +as follows:
> > +
> > +* cpu.uclamp.min is a protection as described in section 3-3 in
> > +  Documentation/admin-guide/cgroup-v2.rst.
> > <snipped>...
> > +* cpu.uclamp.max is a limit as described in section 3-2 in
> > +  Documentation/admin-guide/cgroup-v2.rst.
> > +
> 
> Exactly what section on cgroup doc do you refer? I don't see any section

I got the number from '.. Contents' near the top of the doc

    37    3. Resource Distribution Models
    38      3-1. Weights
    39      3-2. Limits
    40      3-3. Protections
    41      3-4. Allocations

> number there. Did you mean this?:

Correct.


Thanks!

--
Qais Yousef

> 
> ---- >8 ----
> 
> diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst
> index dc254a3cb95686..fd448069c11562 100644
> --- a/Documentation/admin-guide/cgroup-v2.rst
> +++ b/Documentation/admin-guide/cgroup-v2.rst
> @@ -619,6 +619,8 @@ process migrations.
>  and is an example of this type.
>  
>  
> +.. _cgroupv2-limits-distributor:
> +
>  Limits
>  ------
>  
> @@ -635,6 +637,7 @@ process migrations.
>  "io.max" limits the maximum BPS and/or IOPS that a cgroup can consume
>  on an IO device and is an example of this type.
>  
> +.. _cgroupv2-protections-distributor:
>  
>  Protections
>  -----------
> diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
> index 6601bda176d16e..5741acb35b7db2 100644
> --- a/Documentation/scheduler/sched-util-clamp.rst
> +++ b/Documentation/scheduler/sched-util-clamp.rst
> @@ -364,8 +364,8 @@ There are two uclamp related values in the CPU cgroup controller:
>  When a task is attached to a CPU controller, its uclamp values will be impacted
>  as follows:
>  
> -* cpu.uclamp.min is a protection as described in section 3-3 in
> -  Documentation/admin-guide/cgroup-v2.rst.
> +* cpu.uclamp.min is a protection as described in :ref:`section 3-3 of cgroup
> +  v2 documentation <cgroupv2-protections-distributor>`.
>  
>    If a task uclamp_min value is lower than cpu.uclamp.min, then the task will
>    inherit the cgroup cpu.uclamp.min value.
> @@ -373,8 +373,8 @@ as follows:
>    In a cgroup hierarchy, effective cpu.uclamp.min is the max of (child,
>    parent).
>  
> -* cpu.uclamp.max is a limit as described in section 3-2 in
> -  Documentation/admin-guide/cgroup-v2.rst.
> +* cpu.uclamp.max is a limit as described in :ref:`section 3-2 of cgroup v2
> +  documentation <cgroupv2-limits-distributor>`.
>  
>    If a task uclamp_max value is higher than cpu.uclamp.max, then the task will
>    inherit the cgroup cpu.uclamp.max value.
> 
> 
> IMO, the doc wording can be improved (applied on top of your fixup [1]):
> 
> ---- >8 ----
> 
> diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
> index 728ffa364fc7ad..6601bda176d16e 100644
> --- a/Documentation/scheduler/sched-util-clamp.rst
> +++ b/Documentation/scheduler/sched-util-clamp.rst
> @@ -2,31 +2,29 @@
>  Utilization Clamping
>  ====================
>  
> -1.  INTRODUCTION
> -================
> +1. Introduction
> +===============
>  
> -Utilization clamping is a scheduler feature that allows user space to help in
> -managing the performance requirement of tasks. It was introduced in v5.3
> -release. The CGroup support was merged in v5.4.
> -
> -It is often referred to as util clamp and uclamp. You'll find all variations
> -used interchangeably in this documentation and in the source code.
> +Utilization clamping, also known as util clamp or uclamp, is a scheduler
> +feature that allows user space to help in managing the performance requirement
> +of tasks. It was introduced in v5.3 release. The CGroup support was merged in
> +v5.4.
>  
>  Uclamp is a hinting mechanism that allows the scheduler to understand the
> -performance requirements and restrictions of the tasks. Hence help it make
> -a better placement decision. And when schedutil cpufreq governor is used, util
> -clamp will influence the frequency selection as well.
> +performance requirements and restrictions of the tasks, thus it helps the
> +scheduler to make a better decision. And when schedutil cpufreq governor is
> +used, util clamp will influence the frequency selection as well.
>  
>  Since scheduler and schedutil are both driven by PELT (util_avg) signals, util
>  clamp acts on that to achieve its goal by clamping the signal to a certain
> -point; hence the name. I.e: by clamping utilization we are making the system
> -run at a certain performance point.
> +point; hence the name. That is, by clamping utilization we are making the
> +system run at a certain performance point.
>  
> -The right way to view util clamp is as a mechanism to make performance
> -constraints request/hint. It consists of two components:
> +The right way to view util clamp is as a mechanism to make request or hint on
> +performance constraints. It consists of two tunables:
>  
> -        * UCLAMP_MIN, which sets a lower bound.
> -        * UCLAMP_MAX, which sets an upper bound.
> +        * UCLAMP_MIN, which sets the lower bound.
> +        * UCLAMP_MAX, which sets the upper bound.
>  
>  These two bounds will ensure a task will operate within this performance range
>  of the system. UCLAMP_MIN implies boosting a task, while UCLAMP_MAX implies
> @@ -35,18 +33,18 @@ capping a task.
>  One can tell the system (scheduler) that some tasks require a minimum
>  performance point to operate at to deliver the desired user experience. Or one
>  can tell the system that some tasks should be restricted from consuming too
> -much resources and should NOT go above a specific performance point. Viewing
> +much resources and should not go above a specific performance point. Viewing
>  the uclamp values as performance points rather than utilization is a better
>  abstraction from user space point of view.
>  
>  As an example, a game can use util clamp to form a feedback loop with its
>  perceived FPS. It can dynamically increase the minimum performance point
>  required by its display pipeline to ensure no frame is dropped. It can also
> -dynamically 'prime' up these tasks if it knows in the coming few 100ms
> -a computationally intensive scene is about to happen.
> +dynamically 'prime' up these tasks if it knows in the coming few hundred
> +milliseconds a computationally intensive scene is about to happen.
>  
>  On mobile hardware where the capability of the devices varies a lot, this
> -dynamic feedback loop offers a great flexibility in ensuring best user
> +dynamic feedback loop offers a great flexibility to ensure best user
>  experience given the capabilities of any system.
>  
>  Of course a static configuration is possible too. The exact usage will depend
> @@ -68,17 +66,17 @@ stay on the little cores which will ensure that:
>             are CPU intensive tasks.
>  
>  By making these uclamp performance requests, or rather hints, user space can
> -ensure system resources are used optimally to deliver the best user experience
> -the system is capable of.
> +ensure system resources are used optimally to deliver the best possible user
> +experience.
>  
>  Another use case is to help with overcoming the ramp up latency inherit in how
>  scheduler utilization signal is calculated.
>  
> -A busy task for instance that requires to run at maximum performance point will
> -suffer a delay of ~200ms (PELT HALFIFE = 32ms) for the scheduler to realize
> -that. This is known to affect workloads like gaming on mobile devices where
> -frames will drop due to slow response time to select the higher frequency
> -required for the tasks to finish their work in time.
> +On the other hand, a busy task for instance that requires to run at maximum
> +performance point will suffer a delay of ~200ms (PELT HALFIFE = 32ms) for the
> +scheduler to realize that. This is known to affect workloads like gaming on
> +mobile devices where frames will drop due to slow response time to select the
> +higher frequency required for the tasks to finish their work in time.
>  
>  The overall visible effect goes beyond better perceived user
>  experience/performance and stretches to help achieve a better overall
> @@ -101,11 +99,12 @@ when an RT task wakes up. This cost is unchanged by using uclamp. Uclamp only
>  helps picking what frequency to request instead of schedutil always requesting
>  MAX for all RT tasks.
>  
> -See section 3.4 for default values and 3.4.1 on how to change RT tasks default
> -value.
> +See :ref:`section 3.4 <uclamp-default-values>` for default values and
> +:ref:`3.4.1 <sched-util-clamp-min-rt-default>` on how to change RT tasks
> +default value.
>  
> -2.  DESIGN:
> -===========
> +2. Design
> +=========
>  
>  Util clamp is a property of every task in the system. It sets the boundaries of
>  its utilization signal; acting as a bias mechanism that influences certain
> @@ -123,10 +122,10 @@ which have implications on the utilization value at rq level, which brings us
>  to the main design challenge.
>  
>  When a task wakes up on an rq, the utilization signal of the rq will be
> -impacted by the uclamp settings of all the tasks enqueued on it. For example if
> +affected by the uclamp settings of all the tasks enqueued on it. For example if
>  a task requests to run at UTIL_MIN = 512, then the util signal of the rq needs
> -to respect this request as well as all other requests from all of the enqueued
> -tasks.
> +to respect to this request as well as all other requests from all of the
> +enqueued tasks.
>  
>  To be able to aggregate the util clamp value of all the tasks attached to the
>  rq, uclamp must do some housekeeping at every enqueue/dequeue, which is the
> @@ -138,19 +137,21 @@ The way this is handled is by dividing the utilization range into buckets
>  (struct uclamp_bucket) which allows us to reduce the search space from every
>  task on the rq to only a subset of tasks on the top-most bucket.
>  
> -When a task is enqueued, we increment a counter in the matching bucket. And on
> -dequeue we decrement it. This makes keeping track of the effective uclamp value
> -at rq level a lot easier.
> +When a task is enqueued, the counter in the matching bucket is incremented,
> +and on dequeue it is decremented. This makes keeping track of the effective
> +uclamp value at rq level a lot easier.
>  
> -As we enqueue and dequeue tasks we keep track of the current effective uclamp
> -value of the rq. See section 2.1 for details on how this works.
> +As tasks are enqueued and dequeued, we keep track of the current effective
> +uclamp value of the rq. See :ref:`section 2.1 <uclamp-buckets>` for details on
> +how this works.
>  
>  Later at any path that wants to identify the effective uclamp value of the rq,
>  it will simply need to read this effective uclamp value of the rq at that exact
>  moment of time it needs to take a decision.
>  
>  For task placement case, only Energy Aware and Capacity Aware Scheduling
> -(EAS/CAS) make use of uclamp for now. This implies heterogeneous systems only.
> +(EAS/CAS) make use of uclamp for now, which implies that it is applied on
> +heterogeneous systems only.
>  When a task wakes up, the scheduler will look at the current effective uclamp
>  value of every rq and compare it with the potential new value if the task were
>  to be enqueued there. Favoring the rq that will end up with the most energy
> @@ -159,17 +160,19 @@ efficient combination.
>  Similarly in schedutil, when it needs to make a frequency update it will look
>  at the current effective uclamp value of the rq which is influenced by the set
>  of tasks currently enqueued there and select the appropriate frequency that
> -will honour uclamp requests.
> +will satisfy constraints from requests.
>  
>  Other paths like setting overutilization state (which effectively disables EAS)
>  make use of uclamp as well. Such cases are considered necessary housekeeping to
>  allow the 2 main use cases above and will not be covered in detail here as they
>  could change with implementation details.
>  
> -2.1  BUCKETS:
> --------------
> +.. _uclamp-buckets:
>  
> -.. code-block:: c
> +2.1. Buckets
> +------------
> +
> +.. code-block::
>  
>                             [struct rq]
>  
> @@ -189,7 +192,6 @@ could change with implementation details.
>  
>  
>  .. note::
> -  DISCLAMER:
>     The diagram above is an illustration rather than a true depiction of the
>     internal data structure.
>  
> @@ -198,12 +200,11 @@ an rq as tasks are enqueued/dequeued, the whole utilization range is divided
>  into N buckets where N is configured at compile time by setting
>  CONFIG_UCLAMP_BUCKETS_COUNT. By default it is set to 5.
>  
> -The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
> +The rq has a bucket for each uclamp_id tunables: [UCLAMP_MIN, UCLAMP_MAX].
>  
> -The range of each bucket is 1024/N. For example for the default value of 5 we
> -will have 5 buckets, each of which will cover the following range:
> +The range of each bucket is 1024/N. For example, for the default value of 5 there will be 5 buckets, each of which will cover the following range:
>  
> -.. code-block:: c
> +.. code-block::
>  
>          DELTA = round_closest(1024/5) = 204.8 = 205
>  
> @@ -213,21 +214,21 @@ will have 5 buckets, each of which will cover the following range:
>          Bucket 3: [615:819]
>          Bucket 4: [820:1024]
>  
> -When a task p
> +When a task p with following tunable parameters
>  
>  .. code-block:: c
>  
>          p->uclamp[UCLAMP_MIN] = 300
>          p->uclamp[UCLAMP_MAX] = 1024
>  
> -is enqueued into the rq, Bucket 1 will be incremented for UCLAMP_MIN and Bucket
> +is enqueued into the rq, bucket 1 will be incremented for UCLAMP_MIN and bucket
>  4 will be incremented for UCLAMP_MAX to reflect the fact the rq has a task in
>  this range.
>  
>  The rq then keeps track of its current effective uclamp value for each
>  uclamp_id.
>  
> -When a task p is enqueued, the rq value changes as follows:
> +When a task p is enqueued, the rq value changes to:
>  
>  .. code-block:: c
>  
> @@ -235,7 +236,7 @@ When a task p is enqueued, the rq value changes as follows:
>          rq->uclamp[UCLAMP_MIN] = max(rq->uclamp[UCLAMP_MIN], p->uclamp[UCLAMP_MIN])
>          // repeat for UCLAMP_MAX
>  
> -When a task is p dequeued the rq value changes as follows:
> +Similarly, when p is dequeued the rq value changes to:
>  
>  .. code-block:: c
>  
> @@ -244,11 +245,11 @@ When a task is p dequeued the rq value changes as follows:
>          // repeat for UCLAMP_MAX
>  
>  When all buckets are empty, the rq uclamp values are reset to system defaults.
> -See section 3.4 for default values.
> +See :ref:`section 3.4 <uclamp-default-values>` for details on default values.
>  
>  
> -2.2  MAX AGGREGATION:
> ----------------------
> +2.2. Max aggregation
> +--------------------
>  
>  Util clamp is tuned to honour the request for the task that requires the
>  highest performance point.
> @@ -268,19 +269,20 @@ values:
>          p1->uclamp[UCLAMP_MIN] = 500
>          p1->uclamp[UCLAMP_MAX] = 500
>  
> -then assuming both p0 and p1 are enqueued to the same rq
> +then assuming both p0 and p1 are enqueued to the same rq, both UCLAMP_MIN
> +and UCLAMP_MAX become:
>  
>  .. code-block:: c
>  
>          rq->uclamp[UCLAMP_MIN] = max(300, 500) = 500
>          rq->uclamp[UCLAMP_MAX] = max(900, 500) = 900
>  
> -As we shall see in section 5.1, this max aggregation is the cause of one of the
> -limitations when using util clamp. Particularly for UCLAMP_MAX hint when user
> -space would like to save power.
> +As we shall see in :ref:`section 5.1 <uclamp-capping-fail>`, this max
> +aggregation is the cause of one of limitations when using util clamp, in
> +particular for UCLAMP_MAX hint when user space would like to save power.
>  
> -2.3  HIERARCHICAL AGGREGATION:
> -------------------------------
> +2.3. Hierarchial aggregation
> +----------------------------
>  
>  As stated earlier, util clamp is a property of every task in the system. But
>  the actual applied (effective) value can be influenced by more than just the
> @@ -293,80 +295,66 @@ The effective util clamp value of any task is restricted as follows:
>    2. The restricted value in (1) is then further restricted by the system wide
>       uclamp settings.
>  
> -Section 3 discusses the interfaces and will expand further on that.
> +:ref:`Section 3 <uclamp-interfaces>` discusses the interfaces and will expand further on that.
>  
>  For now suffice to say that if a task makes a request, its actual effective
>  value will have to adhere to some restrictions imposed by cgroup and system
>  wide settings.
>  
> -The system will still accept the request even if effectively will look
> -different; but as soon as the task moves to a different cgroup or a sysadmin
> -modifies the system settings, it'll be able to get what it wants if the new
> -settings allows it.
> +The system will still accept the request even if effectively will be
> +beyond the constraints, but as soon as the task moves to a different cgroup
> +or a sysadmin modifies the system settings, the request will be satisfied
> +only if it is within new constraints.
>  
>  In other words, this aggregation will not cause an error when a task changes
> -its uclamp values. It just might not be able to achieve it based on those
> -factors.
> +its uclamp values, but rather the system may not be able to satisfy requests
> +based on those factors.
>  
>  2.4  Range:
>  -----------
>  
> -Uclamp performance request follow the utilization range: [0:1024] inclusive.
> +Uclamp performance request has the range of 0 to 1024 inclusive.
>  
> -For cgroup interface percentage is used: [0:100] inclusive.
> -You can use 'max' instead of 100 like other cgroup interfaces.
> +For cgroup interface percentage is used (that is 0 to 100 inclusive).
> +Just like other cgroup interfaces, you can use 'max' instead of 100.
>  
> -3.  INTERFACES:
> -===============
> +.. _uclamp-interfaces:
>  
> -3.1  PER TASK INTERFACE:
> -------------------------
> +3.  Interfaces
> +==============
> +
> +3.1  Per-task interface
> +-----------------------
>  
>  sched_setattr() syscall was extended to accept two new fields:
>  
>  * sched_util_min: requests the minimum performance point the system should run
> -                  at when this task is running. Or lower performance bound.
> +  at when this task is running. Or lower performance bound.
>  * sched_util_max: requests the maximum performance point the system should run
> -                  at when this task is running. Or upper performance bound.
> +  at when this task is running. Or upper performance bound.
>  
> -For example:
> +For example, the following scenario have 40% to 80% utilization constraints:
>  
>  .. code-block:: c
>  
>          attr->sched_util_min = 40% * 1024;
>          attr->sched_util_max = 80% * 1024;
>  
> -Will tell the system that when task @p is running, it should try its best to
> -ensure it starts at a performance point no less than 40% of maximum system's
> -capability.
> -
> -And if the task runs for a long enough time so that its actual utilization goes
> -above 80%, then it should not cause the system to operate at a performance
> -point higher than that.
> +When task @p is running, the scheduler should try its best to ensure it starts
> +at 40% utilization. If the task runs for a long enough time so that its actual
> +utilization goes above 80%, the utilization will be capped.
>  
>  The special value -1 is used to reset the uclamp settings to the system
>  default.
>  
>  Note that resetting the uclamp value to system default using -1 is not the same
> -as setting the uclamp value to system default.
> +as manually setting uclamp value to system default. This distinction is
> +important because as we shall see in system interfaces, the default value for
> +RT could be changed. SCHED_NORMAL/OTHER might gain similar knobs too in the
> +future.
>  
> -.. code-block:: c
> -
> -        attr->sched_util_min = -1  // p0 is reset to system default e.g: 0
> -
> -not the same as
> -
> -.. code-block:: c
> -
> -        attr->sched_util_min = 0   // p0 is set to 0, the fact it is the same
> -                                   // as system default is irrelevant
> -
> -This distinction is important because as we shall see in system interfaces, the
> -default value for RT could be changed. SCHED_NORMAL/OTHER might gain similar
> -knobs too in the future.
> -
> -3.2  CGROUP INTERFACE:
> -----------------------
> +3.2. cgroup interface
> +---------------------
>  
>  There are two uclamp related values in the CPU cgroup controller:
>  
> @@ -394,7 +382,7 @@ as follows:
>    In a cgroup hierarchy, effective cpu.uclamp.max is the min of (child,
>    parent).
>  
> -For example:
> +For example, given following parameters:
>  
>  .. code-block:: c
>  
> @@ -410,7 +398,7 @@ For example:
>          cgroup1->cpu.uclamp.min = 60% * 1024;
>          cgroup1->cpu.uclamp.max = 100% * 1024;
>  
> -when p0 and p1 are attached to cgroup0
> +when p0 and p1 are attached to cgroup0, the values become:
>  
>  .. code-block:: c
>  
> @@ -420,7 +408,7 @@ when p0 and p1 are attached to cgroup0
>          p1->uclamp[UCLAMP_MIN] = 40% * 1024; // intact
>          p1->uclamp[UCLAMP_MAX] = 50% * 1024; // intact
>  
> -when p0 and p1 are attached to cgroup1
> +when p0 and p1 are attached to cgroup1, these instead become:
>  
>  .. code-block:: c
>  
> @@ -433,49 +421,46 @@ when p0 and p1 are attached to cgroup1
>  Note that cgroup interfaces allows cpu.uclamp.max value to be lower than
>  cpu.uclamp.min. Other interfaces don't allow that.
>  
> -3.3  SYSTEM INTERFACE:
> +3.3.  System interface
>  ----------------------
>  
> -3.3.1  sched_util_clamp_min:
> -----------------------------
> +3.3.1  sched_util_clamp_min
> +---------------------------
>  
> -System wide limit of allowed UCLAMP_MIN range. By default set to 1024, which
> -means tasks are allowed to reach an effective UCLAMP_MIN value in the range of
> -[0:1024].
> +System wide limit of allowed UCLAMP_MIN range. By default it is set to 1024,
> +which means that permitted effective UCLAMP_MIN range for tasks is [0:1024].
> +By changing it to 512 for example the range reduces to [0:512]. This is useful
> +to restrict how much boosting tasks are allowed to acquire.
>  
> -By changing it to 512 for example the effective allowed range reduces to
> -[0:512].
> -
> -This is useful to restrict how much boosting tasks are allowed to acquire.
> -
> -Requests from tasks to go above this point will still succeed, but effectively
> -they won't be achieved until this value is >= p->uclamp[UCLAMP_MIN].
> +Requests from tasks to go above this knob value will still succeed, but
> +they won't be satisfied until it is more than p->uclamp[UCLAMP_MIN].
>  
>  The value must be smaller than or equal to sched_util_clamp_max.
>  
> -3.3.2  sched_util_clamp_max:
> -----------------------------
> +3.3.2  sched_util_clamp_max
> +---------------------------
>  
> -System wide limit of allowed UCLAMP_MAX range. By default set to 1024, which
> -means tasks are allowed to reach an effective UCLAMP_MAX value in the range of
> -[0:1024].
> +System wide limit of allowed UCLAMP_MAX range. By default it is set to 1024,
> +which means that permitted effective UCLAMP_MAX range for tasks is [0:1024].
>  
>  By changing it to 512 for example the effective allowed range reduces to
> -[0:512]. The visible impact of this is that no task can run above 512, which in
> -return means that all rqs are restricted too. IOW, the whole system is capped
> -to half its performance capacity.
> +[0:512]. This means is that no task can run above 512, which implies that all
> +rqs are restricted too. IOW, the whole system is capped to half its performance
> +capacity.
>  
> -This is useful to restrict the overall maximum performance point of the system.
> +This is useful to restrict the overall maximum performance point of the
> +system. For example, it can be handy to limit performance when running low on
> +battery.
>  
> -Can be handy to limit performance when running low on battery.
> -
> -Requests from tasks to go above this point will still succeed, but effectively
> -they won't be achieved until this value is >= p->uclamp[UCLAMP_MAX].
> +Requests from tasks to go above this knob value will still succeed, but
> +they won't be satisfied until it is more than p->uclamp[UCLAMP_MAX].
>  
>  The value must be greater than or equal to sched_util_clamp_min.
>  
> -3.4  DEFAULT VALUES:
> -----------------------
> +.. _uclamp-default-values:
> +
> +3.4. Default values
> +-------------------
>  
>  By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
>  
> @@ -484,7 +469,7 @@ By default all SCHED_NORMAL/SCHED_OTHER tasks are initialized to:
>          p_fair->uclamp[UCLAMP_MIN] = 0
>          p_fair->uclamp[UCLAMP_MAX] = 1024
>  
> -That is no boosting or restriction on any task. These default values can't be
> +That is, no boosting or restriction on any task. These default values can't be
>  changed at boot or runtime. No argument was made yet as to why we should
>  provide this, but can be added in the future.
>  
> @@ -495,33 +480,35 @@ For SCHED_FIFO/SCHED_RR tasks:
>          p_rt->uclamp[UCLAMP_MIN] = 1024
>          p_rt->uclamp[UCLAMP_MAX] = 1024
>  
> -That is by default they're boosted to run at the maximum performance point of
> +That is, by default they're boosted to run at the maximum performance point of
>  the system which retains the historical behavior of the RT tasks.
>  
>  RT tasks default uclamp_min value can be modified at boot or runtime via
> -sysctl. See section 3.4.1.
> +sysctl. See below section.
> +
> +.. _sched-util-clamp-min-rt-default:
>  
>  3.4.1  sched_util_clamp_min_rt_default:
>  ---------------------------------------
>  
>  Running RT tasks at maximum performance point is expensive on battery powered
> -devices and not necessary. To allow system designers to offer good performance
> -guarantees for RT tasks without pushing it all the way to maximum performance
> +devices and not necessary. To allow system developer to offer good performance
> +guarantees for these tasks without pushing it all the way to maximum performance
>  point, this sysctl knob allows tuning the best boost value to address the
>  system requirement without burning power running at maximum performance point
>  all the time.
>  
> -Application designers are encouraged to use the per task util clamp interface
> +Application developer are encouraged to use the per task util clamp interface
>  to ensure they are performance and power aware. Ideally this knob should be set
>  to 0 by system designers and leave the task of managing performance
> -requirements to the apps themselves.
> +requirements to the apps.
>  
> -4.  HOW TO USE UTIL CLAMP:
> -==========================
> +4. How to use util clamp
> +========================
>  
>  Util clamp promotes the concept of user space assisted power and performance
> -management. At the scheduler level the info required to make the best decision
> -are non existent. But with util clamp user space can hint to the scheduler to
> +management. At the scheduler level there is no info required to make the best
> +decision. However, with util clamp user space can hint to the scheduler to
>  make better decision about task placement and frequency selection.
>  
>  Best results are achieved by not making any assumptions about the system the
> @@ -530,41 +517,41 @@ dynamically monitor and adjust. Ultimately this will allow for a better user
>  experience at a better perf/watt.
>  
>  For some systems and use cases, static setup will help to achieve good results.
> -Portability will be a problem in this case. After all how much work one can do
> -at 100, 200 or 1024 is unknown and a special property of every system. Unless
> -there's a specific target system, static setup should be avoided.
> +Portability will be a problem in this case. How much work one can do at 100,
> +200 or 1024 is different for each system. Unless there's a specific target
> +system, static setup should be avoided.
>  
> -All in all there are enough possibilities to create a whole framework based on
> +There are enough possibilities to create a whole framework based on
>  util clamp or self contained app that makes use of it directly.
>  
> -4.1  BOOST IMPORTANT AND DVFS-LATENCY-SENSITIVE TASKS:
> -------------------------------------------------------
> +4.1. Boost important and DVFS-latency-sensitive tasks
> +-----------------------------------------------------
>  
>  A GUI task might not be busy to warrant driving the frequency high when it
> -wakes up. But it requires to finish its work within a specific period of time
> +wakes up. However, it requires to finish its work within a specific time window
>  to deliver the desired user experience. The right frequency it requires at
>  wakeup will be system dependent. On some underpowered systems it will be high,
> -on other overpowered ones, it will be low or 0.
> +on other overpowered ones it will be low or 0.
>  
> -This task can increase its UCLAMP_MIN value every time it misses a deadline to
> -ensure on next wake up it runs at a higher performance point. It should try to
> -approach the lowest UCLAMP_MIN value that allows to meet its deadline on any
> +This task can increase its UCLAMP_MIN value every time it misses the deadline
> +to ensure on next wake up it runs at a higher performance point. It should try
> +to approach the lowest UCLAMP_MIN value that allows to meet its deadline on any
>  particular system to achieve the best possible perf/watt for that system.
>  
>  On heterogeneous systems, it might be important for this task to run on
> -a bigger CPU.
> +a faster CPU.
>  
>  Generally it is advised to perceive the input as performance level or point
>  which will imply both task placement and frequency selection.
>  
> -4.2  CAP BACKGROUND TASKS:
> ---------------------------
> +4.2. Cap background tasks
> +-------------------------
>  
>  Like explained for Android case in the introduction. Any app can lower
>  UCLAMP_MAX for some background tasks that don't care about performance but
>  could end up being busy and consume unnecessary system resources on the system.
>  
> -4.3  POWERSAVE MODE:
> +4.3.  Powersave mode
>  --------------------
>  
>  sched_util_clamp_max system wide interface can be used to limit all tasks from
> @@ -575,8 +562,8 @@ This is not unique to uclamp as one can achieve the same by reducing max
>  frequency of the cpufreq governor. It can be considered a more convenient
>  alternative interface.
>  
> -4.4  PER APP PERFORMANCE RESTRICTIONS:
> ---------------------------------------
> +4.4.  Per-app performance restriction
> +-------------------------------------
>  
>  Middleware/Utility can provide the user an option to set UCLAMP_MIN/MAX for an
>  app every time it is executed to guarantee a minimum performance point and/or
> @@ -585,28 +572,31 @@ these apps.
>  
>  If you want to prevent your laptop from heating up while on the go from
>  compiling the kernel and happy to sacrifice performance to save power, but
> -still would like to keep your browser performance intact; uclamp enables that.
> +still would like to keep your browser performance intact, uclamp makes it
> +possible.
>  
> -5.  LIMITATIONS:
> -================
> +5. Limitations
> +==============
>  
> -5.1  CAPPING FREQUENCY WITH UCLAMP_MAX FAILS UNDER CERTAIN CONDITIONS:
> -----------------------------------------------------------------------
> +.. _uclamp-capping-fail:
>  
> -If task p0 is capped to run at 512
> +5.1. Capping frequency with uclamp_max fails under certain conditions
> +---------------------------------------------------------------------
> +
> +If task p0 is capped to run at 512:
>  
>  .. code-block:: c
>  
>          p0->uclamp[UCLAMP_MAX] = 512
>  
> -is sharing the rq with p1 which is free to run at any performance point
> +and it shares the rq with p1 which is free to run at any performance point:
>  
>  .. code-block:: c
>  
>          p1->uclamp[UCLAMP_MAX] = 1024
>  
>  then due to max aggregation the rq will be allowed to reach max performance
> -point
> +point:
>  
>  .. code-block:: c
>  
> @@ -620,19 +610,19 @@ both are running at the same rq, p1 will cause the frequency capping to be left
>  from the rq although p1, which is allowed to run at any performance point,
>  doesn't actually need to run at that frequency.
>  
> -5.2  UCLAMP_MAX CAN BREAK PELT (UTIL_AVG) SIGNAL
> +5.2. UCLAMP_MAX can break pelt (util_avg) signal
>  ------------------------------------------------
>  
>  PELT assumes that frequency will always increase as the signals grow to ensure
> -there's always some idle time on the CPU. But with UCLAMP_MAX, we will prevent
> -this frequency increase which can lead to no idle time in some circumstances.
> -When there's no idle time, then a task will look like a busy loop, which would
> -result in util_avg being 1024.
> +there's always some idle time on the CPU. But with UCLAMP_MAX, this frequency
> +increase will be prevented which can lead to no idle time in some
> +circumstances. When there's no idle time, a task will stuck in a busy loop,
> +which would result in util_avg being 1024.
>  
> -Combing with issue described in 5.2, this an lead to unwanted frequency spikes
> +Combing with issue described below, this an lead to unwanted frequency spikes
>  when severely capped tasks share the rq with a small non capped task.
>  
> -As an example if task p
> +As an example if task p, which have:
>  
>  .. code-block:: c
>  
> @@ -646,35 +636,35 @@ of.
>  
>          rq->uclamp[UCLAMP_MAX] = 0
>  
> -If the ratio of Fmax/Fmin is 3, then
> +If the ratio of Fmax/Fmin is 3, then maximum value will be:
>  
>  .. code-block:: c
>  
>          300 * (Fmax/Fmin) = 900
>  
> -Which indicates the CPU will still see idle time since 900 is < 1024. The
> -_actual_ util_avg will NOT be 900 though. It will be higher than 300, but won't
> -approach 900. As long as there's idle time, p->util_avg updates will be off by
> -a some margin, but not proportional to Fmax/Fmin.
> +which indicates the CPU will still see idle time since 900 is < 1024. The
> +_actual_ util_avg will not be 900 though, but somewhere between 300 and 900. As
> +long as there's idle time, p->util_avg updates will be off by a some margin,
> +but not proportional to Fmax/Fmin.
>  
>  .. code-block:: c
>  
>          p0->util_avg = 300 + small_error
>  
> -Now if the ratio of Fmax/Fmin is 4, then
> +Now if the ratio of Fmax/Fmin is 4, the maximum value becomes:
>  
>  .. code-block:: c
>  
>          300 * (Fmax/Fmin) = 1200
>  
>  which is higher than 1024 and indicates that the CPU has no idle time. When
> -this happens, then the _actual_ util_avg will become 1024.
> +this happens, then the _actual_ util_avg will become:
>  
>  .. code-block:: c
>  
>          p0->util_avg = 1024
>  
> -If task p1 wakes up on this CPU
> +If task p1 wakes up on this CPU, which have:
>  
>  .. code-block:: c
>  
> @@ -683,7 +673,7 @@ If task p1 wakes up on this CPU
>  
>  then the effective UCLAMP_MAX for the CPU will be 1024 according to max
>  aggregation rule. But since the capped p0 task was running and throttled
> -severely, then the rq->util_avg will be 1024.
> +severely, then the rq->util_avg will be:
>  
>  .. code-block:: c
>  
> @@ -693,7 +683,7 @@ severely, then the rq->util_avg will be 1024.
>          rq->util_avg = 1024
>          rq->uclamp[UCLAMP_MAX] = 1024
>  
> -Hence lead to a frequency spike since if p0 wasn't throttled we should get
> +Hence lead to a frequency spike since if p0 wasn't throttled we should get:
>  
>  .. code-block:: c
>  
> 
> Thanks.
> 
> [1]: https://lore.kernel.org/lkml/20221113152629.3wbyeejsj5v33rvu@airbuntu/
> 
> -- 
> An old man doll... just what I always wanted! - Clara



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-14  8:55     ` Bagas Sanjaya
@ 2022-11-15 20:55       ` Qais Yousef
  2022-11-16  8:36         ` Bagas Sanjaya
  0 siblings, 1 reply; 11+ messages in thread
From: Qais Yousef @ 2022-11-15 20:55 UTC (permalink / raw)
  To: Bagas Sanjaya
  Cc: kernel test robot, Ingo Molnar, Peter Zijlstra, Dietmar Eggemann,
	Vincent Guittot, oe-kbuild-all, linux-kernel, Lukasz Luba,
	Xuewen Yan, Wei Wang, Jonathan JMChen, Hank, Paul Bone,
	Jonathan Corbet, linux-doc

On 11/14/22 15:55, Bagas Sanjaya wrote:
> On Sun, Nov 13, 2022 at 03:26:29PM +0000, Qais Yousef wrote:
> > Thanks! I have the below fixup patch that addresses these. It made me realize
> > my html output could look better. It's cosmetic; so won't post a new version
> > till some feedback is provided first.
> > 
> > 
> > Cheers
> > 
> > --
> > Qais Yousef
> > 
> > 
> > --->8---
> > 
> > diff --git a/Documentation/scheduler/index.rst b/Documentation/scheduler/index.rst
> > index b430d856056a..f12d0d06de3a 100644
> > --- a/Documentation/scheduler/index.rst
> > +++ b/Documentation/scheduler/index.rst
> > @@ -15,6 +15,7 @@ Linux Scheduler
> >      sched-capacity
> >      sched-energy
> >      schedutil
> > +    sched-util-clamp
> >      sched-nice-design
> >      sched-rt-group
> >      sched-stats
> > diff --git a/Documentation/scheduler/sched-util-clamp.rst b/Documentation/scheduler/sched-util-clamp.rst
> > index e75b69767afb..728ffa364fc7 100644
> > --- a/Documentation/scheduler/sched-util-clamp.rst
> > +++ b/Documentation/scheduler/sched-util-clamp.rst
> > @@ -169,24 +169,27 @@ could change with implementation details.
> >  2.1  BUCKETS:
> >  -------------
> >  
> > +.. code-block:: c
> > +
> >                             [struct rq]
> >  
> > -(bottom)                                                    (top)
> > +  (bottom)                                                    (top)
> >  
> > -  0                                                          1024
> > -  |                                                           |
> > -  +-----------+-----------+-----------+----   ----+-----------+
> > -  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > -  +-----------+-----------+-----------+----   ----+-----------+
> > -     :           :                                   :
> > -     +- p0       +- p3                               +- p4
> > -     :                                               :
> > -     +- p1                                           +- p5
> > -     :
> > -     +- p2
> > +    0                                                          1024
> > +    |                                                           |
> > +    +-----------+-----------+-----------+----   ----+-----------+
> > +    |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > +    +-----------+-----------+-----------+----   ----+-----------+
> > +       :           :                                   :
> > +       +- p0       +- p3                               +- p4
> > +       :                                               :
> > +       +- p1                                           +- p5
> > +       :
> > +       +- p2
> 
> The code block above is diagram, isn't it? Thus specifying language for
> syntax highlighting (in this case ``c``) isn't appropriate.

I could do with a helping hand here actually. I am a text only person but
trying to follow the new rst docs; but I don't have a clue to be honest.

I did try to find the right directive, but I couldn't find it. What should be
specified for this diagram?

> 
> >  
> >  
> > -DISCLAMER:
> > +.. note::
> > +  DISCLAMER:
> >     The diagram above is an illustration rather than a true depiction of the
> >     internal data structure.
> 
> The DISCLAIMER line above isn't needed, since note block should do the
> job.

Okay.

> 
> >  
> > @@ -200,6 +203,8 @@ The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
> >  The range of each bucket is 1024/N. For example for the default value of 5 we
> >  will have 5 buckets, each of which will cover the following range:
> >  
> > +.. code-block:: c
> > +
> 
> Again, why ``c`` syntax highlighting?

This is a C code snippet. What would be better to use? I think I was getting
errors if I don't specify something. But again; I was touching my way around in
the dark here trying to figure it out.

> Otherwise no new warnings. Thanks for fixing this up.
> 
> However, in the future, for documentation patches you should always Cc:
> linux-doc list. Adding it to Cc list now.

Indeed. Maybe I went into auto-mode and didn't use get_maintainer proper.
Apologies.


Thanks!

--
Qais Yousef

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-14  2:47 ` Bagas Sanjaya
@ 2022-11-15 20:55   ` Qais Yousef
  0 siblings, 0 replies; 11+ messages in thread
From: Qais Yousef @ 2022-11-15 20:55 UTC (permalink / raw)
  To: Bagas Sanjaya
  Cc: Ingo Molnar, Peter Zijlstra, Dietmar Eggemann, Vincent Guittot,
	linux-kernel, Lukasz Luba, Xuewen Yan, Wei Wang, Jonathan JMChen,
	Hank, Paul Bone

On 11/14/22 09:47, Bagas Sanjaya wrote:
> On Sat, Nov 05, 2022 at 11:23:43PM +0000, Qais Yousef wrote:
> > From: Qais Yousef <qais.yousef@arm.com>
> > 
> > The new util clamp feature needs a document explaining what it is and
> > how to use it. The new document hopefully covers everything one needs to
> > know about uclamp.
> > 
> > Signed-off-by: Qais Yousef <qais.yousef@arm.com>
> > Signed-off-by: Qais Yousef (Google) <qyousef@layalina.io>
> 
> Hmm, why didn't you send this patch from your arm address instead?
> On the other hand, thanks for including SoB from your sending address,
> which is different.

I changed jobs now; but started the patch when I was with Arm, hence the
2 SoBs.

> 
> I will be commenting for the content on your fixup message.

Thanks for having a look!


Cheers

--
Qais Yousef

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-15 20:55       ` Qais Yousef
@ 2022-11-16  8:36         ` Bagas Sanjaya
  2022-11-20 20:52           ` Qais Yousef
  0 siblings, 1 reply; 11+ messages in thread
From: Bagas Sanjaya @ 2022-11-16  8:36 UTC (permalink / raw)
  To: Qais Yousef
  Cc: kernel test robot, Ingo Molnar, Peter Zijlstra, Dietmar Eggemann,
	Vincent Guittot, oe-kbuild-all, linux-kernel, Lukasz Luba,
	Xuewen Yan, Wei Wang, Jonathan JMChen, Hank, Paul Bone,
	Jonathan Corbet, linux-doc

[-- Attachment #1: Type: text/plain, Size: 2947 bytes --]

On Tue, Nov 15, 2022 at 08:55:47PM +0000, Qais Yousef wrote:
> > >  2.1  BUCKETS:
> > >  -------------
> > >  
> > > +.. code-block:: c
> > > +
> > >                             [struct rq]
> > >  
> > > -(bottom)                                                    (top)
> > > +  (bottom)                                                    (top)
> > >  
> > > -  0                                                          1024
> > > -  |                                                           |
> > > -  +-----------+-----------+-----------+----   ----+-----------+
> > > -  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > > -  +-----------+-----------+-----------+----   ----+-----------+
> > > -     :           :                                   :
> > > -     +- p0       +- p3                               +- p4
> > > -     :                                               :
> > > -     +- p1                                           +- p5
> > > -     :
> > > -     +- p2
> > > +    0                                                          1024
> > > +    |                                                           |
> > > +    +-----------+-----------+-----------+----   ----+-----------+
> > > +    |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > > +    +-----------+-----------+-----------+----   ----+-----------+
> > > +       :           :                                   :
> > > +       +- p0       +- p3                               +- p4
> > > +       :                                               :
> > > +       +- p1                                           +- p5
> > > +       :
> > > +       +- p2
> > 
> > The code block above is diagram, isn't it? Thus specifying language for
> > syntax highlighting (in this case ``c``) isn't appropriate.
> 
> I could do with a helping hand here actually. I am a text only person but
> trying to follow the new rst docs; but I don't have a clue to be honest.
> 
> I did try to find the right directive, but I couldn't find it. What should be
> specified for this diagram?

Just leave ..code-block:: directive alone or use simpler double colon
(::). The highlighting will not be applied to the code snippet.

> > > @@ -200,6 +203,8 @@ The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
> > >  The range of each bucket is 1024/N. For example for the default value of 5 we
> > >  will have 5 buckets, each of which will cover the following range:
> > >  
> > > +.. code-block:: c
> > > +
> > 
> > Again, why ``c`` syntax highlighting?
> 
> This is a C code snippet. What would be better to use? I think I was getting
> errors if I don't specify something. But again; I was touching my way around in
> the dark here trying to figure it out.
> 

Yup, that's the correct language for highlighting.

Thanks.

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] Documentation: sched: Add a new sched-util-clamp.rst
  2022-11-16  8:36         ` Bagas Sanjaya
@ 2022-11-20 20:52           ` Qais Yousef
  0 siblings, 0 replies; 11+ messages in thread
From: Qais Yousef @ 2022-11-20 20:52 UTC (permalink / raw)
  To: Bagas Sanjaya
  Cc: kernel test robot, Ingo Molnar, Peter Zijlstra, Dietmar Eggemann,
	Vincent Guittot, oe-kbuild-all, linux-kernel, Lukasz Luba,
	Xuewen Yan, Wei Wang, Jonathan JMChen, Hank, Paul Bone,
	Jonathan Corbet, linux-doc

On 11/16/22 15:36, Bagas Sanjaya wrote:
> On Tue, Nov 15, 2022 at 08:55:47PM +0000, Qais Yousef wrote:
> > > >  2.1  BUCKETS:
> > > >  -------------
> > > >  
> > > > +.. code-block:: c
> > > > +
> > > >                             [struct rq]
> > > >  
> > > > -(bottom)                                                    (top)
> > > > +  (bottom)                                                    (top)
> > > >  
> > > > -  0                                                          1024
> > > > -  |                                                           |
> > > > -  +-----------+-----------+-----------+----   ----+-----------+
> > > > -  |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > > > -  +-----------+-----------+-----------+----   ----+-----------+
> > > > -     :           :                                   :
> > > > -     +- p0       +- p3                               +- p4
> > > > -     :                                               :
> > > > -     +- p1                                           +- p5
> > > > -     :
> > > > -     +- p2
> > > > +    0                                                          1024
> > > > +    |                                                           |
> > > > +    +-----------+-----------+-----------+----   ----+-----------+
> > > > +    |  Bucket 0 |  Bucket 1 |  Bucket 2 |    ...    |  Bucket N |
> > > > +    +-----------+-----------+-----------+----   ----+-----------+
> > > > +       :           :                                   :
> > > > +       +- p0       +- p3                               +- p4
> > > > +       :                                               :
> > > > +       +- p1                                           +- p5
> > > > +       :
> > > > +       +- p2
> > > 
> > > The code block above is diagram, isn't it? Thus specifying language for
> > > syntax highlighting (in this case ``c``) isn't appropriate.
> > 
> > I could do with a helping hand here actually. I am a text only person but
> > trying to follow the new rst docs; but I don't have a clue to be honest.
> > 
> > I did try to find the right directive, but I couldn't find it. What should be
> > specified for this diagram?
> 
> Just leave ..code-block:: directive alone or use simpler double colon
> (::). The highlighting will not be applied to the code snippet.

Leaving

	..code-block::

produces this error:

	sched-util-clamp.rst:172: WARNING: Error in "code-block" directive: 1 argument(s) required, 0 supplied

I used

	::

and it seems to produces the desired results. I tried this first but I think my
indentation was broken then which is why it didn't work at the time and I moved
to code-block.

> 
> > > > @@ -200,6 +203,8 @@ The rq has a bucket for each uclamp_id: [UCLAMP_MIN, UCLAMP_MAX].
> > > >  The range of each bucket is 1024/N. For example for the default value of 5 we
> > > >  will have 5 buckets, each of which will cover the following range:
> > > >  
> > > > +.. code-block:: c
> > > > +
> > > 
> > > Again, why ``c`` syntax highlighting?
> > 
> > This is a C code snippet. What would be better to use? I think I was getting
> > errors if I don't specify something. But again; I was touching my way around in
> > the dark here trying to figure it out.
> > 
> 
> Yup, that's the correct language for highlighting.

Thanks Bagas!


--
Qais Yousef

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-11-20 20:52 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-05 23:23 [PATCH] Documentation: sched: Add a new sched-util-clamp.rst Qais Yousef
2022-11-06 17:47 ` kernel test robot
2022-11-13 15:26   ` Qais Yousef
2022-11-14  8:55     ` Bagas Sanjaya
2022-11-15 20:55       ` Qais Yousef
2022-11-16  8:36         ` Bagas Sanjaya
2022-11-20 20:52           ` Qais Yousef
2022-11-14  2:47 ` Bagas Sanjaya
2022-11-15 20:55   ` Qais Yousef
2022-11-14  9:22 ` Bagas Sanjaya
2022-11-15 20:55   ` Qais Yousef

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.