mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-07 00:38:05 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
181
Documentation/accounting/taskstats.txt
Normal file
181
Documentation/accounting/taskstats.txt
Normal file
|
@ -0,0 +1,181 @@
|
|||
Per-task statistics interface
|
||||
-----------------------------
|
||||
|
||||
|
||||
Taskstats is a netlink-based interface for sending per-task and
|
||||
per-process statistics from the kernel to userspace.
|
||||
|
||||
Taskstats was designed for the following benefits:
|
||||
|
||||
- efficiently provide statistics during lifetime of a task and on its exit
|
||||
- unified interface for multiple accounting subsystems
|
||||
- extensibility for use by future accounting patches
|
||||
|
||||
Terminology
|
||||
-----------
|
||||
|
||||
"pid", "tid" and "task" are used interchangeably and refer to the standard
|
||||
Linux task defined by struct task_struct. per-pid stats are the same as
|
||||
per-task stats.
|
||||
|
||||
"tgid", "process" and "thread group" are used interchangeably and refer to the
|
||||
tasks that share an mm_struct i.e. the traditional Unix process. Despite the
|
||||
use of tgid, there is no special treatment for the task that is thread group
|
||||
leader - a process is deemed alive as long as it has any task belonging to it.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
To get statistics during a task's lifetime, userspace opens a unicast netlink
|
||||
socket (NETLINK_GENERIC family) and sends commands specifying a pid or a tgid.
|
||||
The response contains statistics for a task (if pid is specified) or the sum of
|
||||
statistics for all tasks of the process (if tgid is specified).
|
||||
|
||||
To obtain statistics for tasks which are exiting, the userspace listener
|
||||
sends a register command and specifies a cpumask. Whenever a task exits on
|
||||
one of the cpus in the cpumask, its per-pid statistics are sent to the
|
||||
registered listener. Using cpumasks allows the data received by one listener
|
||||
to be limited and assists in flow control over the netlink interface and is
|
||||
explained in more detail below.
|
||||
|
||||
If the exiting task is the last thread exiting its thread group,
|
||||
an additional record containing the per-tgid stats is also sent to userspace.
|
||||
The latter contains the sum of per-pid stats for all threads in the thread
|
||||
group, both past and present.
|
||||
|
||||
getdelays.c is a simple utility demonstrating usage of the taskstats interface
|
||||
for reporting delay accounting statistics. Users can register cpumasks,
|
||||
send commands and process responses, listen for per-tid/tgid exit data,
|
||||
write the data received to a file and do basic flow control by increasing
|
||||
receive buffer sizes.
|
||||
|
||||
Interface
|
||||
---------
|
||||
|
||||
The user-kernel interface is encapsulated in include/linux/taskstats.h
|
||||
|
||||
To avoid this documentation becoming obsolete as the interface evolves, only
|
||||
an outline of the current version is given. taskstats.h always overrides the
|
||||
description here.
|
||||
|
||||
struct taskstats is the common accounting structure for both per-pid and
|
||||
per-tgid data. It is versioned and can be extended by each accounting subsystem
|
||||
that is added to the kernel. The fields and their semantics are defined in the
|
||||
taskstats.h file.
|
||||
|
||||
The data exchanged between user and kernel space is a netlink message belonging
|
||||
to the NETLINK_GENERIC family and using the netlink attributes interface.
|
||||
The messages are in the format
|
||||
|
||||
+----------+- - -+-------------+-------------------+
|
||||
| nlmsghdr | Pad | genlmsghdr | taskstats payload |
|
||||
+----------+- - -+-------------+-------------------+
|
||||
|
||||
|
||||
The taskstats payload is one of the following three kinds:
|
||||
|
||||
1. Commands: Sent from user to kernel. Commands to get data on
|
||||
a pid/tgid consist of one attribute, of type TASKSTATS_CMD_ATTR_PID/TGID,
|
||||
containing a u32 pid or tgid in the attribute payload. The pid/tgid denotes
|
||||
the task/process for which userspace wants statistics.
|
||||
|
||||
Commands to register/deregister interest in exit data from a set of cpus
|
||||
consist of one attribute, of type
|
||||
TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK and contain a cpumask in the
|
||||
attribute payload. The cpumask is specified as an ascii string of
|
||||
comma-separated cpu ranges e.g. to listen to exit data from cpus 1,2,3,5,7,8
|
||||
the cpumask would be "1-3,5,7-8". If userspace forgets to deregister interest
|
||||
in cpus before closing the listening socket, the kernel cleans up its interest
|
||||
set over time. However, for the sake of efficiency, an explicit deregistration
|
||||
is advisable.
|
||||
|
||||
2. Response for a command: sent from the kernel in response to a userspace
|
||||
command. The payload is a series of three attributes of type:
|
||||
|
||||
a) TASKSTATS_TYPE_AGGR_PID/TGID : attribute containing no payload but indicates
|
||||
a pid/tgid will be followed by some stats.
|
||||
|
||||
b) TASKSTATS_TYPE_PID/TGID: attribute whose payload is the pid/tgid whose stats
|
||||
are being returned.
|
||||
|
||||
c) TASKSTATS_TYPE_STATS: attribute with a struct taskstats as payload. The
|
||||
same structure is used for both per-pid and per-tgid stats.
|
||||
|
||||
3. New message sent by kernel whenever a task exits. The payload consists of a
|
||||
series of attributes of the following type:
|
||||
|
||||
a) TASKSTATS_TYPE_AGGR_PID: indicates next two attributes will be pid+stats
|
||||
b) TASKSTATS_TYPE_PID: contains exiting task's pid
|
||||
c) TASKSTATS_TYPE_STATS: contains the exiting task's per-pid stats
|
||||
d) TASKSTATS_TYPE_AGGR_TGID: indicates next two attributes will be tgid+stats
|
||||
e) TASKSTATS_TYPE_TGID: contains tgid of process to which task belongs
|
||||
f) TASKSTATS_TYPE_STATS: contains the per-tgid stats for exiting task's process
|
||||
|
||||
|
||||
per-tgid stats
|
||||
--------------
|
||||
|
||||
Taskstats provides per-process stats, in addition to per-task stats, since
|
||||
resource management is often done at a process granularity and aggregating task
|
||||
stats in userspace alone is inefficient and potentially inaccurate (due to lack
|
||||
of atomicity).
|
||||
|
||||
However, maintaining per-process, in addition to per-task stats, within the
|
||||
kernel has space and time overheads. To address this, the taskstats code
|
||||
accumulates each exiting task's statistics into a process-wide data structure.
|
||||
When the last task of a process exits, the process level data accumulated also
|
||||
gets sent to userspace (along with the per-task data).
|
||||
|
||||
When a user queries to get per-tgid data, the sum of all other live threads in
|
||||
the group is added up and added to the accumulated total for previously exited
|
||||
threads of the same thread group.
|
||||
|
||||
Extending taskstats
|
||||
-------------------
|
||||
|
||||
There are two ways to extend the taskstats interface to export more
|
||||
per-task/process stats as patches to collect them get added to the kernel
|
||||
in future:
|
||||
|
||||
1. Adding more fields to the end of the existing struct taskstats. Backward
|
||||
compatibility is ensured by the version number within the
|
||||
structure. Userspace will use only the fields of the struct that correspond
|
||||
to the version its using.
|
||||
|
||||
2. Defining separate statistic structs and using the netlink attributes
|
||||
interface to return them. Since userspace processes each netlink attribute
|
||||
independently, it can always ignore attributes whose type it does not
|
||||
understand (because it is using an older version of the interface).
|
||||
|
||||
|
||||
Choosing between 1. and 2. is a matter of trading off flexibility and
|
||||
overhead. If only a few fields need to be added, then 1. is the preferable
|
||||
path since the kernel and userspace don't need to incur the overhead of
|
||||
processing new netlink attributes. But if the new fields expand the existing
|
||||
struct too much, requiring disparate userspace accounting utilities to
|
||||
unnecessarily receive large structures whose fields are of no interest, then
|
||||
extending the attributes structure would be worthwhile.
|
||||
|
||||
Flow control for taskstats
|
||||
--------------------------
|
||||
|
||||
When the rate of task exits becomes large, a listener may not be able to keep
|
||||
up with the kernel's rate of sending per-tid/tgid exit data leading to data
|
||||
loss. This possibility gets compounded when the taskstats structure gets
|
||||
extended and the number of cpus grows large.
|
||||
|
||||
To avoid losing statistics, userspace should do one or more of the following:
|
||||
|
||||
- increase the receive buffer sizes for the netlink sockets opened by
|
||||
listeners to receive exit data.
|
||||
|
||||
- create more listeners and reduce the number of cpus being listened to by
|
||||
each listener. In the extreme case, there could be one listener for each cpu.
|
||||
Users may also consider setting the cpu affinity of the listener to the subset
|
||||
of cpus to which it listens, especially if they are listening to just one cpu.
|
||||
|
||||
Despite these measures, if the userspace receives ENOBUFS error messages
|
||||
indicated overflow of receive buffers, it should take measures to handle the
|
||||
loss of data.
|
||||
|
||||
----
|
Loading…
Add table
Add a link
Reference in a new issue