Merge tag 'v4.15-rc1' into drm-misc-fixes
Linux 4.15-rc1 Pull in the merge window to resync. Dave didn't get his -fixes pull landed in time, and now there's another rockchip fix pending, so fast-forwarding isn't possible, hence backmerge. Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
55
.gitignore
vendored
@@ -7,38 +7,40 @@
|
|||||||
# command after changing this file, to see if there are
|
# command after changing this file, to see if there are
|
||||||
# any tracked files which get ignored after the change.
|
# any tracked files which get ignored after the change.
|
||||||
#
|
#
|
||||||
# Normal rules
|
# Normal rules (sorted alphabetically)
|
||||||
#
|
#
|
||||||
.*
|
.*
|
||||||
|
*.a
|
||||||
|
*.bin
|
||||||
|
*.bz2
|
||||||
|
*.c.[012]*.*
|
||||||
|
*.dtb
|
||||||
|
*.dtb.S
|
||||||
|
*.dwo
|
||||||
|
*.elf
|
||||||
|
*.gcno
|
||||||
|
*.gz
|
||||||
|
*.i
|
||||||
|
*.ko
|
||||||
|
*.ll
|
||||||
|
*.lst
|
||||||
|
*.lz4
|
||||||
|
*.lzma
|
||||||
|
*.lzo
|
||||||
|
*.mod.c
|
||||||
*.o
|
*.o
|
||||||
*.o.*
|
*.o.*
|
||||||
*.a
|
*.order
|
||||||
|
*.patch
|
||||||
*.s
|
*.s
|
||||||
*.ko
|
|
||||||
*.so
|
*.so
|
||||||
*.so.dbg
|
*.so.dbg
|
||||||
*.mod.c
|
|
||||||
*.i
|
|
||||||
*.lst
|
|
||||||
*.symtypes
|
|
||||||
*.order
|
|
||||||
*.elf
|
|
||||||
*.bin
|
|
||||||
*.tar
|
|
||||||
*.gz
|
|
||||||
*.bz2
|
|
||||||
*.lzma
|
|
||||||
*.xz
|
|
||||||
*.lz4
|
|
||||||
*.lzo
|
|
||||||
*.patch
|
|
||||||
*.gcno
|
|
||||||
*.ll
|
|
||||||
modules.builtin
|
|
||||||
Module.symvers
|
|
||||||
*.dwo
|
|
||||||
*.su
|
*.su
|
||||||
*.c.[012]*.*
|
*.symtypes
|
||||||
|
*.tar
|
||||||
|
*.xz
|
||||||
|
Module.symvers
|
||||||
|
modules.builtin
|
||||||
|
|
||||||
#
|
#
|
||||||
# Top-level generic files
|
# Top-level generic files
|
||||||
@@ -53,6 +55,11 @@ Module.symvers
|
|||||||
/System.map
|
/System.map
|
||||||
/Module.markers
|
/Module.markers
|
||||||
|
|
||||||
|
#
|
||||||
|
# RPM spec file (make rpm-pkg)
|
||||||
|
#
|
||||||
|
/*.spec
|
||||||
|
|
||||||
#
|
#
|
||||||
# Debian directory (make deb-pkg)
|
# Debian directory (make deb-pkg)
|
||||||
#
|
#
|
||||||
|
|||||||
9
.mailmap
@@ -15,6 +15,7 @@ Adriana Reus <adi.reus@gmail.com> <adriana.reus@intel.com>
|
|||||||
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||||
Alan Cox <root@hraefn.swansea.linux.org.uk>
|
Alan Cox <root@hraefn.swansea.linux.org.uk>
|
||||||
Aleksey Gorelov <aleksey_gorelov@phoenix.com>
|
Aleksey Gorelov <aleksey_gorelov@phoenix.com>
|
||||||
|
Aleksandar Markovic <aleksandar.markovic@mips.com> <aleksandar.markovic@imgtec.com>
|
||||||
Al Viro <viro@ftp.linux.org.uk>
|
Al Viro <viro@ftp.linux.org.uk>
|
||||||
Al Viro <viro@zenIV.linux.org.uk>
|
Al Viro <viro@zenIV.linux.org.uk>
|
||||||
Andreas Herrmann <aherrman@de.ibm.com>
|
Andreas Herrmann <aherrman@de.ibm.com>
|
||||||
@@ -43,6 +44,7 @@ Corey Minyard <minyard@acm.org>
|
|||||||
Damian Hobson-Garcia <dhobsong@igel.co.jp>
|
Damian Hobson-Garcia <dhobsong@igel.co.jp>
|
||||||
David Brownell <david-b@pacbell.net>
|
David Brownell <david-b@pacbell.net>
|
||||||
David Woodhouse <dwmw2@shinybook.infradead.org>
|
David Woodhouse <dwmw2@shinybook.infradead.org>
|
||||||
|
Deng-Cheng Zhu <dengcheng.zhu@mips.com> <dengcheng.zhu@imgtec.com>
|
||||||
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||||
Domen Puncer <domen@coderock.org>
|
Domen Puncer <domen@coderock.org>
|
||||||
Douglas Gilbert <dougg@torque.net>
|
Douglas Gilbert <dougg@torque.net>
|
||||||
@@ -71,6 +73,8 @@ James E Wilson <wilson@specifix.com>
|
|||||||
James Hogan <jhogan@kernel.org> <james.hogan@imgtec.com>
|
James Hogan <jhogan@kernel.org> <james.hogan@imgtec.com>
|
||||||
James Hogan <jhogan@kernel.org> <james@albanarts.com>
|
James Hogan <jhogan@kernel.org> <james@albanarts.com>
|
||||||
James Ketrenos <jketreno@io.(none)>
|
James Ketrenos <jketreno@io.(none)>
|
||||||
|
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||||
|
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||||
Javi Merino <javi.merino@kernel.org> <javi.merino@arm.com>
|
Javi Merino <javi.merino@kernel.org> <javi.merino@arm.com>
|
||||||
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
||||||
Jean Tourrilhes <jt@hpl.hp.com>
|
Jean Tourrilhes <jt@hpl.hp.com>
|
||||||
@@ -100,6 +104,8 @@ Leonid I Ananiev <leonid.i.ananiev@intel.com>
|
|||||||
Linas Vepstas <linas@austin.ibm.com>
|
Linas Vepstas <linas@austin.ibm.com>
|
||||||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
|
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
|
||||||
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
|
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
|
||||||
|
Maciej W. Rozycki <macro@mips.com> <macro@imgtec.com>
|
||||||
|
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
|
||||||
Mark Brown <broonie@sirena.org.uk>
|
Mark Brown <broonie@sirena.org.uk>
|
||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
|
||||||
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com>
|
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@ginzinger.com>
|
||||||
@@ -114,9 +120,11 @@ Mauro Carvalho Chehab <mchehab@kernel.org> <mchehab@s-opensource.com>
|
|||||||
Matt Ranostay <mranostay@gmail.com> Matthew Ranostay <mranostay@embeddedalley.com>
|
Matt Ranostay <mranostay@gmail.com> Matthew Ranostay <mranostay@embeddedalley.com>
|
||||||
Matt Ranostay <mranostay@gmail.com> <matt.ranostay@intel.com>
|
Matt Ranostay <mranostay@gmail.com> <matt.ranostay@intel.com>
|
||||||
Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
|
Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
|
||||||
|
Matt Redfearn <matt.redfearn@mips.com> <matt.redfearn@imgtec.com>
|
||||||
Mayuresh Janorkar <mayur@ti.com>
|
Mayuresh Janorkar <mayur@ti.com>
|
||||||
Michael Buesch <m@bues.ch>
|
Michael Buesch <m@bues.ch>
|
||||||
Michel Dänzer <michel@tungstengraphics.com>
|
Michel Dänzer <michel@tungstengraphics.com>
|
||||||
|
Miodrag Dinic <miodrag.dinic@mips.com> <miodrag.dinic@imgtec.com>
|
||||||
Mitesh shah <mshah@teja.com>
|
Mitesh shah <mshah@teja.com>
|
||||||
Mohit Kumar <mohit.kumar@st.com> <mohit.kumar.dhaka@gmail.com>
|
Mohit Kumar <mohit.kumar@st.com> <mohit.kumar.dhaka@gmail.com>
|
||||||
Morten Welinder <terra@gnome.org>
|
Morten Welinder <terra@gnome.org>
|
||||||
@@ -127,6 +135,7 @@ Mythri P K <mythripk@ti.com>
|
|||||||
Nguyen Anh Quynh <aquynh@gmail.com>
|
Nguyen Anh Quynh <aquynh@gmail.com>
|
||||||
Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
||||||
Patrick Mochel <mochel@digitalimplant.org>
|
Patrick Mochel <mochel@digitalimplant.org>
|
||||||
|
Paul Burton <paul.burton@mips.com> <paul.burton@imgtec.com>
|
||||||
Peter A Jonsson <pj@ludd.ltu.se>
|
Peter A Jonsson <pj@ludd.ltu.se>
|
||||||
Peter Oruba <peter@oruba.de>
|
Peter Oruba <peter@oruba.de>
|
||||||
Peter Oruba <peter.oruba@amd.com>
|
Peter Oruba <peter.oruba@amd.com>
|
||||||
|
|||||||
9
CREDITS
@@ -2113,6 +2113,10 @@ S: J. Obrechtstr 23
|
|||||||
S: NL-5216 GP 's-Hertogenbosch
|
S: NL-5216 GP 's-Hertogenbosch
|
||||||
S: The Netherlands
|
S: The Netherlands
|
||||||
|
|
||||||
|
N: Ashley Lai
|
||||||
|
E: ashleydlai@gmail.com
|
||||||
|
D: IBM VTPM driver
|
||||||
|
|
||||||
N: Savio Lam
|
N: Savio Lam
|
||||||
E: lam836@cs.cuhk.hk
|
E: lam836@cs.cuhk.hk
|
||||||
D: Author of the dialog utility, foundation
|
D: Author of the dialog utility, foundation
|
||||||
@@ -3333,6 +3337,10 @@ S: Braunschweiger Strasse 79
|
|||||||
S: 31134 Hildesheim
|
S: 31134 Hildesheim
|
||||||
S: Germany
|
S: Germany
|
||||||
|
|
||||||
|
N: Marcel Selhorst
|
||||||
|
E: tpmdd@selhorst.net
|
||||||
|
D: TPM driver
|
||||||
|
|
||||||
N: Darren Senn
|
N: Darren Senn
|
||||||
E: sinster@darkwater.com
|
E: sinster@darkwater.com
|
||||||
D: Whatever I notice needs doing (so far: itimers, /proc)
|
D: Whatever I notice needs doing (so far: itimers, /proc)
|
||||||
@@ -4128,7 +4136,6 @@ D: MD driver
|
|||||||
D: EISA/sysfs subsystem
|
D: EISA/sysfs subsystem
|
||||||
S: France
|
S: France
|
||||||
|
|
||||||
|
|
||||||
# Don't add your name here, unless you really _are_ after Marc
|
# Don't add your name here, unless you really _are_ after Marc
|
||||||
# alphabetically. Leonard used to be very proud of being the
|
# alphabetically. Leonard used to be very proud of being the
|
||||||
# last entry, and he'll get positively pissed if he can't even
|
# last entry, and he'll get positively pissed if he can't even
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
What: /proc/sys/vm/nr_pdflush_threads
|
|
||||||
Date: June 2012
|
|
||||||
Contact: Wanpeng Li <liwp@linux.vnet.ibm.com>
|
|
||||||
Description: Since pdflush is replaced by per-BDI flusher, the interface of old pdflush
|
|
||||||
exported in /proc/sys/vm/ should be removed.
|
|
||||||
@@ -11,7 +11,7 @@ Description:
|
|||||||
Kernel code may export it for complete or partial access.
|
Kernel code may export it for complete or partial access.
|
||||||
|
|
||||||
GPIOs are identified as they are inside the kernel, using integers in
|
GPIOs are identified as they are inside the kernel, using integers in
|
||||||
the range 0..INT_MAX. See Documentation/gpio.txt for more information.
|
the range 0..INT_MAX. See Documentation/gpio/gpio.txt for more information.
|
||||||
|
|
||||||
/sys/class/gpio
|
/sys/class/gpio
|
||||||
/export ... asks the kernel to export a GPIO to userspace
|
/export ... asks the kernel to export a GPIO to userspace
|
||||||
|
|||||||
@@ -41,3 +41,73 @@ KernelVersion: 4.5
|
|||||||
Contact: K. Y. Srinivasan <kys@microsoft.com>
|
Contact: K. Y. Srinivasan <kys@microsoft.com>
|
||||||
Description: The 16 bit vendor ID of the device
|
Description: The 16 bit vendor ID of the device
|
||||||
Users: tools/hv/lsvmbus and user level RDMA libraries
|
Users: tools/hv/lsvmbus and user level RDMA libraries
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/cpu
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: VCPU (sub)channel is affinitized to
|
||||||
|
Users: tools/hv/lsvmbus and other debuggig tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/cpu
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: VCPU (sub)channel is affinitized to
|
||||||
|
Users: tools/hv/lsvmbus and other debuggig tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/in_mask
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Inbound channel signaling state
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/latency
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Channel signaling latency
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/out_mask
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Outbound channel signaling state
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/pending
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Channel interrupt pending state
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/read_avail
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Bytes availabble to read
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/write_avail
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Bytes availabble to write
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/events
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Number of times we have signaled the host
|
||||||
|
Users: Debugging tools
|
||||||
|
|
||||||
|
What: /sys/bus/vmbus/devices/vmbus_*/channels/relid/interrupts
|
||||||
|
Date: September. 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Stephen Hemminger <sthemmin@microsoft.com>
|
||||||
|
Description: Number of times we have taken an interrupt (incoming)
|
||||||
|
Users: Debugging tools
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Note: This documents additional properties of any device beyond what
|
# Note: This documents additional properties of any device beyond what
|
||||||
# is documented in Documentation/sysfs-rules.txt
|
# is documented in Documentation/admin-guide/sysfs-rules.rst
|
||||||
|
|
||||||
What: /sys/devices/*/of_node
|
What: /sys/devices/*/of_node
|
||||||
Date: February 2015
|
Date: February 2015
|
||||||
|
|||||||
41
Documentation/ABI/testing/dell-smbios-wmi
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
What: /dev/wmi/dell-smbios
|
||||||
|
Date: November 2017
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: "Mario Limonciello" <mario.limonciello@dell.com>
|
||||||
|
Description:
|
||||||
|
Perform SMBIOS calls on supported Dell machines.
|
||||||
|
through the Dell ACPI-WMI interface.
|
||||||
|
|
||||||
|
IOCTL's and buffer formats are defined in:
|
||||||
|
<uapi/linux/wmi.h>
|
||||||
|
|
||||||
|
1) To perform an SMBIOS call from userspace, you'll need to
|
||||||
|
first determine the minimum size of the calling interface
|
||||||
|
buffer for your machine.
|
||||||
|
Platforms that contain larger buffers can return larger
|
||||||
|
objects from the system firmware.
|
||||||
|
Commonly this size is either 4k or 32k.
|
||||||
|
|
||||||
|
To determine the size of the buffer read() a u64 dword from
|
||||||
|
the WMI character device /dev/wmi/dell-smbios.
|
||||||
|
|
||||||
|
2) After you've determined the minimum size of the calling
|
||||||
|
interface buffer, you can allocate a structure that represents
|
||||||
|
the structure documented above.
|
||||||
|
|
||||||
|
3) In the 'length' object store the size of the buffer you
|
||||||
|
determined above and allocated.
|
||||||
|
|
||||||
|
4) In this buffer object, prepare as necessary for the SMBIOS
|
||||||
|
call you're interested in. Typically SMBIOS buffers have
|
||||||
|
"class", "select", and "input" defined to values that coincide
|
||||||
|
with the data you are interested in.
|
||||||
|
Documenting class/select/input values is outside of the scope
|
||||||
|
of this documentation. Check with the libsmbios project for
|
||||||
|
further documentation on these values.
|
||||||
|
|
||||||
|
6) Run the call by using ioctl() as described in the header.
|
||||||
|
|
||||||
|
7) The output will be returned in the buffer object.
|
||||||
|
|
||||||
|
8) Be sure to free up your allocated object.
|
||||||
@@ -7,17 +7,37 @@ Description:
|
|||||||
HMAC-sha1 value across the extended attributes, storing the
|
HMAC-sha1 value across the extended attributes, storing the
|
||||||
value as the extended attribute 'security.evm'.
|
value as the extended attribute 'security.evm'.
|
||||||
|
|
||||||
EVM depends on the Kernel Key Retention System to provide it
|
EVM supports two classes of security.evm. The first is
|
||||||
with a trusted/encrypted key for the HMAC-sha1 operation.
|
an HMAC-sha1 generated locally with a
|
||||||
The key is loaded onto the root's keyring using keyctl. Until
|
trusted/encrypted key stored in the Kernel Key
|
||||||
EVM receives notification that the key has been successfully
|
Retention System. The second is a digital signature
|
||||||
loaded onto the keyring (echo 1 > <securityfs>/evm), EVM
|
generated either locally or remotely using an
|
||||||
can not create or validate the 'security.evm' xattr, but
|
asymmetric key. These keys are loaded onto root's
|
||||||
returns INTEGRITY_UNKNOWN. Loading the key and signaling EVM
|
keyring using keyctl, and EVM is then enabled by
|
||||||
should be done as early as possible. Normally this is done
|
echoing a value to <securityfs>/evm:
|
||||||
in the initramfs, which has already been measured as part
|
|
||||||
of the trusted boot. For more information on creating and
|
1: enable HMAC validation and creation
|
||||||
loading existing trusted/encrypted keys, refer to:
|
2: enable digital signature validation
|
||||||
Documentation/keys-trusted-encrypted.txt. (A sample dracut
|
3: enable HMAC and digital signature validation and HMAC
|
||||||
patch, which loads the trusted/encrypted key and enables
|
creation
|
||||||
EVM, is available from http://linux-ima.sourceforge.net/#EVM.)
|
|
||||||
|
Further writes will be blocked if HMAC support is enabled or
|
||||||
|
if bit 32 is set:
|
||||||
|
|
||||||
|
echo 0x80000002 ><securityfs>/evm
|
||||||
|
|
||||||
|
will enable digital signature validation and block
|
||||||
|
further writes to <securityfs>/evm.
|
||||||
|
|
||||||
|
Until this is done, EVM can not create or validate the
|
||||||
|
'security.evm' xattr, but returns INTEGRITY_UNKNOWN.
|
||||||
|
Loading keys and signaling EVM should be done as early
|
||||||
|
as possible. Normally this is done in the initramfs,
|
||||||
|
which has already been measured as part of the trusted
|
||||||
|
boot. For more information on creating and loading
|
||||||
|
existing trusted/encrypted keys, refer to:
|
||||||
|
|
||||||
|
Documentation/security/keys/trusted-encrypted.rst. Both dracut
|
||||||
|
(via 97masterkey and 98integrity) and systemd (via
|
||||||
|
core/ima-setup) have support for loading keys at boot
|
||||||
|
time.
|
||||||
|
|||||||
@@ -522,6 +522,7 @@ Description:
|
|||||||
Specifies the output powerdown mode.
|
Specifies the output powerdown mode.
|
||||||
DAC output stage is disconnected from the amplifier and
|
DAC output stage is disconnected from the amplifier and
|
||||||
1kohm_to_gnd: connected to ground via an 1kOhm resistor,
|
1kohm_to_gnd: connected to ground via an 1kOhm resistor,
|
||||||
|
2.5kohm_to_gnd: connected to ground via a 2.5kOhm resistor,
|
||||||
6kohm_to_gnd: connected to ground via a 6kOhm resistor,
|
6kohm_to_gnd: connected to ground via a 6kOhm resistor,
|
||||||
20kohm_to_gnd: connected to ground via a 20kOhm resistor,
|
20kohm_to_gnd: connected to ground via a 20kOhm resistor,
|
||||||
90kohm_to_gnd: connected to ground via a 90kOhm resistor,
|
90kohm_to_gnd: connected to ground via a 90kOhm resistor,
|
||||||
@@ -1242,9 +1243,9 @@ What: /sys/.../iio:deviceX/in_distance_raw
|
|||||||
KernelVersion: 4.0
|
KernelVersion: 4.0
|
||||||
Contact: linux-iio@vger.kernel.org
|
Contact: linux-iio@vger.kernel.org
|
||||||
Description:
|
Description:
|
||||||
This attribute is used to read the distance covered by the user
|
This attribute is used to read the measured distance to an object
|
||||||
since the last reboot while activated. Units after application
|
or the distance covered by the user since the last reboot while
|
||||||
of scale are meters.
|
activated. Units after application of scale are meters.
|
||||||
|
|
||||||
What: /sys/bus/iio/devices/iio:deviceX/store_eeprom
|
What: /sys/bus/iio/devices/iio:deviceX/store_eeprom
|
||||||
KernelVersion: 3.4.0
|
KernelVersion: 3.4.0
|
||||||
|
|||||||
@@ -16,3 +16,13 @@ Description:
|
|||||||
the motion sensor is placed. For example, in a laptop a motion
|
the motion sensor is placed. For example, in a laptop a motion
|
||||||
sensor can be located on the base or on the lid. Current valid
|
sensor can be located on the base or on the lid. Current valid
|
||||||
values are 'base' and 'lid'.
|
values are 'base' and 'lid'.
|
||||||
|
|
||||||
|
What: /sys/bus/iio/devices/iio:deviceX/id
|
||||||
|
Date: Septembre 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: linux-iio@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
This attribute is exposed by the CrOS EC legacy accelerometer
|
||||||
|
driver and represents the sensor ID as exposed by the EC. This
|
||||||
|
ID is used by the Android sensor service hardware abstraction
|
||||||
|
layer (sensor HAL) through the Android container on ChromeOS.
|
||||||
|
|||||||
@@ -14,3 +14,11 @@ Description:
|
|||||||
Show or set the gain boost of the amp, from 0-31 range.
|
Show or set the gain boost of the amp, from 0-31 range.
|
||||||
18 = indoors (default)
|
18 = indoors (default)
|
||||||
14 = outdoors
|
14 = outdoors
|
||||||
|
|
||||||
|
What /sys/bus/iio/devices/iio:deviceX/noise_level_tripped
|
||||||
|
Date: May 2017
|
||||||
|
KernelVersion: 4.13
|
||||||
|
Contact: Matt Ranostay <matt.ranostay@konsulko.com>
|
||||||
|
Description:
|
||||||
|
When 1 the noise level is over the trip level and not reporting
|
||||||
|
valid data
|
||||||
|
|||||||
4
Documentation/ABI/testing/sysfs-bus-mmc
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
What: /sys/bus/mmc/devices/.../rev
|
||||||
|
Date: October 2017
|
||||||
|
Contact: Jin Qian <jinqian@android.com>
|
||||||
|
Description: Extended CSD revision number
|
||||||
@@ -110,3 +110,51 @@ Description: When new NVM image is written to the non-active NVM
|
|||||||
is directly the status value from the DMA configuration
|
is directly the status value from the DMA configuration
|
||||||
based mailbox before the device is power cycled. Writing
|
based mailbox before the device is power cycled. Writing
|
||||||
0 here clears the status.
|
0 here clears the status.
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/key
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: This contains name of the property directory the XDomain
|
||||||
|
service exposes. This entry describes the protocol in
|
||||||
|
question. Following directories are already reserved by
|
||||||
|
the Apple XDomain specification:
|
||||||
|
|
||||||
|
network: IP/ethernet over Thunderbolt
|
||||||
|
targetdm: Target disk mode protocol over Thunderbolt
|
||||||
|
extdisp: External display mode protocol over Thunderbolt
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/modalias
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: Stores the same MODALIAS value emitted by uevent for
|
||||||
|
the XDomain service. Format: tbtsvc:kSpNvNrN
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/prtcid
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: This contains XDomain protocol identifier the XDomain
|
||||||
|
service supports.
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/prtcvers
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: This contains XDomain protocol version the XDomain
|
||||||
|
service supports.
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/prtcrevs
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: This contains XDomain software version the XDomain
|
||||||
|
service supports.
|
||||||
|
|
||||||
|
What: /sys/bus/thunderbolt/devices/<xdomain>.<service>/prtcstns
|
||||||
|
Date: Jan 2018
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: thunderbolt-software@lists.01.org
|
||||||
|
Description: This contains XDomain service specific settings as
|
||||||
|
bitmask. Format: %x
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
What: /sys/class/remoteproc/.../firmware
|
What: /sys/class/remoteproc/.../firmware
|
||||||
Date: October 2016
|
Date: October 2016
|
||||||
Contact: Matt Redfearn <matt.redfearn@imgtec.com>
|
Contact: Matt Redfearn <matt.redfearn@mips.com>
|
||||||
Description: Remote processor firmware
|
Description: Remote processor firmware
|
||||||
|
|
||||||
Reports the name of the firmware currently loaded to the
|
Reports the name of the firmware currently loaded to the
|
||||||
@@ -11,7 +11,7 @@ Description: Remote processor firmware
|
|||||||
|
|
||||||
What: /sys/class/remoteproc/.../state
|
What: /sys/class/remoteproc/.../state
|
||||||
Date: October 2016
|
Date: October 2016
|
||||||
Contact: Matt Redfearn <matt.redfearn@imgtec.com>
|
Contact: Matt Redfearn <matt.redfearn@mips.com>
|
||||||
Description: Remote processor state
|
Description: Remote processor state
|
||||||
|
|
||||||
Reports the state of the remote processor, which will be one of:
|
Reports the state of the remote processor, which will be one of:
|
||||||
|
|||||||
@@ -211,7 +211,9 @@ Description:
|
|||||||
device, after it has been suspended at run time, from a resume
|
device, after it has been suspended at run time, from a resume
|
||||||
request to the moment the device will be ready to process I/O,
|
request to the moment the device will be ready to process I/O,
|
||||||
in microseconds. If it is equal to 0, however, this means that
|
in microseconds. If it is equal to 0, however, this means that
|
||||||
the PM QoS resume latency may be arbitrary.
|
the PM QoS resume latency may be arbitrary and the special value
|
||||||
|
"n/a" means that user space cannot accept any resume latency at
|
||||||
|
all for the given device.
|
||||||
|
|
||||||
Not all drivers support this attribute. If it isn't supported,
|
Not all drivers support this attribute. If it isn't supported,
|
||||||
it is not present.
|
it is not present.
|
||||||
@@ -258,19 +260,3 @@ Description:
|
|||||||
|
|
||||||
This attribute has no effect on system-wide suspend/resume and
|
This attribute has no effect on system-wide suspend/resume and
|
||||||
hibernation.
|
hibernation.
|
||||||
|
|
||||||
What: /sys/devices/.../power/pm_qos_remote_wakeup
|
|
||||||
Date: September 2012
|
|
||||||
Contact: Rafael J. Wysocki <rjw@rjwysocki.net>
|
|
||||||
Description:
|
|
||||||
The /sys/devices/.../power/pm_qos_remote_wakeup attribute
|
|
||||||
is used for manipulating the PM QoS "remote wakeup required"
|
|
||||||
flag. If set, this flag indicates to the kernel that the
|
|
||||||
device is a source of user events that have to be signaled from
|
|
||||||
its low-power states.
|
|
||||||
|
|
||||||
Not all drivers support this attribute. If it isn't supported,
|
|
||||||
it is not present.
|
|
||||||
|
|
||||||
This attribute has no effect on system-wide suspend/resume and
|
|
||||||
hibernation.
|
|
||||||
|
|||||||
@@ -187,7 +187,8 @@ Description: Processor frequency boosting control
|
|||||||
This switch controls the boost setting for the whole system.
|
This switch controls the boost setting for the whole system.
|
||||||
Boosting allows the CPU and the firmware to run at a frequency
|
Boosting allows the CPU and the firmware to run at a frequency
|
||||||
beyound it's nominal limit.
|
beyound it's nominal limit.
|
||||||
More details can be found in Documentation/cpu-freq/boost.txt
|
More details can be found in
|
||||||
|
Documentation/admin-guide/pm/cpufreq.rst
|
||||||
|
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpu#/crash_notes
|
What: /sys/devices/system/cpu/cpu#/crash_notes
|
||||||
@@ -223,7 +224,8 @@ Description: Parameters for the Intel P-state driver
|
|||||||
no_turbo: limits the driver to selecting P states below the turbo
|
no_turbo: limits the driver to selecting P states below the turbo
|
||||||
frequency range.
|
frequency range.
|
||||||
|
|
||||||
More details can be found in Documentation/cpu-freq/intel-pstate.txt
|
More details can be found in
|
||||||
|
Documentation/admin-guide/pm/intel_pstate.rst
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpu*/cache/index*/<set_of_attributes_mentioned_below>
|
What: /sys/devices/system/cpu/cpu*/cache/index*/<set_of_attributes_mentioned_below>
|
||||||
Date: July 2014(documented, existed before August 2008)
|
Date: July 2014(documented, existed before August 2008)
|
||||||
|
|||||||
21
Documentation/ABI/testing/sysfs-driver-w1_ds28e17
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
What: /sys/bus/w1/devices/19-<id>/speed
|
||||||
|
Date: Sep 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Jan Kandziora <jjj@gmx.de>
|
||||||
|
Description: When written, this file sets the I2C speed on the connected
|
||||||
|
DS28E17 chip. When read, it reads the current setting from
|
||||||
|
the DS28E17 chip.
|
||||||
|
Valid values: 100, 400, 900 [kBaud].
|
||||||
|
Default 100, can be set by w1_ds28e17.speed= module parameter.
|
||||||
|
Users: w1_ds28e17 driver
|
||||||
|
|
||||||
|
What: /sys/bus/w1/devices/19-<id>/stretch
|
||||||
|
Date: Sep 2017
|
||||||
|
KernelVersion: 4.14
|
||||||
|
Contact: Jan Kandziora <jjj@gmx.de>
|
||||||
|
Description: When written, this file sets the multiplier used to calculate
|
||||||
|
the busy timeout for I2C operations on the connected DS28E17
|
||||||
|
chip. When read, returns the current setting.
|
||||||
|
Valid values: 1 to 9.
|
||||||
|
Default 1, can be set by w1_ds28e17.stretch= module parameter.
|
||||||
|
Users: w1_ds28e17 driver
|
||||||
@@ -51,6 +51,18 @@ Description:
|
|||||||
Controls the dirty page count condition for the in-place-update
|
Controls the dirty page count condition for the in-place-update
|
||||||
policies.
|
policies.
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/min_hot_blocks
|
||||||
|
Date: March 2017
|
||||||
|
Contact: "Jaegeuk Kim" <jaegeuk@kernel.org>
|
||||||
|
Description:
|
||||||
|
Controls the dirty page count condition for redefining hot data.
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/min_ssr_sections
|
||||||
|
Date: October 2017
|
||||||
|
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||||
|
Description:
|
||||||
|
Controls the fee section threshold to trigger SSR allocation.
|
||||||
|
|
||||||
What: /sys/fs/f2fs/<disk>/max_small_discards
|
What: /sys/fs/f2fs/<disk>/max_small_discards
|
||||||
Date: November 2013
|
Date: November 2013
|
||||||
Contact: "Jaegeuk Kim" <jaegeuk.kim@samsung.com>
|
Contact: "Jaegeuk Kim" <jaegeuk.kim@samsung.com>
|
||||||
@@ -102,6 +114,12 @@ Contact: "Jaegeuk Kim" <jaegeuk@kernel.org>
|
|||||||
Description:
|
Description:
|
||||||
Controls the idle timing.
|
Controls the idle timing.
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/iostat_enable
|
||||||
|
Date: August 2017
|
||||||
|
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||||
|
Description:
|
||||||
|
Controls to enable/disable IO stat.
|
||||||
|
|
||||||
What: /sys/fs/f2fs/<disk>/ra_nid_pages
|
What: /sys/fs/f2fs/<disk>/ra_nid_pages
|
||||||
Date: October 2015
|
Date: October 2015
|
||||||
Contact: "Chao Yu" <chao2.yu@samsung.com>
|
Contact: "Chao Yu" <chao2.yu@samsung.com>
|
||||||
@@ -122,6 +140,12 @@ Contact: "Shuoran Liu" <liushuoran@huawei.com>
|
|||||||
Description:
|
Description:
|
||||||
Shows total written kbytes issued to disk.
|
Shows total written kbytes issued to disk.
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/feature
|
||||||
|
Date: July 2017
|
||||||
|
Contact: "Jaegeuk Kim" <jaegeuk@kernel.org>
|
||||||
|
Description:
|
||||||
|
Shows all enabled features in current device.
|
||||||
|
|
||||||
What: /sys/fs/f2fs/<disk>/inject_rate
|
What: /sys/fs/f2fs/<disk>/inject_rate
|
||||||
Date: May 2016
|
Date: May 2016
|
||||||
Contact: "Sheng Yong" <shengyong1@huawei.com>
|
Contact: "Sheng Yong" <shengyong1@huawei.com>
|
||||||
@@ -138,7 +162,18 @@ What: /sys/fs/f2fs/<disk>/reserved_blocks
|
|||||||
Date: June 2017
|
Date: June 2017
|
||||||
Contact: "Chao Yu" <yuchao0@huawei.com>
|
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||||
Description:
|
Description:
|
||||||
Controls current reserved blocks in system.
|
Controls target reserved blocks in system, the threshold
|
||||||
|
is soft, it could exceed current available user space.
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/current_reserved_blocks
|
||||||
|
Date: October 2017
|
||||||
|
Contact: "Yunlong Song" <yunlong.song@huawei.com>
|
||||||
|
Contact: "Chao Yu" <yuchao0@huawei.com>
|
||||||
|
Description:
|
||||||
|
Shows current reserved blocks in system, it may be temporarily
|
||||||
|
smaller than target_reserved_blocks, but will gradually
|
||||||
|
increase to target_reserved_blocks when more free blocks are
|
||||||
|
freed by user later.
|
||||||
|
|
||||||
What: /sys/fs/f2fs/<disk>/gc_urgent
|
What: /sys/fs/f2fs/<disk>/gc_urgent
|
||||||
Date: August 2017
|
Date: August 2017
|
||||||
|
|||||||
21
Documentation/ABI/testing/sysfs-platform-dell-smbios
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
What: /sys/devices/platform/<platform>/tokens/*
|
||||||
|
Date: November 2017
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: "Mario Limonciello" <mario.limonciello@dell.com>
|
||||||
|
Description:
|
||||||
|
A read-only description of Dell platform tokens
|
||||||
|
available on the machine.
|
||||||
|
|
||||||
|
Each token attribute is available as a pair of
|
||||||
|
sysfs attributes readable by a process with
|
||||||
|
CAP_SYS_ADMIN.
|
||||||
|
|
||||||
|
For example the token ID "5" would be available
|
||||||
|
as the following attributes:
|
||||||
|
|
||||||
|
0005_location
|
||||||
|
0005_value
|
||||||
|
|
||||||
|
Tokens will vary from machine to machine, and
|
||||||
|
only tokens available on that machine will be
|
||||||
|
displayed.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
What: /sys/devices/platform/<platform>/force_power
|
||||||
|
Date: September 2017
|
||||||
|
KernelVersion: 4.15
|
||||||
|
Contact: "Mario Limonciello" <mario.limonciello@dell.com>
|
||||||
|
Description:
|
||||||
|
Modify the platform force power state, influencing
|
||||||
|
Thunderbolt controllers to turn on or off when no
|
||||||
|
devices are connected (write-only)
|
||||||
|
There are two available states:
|
||||||
|
* 0 -> Force power disabled
|
||||||
|
* 1 -> Force power enabled
|
||||||
@@ -18,7 +18,8 @@ Description:
|
|||||||
Writing one of the above strings to this file causes the system
|
Writing one of the above strings to this file causes the system
|
||||||
to transition into the corresponding state, if available.
|
to transition into the corresponding state, if available.
|
||||||
|
|
||||||
See Documentation/power/states.txt for more information.
|
See Documentation/admin-guide/pm/sleep-states.rst for more
|
||||||
|
information.
|
||||||
|
|
||||||
What: /sys/power/mem_sleep
|
What: /sys/power/mem_sleep
|
||||||
Date: November 2016
|
Date: November 2016
|
||||||
@@ -35,7 +36,8 @@ Description:
|
|||||||
represented by it to be used on subsequent attempts to suspend
|
represented by it to be used on subsequent attempts to suspend
|
||||||
the system.
|
the system.
|
||||||
|
|
||||||
See Documentation/power/states.txt for more information.
|
See Documentation/admin-guide/pm/sleep-states.rst for more
|
||||||
|
information.
|
||||||
|
|
||||||
What: /sys/power/disk
|
What: /sys/power/disk
|
||||||
Date: September 2006
|
Date: September 2006
|
||||||
|
|||||||
@@ -81,7 +81,9 @@ If you want the driver to put an event into the event log on a panic,
|
|||||||
enable the 'Generate a panic event to all BMCs on a panic' option. If
|
enable the 'Generate a panic event to all BMCs on a panic' option. If
|
||||||
you want the whole panic string put into the event log using OEM
|
you want the whole panic string put into the event log using OEM
|
||||||
events, enable the 'Generate OEM events containing the panic string'
|
events, enable the 'Generate OEM events containing the panic string'
|
||||||
option.
|
option. You can also enable these dynamically by setting the module
|
||||||
|
parameter named "panic_op" in the ipmi_msghandler module to "event"
|
||||||
|
or "string". Setting that parameter to "none" disables this function.
|
||||||
|
|
||||||
Basic Design
|
Basic Design
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -97,6 +97,9 @@ endif # HAVE_SPHINX
|
|||||||
# The following targets are independent of HAVE_SPHINX, and the rules should
|
# The following targets are independent of HAVE_SPHINX, and the rules should
|
||||||
# work or silently pass without Sphinx.
|
# work or silently pass without Sphinx.
|
||||||
|
|
||||||
|
refcheckdocs:
|
||||||
|
$(Q)cd $(srctree);scripts/documentation-file-ref-check
|
||||||
|
|
||||||
cleandocs:
|
cleandocs:
|
||||||
$(Q)rm -rf $(BUILDDIR)
|
$(Q)rm -rf $(BUILDDIR)
|
||||||
$(Q)$(MAKE) BUILDDIR=$(abspath $(BUILDDIR)) $(build)=Documentation/media clean
|
$(Q)$(MAKE) BUILDDIR=$(abspath $(BUILDDIR)) $(build)=Documentation/media clean
|
||||||
@@ -109,6 +112,7 @@ dochelp:
|
|||||||
@echo ' epubdocs - EPUB'
|
@echo ' epubdocs - EPUB'
|
||||||
@echo ' xmldocs - XML'
|
@echo ' xmldocs - XML'
|
||||||
@echo ' linkcheckdocs - check for broken external links (will connect to external hosts)'
|
@echo ' linkcheckdocs - check for broken external links (will connect to external hosts)'
|
||||||
|
@echo ' refcheckdocs - check for references to non-existing files under Documentation'
|
||||||
@echo ' cleandocs - clean all generated files'
|
@echo ' cleandocs - clean all generated files'
|
||||||
@echo
|
@echo
|
||||||
@echo ' make SPHINXDIRS="s1 s2" [target] Generate only docs of folder s1, s2'
|
@echo ' make SPHINXDIRS="s1 s2" [target] Generate only docs of folder s1, s2'
|
||||||
@@ -116,3 +120,5 @@ dochelp:
|
|||||||
@echo
|
@echo
|
||||||
@echo ' make SPHINX_CONF={conf-file} [target] use *additional* sphinx-build'
|
@echo ' make SPHINX_CONF={conf-file} [target] use *additional* sphinx-build'
|
||||||
@echo ' configuration. This is e.g. useful to build with nit-picking config.'
|
@echo ' configuration. This is e.g. useful to build with nit-picking config.'
|
||||||
|
@echo
|
||||||
|
@echo ' Default location for the generated documents is Documentation/output'
|
||||||
|
|||||||
@@ -527,7 +527,7 @@ grace period also drove it to completion.
|
|||||||
This straightforward approach had the disadvantage of needing to
|
This straightforward approach had the disadvantage of needing to
|
||||||
account for POSIX signals sent to user tasks,
|
account for POSIX signals sent to user tasks,
|
||||||
so more recent implemementations use the Linux kernel's
|
so more recent implemementations use the Linux kernel's
|
||||||
<a href="https://www.kernel.org/doc/Documentation/workqueue.txt">workqueues</a>.
|
<a href="https://www.kernel.org/doc/Documentation/core-api/workqueue.rst">workqueues</a>.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The requesting task still does counter snapshotting and funnel-lock
|
The requesting task still does counter snapshotting and funnel-lock
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/html4/loose.dtd">
|
||||||
|
<html>
|
||||||
|
<head><title>A Diagram of TREE_RCU's Grace-Period Memory Ordering</title>
|
||||||
|
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||||
|
|
||||||
|
<p><img src="TreeRCU-gp.svg" alt="TreeRCU-gp.svg">
|
||||||
|
|
||||||
|
</body></html>
|
||||||
@@ -0,0 +1,707 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/html4/loose.dtd">
|
||||||
|
<html>
|
||||||
|
<head><title>A Tour Through TREE_RCU's Grace-Period Memory Ordering</title>
|
||||||
|
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||||
|
|
||||||
|
<p>August 8, 2017</p>
|
||||||
|
<p>This article was contributed by Paul E. McKenney</p>
|
||||||
|
|
||||||
|
<h3>Introduction</h3>
|
||||||
|
|
||||||
|
<p>This document gives a rough visual overview of how Tree RCU's
|
||||||
|
grace-period memory ordering guarantee is provided.
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> <a href="#What Is Tree RCU's Grace Period Memory Ordering Guarantee?">
|
||||||
|
What Is Tree RCU's Grace Period Memory Ordering Guarantee?</a>
|
||||||
|
<li> <a href="#Tree RCU Grace Period Memory Ordering Building Blocks">
|
||||||
|
Tree RCU Grace Period Memory Ordering Building Blocks</a>
|
||||||
|
<li> <a href="#Tree RCU Grace Period Memory Ordering Components">
|
||||||
|
Tree RCU Grace Period Memory Ordering Components</a>
|
||||||
|
<li> <a href="#Putting It All Together">Putting It All Together</a>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h3><a name="What Is Tree RCU's Grace Period Memory Ordering Guarantee?">
|
||||||
|
What Is Tree RCU's Grace Period Memory Ordering Guarantee?</a></h3>
|
||||||
|
|
||||||
|
<p>RCU grace periods provide extremely strong memory-ordering guarantees
|
||||||
|
for non-idle non-offline code.
|
||||||
|
Any code that happens after the end of a given RCU grace period is guaranteed
|
||||||
|
to see the effects of all accesses prior to the beginning of that grace
|
||||||
|
period that are within RCU read-side critical sections.
|
||||||
|
Similarly, any code that happens before the beginning of a given RCU grace
|
||||||
|
period is guaranteed to see the effects of all accesses following the end
|
||||||
|
of that grace period that are within RCU read-side critical sections.
|
||||||
|
|
||||||
|
<p>This guarantee is particularly pervasive for <tt>synchronize_sched()</tt>,
|
||||||
|
for which RCU-sched read-side critical sections include any region
|
||||||
|
of code for which preemption is disabled.
|
||||||
|
Given that each individual machine instruction can be thought of as
|
||||||
|
an extremely small region of preemption-disabled code, one can think of
|
||||||
|
<tt>synchronize_sched()</tt> as <tt>smp_mb()</tt> on steroids.
|
||||||
|
|
||||||
|
<p>RCU updaters use this guarantee by splitting their updates into
|
||||||
|
two phases, one of which is executed before the grace period and
|
||||||
|
the other of which is executed after the grace period.
|
||||||
|
In the most common use case, phase one removes an element from
|
||||||
|
a linked RCU-protected data structure, and phase two frees that element.
|
||||||
|
For this to work, any readers that have witnessed state prior to the
|
||||||
|
phase-one update (in the common case, removal) must not witness state
|
||||||
|
following the phase-two update (in the common case, freeing).
|
||||||
|
|
||||||
|
<p>The RCU implementation provides this guarantee using a network
|
||||||
|
of lock-based critical sections, memory barriers, and per-CPU
|
||||||
|
processing, as is described in the following sections.
|
||||||
|
|
||||||
|
<h3><a name="Tree RCU Grace Period Memory Ordering Building Blocks">
|
||||||
|
Tree RCU Grace Period Memory Ordering Building Blocks</a></h3>
|
||||||
|
|
||||||
|
<p>The workhorse for RCU's grace-period memory ordering is the
|
||||||
|
critical section for the <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->lock</tt>.
|
||||||
|
These critical sections use helper functions for lock acquisition, including
|
||||||
|
<tt>raw_spin_lock_rcu_node()</tt>,
|
||||||
|
<tt>raw_spin_lock_irq_rcu_node()</tt>, and
|
||||||
|
<tt>raw_spin_lock_irqsave_rcu_node()</tt>.
|
||||||
|
Their lock-release counterparts are
|
||||||
|
<tt>raw_spin_unlock_rcu_node()</tt>,
|
||||||
|
<tt>raw_spin_unlock_irq_rcu_node()</tt>, and
|
||||||
|
<tt>raw_spin_unlock_irqrestore_rcu_node()</tt>,
|
||||||
|
respectively.
|
||||||
|
For completeness, a
|
||||||
|
<tt>raw_spin_trylock_rcu_node()</tt>
|
||||||
|
is also provided.
|
||||||
|
The key point is that the lock-acquisition functions, including
|
||||||
|
<tt>raw_spin_trylock_rcu_node()</tt>, all invoke
|
||||||
|
<tt>smp_mb__after_unlock_lock()</tt> immediately after successful
|
||||||
|
acquisition of the lock.
|
||||||
|
|
||||||
|
<p>Therefore, for any given <tt>rcu_node</tt> struction, any access
|
||||||
|
happening before one of the above lock-release functions will be seen
|
||||||
|
by all CPUs as happening before any access happening after a later
|
||||||
|
one of the above lock-acquisition functions.
|
||||||
|
Furthermore, any access happening before one of the
|
||||||
|
above lock-release function on any given CPU will be seen by all
|
||||||
|
CPUs as happening before any access happening after a later one
|
||||||
|
of the above lock-acquisition functions executing on that same CPU,
|
||||||
|
even if the lock-release and lock-acquisition functions are operating
|
||||||
|
on different <tt>rcu_node</tt> structures.
|
||||||
|
Tree RCU uses these two ordering guarantees to form an ordering
|
||||||
|
network among all CPUs that were in any way involved in the grace
|
||||||
|
period, including any CPUs that came online or went offline during
|
||||||
|
the grace period in question.
|
||||||
|
|
||||||
|
<p>The following litmus test exhibits the ordering effects of these
|
||||||
|
lock-acquisition and lock-release functions:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
1 int x, y, z;
|
||||||
|
2
|
||||||
|
3 void task0(void)
|
||||||
|
4 {
|
||||||
|
5 raw_spin_lock_rcu_node(rnp);
|
||||||
|
6 WRITE_ONCE(x, 1);
|
||||||
|
7 r1 = READ_ONCE(y);
|
||||||
|
8 raw_spin_unlock_rcu_node(rnp);
|
||||||
|
9 }
|
||||||
|
10
|
||||||
|
11 void task1(void)
|
||||||
|
12 {
|
||||||
|
13 raw_spin_lock_rcu_node(rnp);
|
||||||
|
14 WRITE_ONCE(y, 1);
|
||||||
|
15 r2 = READ_ONCE(z);
|
||||||
|
16 raw_spin_unlock_rcu_node(rnp);
|
||||||
|
17 }
|
||||||
|
18
|
||||||
|
19 void task2(void)
|
||||||
|
20 {
|
||||||
|
21 WRITE_ONCE(z, 1);
|
||||||
|
22 smp_mb();
|
||||||
|
23 r3 = READ_ONCE(x);
|
||||||
|
24 }
|
||||||
|
25
|
||||||
|
26 WARN_ON(r1 == 0 && r2 == 0 && r3 == 0);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>The <tt>WARN_ON()</tt> is evaluated at “the end of time”,
|
||||||
|
after all changes have propagated throughout the system.
|
||||||
|
Without the <tt>smp_mb__after_unlock_lock()</tt> provided by the
|
||||||
|
acquisition functions, this <tt>WARN_ON()</tt> could trigger, for example
|
||||||
|
on PowerPC.
|
||||||
|
The <tt>smp_mb__after_unlock_lock()</tt> invocations prevent this
|
||||||
|
<tt>WARN_ON()</tt> from triggering.
|
||||||
|
|
||||||
|
<p>This approach must be extended to include idle CPUs, which need
|
||||||
|
RCU's grace-period memory ordering guarantee to extend to any
|
||||||
|
RCU read-side critical sections preceding and following the current
|
||||||
|
idle sojourn.
|
||||||
|
This case is handled by calls to the strongly ordered
|
||||||
|
<tt>atomic_add_return()</tt> read-modify-write atomic operation that
|
||||||
|
is invoked within <tt>rcu_dynticks_eqs_enter()</tt> at idle-entry
|
||||||
|
time and within <tt>rcu_dynticks_eqs_exit()</tt> at idle-exit time.
|
||||||
|
The grace-period kthread invokes <tt>rcu_dynticks_snap()</tt> and
|
||||||
|
<tt>rcu_dynticks_in_eqs_since()</tt> (both of which invoke
|
||||||
|
an <tt>atomic_add_return()</tt> of zero) to detect idle CPUs.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
But what about CPUs that remain offline for the entire
|
||||||
|
grace period?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
Such CPUs will be offline at the beginning of the grace period,
|
||||||
|
so the grace period won't expect quiescent states from them.
|
||||||
|
Races between grace-period start and CPU-hotplug operations
|
||||||
|
are mediated by the CPU's leaf <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->lock</tt> as described above.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p>The approach must be extended to handle one final case, that
|
||||||
|
of waking a task blocked in <tt>synchronize_rcu()</tt>.
|
||||||
|
This task might be affinitied to a CPU that is not yet aware that
|
||||||
|
the grace period has ended, and thus might not yet be subject to
|
||||||
|
the grace period's memory ordering.
|
||||||
|
Therefore, there is an <tt>smp_mb()</tt> after the return from
|
||||||
|
<tt>wait_for_completion()</tt> in the <tt>synchronize_rcu()</tt>
|
||||||
|
code path.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
What? Where???
|
||||||
|
I don't see any <tt>smp_mb()</tt> after the return from
|
||||||
|
<tt>wait_for_completion()</tt>!!!
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
That would be because I spotted the need for that
|
||||||
|
<tt>smp_mb()</tt> during the creation of this documentation,
|
||||||
|
and it is therefore unlikely to hit mainline before v4.14.
|
||||||
|
Kudos to Lance Roy, Will Deacon, Peter Zijlstra, and
|
||||||
|
Jonathan Cameron for asking questions that sensitized me
|
||||||
|
to the rather elaborate sequence of events that demonstrate
|
||||||
|
the need for this memory barrier.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p>Tree RCU's grace--period memory-ordering guarantees rely most
|
||||||
|
heavily on the <tt>rcu_node</tt> structure's <tt>->lock</tt>
|
||||||
|
field, so much so that it is necessary to abbreviate this pattern
|
||||||
|
in the diagrams in the next section.
|
||||||
|
For example, consider the <tt>rcu_prepare_for_idle()</tt> function
|
||||||
|
shown below, which is one of several functions that enforce ordering
|
||||||
|
of newly arrived RCU callbacks against future grace periods:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
1 static void rcu_prepare_for_idle(void)
|
||||||
|
2 {
|
||||||
|
3 bool needwake;
|
||||||
|
4 struct rcu_data *rdp;
|
||||||
|
5 struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
|
||||||
|
6 struct rcu_node *rnp;
|
||||||
|
7 struct rcu_state *rsp;
|
||||||
|
8 int tne;
|
||||||
|
9
|
||||||
|
10 if (IS_ENABLED(CONFIG_RCU_NOCB_CPU_ALL) ||
|
||||||
|
11 rcu_is_nocb_cpu(smp_processor_id()))
|
||||||
|
12 return;
|
||||||
|
13 tne = READ_ONCE(tick_nohz_active);
|
||||||
|
14 if (tne != rdtp->tick_nohz_enabled_snap) {
|
||||||
|
15 if (rcu_cpu_has_callbacks(NULL))
|
||||||
|
16 invoke_rcu_core();
|
||||||
|
17 rdtp->tick_nohz_enabled_snap = tne;
|
||||||
|
18 return;
|
||||||
|
19 }
|
||||||
|
20 if (!tne)
|
||||||
|
21 return;
|
||||||
|
22 if (rdtp->all_lazy &&
|
||||||
|
23 rdtp->nonlazy_posted != rdtp->nonlazy_posted_snap) {
|
||||||
|
24 rdtp->all_lazy = false;
|
||||||
|
25 rdtp->nonlazy_posted_snap = rdtp->nonlazy_posted;
|
||||||
|
26 invoke_rcu_core();
|
||||||
|
27 return;
|
||||||
|
28 }
|
||||||
|
29 if (rdtp->last_accelerate == jiffies)
|
||||||
|
30 return;
|
||||||
|
31 rdtp->last_accelerate = jiffies;
|
||||||
|
32 for_each_rcu_flavor(rsp) {
|
||||||
|
33 rdp = this_cpu_ptr(rsp->rda);
|
||||||
|
34 if (rcu_segcblist_pend_cbs(&rdp->cblist))
|
||||||
|
35 continue;
|
||||||
|
36 rnp = rdp->mynode;
|
||||||
|
37 raw_spin_lock_rcu_node(rnp);
|
||||||
|
38 needwake = rcu_accelerate_cbs(rsp, rnp, rdp);
|
||||||
|
39 raw_spin_unlock_rcu_node(rnp);
|
||||||
|
40 if (needwake)
|
||||||
|
41 rcu_gp_kthread_wake(rsp);
|
||||||
|
42 }
|
||||||
|
43 }
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>But the only part of <tt>rcu_prepare_for_idle()</tt> that really
|
||||||
|
matters for this discussion are lines 37–39.
|
||||||
|
We will therefore abbreviate this function as follows:
|
||||||
|
|
||||||
|
</p><p><img src="rcu_node-lock.svg" alt="rcu_node-lock.svg">
|
||||||
|
|
||||||
|
<p>The box represents the <tt>rcu_node</tt> structure's <tt>->lock</tt>
|
||||||
|
critical section, with the double line on top representing the additional
|
||||||
|
<tt>smp_mb__after_unlock_lock()</tt>.
|
||||||
|
|
||||||
|
<h3><a name="Tree RCU Grace Period Memory Ordering Components">
|
||||||
|
Tree RCU Grace Period Memory Ordering Components</a></h3>
|
||||||
|
|
||||||
|
<p>Tree RCU's grace-period memory-ordering guarantee is provided by
|
||||||
|
a number of RCU components:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> <a href="#Callback Registry">Callback Registry</a>
|
||||||
|
<li> <a href="#Grace-Period Initialization">Grace-Period Initialization</a>
|
||||||
|
<li> <a href="#Self-Reported Quiescent States">
|
||||||
|
Self-Reported Quiescent States</a>
|
||||||
|
<li> <a href="#Dynamic Tick Interface">Dynamic Tick Interface</a>
|
||||||
|
<li> <a href="#CPU-Hotplug Interface">CPU-Hotplug Interface</a>
|
||||||
|
<li> <a href="Forcing Quiescent States">Forcing Quiescent States</a>
|
||||||
|
<li> <a href="Grace-Period Cleanup">Grace-Period Cleanup</a>
|
||||||
|
<li> <a href="Callback Invocation">Callback Invocation</a>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>Each of the following section looks at the corresponding component
|
||||||
|
in detail.
|
||||||
|
|
||||||
|
<h4><a name="Callback Registry">Callback Registry</a></h4>
|
||||||
|
|
||||||
|
<p>If RCU's grace-period guarantee is to mean anything at all, any
|
||||||
|
access that happens before a given invocation of <tt>call_rcu()</tt>
|
||||||
|
must also happen before the corresponding grace period.
|
||||||
|
The implementation of this portion of RCU's grace period guarantee
|
||||||
|
is shown in the following figure:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-callback-registry.svg" alt="TreeRCU-callback-registry.svg">
|
||||||
|
|
||||||
|
<p>Because <tt>call_rcu()</tt> normally acts only on CPU-local state,
|
||||||
|
it provides no ordering guarantees, either for itself or for
|
||||||
|
phase one of the update (which again will usually be removal of
|
||||||
|
an element from an RCU-protected data structure).
|
||||||
|
It simply enqueues the <tt>rcu_head</tt> structure on a per-CPU list,
|
||||||
|
which cannot become associated with a grace period until a later
|
||||||
|
call to <tt>rcu_accelerate_cbs()</tt>, as shown in the diagram above.
|
||||||
|
|
||||||
|
<p>One set of code paths shown on the left invokes
|
||||||
|
<tt>rcu_accelerate_cbs()</tt> via
|
||||||
|
<tt>note_gp_changes()</tt>, either directly from <tt>call_rcu()</tt> (if
|
||||||
|
the current CPU is inundated with queued <tt>rcu_head</tt> structures)
|
||||||
|
or more likely from an <tt>RCU_SOFTIRQ</tt> handler.
|
||||||
|
Another code path in the middle is taken only in kernels built with
|
||||||
|
<tt>CONFIG_RCU_FAST_NO_HZ=y</tt>, which invokes
|
||||||
|
<tt>rcu_accelerate_cbs()</tt> via <tt>rcu_prepare_for_idle()</tt>.
|
||||||
|
The final code path on the right is taken only in kernels built with
|
||||||
|
<tt>CONFIG_HOTPLUG_CPU=y</tt>, which invokes
|
||||||
|
<tt>rcu_accelerate_cbs()</tt> via
|
||||||
|
<tt>rcu_advance_cbs()</tt>, <tt>rcu_migrate_callbacks</tt>,
|
||||||
|
<tt>rcutree_migrate_callbacks()</tt>, and <tt>takedown_cpu()</tt>,
|
||||||
|
which in turn is invoked on a surviving CPU after the outgoing
|
||||||
|
CPU has been completely offlined.
|
||||||
|
|
||||||
|
<p>There are a few other code paths within grace-period processing
|
||||||
|
that opportunistically invoke <tt>rcu_accelerate_cbs()</tt>.
|
||||||
|
However, either way, all of the CPU's recently queued <tt>rcu_head</tt>
|
||||||
|
structures are associated with a future grace-period number under
|
||||||
|
the protection of the CPU's lead <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->lock</tt>.
|
||||||
|
In all cases, there is full ordering against any prior critical section
|
||||||
|
for that same <tt>rcu_node</tt> structure's <tt>->lock</tt>, and
|
||||||
|
also full ordering against any of the current task's or CPU's prior critical
|
||||||
|
sections for any <tt>rcu_node</tt> structure's <tt>->lock</tt>.
|
||||||
|
|
||||||
|
<p>The next section will show how this ordering ensures that any
|
||||||
|
accesses prior to the <tt>call_rcu()</tt> (particularly including phase
|
||||||
|
one of the update)
|
||||||
|
happen before the start of the corresponding grace period.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
But what about <tt>synchronize_rcu()</tt>?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
The <tt>synchronize_rcu()</tt> passes <tt>call_rcu()</tt>
|
||||||
|
to <tt>wait_rcu_gp()</tt>, which invokes it.
|
||||||
|
So either way, it eventually comes down to <tt>call_rcu()</tt>.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="Grace-Period Initialization">Grace-Period Initialization</a></h4>
|
||||||
|
|
||||||
|
<p>Grace-period initialization is carried out by
|
||||||
|
the grace-period kernel thread, which makes several passes over the
|
||||||
|
<tt>rcu_node</tt> tree within the <tt>rcu_gp_init()</tt> function.
|
||||||
|
This means that showing the full flow of ordering through the
|
||||||
|
grace-period computation will require duplicating this tree.
|
||||||
|
If you find this confusing, please note that the state of the
|
||||||
|
<tt>rcu_node</tt> changes over time, just like Heraclitus's river.
|
||||||
|
However, to keep the <tt>rcu_node</tt> river tractable, the
|
||||||
|
grace-period kernel thread's traversals are presented in multiple
|
||||||
|
parts, starting in this section with the various phases of
|
||||||
|
grace-period initialization.
|
||||||
|
|
||||||
|
<p>The first ordering-related grace-period initialization action is to
|
||||||
|
increment the <tt>rcu_state</tt> structure's <tt>->gpnum</tt>
|
||||||
|
grace-period-number counter, as shown below:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-gp-init-1.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
|
||||||
|
|
||||||
|
<p>The actual increment is carried out using <tt>smp_store_release()</tt>,
|
||||||
|
which helps reject false-positive RCU CPU stall detection.
|
||||||
|
Note that only the root <tt>rcu_node</tt> structure is touched.
|
||||||
|
|
||||||
|
<p>The first pass through the <tt>rcu_node</tt> tree updates bitmasks
|
||||||
|
based on CPUs having come online or gone offline since the start of
|
||||||
|
the previous grace period.
|
||||||
|
In the common case where the number of online CPUs for this <tt>rcu_node</tt>
|
||||||
|
structure has not transitioned to or from zero,
|
||||||
|
this pass will scan only the leaf <tt>rcu_node</tt> structures.
|
||||||
|
However, if the number of online CPUs for a given leaf <tt>rcu_node</tt>
|
||||||
|
structure has transitioned from zero,
|
||||||
|
<tt>rcu_init_new_rnp()</tt> will be invoked for the first incoming CPU.
|
||||||
|
Similarly, if the number of online CPUs for a given leaf <tt>rcu_node</tt>
|
||||||
|
structure has transitioned to zero,
|
||||||
|
<tt>rcu_cleanup_dead_rnp()</tt> will be invoked for the last outgoing CPU.
|
||||||
|
The diagram below shows the path of ordering if the leftmost
|
||||||
|
<tt>rcu_node</tt> structure onlines its first CPU and if the next
|
||||||
|
<tt>rcu_node</tt> structure has no online CPUs
|
||||||
|
(or, alternatively if the leftmost <tt>rcu_node</tt> structure offlines
|
||||||
|
its last CPU and if the next <tt>rcu_node</tt> structure has no online CPUs).
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-gp-init-2.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
|
||||||
|
|
||||||
|
<p>The final <tt>rcu_gp_init()</tt> pass through the <tt>rcu_node</tt>
|
||||||
|
tree traverses breadth-first, setting each <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->gpnum</tt> field to the newly incremented value from the
|
||||||
|
<tt>rcu_state</tt> structure, as shown in the following diagram.
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-gp-init-3.svg" alt="TreeRCU-gp-init-1.svg" width="75%">
|
||||||
|
|
||||||
|
<p>This change will also cause each CPU's next call to
|
||||||
|
<tt>__note_gp_changes()</tt>
|
||||||
|
to notice that a new grace period has started, as described in the next
|
||||||
|
section.
|
||||||
|
But because the grace-period kthread started the grace period at the
|
||||||
|
root (with the increment of the <tt>rcu_state</tt> structure's
|
||||||
|
<tt>->gpnum</tt> field) before setting each leaf <tt>rcu_node</tt>
|
||||||
|
structure's <tt>->gpnum</tt> field, each CPU's observation of
|
||||||
|
the start of the grace period will happen after the actual start
|
||||||
|
of the grace period.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
But what about the CPU that started the grace period?
|
||||||
|
Why wouldn't it see the start of the grace period right when
|
||||||
|
it started that grace period?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
In some deep philosophical and overly anthromorphized
|
||||||
|
sense, yes, the CPU starting the grace period is immediately
|
||||||
|
aware of having done so.
|
||||||
|
However, if we instead assume that RCU is not self-aware,
|
||||||
|
then even the CPU starting the grace period does not really
|
||||||
|
become aware of the start of this grace period until its
|
||||||
|
first call to <tt>__note_gp_changes()</tt>.
|
||||||
|
On the other hand, this CPU potentially gets early notification
|
||||||
|
because it invokes <tt>__note_gp_changes()</tt> during its
|
||||||
|
last <tt>rcu_gp_init()</tt> pass through its leaf
|
||||||
|
<tt>rcu_node</tt> structure.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="Self-Reported Quiescent States">
|
||||||
|
Self-Reported Quiescent States</a></h4>
|
||||||
|
|
||||||
|
<p>When all entities that might block the grace period have reported
|
||||||
|
quiescent states (or as described in a later section, had quiescent
|
||||||
|
states reported on their behalf), the grace period can end.
|
||||||
|
Online non-idle CPUs report their own quiescent states, as shown
|
||||||
|
in the following diagram:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-qs.svg" alt="TreeRCU-qs.svg" width="75%">
|
||||||
|
|
||||||
|
<p>This is for the last CPU to report a quiescent state, which signals
|
||||||
|
the end of the grace period.
|
||||||
|
Earlier quiescent states would push up the <tt>rcu_node</tt> tree
|
||||||
|
only until they encountered an <tt>rcu_node</tt> structure that
|
||||||
|
is waiting for additional quiescent states.
|
||||||
|
However, ordering is nevertheless preserved because some later quiescent
|
||||||
|
state will acquire that <tt>rcu_node</tt> structure's <tt>->lock</tt>.
|
||||||
|
|
||||||
|
<p>Any number of events can lead up to a CPU invoking
|
||||||
|
<tt>note_gp_changes</tt> (or alternatively, directly invoking
|
||||||
|
<tt>__note_gp_changes()</tt>), at which point that CPU will notice
|
||||||
|
the start of a new grace period while holding its leaf
|
||||||
|
<tt>rcu_node</tt> lock.
|
||||||
|
Therefore, all execution shown in this diagram happens after the
|
||||||
|
start of the grace period.
|
||||||
|
In addition, this CPU will consider any RCU read-side critical
|
||||||
|
section that started before the invocation of <tt>__note_gp_changes()</tt>
|
||||||
|
to have started before the grace period, and thus a critical
|
||||||
|
section that the grace period must wait on.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
But a RCU read-side critical section might have started
|
||||||
|
after the beginning of the grace period
|
||||||
|
(the <tt>->gpnum++</tt> from earlier), so why should
|
||||||
|
the grace period wait on such a critical section?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
It is indeed not necessary for the grace period to wait on such
|
||||||
|
a critical section.
|
||||||
|
However, it is permissible to wait on it.
|
||||||
|
And it is furthermore important to wait on it, as this
|
||||||
|
lazy approach is far more scalable than a “big bang”
|
||||||
|
all-at-once grace-period start could possibly be.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<p>If the CPU does a context switch, a quiescent state will be
|
||||||
|
noted by <tt>rcu_node_context_switch()</tt> on the left.
|
||||||
|
On the other hand, if the CPU takes a scheduler-clock interrupt
|
||||||
|
while executing in usermode, a quiescent state will be noted by
|
||||||
|
<tt>rcu_check_callbacks()</tt> on the right.
|
||||||
|
Either way, the passage through a quiescent state will be noted
|
||||||
|
in a per-CPU variable.
|
||||||
|
|
||||||
|
<p>The next time an <tt>RCU_SOFTIRQ</tt> handler executes on
|
||||||
|
this CPU (for example, after the next scheduler-clock
|
||||||
|
interrupt), <tt>__rcu_process_callbacks()</tt> will invoke
|
||||||
|
<tt>rcu_check_quiescent_state()</tt>, which will notice the
|
||||||
|
recorded quiescent state, and invoke
|
||||||
|
<tt>rcu_report_qs_rdp()</tt>.
|
||||||
|
If <tt>rcu_report_qs_rdp()</tt> verifies that the quiescent state
|
||||||
|
really does apply to the current grace period, it invokes
|
||||||
|
<tt>rcu_report_rnp()</tt> which traverses up the <tt>rcu_node</tt>
|
||||||
|
tree as shown at the bottom of the diagram, clearing bits from
|
||||||
|
each <tt>rcu_node</tt> structure's <tt>->qsmask</tt> field,
|
||||||
|
and propagating up the tree when the result is zero.
|
||||||
|
|
||||||
|
<p>Note that traversal passes upwards out of a given <tt>rcu_node</tt>
|
||||||
|
structure only if the current CPU is reporting the last quiescent
|
||||||
|
state for the subtree headed by that <tt>rcu_node</tt> structure.
|
||||||
|
A key point is that if a CPU's traversal stops at a given <tt>rcu_node</tt>
|
||||||
|
structure, then there will be a later traversal by another CPU
|
||||||
|
(or perhaps the same one) that proceeds upwards
|
||||||
|
from that point, and the <tt>rcu_node</tt> <tt>->lock</tt>
|
||||||
|
guarantees that the first CPU's quiescent state happens before the
|
||||||
|
remainder of the second CPU's traversal.
|
||||||
|
Applying this line of thought repeatedly shows that all CPUs'
|
||||||
|
quiescent states happen before the last CPU traverses through
|
||||||
|
the root <tt>rcu_node</tt> structure, the “last CPU”
|
||||||
|
being the one that clears the last bit in the root <tt>rcu_node</tt>
|
||||||
|
structure's <tt>->qsmask</tt> field.
|
||||||
|
|
||||||
|
<h4><a name="Dynamic Tick Interface">Dynamic Tick Interface</a></h4>
|
||||||
|
|
||||||
|
<p>Due to energy-efficiency considerations, RCU is forbidden from
|
||||||
|
disturbing idle CPUs.
|
||||||
|
CPUs are therefore required to notify RCU when entering or leaving idle
|
||||||
|
state, which they do via fully ordered value-returning atomic operations
|
||||||
|
on a per-CPU variable.
|
||||||
|
The ordering effects are as shown below:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-dyntick.svg" alt="TreeRCU-dyntick.svg" width="50%">
|
||||||
|
|
||||||
|
<p>The RCU grace-period kernel thread samples the per-CPU idleness
|
||||||
|
variable while holding the corresponding CPU's leaf <tt>rcu_node</tt>
|
||||||
|
structure's <tt>->lock</tt>.
|
||||||
|
This means that any RCU read-side critical sections that precede the
|
||||||
|
idle period (the oval near the top of the diagram above) will happen
|
||||||
|
before the end of the current grace period.
|
||||||
|
Similarly, the beginning of the current grace period will happen before
|
||||||
|
any RCU read-side critical sections that follow the
|
||||||
|
idle period (the oval near the bottom of the diagram above).
|
||||||
|
|
||||||
|
<p>Plumbing this into the full grace-period execution is described
|
||||||
|
<a href="#Forcing Quiescent States">below</a>.
|
||||||
|
|
||||||
|
<h4><a name="CPU-Hotplug Interface">CPU-Hotplug Interface</a></h4>
|
||||||
|
|
||||||
|
<p>RCU is also forbidden from disturbing offline CPUs, which might well
|
||||||
|
be powered off and removed from the system completely.
|
||||||
|
CPUs are therefore required to notify RCU of their comings and goings
|
||||||
|
as part of the corresponding CPU hotplug operations.
|
||||||
|
The ordering effects are shown below:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-hotplug.svg" alt="TreeRCU-hotplug.svg" width="50%">
|
||||||
|
|
||||||
|
<p>Because CPU hotplug operations are much less frequent than idle transitions,
|
||||||
|
they are heavier weight, and thus acquire the CPU's leaf <tt>rcu_node</tt>
|
||||||
|
structure's <tt>->lock</tt> and update this structure's
|
||||||
|
<tt>->qsmaskinitnext</tt>.
|
||||||
|
The RCU grace-period kernel thread samples this mask to detect CPUs
|
||||||
|
having gone offline since the beginning of this grace period.
|
||||||
|
|
||||||
|
<p>Plumbing this into the full grace-period execution is described
|
||||||
|
<a href="#Forcing Quiescent States">below</a>.
|
||||||
|
|
||||||
|
<h4><a name="Forcing Quiescent States">Forcing Quiescent States</a></h4>
|
||||||
|
|
||||||
|
<p>As noted above, idle and offline CPUs cannot report their own
|
||||||
|
quiescent states, and therefore the grace-period kernel thread
|
||||||
|
must do the reporting on their behalf.
|
||||||
|
This process is called “forcing quiescent states”, it is
|
||||||
|
repeated every few jiffies, and its ordering effects are shown below:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-gp-fqs.svg" alt="TreeRCU-gp-fqs.svg" width="100%">
|
||||||
|
|
||||||
|
<p>Each pass of quiescent state forcing is guaranteed to traverse the
|
||||||
|
leaf <tt>rcu_node</tt> structures, and if there are no new quiescent
|
||||||
|
states due to recently idled and/or offlined CPUs, then only the
|
||||||
|
leaves are traversed.
|
||||||
|
However, if there is a newly offlined CPU as illustrated on the left
|
||||||
|
or a newly idled CPU as illustrated on the right, the corresponding
|
||||||
|
quiescent state will be driven up towards the root.
|
||||||
|
As with self-reported quiescent states, the upwards driving stops
|
||||||
|
once it reaches an <tt>rcu_node</tt> structure that has quiescent
|
||||||
|
states outstanding from other CPUs.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
The leftmost drive to root stopped before it reached
|
||||||
|
the root <tt>rcu_node</tt> structure, which means that
|
||||||
|
there are still CPUs subordinate to that structure on
|
||||||
|
which the current grace period is waiting.
|
||||||
|
Given that, how is it possible that the rightmost drive
|
||||||
|
to root ended the grace period?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
Good analysis!
|
||||||
|
It is in fact impossible in the absence of bugs in RCU.
|
||||||
|
But this diagram is complex enough as it is, so simplicity
|
||||||
|
overrode accuracy.
|
||||||
|
You can think of it as poetic license, or you can think of
|
||||||
|
it as misdirection that is resolved in the
|
||||||
|
<a href="#Putting It All Together">stitched-together diagram</a>.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="Grace-Period Cleanup">Grace-Period Cleanup</a></h4>
|
||||||
|
|
||||||
|
<p>Grace-period cleanup first scans the <tt>rcu_node</tt> tree
|
||||||
|
breadth-first setting all the <tt>->completed</tt> fields equal
|
||||||
|
to the number of the newly completed grace period, then it sets
|
||||||
|
the <tt>rcu_state</tt> structure's <tt>->completed</tt> field,
|
||||||
|
again to the number of the newly completed grace period.
|
||||||
|
The ordering effects are shown below:
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-gp-cleanup.svg" alt="TreeRCU-gp-cleanup.svg" width="75%">
|
||||||
|
|
||||||
|
<p>As indicated by the oval at the bottom of the diagram, once
|
||||||
|
grace-period cleanup is complete, the next grace period can begin.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th> </th></tr>
|
||||||
|
<tr><th align="left">Quick Quiz:</th></tr>
|
||||||
|
<tr><td>
|
||||||
|
But when precisely does the grace period end?
|
||||||
|
</td></tr>
|
||||||
|
<tr><th align="left">Answer:</th></tr>
|
||||||
|
<tr><td bgcolor="#ffffff"><font color="ffffff">
|
||||||
|
There is no useful single point at which the grace period
|
||||||
|
can be said to end.
|
||||||
|
The earliest reasonable candidate is as soon as the last
|
||||||
|
CPU has reported its quiescent state, but it may be some
|
||||||
|
milliseconds before RCU becomes aware of this.
|
||||||
|
The latest reasonable candidate is once the <tt>rcu_state</tt>
|
||||||
|
structure's <tt>->completed</tt> field has been updated,
|
||||||
|
but it is quite possible that some CPUs have already completed
|
||||||
|
phase two of their updates by that time.
|
||||||
|
In short, if you are going to work with RCU, you need to
|
||||||
|
learn to embrace uncertainty.
|
||||||
|
</font></td></tr>
|
||||||
|
<tr><td> </td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="Callback Invocation">Callback Invocation</a></h4>
|
||||||
|
|
||||||
|
<p>Once a given CPU's leaf <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->completed</tt> field has been updated, that CPU can begin
|
||||||
|
invoking its RCU callbacks that were waiting for this grace period
|
||||||
|
to end.
|
||||||
|
These callbacks are identified by <tt>rcu_advance_cbs()</tt>,
|
||||||
|
which is usually invoked by <tt>__note_gp_changes()</tt>.
|
||||||
|
As shown in the diagram below, this invocation can be triggered by
|
||||||
|
the scheduling-clock interrupt (<tt>rcu_check_callbacks()</tt> on
|
||||||
|
the left) or by idle entry (<tt>rcu_cleanup_after_idle()</tt> on
|
||||||
|
the right, but only for kernels build with
|
||||||
|
<tt>CONFIG_RCU_FAST_NO_HZ=y</tt>).
|
||||||
|
Either way, <tt>RCU_SOFTIRQ</tt> is raised, which results in
|
||||||
|
<tt>rcu_do_batch()</tt> invoking the callbacks, which in turn
|
||||||
|
allows those callbacks to carry out (either directly or indirectly
|
||||||
|
via wakeup) the needed phase-two processing for each update.
|
||||||
|
|
||||||
|
</p><p><img src="TreeRCU-callback-invocation.svg" alt="TreeRCU-callback-invocation.svg" width="60%">
|
||||||
|
|
||||||
|
<p>Please note that callback invocation can also be prompted by any
|
||||||
|
number of corner-case code paths, for example, when a CPU notes that
|
||||||
|
it has excessive numbers of callbacks queued.
|
||||||
|
In all cases, the CPU acquires its leaf <tt>rcu_node</tt> structure's
|
||||||
|
<tt>->lock</tt> before invoking callbacks, which preserves the
|
||||||
|
required ordering against the newly completed grace period.
|
||||||
|
|
||||||
|
<p>However, if the callback function communicates to other CPUs,
|
||||||
|
for example, doing a wakeup, then it is that function's responsibility
|
||||||
|
to maintain ordering.
|
||||||
|
For example, if the callback function wakes up a task that runs on
|
||||||
|
some other CPU, proper ordering must in place in both the callback
|
||||||
|
function and the task being awakened.
|
||||||
|
To see why this is important, consider the top half of the
|
||||||
|
<a href="#Grace-Period Cleanup">grace-period cleanup</a> diagram.
|
||||||
|
The callback might be running on a CPU corresponding to the leftmost
|
||||||
|
leaf <tt>rcu_node</tt> structure, and awaken a task that is to run on
|
||||||
|
a CPU corresponding to the rightmost leaf <tt>rcu_node</tt> structure,
|
||||||
|
and the grace-period kernel thread might not yet have reached the
|
||||||
|
rightmost leaf.
|
||||||
|
In this case, the grace period's memory ordering might not yet have
|
||||||
|
reached that CPU, so again the callback function and the awakened
|
||||||
|
task must supply proper ordering.
|
||||||
|
|
||||||
|
<h3><a name="Putting It All Together">Putting It All Together</a></h3>
|
||||||
|
|
||||||
|
<p>A stitched-together diagram is
|
||||||
|
<a href="Tree-RCU-Diagram.html">here</a>.
|
||||||
|
|
||||||
|
<h3><a name="Legal Statement">
|
||||||
|
Legal Statement</a></h3>
|
||||||
|
|
||||||
|
<p>This work represents the view of the author and does not necessarily
|
||||||
|
represent the view of IBM.
|
||||||
|
|
||||||
|
</p><p>Linux is a registered trademark of Linus Torvalds.
|
||||||
|
|
||||||
|
</p><p>Other company, product, and service names may be trademarks or
|
||||||
|
service marks of others.
|
||||||
|
|
||||||
|
</body></html>
|
||||||
@@ -0,0 +1,486 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="592.12805"
|
||||||
|
height="469.83038"
|
||||||
|
viewBox="-44 -44 7874.1949 6244.9802"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-callback-invocation.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.2009216"
|
||||||
|
inkscape:cx="289.88715"
|
||||||
|
inkscape:cy="219.06265"
|
||||||
|
inkscape:window-x="713"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="g3058"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3079"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="-116.00011px"
|
||||||
|
originy="-87.2081px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g4"
|
||||||
|
transform="translate(-2296.0293,-2364.1166)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,2411.7612 0,4920.3076"
|
||||||
|
id="path3134-9-0-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,4672.443 -2393.6631,0.5116 0,1196.8316 2393.6631,-0.5116"
|
||||||
|
id="path3134-9-0"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,4672.443 2393.6631,0.5116 0,1196.8316 -2393.6631,-0.5116"
|
||||||
|
id="path3134-9-0-7"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5710 5790-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4512 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1040 9300 - 1502 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2240 8100 - 2702 5940-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1350 3450 - 2444 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4950 3450 - 3854 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 6600 - 4050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 6600 - 1050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 5400 - 2250 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 8100 - 2250 6240-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 9300 - 1050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5250 6240-->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9300 3150 - 10860 3150-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 3600 - 11400 4410-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 5100 - 11400 5910-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9900 4650 - 10860 4650-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9600 6150 - 10860 6150-->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 5400 - 5250 4290-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<rect
|
||||||
|
x="2333.5203"
|
||||||
|
y="5109.5566"
|
||||||
|
width="2844.0974"
|
||||||
|
height="360.77411"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.0005789, 60.00115781;stroke-dashoffset:0"
|
||||||
|
id="rect118-3"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="2562.135"
|
||||||
|
y="5357.9937"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_check_callbacks()</text>
|
||||||
|
<rect
|
||||||
|
x="7069.6187"
|
||||||
|
y="5087.4678"
|
||||||
|
width="2975.115"
|
||||||
|
height="382.86298"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057902, 60.00115804;stroke-dashoffset:0"
|
||||||
|
id="rect118-36"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7165.2524"
|
||||||
|
y="5333.4927"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_cleanup_after_idle()</text>
|
||||||
|
<g
|
||||||
|
id="g3058"
|
||||||
|
transform="translate(-53.192514,-2819.2063)">
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier"
|
||||||
|
id="text202"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="6532.0293"
|
||||||
|
x="5073.3374"
|
||||||
|
xml:space="preserve">rcu_advance_cbs()</text>
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="5650.2598"
|
||||||
|
x="4800.2563" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="5726.2852"
|
||||||
|
x="4800.2563" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-3-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="6961.395"
|
||||||
|
x="7220.106"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-6-5"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-3"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="6321.9248"
|
||||||
|
x="5073.3374"
|
||||||
|
xml:space="preserve">__note_gp_changes()</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3049"
|
||||||
|
transform="translate(26.596257,6090.5512)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,1872.6808,-2726.4833)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084-3"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-6"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="1785.2073"
|
||||||
|
x="5717.4517"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-7"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Phase Two</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110-5"
|
||||||
|
y="2005.6624"
|
||||||
|
x="6119.668"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="2005.6624"
|
||||||
|
x="6119.668"
|
||||||
|
id="tspan3112-3"
|
||||||
|
sodipodi:role="line">of Update</tspan></text>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
x="5097.8271"
|
||||||
|
y="6268.2183"
|
||||||
|
width="1994.7195"
|
||||||
|
height="664.90662"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057858, 60.00115716;stroke-dashoffset:0"
|
||||||
|
id="rect118-36-3"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5363.7886"
|
||||||
|
y="6534.1812"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9-6-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">RCU_SOFTIRQ</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5363.7886"
|
||||||
|
y="6800.1436"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9-6-6-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_do_batch()</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,655 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="816.04761"
|
||||||
|
height="636.55627"
|
||||||
|
viewBox="-44 -44 10851.906 8461.0989"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-callback-registry.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.2009216"
|
||||||
|
inkscape:cx="408.02381"
|
||||||
|
inkscape:cy="254.38856"
|
||||||
|
inkscape:window-x="713"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="g4"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3079"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="5.2596966e-08px"
|
||||||
|
originy="-4.5963961e-06px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g4"
|
||||||
|
transform="translate(-753.44492,-1306.6788)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,2411.7612 0,6117.1391"
|
||||||
|
id="path3134-9-0-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,3342.6302 -3856.4573,0 10.6979,5757.1962 2918.1436,-2e-4"
|
||||||
|
id="path3134-9-0"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)"
|
||||||
|
d="m 6161.6776,3342.6302 3856.4574,0 -12.188,5757.1963 -2918.1436,-3e-4"
|
||||||
|
id="path3134-9-0-7"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5710 5790-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4512 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1040 9300 - 1502 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2240 8100 - 2702 5940-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1350 3450 - 2444 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4950 3450 - 3854 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 6600 - 4050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 6600 - 1050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 5400 - 2250 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 8100 - 2250 6240-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 9300 - 1050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5250 6240-->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9300 3150 - 10860 3150-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 3600 - 11400 4410-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 5100 - 11400 5910-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9900 4650 - 10860 4650-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9600 6150 - 10860 6150-->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 5400 - 5250 4290-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<rect
|
||||||
|
x="4544.7305"
|
||||||
|
y="4603.417"
|
||||||
|
width="3240.0088"
|
||||||
|
height="2650.6289"
|
||||||
|
rx="0"
|
||||||
|
style="stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057884, 60.00115769;stroke-dashoffset:0"
|
||||||
|
id="rect118"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5073.3374"
|
||||||
|
y="6372.4521"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">rcu_accelerate_cbs()</text>
|
||||||
|
<g
|
||||||
|
id="g3107"
|
||||||
|
transform="translate(2715.7065,4700.8888)">
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="4773.3452"
|
||||||
|
y="4825.2578"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_prepare_for_idle()</text>
|
||||||
|
<rect
|
||||||
|
x="790.93585"
|
||||||
|
y="4630.8252"
|
||||||
|
width="3240.0088"
|
||||||
|
height="2650.6289"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.0005789, 60.00115781;stroke-dashoffset:0"
|
||||||
|
id="rect118-3"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="1319.5447"
|
||||||
|
y="6639.2261"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_accelerate_cbs()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-7"
|
||||||
|
transform="translate(-1038.0776,4728.2971)">
|
||||||
|
<rect
|
||||||
|
id="rect112-5"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="1019.5512"
|
||||||
|
y="4852.666"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">note_gp_changes()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="1319.5447"
|
||||||
|
y="6376.6328"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_advance_cbs()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="1340.6649"
|
||||||
|
y="6111.4473"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6-6-2"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">__note_gp_changes()</text>
|
||||||
|
<rect
|
||||||
|
x="5422.6279"
|
||||||
|
y="3041.8311"
|
||||||
|
width="1480.4871"
|
||||||
|
height="379.24637"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.0005789, 60.00115794;stroke-dashoffset:0"
|
||||||
|
id="rect118-3-9"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5607.2734"
|
||||||
|
y="3283.3892"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">call_rcu()</text>
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
id="path3084"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,1915.7286,4523.6528)" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5853.9238"
|
||||||
|
y="8902.3623"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104">Wake up</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
x="6165.7158"
|
||||||
|
y="9122.8174"
|
||||||
|
id="text3110"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3112"
|
||||||
|
x="6165.7158"
|
||||||
|
y="9122.8174">grace-period</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
x="6162.8716"
|
||||||
|
y="9364.3564"
|
||||||
|
id="text3114"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3116"
|
||||||
|
x="6162.8716"
|
||||||
|
y="9364.3564">kernel thread</tspan></text>
|
||||||
|
<rect
|
||||||
|
x="8239.8516"
|
||||||
|
y="4608.7363"
|
||||||
|
width="3240.0088"
|
||||||
|
height="2650.6289"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057902, 60.00115804;stroke-dashoffset:0"
|
||||||
|
id="rect118-36"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="8768.4678"
|
||||||
|
y="6484.1562"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-75"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_accelerate_cbs()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-3"
|
||||||
|
transform="translate(6410.833,4706.2127)">
|
||||||
|
<rect
|
||||||
|
id="rect112-56"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-2"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="8329.5352"
|
||||||
|
y="4830.5771"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">takedown_cpu()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="8335.4873"
|
||||||
|
y="5094.127"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcutree_migrate_callbacks()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="8335.4873"
|
||||||
|
y="5357.1006"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-9-6-0"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_migrate_callbacks()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="8768.4678"
|
||||||
|
y="6224.9038"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6-6-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_advance_cbs()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3467.9963"
|
||||||
|
y="6987.9912"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7220.106"
|
||||||
|
y="6961.395"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="10905.331"
|
||||||
|
y="6961.395"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-3"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-5">Leaf</tspan></text>
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
id="path3084-3"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,1872.6808,-2726.4833)" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5717.4517"
|
||||||
|
y="1785.2073"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-7">Phase One</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
x="6119.668"
|
||||||
|
y="2005.6624"
|
||||||
|
id="text3110-5"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3112-3"
|
||||||
|
x="6119.668"
|
||||||
|
y="2005.6624">of Update</tspan></text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 23 KiB |
700
Documentation/RCU/Design/Memory-Ordering/TreeRCU-dyntick.svg
Normal file
@@ -0,0 +1,700 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="670.61804"
|
||||||
|
height="557.16394"
|
||||||
|
viewBox="-44 -44 8917.9652 7405.8166"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-dyntick.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-1"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-4"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-7"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker4880"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4882"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-5"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-10"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-36"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-0"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-26"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-8"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-7"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-367"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-5"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-56"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-2"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3081"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3083"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3085"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3087"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3089"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3091"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3093"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3095"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3097"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3099"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-9"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-1"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3675"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-3"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1148"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.4142136"
|
||||||
|
inkscape:cx="381.32663"
|
||||||
|
inkscape:cy="239.67141"
|
||||||
|
inkscape:window-x="833"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5"
|
||||||
|
inkscape:snap-global="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3154"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="-235.14935px"
|
||||||
|
originy="-709.25071px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1-3-5"
|
||||||
|
d="m 3754.1051,47.378296 -2.828,7173.860804"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1-3"
|
||||||
|
d="m 6681.1176,1435.1734 -2.828,1578.9586 -2861.3912,7.7159"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1"
|
||||||
|
d="m 3748.8929,3772.1176 2904.1747,-0.8434 26.8008,1842.1825"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<g
|
||||||
|
id="g3115"
|
||||||
|
transform="translate(-2341.8794,10827.399)">
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057923, 60.00115859;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="2349.7295"
|
||||||
|
width="5308.7119"
|
||||||
|
y="-8909.5498"
|
||||||
|
x="2379.3704" />
|
||||||
|
<g
|
||||||
|
transform="translate(2576.8841,-9085.2783)"
|
||||||
|
id="g3107-7"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="949.37109"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1370.8721"
|
||||||
|
rx="0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-5" />
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="1025.3964"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1294.8468"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-3-3" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-6-6-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-7356.375"
|
||||||
|
x="4769.4536"
|
||||||
|
xml:space="preserve">->qsmask &= ~->grpmask</text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-3"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-6825.5815"
|
||||||
|
x="7082.9585"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-6"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-8652.5312"
|
||||||
|
x="2466.7822"
|
||||||
|
xml:space="preserve">dyntick_save_progress_counter()</text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7-2-0"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-8368.1475"
|
||||||
|
x="2463.3262"
|
||||||
|
xml:space="preserve">rcu_implicit_dynticks_qs()</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4504"
|
||||||
|
transform="translate(2063.5184,-16111.739)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,335.22989,12456.379)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="16835.086"
|
||||||
|
x="4409.043"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">RCU</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110"
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
id="tspan3112"
|
||||||
|
sodipodi:role="line">read-side</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3114"
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
id="tspan3116"
|
||||||
|
sodipodi:role="line">critical section</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3148-9-9"
|
||||||
|
transform="translate(2035.3087,6370.5796)">
|
||||||
|
<rect
|
||||||
|
x="3592.3828"
|
||||||
|
y="-4715.7246"
|
||||||
|
width="3164.783"
|
||||||
|
height="769.99048"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057963, 60.00115926;stroke-dashoffset:0"
|
||||||
|
id="rect118-3-5-1-3"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4418.6582"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_dynticks_eqs_enter()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4165.7954"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-0-0"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">atomic_add_return()</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3148-9-9-2"
|
||||||
|
transform="translate(2035.3089,9031.6839)">
|
||||||
|
<rect
|
||||||
|
x="3592.3828"
|
||||||
|
y="-4715.7246"
|
||||||
|
width="3164.783"
|
||||||
|
height="769.99048"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057963, 60.00115926;stroke-dashoffset:0"
|
||||||
|
id="rect118-3-5-1-3-6"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4418.6582"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-6-1"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_dynticks_eqs_exit()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4165.7954"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-0-0-8"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">atomic_add_return()</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4504-7"
|
||||||
|
transform="translate(2082.3248,-10883.562)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,335.22989,12456.379)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084-9"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="16835.086"
|
||||||
|
x="4409.043"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-0"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">RCU</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110-2"
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
id="tspan3112-3"
|
||||||
|
sodipodi:role="line">read-side</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3114-7"
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
id="tspan3116-5"
|
||||||
|
sodipodi:role="line">critical section</tspan></text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 25 KiB |
1126
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-cleanup.svg
Normal file
|
After Width: | Height: | Size: 42 KiB |
1309
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-fqs.svg
Normal file
|
After Width: | Height: | Size: 50 KiB |
656
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-1.svg
Normal file
@@ -0,0 +1,656 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="1039.3743"
|
||||||
|
height="677.72852"
|
||||||
|
viewBox="-44 -44 13821.733 9008.3597"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-gp-init-1.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-1"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-4"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-7"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker4880"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4882"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-5"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-10"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-36"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-7"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="0.70710678"
|
||||||
|
inkscape:cx="617.89019"
|
||||||
|
inkscape:cy="636.57143"
|
||||||
|
inkscape:window-x="697"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3059"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="1.6062488e-07px"
|
||||||
|
originy="10.7285px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3"
|
||||||
|
d="m 6871.027,46.883461 0,8777.144039"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2450.4075,-10679.115)"
|
||||||
|
id="g3188">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3305.5364"
|
||||||
|
y="13255.592"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">rsp->gpnum++</text>
|
||||||
|
<g
|
||||||
|
id="g3107"
|
||||||
|
transform="translate(947.90548,11584.029)">
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5452.3052"
|
||||||
|
y="13844.535"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5">Root</tspan></text>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057884, 60.00115769;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="6844.4546"
|
||||||
|
width="13658.751"
|
||||||
|
y="1371.6335"
|
||||||
|
x="37.490932" />
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="1631.0878"
|
||||||
|
x="153.26733"
|
||||||
|
xml:space="preserve">rcu_gp_init()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2329.9439,-10642.748)"
|
||||||
|
id="g3147">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(3181.0246,-10679.115)"
|
||||||
|
id="g3153">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-1642.5375,-10642.748)"
|
||||||
|
id="g3147-3"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-6"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-151.71726,-10679.115)"
|
||||||
|
id="g3153-2"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-6"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-8"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-9">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-3484.4587,-10679.115)"
|
||||||
|
id="g3153-20"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-2"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-3"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-7"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-92">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-6817.1998,-10679.115)"
|
||||||
|
id="g3153-28"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-1">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812908px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 5473.7572,3203.2219 -582.9982,865.094"
|
||||||
|
id="path3414"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8282.5391,3203.4839 582.9982,865.094"
|
||||||
|
id="path3414-9"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 3523.1241,5416.3989 -582.9982,865.094"
|
||||||
|
id="path3414-8"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 10268.171,5416.6609 583,865.094"
|
||||||
|
id="path3414-9-4"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 4939.6205,5416.3989 0,846.288"
|
||||||
|
id="path3414-8-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8816.5958,5442.9949 0,846.288"
|
||||||
|
id="path3414-8-3-6"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<g
|
||||||
|
id="g4504-3-9"
|
||||||
|
transform="translate(4866.0367,-16425.339)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,335.22989,12456.379)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084-6-1"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-7-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="16888.277"
|
||||||
|
x="4344.877"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-5-7"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">End of</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110-3-0"
|
||||||
|
y="17119.1"
|
||||||
|
x="4578.7886"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17119.1"
|
||||||
|
x="4578.7886"
|
||||||
|
id="tspan3112-5-9"
|
||||||
|
sodipodi:role="line">Last Grace</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3114-6-3"
|
||||||
|
y="17350.271"
|
||||||
|
x="4581.7886"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17350.271"
|
||||||
|
x="4581.7886"
|
||||||
|
id="tspan3116-2-6"
|
||||||
|
sodipodi:role="line">Period</tspan></text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-5"
|
||||||
|
d="m 8546.5914,605.78414 -1595.7755,0"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send-36)" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 23 KiB |
656
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-2.svg
Normal file
@@ -0,0 +1,656 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="1037.9602"
|
||||||
|
height="666.38184"
|
||||||
|
viewBox="-44 -44 13802.928 8857.5401"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-gp-init-2.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-1"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-4"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-7"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker4880"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4882"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-5"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-10"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.79710462"
|
||||||
|
inkscape:cx="564.27119"
|
||||||
|
inkscape:cy="397.32188"
|
||||||
|
inkscape:window-x="833"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccccccccccccccccccccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3"
|
||||||
|
d="m 6861.6904,46.438525 -2.8276,1315.668775 -5343.8436,17.1194 -2.8276,6561.7446 2039.0799,17.963 -2.7042,-2144.1399 -491.6705,-0.2109 -2.7042,-1993.6887 1487.7179,-4.7279 -17.8,1812.453 2017.2374,-7.6434 4.9532,-2151.5723 -1405.5264,11.163 -10.919,-1891.1468 1739.2164,-2.7175 -13.2006,4234.2295 -1701.3595,1.3953 -8.7841,2107.7116 1702.6392,-4.8334 33.4144,-1867.7167 1312.2492,12.9229 14.608,1818.3367 2000.0063,20.4217 -12.279,-1841.4113 1304.168,1.6154 -12.279,2032.7059 -4638.6515,1.6154 19.5828,569.0378"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057884, 60.00115769;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="7653.1299"
|
||||||
|
width="13639.945"
|
||||||
|
y="555.69745"
|
||||||
|
x="37.490929" />
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="799.34259"
|
||||||
|
x="134.46091"
|
||||||
|
xml:space="preserve">rcu_gp_init()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2311.1375,-10650.009)"
|
||||||
|
id="g3147">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(3162.2182,-10686.376)"
|
||||||
|
id="g3153">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-1661.3439,-10650.009)"
|
||||||
|
id="g3147-3"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-6"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5398.415"
|
||||||
|
y="15310.093"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-8"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->qsmaskinit</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5398.415"
|
||||||
|
y="15545.01"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-5-8"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->qsmaskinitnext</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-170.52359,-10686.376)"
|
||||||
|
id="g3153-2"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-6"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-8"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-9">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-3503.2651,-10686.376)"
|
||||||
|
id="g3153-20"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-2"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-3"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-7"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-92">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-6836.0062,-10686.376)"
|
||||||
|
id="g3153-28"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-1">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7699.7246"
|
||||||
|
y="17734.791"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-4"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->qsmaskinit</text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812908px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 5454.9508,3195.9607 -582.9982,865.094"
|
||||||
|
id="path3414"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8263.7327,3196.2227 582.9982,865.094"
|
||||||
|
id="path3414-9"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 3504.3177,5409.1377 -582.9982,865.094"
|
||||||
|
id="path3414-8"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 10249.365,5409.3997 583,865.094"
|
||||||
|
id="path3414-9-4"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 4920.8141,5409.1377 0,846.288"
|
||||||
|
id="path3414-8-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8797.7894,5435.7337 0,846.288"
|
||||||
|
id="path3414-8-3-6"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118-1"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057923, 60.00115846;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="4418.4302"
|
||||||
|
width="4932.5845"
|
||||||
|
y="1492.2119"
|
||||||
|
x="2087.8708" />
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="1690.4336"
|
||||||
|
x="2223.3145"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:linespacing="125%">rcu_init_new_rnp()<tspan
|
||||||
|
style="font-size:192px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3307"> or</tspan></text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="1958.5066"
|
||||||
|
x="2223.3145"
|
||||||
|
xml:space="preserve">rcu_cleanup_dead_rnp()</text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7-6"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="2227.4531"
|
||||||
|
x="2226.1592"
|
||||||
|
xml:space="preserve"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:192px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3327">(optional)</tspan></text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2431.6011,-10686.376)"
|
||||||
|
id="g3188">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3305.5364"
|
||||||
|
y="13255.592"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">->qsmaskinit</text>
|
||||||
|
<g
|
||||||
|
id="g3107"
|
||||||
|
transform="translate(947.90548,11584.029)">
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5452.3052"
|
||||||
|
y="13844.535"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5">Root</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3305.5364"
|
||||||
|
y="13490.509"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->qsmaskinitnext</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 24 KiB |
632
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp-init-3.svg
Normal file
@@ -0,0 +1,632 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="1039.3743"
|
||||||
|
height="594.19171"
|
||||||
|
viewBox="-44 -44 13821.733 7897.9895"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-gp-init-2.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-1"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-4"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-7"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker4880"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4882"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-5"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-10"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.70710678"
|
||||||
|
inkscape:cx="617.89019"
|
||||||
|
inkscape:cy="625.84293"
|
||||||
|
inkscape:window-x="697"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccccccccccccccccccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3"
|
||||||
|
d="m 6899.3032,45.520244 -2.8276,2480.757056 -2316.0141,-1.687 -2.8276,2179.8547 2321.1758,-0.8434 -2.7042,-1843.2376 2404.5142,-0.2109 16.1022,1993.2669 -7783.8345,-4.7279 -16.7936,2120.3946 2033.1033,-23.5344 2.0128,-1866.561 2051.9097,14.0785 2.0128,1838.2987 1280.8475,-4.728 14.608,-1830.1039 1312.2492,12.9229 14.608,1818.3367 2000.0059,20.4217 -12.279,-1841.4113 1304.168,1.6154 -12.279,2032.7059 -4638.6511,1.6154 19.5828,569.0378"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2450.4075,-11647.329)"
|
||||||
|
id="g3188">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3305.5364"
|
||||||
|
y="13255.592"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
<g
|
||||||
|
id="g3107"
|
||||||
|
transform="translate(947.90548,11584.029)">
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5452.3052"
|
||||||
|
y="13844.535"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5">Root</tspan></text>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057884, 60.00115769;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="6844.4546"
|
||||||
|
width="13658.751"
|
||||||
|
y="403.41983"
|
||||||
|
x="37.490932" />
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="662.8739"
|
||||||
|
x="153.26733"
|
||||||
|
xml:space="preserve">rcu_gp_init()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(2329.9439,-11610.962)"
|
||||||
|
id="g3147">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5392.3345"
|
||||||
|
y="15407.104"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
transform="translate(3181.0246,-11647.329)"
|
||||||
|
id="g3153">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7536.4883"
|
||||||
|
y="17640.934"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-9"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-1642.5375,-11610.962)"
|
||||||
|
id="g3147-3"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-6"
|
||||||
|
transform="translate(3054.6101,13760.052)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-6"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="5378.4146"
|
||||||
|
y="15436.927"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-3"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-151.71726,-11647.329)"
|
||||||
|
id="g3153-2"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-6"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-1"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-8"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-9">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-3484.4587,-11647.329)"
|
||||||
|
id="g3153-20"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-2"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-3"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-7"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-5"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-92">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7520.1294"
|
||||||
|
y="17673.639"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-35"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(-6817.1998,-11647.329)"
|
||||||
|
id="g3153-28"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-6-9-9"
|
||||||
|
transform="translate(5213.0126,16008.808)">
|
||||||
|
<rect
|
||||||
|
id="rect112-7-1-7"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-5-2-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="9717.4141"
|
||||||
|
y="18269.314"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-7-35-7-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-5-6-0-1">Leaf</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7521.4663"
|
||||||
|
y="17666.062"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-75"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812908px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 5473.7572,2235.0081 -582.9982,865.094"
|
||||||
|
id="path3414"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8282.5391,2235.2701 582.9982,865.094"
|
||||||
|
id="path3414-9"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 3523.1241,4448.1851 -582.9982,865.094"
|
||||||
|
id="path3414-8"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 10268.171,4448.4471 583,865.094"
|
||||||
|
id="path3414-9-4"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 4939.6205,4448.1851 0,846.288"
|
||||||
|
id="path3414-8-3"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:13.29812717px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
|
||||||
|
d="m 8816.5958,4474.7811 0,846.288"
|
||||||
|
id="path3414-8-3-6"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="7370.856"
|
||||||
|
y="5997.5972"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-62"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->gpnum = rsp->gpnum</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 22 KiB |
5135
Documentation/RCU/Design/Memory-Ordering/TreeRCU-gp.svg
Normal file
|
After Width: | Height: | Size: 208 KiB |
775
Documentation/RCU/Design/Memory-Ordering/TreeRCU-hotplug.svg
Normal file
@@ -0,0 +1,775 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="613.22784"
|
||||||
|
height="707.07056"
|
||||||
|
viewBox="-44 -44 8154.7829 9398.3736"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="TreeRCU-hotplug.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutS"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutS"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4073"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.2,0.2)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="TriangleOutM"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="TriangleOutM"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4070"
|
||||||
|
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="scale(0.4,0.4)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3952"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Mend-7"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3952-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="scale(-0.6,-0.6)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-6"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-1"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-2"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-0"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3940-9"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-3"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-1"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-4"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-7"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker4880"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4882"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-5"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-0"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-10"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-36"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-0"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-6"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-26"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-8"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-7"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-367"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-5"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow2Lend-56"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3946-2"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3081"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3083"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3085"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3087"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3089"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3091"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3093"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3095"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="marker3097"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3099"
|
||||||
|
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||||
|
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||||
|
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-9"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-1"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Send-3675"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3940-3"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1148"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.4142136"
|
||||||
|
inkscape:cx="325.41695"
|
||||||
|
inkscape:cy="364.94502"
|
||||||
|
inkscape:window-x="833"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg2"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5"
|
||||||
|
inkscape:snap-global="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3154"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true"
|
||||||
|
originx="65.610033px"
|
||||||
|
originy="-659.12429px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1-3-5"
|
||||||
|
d="m 5749.1555,47.151064 2.828,9167.338436"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1"
|
||||||
|
d="m 5746.8844,5080.2018 -4107.7813,-0.8434 20.2152,2632.0511"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path3134-9-0-3-1-3"
|
||||||
|
d="m 1629.8595,1633.6804 12.2312,2669.7294 4055.5945,7.7159"
|
||||||
|
style="fill:none;stroke:#969696;stroke-width:53.19251633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Send)" />
|
||||||
|
<g
|
||||||
|
id="g3115"
|
||||||
|
transform="translate(1657.6576,12154.29)">
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057923, 60.00115859;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="2349.7295"
|
||||||
|
width="3992.2642"
|
||||||
|
y="-8909.5498"
|
||||||
|
x="2379.3704" />
|
||||||
|
<g
|
||||||
|
transform="translate(582.16224,-9085.2783)"
|
||||||
|
id="g3107-7"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="949.37109"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1370.8721"
|
||||||
|
rx="0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-5" />
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="1025.3964"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1294.8468"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-3-3" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-6-6-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-7356.375"
|
||||||
|
x="2774.7393"
|
||||||
|
xml:space="preserve">->qsmask &= ~->grpmask</text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7-7"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-8652.5312"
|
||||||
|
x="2466.7822"
|
||||||
|
xml:space="preserve">dyntick_save_progress_counter()</text>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-2-7-2-0"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-8368.1475"
|
||||||
|
x="2463.3262"
|
||||||
|
xml:space="preserve">rcu_implicit_dynticks_qs()</text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-3"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-6817.3472"
|
||||||
|
x="5103.9922"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-6"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4504"
|
||||||
|
transform="translate(-2953.0872,-15955.072)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,335.22989,12456.379)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="16835.086"
|
||||||
|
x="4409.043"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">RCU</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110"
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
id="tspan3112"
|
||||||
|
sodipodi:role="line">read-side</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3114"
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
id="tspan3116"
|
||||||
|
sodipodi:role="line">critical section</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3148-9-9"
|
||||||
|
transform="translate(-3554.8919,7020.44)">
|
||||||
|
<rect
|
||||||
|
x="3592.3828"
|
||||||
|
y="-4981.6865"
|
||||||
|
width="3728.9751"
|
||||||
|
height="2265.0989"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057963, 60.00115926;stroke-dashoffset:0"
|
||||||
|
id="rect118-3-5-1-3"
|
||||||
|
ry="0" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4684.6201"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_report_dead()</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3745.7725"
|
||||||
|
y="-4431.7573"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-3-27-0-0"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_cleanup_dying_idle_cpu()</text>
|
||||||
|
<g
|
||||||
|
transform="translate(1783.3183,-5255.3491)"
|
||||||
|
id="g3107-7-5"
|
||||||
|
style="fill:none;stroke-width:0.025in">
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="949.37109"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1370.8721"
|
||||||
|
rx="0"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-5-3" />
|
||||||
|
<rect
|
||||||
|
x="2084.55"
|
||||||
|
y="1025.3964"
|
||||||
|
width="2809.1992"
|
||||||
|
height="1294.8468"
|
||||||
|
rx="0"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
id="rect112-3-3-5" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-6-6-2-6"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-3526.4448"
|
||||||
|
x="4241.8574"
|
||||||
|
xml:space="preserve">->qsmaskinitnext</text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-3-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="-2987.4167"
|
||||||
|
x="6305.1484"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-6-9"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4504-7"
|
||||||
|
transform="translate(-2934.2808,-8785.3871)">
|
||||||
|
<path
|
||||||
|
transform="matrix(13.298129,0,0,13.298129,335.22989,12456.379)"
|
||||||
|
d="m 385.2961,345.54001 c 0,21.84301 -29.51209,39.55026 -65.9171,39.55026 -36.40501,0 -65.91711,-17.70725 -65.91711,-39.55026 0,-21.84301 29.5121,-39.55026 65.91711,-39.55026 36.40501,0 65.9171,17.70725 65.9171,39.55026 z"
|
||||||
|
sodipodi:ry="39.550262"
|
||||||
|
sodipodi:rx="65.917107"
|
||||||
|
sodipodi:cy="345.54001"
|
||||||
|
sodipodi:cx="319.379"
|
||||||
|
id="path3084-9"
|
||||||
|
style="fill:#ffffa1;fill-opacity:0;stroke:#000000;stroke-width:2.25600004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.256, 4.512;stroke-dashoffset:0"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-1-2-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="16835.086"
|
||||||
|
x="4409.043"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
id="tspan3104-0"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans">RCU</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3110-2"
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17055.541"
|
||||||
|
x="4579.373"
|
||||||
|
id="tspan3112-3"
|
||||||
|
sodipodi:role="line">read-side</tspan></text>
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3114-7"
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="17297.08"
|
||||||
|
x="4584.8276"
|
||||||
|
id="tspan3116-5"
|
||||||
|
sodipodi:role="line">critical section</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3206"
|
||||||
|
transform="translate(3999.537,1706.6099)">
|
||||||
|
<rect
|
||||||
|
ry="0"
|
||||||
|
id="rect118-3-5-1-3-1"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30.00057983;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00058007, 60.00116001;stroke-dashoffset:0"
|
||||||
|
rx="0"
|
||||||
|
height="2265.0989"
|
||||||
|
width="3728.9751"
|
||||||
|
y="3382.2036"
|
||||||
|
x="-3958.3845" />
|
||||||
|
<text
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
id="text202-7-5-3-27-6-2"
|
||||||
|
font-size="192"
|
||||||
|
font-weight="bold"
|
||||||
|
font-style="normal"
|
||||||
|
y="3679.27"
|
||||||
|
x="-3804.9949"
|
||||||
|
xml:space="preserve">rcu_cpu_starting()</text>
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g3107-7-5-0"
|
||||||
|
transform="translate(-5767.4491,3108.5424)">
|
||||||
|
<rect
|
||||||
|
id="rect112-5-3-9"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3-3-5-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="-3308.9099"
|
||||||
|
y="4837.4453"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-6-6-2-6-6"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">->qsmaskinitnext</text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="-1245.6189"
|
||||||
|
y="5376.4731"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7-5-1-2-3-2-0"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;line-height:125%;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
style="font-size:159.57754517px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
|
||||||
|
id="tspan3104-6-9-6">Leaf</tspan></text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 28 KiB |
1095
Documentation/RCU/Design/Memory-Ordering/TreeRCU-qs.svg
Normal file
|
After Width: | Height: | Size: 43 KiB |
229
Documentation/RCU/Design/Memory-Ordering/rcu_node-lock.svg
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Creator: fig2dev Version 3.2 Patchlevel 5e -->
|
||||||
|
|
||||||
|
<!-- CreationDate: Wed Dec 9 17:35:03 2015 -->
|
||||||
|
|
||||||
|
<!-- Magnification: 2.000 -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="303.54147"
|
||||||
|
height="211.57945"
|
||||||
|
viewBox="-44 -44 4036.5336 2812.3117"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="rcu_node-lock.svg">
|
||||||
|
<metadata
|
||||||
|
id="metadata212">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs210">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path3970"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1087"
|
||||||
|
inkscape:window-height="1144"
|
||||||
|
id="namedview208"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0495049"
|
||||||
|
inkscape:cx="311.2033"
|
||||||
|
inkscape:cy="168.10913"
|
||||||
|
inkscape:window-x="833"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="g4"
|
||||||
|
fit-margin-top="5"
|
||||||
|
fit-margin-right="5"
|
||||||
|
fit-margin-left="5"
|
||||||
|
fit-margin-bottom="5" />
|
||||||
|
<g
|
||||||
|
style="fill:none;stroke-width:0.025in"
|
||||||
|
id="g4"
|
||||||
|
transform="translate(-1905.5784,-4568.3024)">
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5710 5790-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4512 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1040 9300 - 1502 7140-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2240 8100 - 2702 5940-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1350 3450 - 2444 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4950 3450 - 3854 2510-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 6600 - 4050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 6600 - 1050 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 5400 - 2250 4290-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 2250 8100 - 2250 6240-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 1050 9300 - 1050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 4050 9300 - 4050 7440-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 8100 - 5250 6240-->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Circle -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9300 3150 - 10860 3150-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 3600 - 11400 4410-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<rect
|
||||||
|
x="1943.0693"
|
||||||
|
y="4603.417"
|
||||||
|
width="3873.5518"
|
||||||
|
height="2650.6289"
|
||||||
|
rx="0"
|
||||||
|
style="stroke:#000000;stroke-width:30.00057793;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:30.00057884, 60.00115769;stroke-dashoffset:0"
|
||||||
|
id="rect118"
|
||||||
|
ry="0" />
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 11400 5100 - 11400 5910-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9900 4650 - 10860 4650-->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 9600 6150 - 10860 6150-->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Line -->
|
||||||
|
<!-- Arrowhead on XXXpoint 5250 5400 - 5250 4290-->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Line: box -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="3105.219"
|
||||||
|
y="6425.6445"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;font-family:Courier">rcu_accelerate_cbs()</text>
|
||||||
|
<!-- Text -->
|
||||||
|
<!-- Text -->
|
||||||
|
<g
|
||||||
|
id="g3107"
|
||||||
|
transform="translate(747.5807,4700.8888)">
|
||||||
|
<rect
|
||||||
|
id="rect112"
|
||||||
|
style="stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1370.8721"
|
||||||
|
width="2809.1992"
|
||||||
|
y="949.37109"
|
||||||
|
x="2084.55" />
|
||||||
|
<rect
|
||||||
|
id="rect112-3"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:30;stroke-linecap:butt;stroke-linejoin:miter"
|
||||||
|
rx="0"
|
||||||
|
height="1294.8468"
|
||||||
|
width="2809.1992"
|
||||||
|
y="1025.3964"
|
||||||
|
x="2084.55" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
x="2025.5763"
|
||||||
|
y="4825.2578"
|
||||||
|
font-style="normal"
|
||||||
|
font-weight="bold"
|
||||||
|
font-size="192"
|
||||||
|
id="text202-7"
|
||||||
|
style="font-size:192px;font-style:normal;font-weight:bold;text-anchor:start;fill:#000000;stroke-width:0.025in;font-family:Courier">rcu_prepare_for_idle()</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.4 KiB |
@@ -40,7 +40,9 @@ o Booting Linux using a console connection that is too slow to
|
|||||||
o Anything that prevents RCU's grace-period kthreads from running.
|
o Anything that prevents RCU's grace-period kthreads from running.
|
||||||
This can result in the "All QSes seen" console-log message.
|
This can result in the "All QSes seen" console-log message.
|
||||||
This message will include information on when the kthread last
|
This message will include information on when the kthread last
|
||||||
ran and how often it should be expected to run.
|
ran and how often it should be expected to run. It can also
|
||||||
|
result in the "rcu_.*kthread starved for" console-log message,
|
||||||
|
which will include additional debugging information.
|
||||||
|
|
||||||
o A CPU-bound real-time task in a CONFIG_PREEMPT kernel, which might
|
o A CPU-bound real-time task in a CONFIG_PREEMPT kernel, which might
|
||||||
happen to preempt a low-priority task in the middle of an RCU
|
happen to preempt a low-priority task in the middle of an RCU
|
||||||
@@ -60,6 +62,20 @@ o A CPU-bound real-time task in a CONFIG_PREEMPT_RT kernel that
|
|||||||
CONFIG_PREEMPT_RCU case, you might see stall-warning
|
CONFIG_PREEMPT_RCU case, you might see stall-warning
|
||||||
messages.
|
messages.
|
||||||
|
|
||||||
|
o A periodic interrupt whose handler takes longer than the time
|
||||||
|
interval between successive pairs of interrupts. This can
|
||||||
|
prevent RCU's kthreads and softirq handlers from running.
|
||||||
|
Note that certain high-overhead debugging options, for example
|
||||||
|
the function_graph tracer, can result in interrupt handler taking
|
||||||
|
considerably longer than normal, which can in turn result in
|
||||||
|
RCU CPU stall warnings.
|
||||||
|
|
||||||
|
o Testing a workload on a fast system, tuning the stall-warning
|
||||||
|
timeout down to just barely avoid RCU CPU stall warnings, and then
|
||||||
|
running the same workload with the same stall-warning timeout on a
|
||||||
|
slow system. Note that thermal throttling and on-demand governors
|
||||||
|
can cause a single system to be sometimes fast and sometimes slow!
|
||||||
|
|
||||||
o A hardware or software issue shuts off the scheduler-clock
|
o A hardware or software issue shuts off the scheduler-clock
|
||||||
interrupt on a CPU that is not in dyntick-idle mode. This
|
interrupt on a CPU that is not in dyntick-idle mode. This
|
||||||
problem really has happened, and seems to be most likely to
|
problem really has happened, and seems to be most likely to
|
||||||
@@ -155,67 +171,32 @@ Interpreting RCU's CPU Stall-Detector "Splats"
|
|||||||
For non-RCU-tasks flavors of RCU, when a CPU detects that it is stalling,
|
For non-RCU-tasks flavors of RCU, when a CPU detects that it is stalling,
|
||||||
it will print a message similar to the following:
|
it will print a message similar to the following:
|
||||||
|
|
||||||
INFO: rcu_sched_state detected stall on CPU 5 (t=2500 jiffies)
|
INFO: rcu_sched detected stalls on CPUs/tasks:
|
||||||
|
2-...: (3 GPs behind) idle=06c/0/0 softirq=1453/1455 fqs=0
|
||||||
|
16-...: (0 ticks this GP) idle=81c/0/0 softirq=764/764 fqs=0
|
||||||
|
(detected by 32, t=2603 jiffies, g=7073, c=7072, q=625)
|
||||||
|
|
||||||
This message indicates that CPU 5 detected that it was causing a stall,
|
This message indicates that CPU 32 detected that CPUs 2 and 16 were both
|
||||||
and that the stall was affecting RCU-sched. This message will normally be
|
causing stalls, and that the stall was affecting RCU-sched. This message
|
||||||
followed by a stack dump of the offending CPU. On TREE_RCU kernel builds,
|
|
||||||
RCU and RCU-sched are implemented by the same underlying mechanism,
|
|
||||||
while on PREEMPT_RCU kernel builds, RCU is instead implemented
|
|
||||||
by rcu_preempt_state.
|
|
||||||
|
|
||||||
On the other hand, if the offending CPU fails to print out a stall-warning
|
|
||||||
message quickly enough, some other CPU will print a message similar to
|
|
||||||
the following:
|
|
||||||
|
|
||||||
INFO: rcu_bh_state detected stalls on CPUs/tasks: { 3 5 } (detected by 2, 2502 jiffies)
|
|
||||||
|
|
||||||
This message indicates that CPU 2 detected that CPUs 3 and 5 were both
|
|
||||||
causing stalls, and that the stall was affecting RCU-bh. This message
|
|
||||||
will normally be followed by stack dumps for each CPU. Please note that
|
will normally be followed by stack dumps for each CPU. Please note that
|
||||||
PREEMPT_RCU builds can be stalled by tasks as well as by CPUs,
|
PREEMPT_RCU builds can be stalled by tasks as well as by CPUs, and that
|
||||||
and that the tasks will be indicated by PID, for example, "P3421".
|
the tasks will be indicated by PID, for example, "P3421". It is even
|
||||||
It is even possible for a rcu_preempt_state stall to be caused by both
|
possible for a rcu_preempt_state stall to be caused by both CPUs -and-
|
||||||
CPUs -and- tasks, in which case the offending CPUs and tasks will all
|
tasks, in which case the offending CPUs and tasks will all be called
|
||||||
be called out in the list.
|
out in the list.
|
||||||
|
|
||||||
Finally, if the grace period ends just as the stall warning starts
|
CPU 2's "(3 GPs behind)" indicates that this CPU has not interacted with
|
||||||
printing, there will be a spurious stall-warning message:
|
the RCU core for the past three grace periods. In contrast, CPU 16's "(0
|
||||||
|
ticks this GP)" indicates that this CPU has not taken any scheduling-clock
|
||||||
INFO: rcu_bh_state detected stalls on CPUs/tasks: { } (detected by 4, 2502 jiffies)
|
interrupts during the current stalled grace period.
|
||||||
|
|
||||||
This is rare, but does happen from time to time in real life. It is also
|
|
||||||
possible for a zero-jiffy stall to be flagged in this case, depending
|
|
||||||
on how the stall warning and the grace-period initialization happen to
|
|
||||||
interact. Please note that it is not possible to entirely eliminate this
|
|
||||||
sort of false positive without resorting to things like stop_machine(),
|
|
||||||
which is overkill for this sort of problem.
|
|
||||||
|
|
||||||
Recent kernels will print a long form of the stall-warning message:
|
|
||||||
|
|
||||||
INFO: rcu_preempt detected stall on CPU
|
|
||||||
0: (63959 ticks this GP) idle=241/3fffffffffffffff/0 softirq=82/543
|
|
||||||
(t=65000 jiffies)
|
|
||||||
|
|
||||||
In kernels with CONFIG_RCU_FAST_NO_HZ, more information is printed:
|
|
||||||
|
|
||||||
INFO: rcu_preempt detected stall on CPU
|
|
||||||
0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 softirq=82/543 last_accelerate: a345/d342 nonlazy_posted: 25 .D
|
|
||||||
(t=65000 jiffies)
|
|
||||||
|
|
||||||
The "(64628 ticks this GP)" indicates that this CPU has taken more
|
|
||||||
than 64,000 scheduling-clock interrupts during the current stalled
|
|
||||||
grace period. If the CPU was not yet aware of the current grace
|
|
||||||
period (for example, if it was offline), then this part of the message
|
|
||||||
indicates how many grace periods behind the CPU is.
|
|
||||||
|
|
||||||
The "idle=" portion of the message prints the dyntick-idle state.
|
The "idle=" portion of the message prints the dyntick-idle state.
|
||||||
The hex number before the first "/" is the low-order 12 bits of the
|
The hex number before the first "/" is the low-order 12 bits of the
|
||||||
dynticks counter, which will have an even-numbered value if the CPU is
|
dynticks counter, which will have an even-numbered value if the CPU
|
||||||
in dyntick-idle mode and an odd-numbered value otherwise. The hex
|
is in dyntick-idle mode and an odd-numbered value otherwise. The hex
|
||||||
number between the two "/"s is the value of the nesting, which will
|
number between the two "/"s is the value of the nesting, which will be
|
||||||
be a small positive number if in the idle loop and a very large positive
|
a small non-negative number if in the idle loop (as shown above) and a
|
||||||
number (as shown above) otherwise.
|
very large positive number otherwise.
|
||||||
|
|
||||||
The "softirq=" portion of the message tracks the number of RCU softirq
|
The "softirq=" portion of the message tracks the number of RCU softirq
|
||||||
handlers that the stalled CPU has executed. The number before the "/"
|
handlers that the stalled CPU has executed. The number before the "/"
|
||||||
@@ -230,24 +211,72 @@ handlers are no longer able to execute on this CPU. This can happen if
|
|||||||
the stalled CPU is spinning with interrupts are disabled, or, in -rt
|
the stalled CPU is spinning with interrupts are disabled, or, in -rt
|
||||||
kernels, if a high-priority process is starving RCU's softirq handler.
|
kernels, if a high-priority process is starving RCU's softirq handler.
|
||||||
|
|
||||||
For CONFIG_RCU_FAST_NO_HZ kernels, the "last_accelerate:" prints the
|
The "fps=" shows the number of force-quiescent-state idle/offline
|
||||||
low-order 16 bits (in hex) of the jiffies counter when this CPU last
|
detection passes that the grace-period kthread has made across this
|
||||||
invoked rcu_try_advance_all_cbs() from rcu_needs_cpu() or last invoked
|
CPU since the last time that this CPU noted the beginning of a grace
|
||||||
rcu_accelerate_cbs() from rcu_prepare_for_idle(). The "nonlazy_posted:"
|
period.
|
||||||
prints the number of non-lazy callbacks posted since the last call to
|
|
||||||
rcu_needs_cpu(). Finally, an "L" indicates that there are currently
|
The "detected by" line indicates which CPU detected the stall (in this
|
||||||
no non-lazy callbacks ("." is printed otherwise, as shown above) and
|
case, CPU 32), how many jiffies have elapsed since the start of the
|
||||||
"D" indicates that dyntick-idle processing is enabled ("." is printed
|
grace period (in this case 2603), the number of the last grace period
|
||||||
otherwise, for example, if disabled via the "nohz=" kernel boot parameter).
|
to start and to complete (7073 and 7072, respectively), and an estimate
|
||||||
|
of the total number of RCU callbacks queued across all CPUs (625 in
|
||||||
|
this case).
|
||||||
|
|
||||||
|
In kernels with CONFIG_RCU_FAST_NO_HZ, more information is printed
|
||||||
|
for each CPU:
|
||||||
|
|
||||||
|
0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 softirq=82/543 last_accelerate: a345/d342 nonlazy_posted: 25 .D
|
||||||
|
|
||||||
|
The "last_accelerate:" prints the low-order 16 bits (in hex) of the
|
||||||
|
jiffies counter when this CPU last invoked rcu_try_advance_all_cbs()
|
||||||
|
from rcu_needs_cpu() or last invoked rcu_accelerate_cbs() from
|
||||||
|
rcu_prepare_for_idle(). The "nonlazy_posted:" prints the number
|
||||||
|
of non-lazy callbacks posted since the last call to rcu_needs_cpu().
|
||||||
|
Finally, an "L" indicates that there are currently no non-lazy callbacks
|
||||||
|
("." is printed otherwise, as shown above) and "D" indicates that
|
||||||
|
dyntick-idle processing is enabled ("." is printed otherwise, for example,
|
||||||
|
if disabled via the "nohz=" kernel boot parameter).
|
||||||
|
|
||||||
|
If the grace period ends just as the stall warning starts printing,
|
||||||
|
there will be a spurious stall-warning message, which will include
|
||||||
|
the following:
|
||||||
|
|
||||||
|
INFO: Stall ended before state dump start
|
||||||
|
|
||||||
|
This is rare, but does happen from time to time in real life. It is also
|
||||||
|
possible for a zero-jiffy stall to be flagged in this case, depending
|
||||||
|
on how the stall warning and the grace-period initialization happen to
|
||||||
|
interact. Please note that it is not possible to entirely eliminate this
|
||||||
|
sort of false positive without resorting to things like stop_machine(),
|
||||||
|
which is overkill for this sort of problem.
|
||||||
|
|
||||||
|
If all CPUs and tasks have passed through quiescent states, but the
|
||||||
|
grace period has nevertheless failed to end, the stall-warning splat
|
||||||
|
will include something like the following:
|
||||||
|
|
||||||
|
All QSes seen, last rcu_preempt kthread activity 23807 (4297905177-4297881370), jiffies_till_next_fqs=3, root ->qsmask 0x0
|
||||||
|
|
||||||
|
The "23807" indicates that it has been more than 23 thousand jiffies
|
||||||
|
since the grace-period kthread ran. The "jiffies_till_next_fqs"
|
||||||
|
indicates how frequently that kthread should run, giving the number
|
||||||
|
of jiffies between force-quiescent-state scans, in this case three,
|
||||||
|
which is way less than 23807. Finally, the root rcu_node structure's
|
||||||
|
->qsmask field is printed, which will normally be zero.
|
||||||
|
|
||||||
If the relevant grace-period kthread has been unable to run prior to
|
If the relevant grace-period kthread has been unable to run prior to
|
||||||
the stall warning, the following additional line is printed:
|
the stall warning, as was the case in the "All QSes seen" line above,
|
||||||
|
the following additional line is printed:
|
||||||
|
|
||||||
rcu_preempt kthread starved for 2023 jiffies!
|
kthread starved for 23807 jiffies! g7073 c7072 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1
|
||||||
|
|
||||||
Starving the grace-period kthreads of CPU time can of course result in
|
Starving the grace-period kthreads of CPU time can of course result
|
||||||
RCU CPU stall warnings even when all CPUs and tasks have passed through
|
in RCU CPU stall warnings even when all CPUs and tasks have passed
|
||||||
the required quiescent states.
|
through the required quiescent states. The "g" and "c" numbers flag the
|
||||||
|
number of the last grace period started and completed, respectively,
|
||||||
|
the "f" precedes the ->gp_flags command to the grace-period kthread,
|
||||||
|
the "RCU_GP_WAIT_FQS" indicates that the kthread is waiting for a short
|
||||||
|
timeout, and the "state" precedes value of the task_struct ->state field.
|
||||||
|
|
||||||
|
|
||||||
Multiple Warnings From One Stall
|
Multiple Warnings From One Stall
|
||||||
@@ -264,13 +293,28 @@ Stall Warnings for Expedited Grace Periods
|
|||||||
If an expedited grace period detects a stall, it will place a message
|
If an expedited grace period detects a stall, it will place a message
|
||||||
like the following in dmesg:
|
like the following in dmesg:
|
||||||
|
|
||||||
INFO: rcu_sched detected expedited stalls on CPUs: { 1 2 6 } 26009 jiffies s: 1043
|
INFO: rcu_sched detected expedited stalls on CPUs/tasks: { 7-... } 21119 jiffies s: 73 root: 0x2/.
|
||||||
|
|
||||||
This indicates that CPUs 1, 2, and 6 have failed to respond to a
|
This indicates that CPU 7 has failed to respond to a reschedule IPI.
|
||||||
reschedule IPI, that the expedited grace period has been going on for
|
The three periods (".") following the CPU number indicate that the CPU
|
||||||
26,009 jiffies, and that the expedited grace-period sequence counter is
|
is online (otherwise the first period would instead have been "O"),
|
||||||
1043. The fact that this last value is odd indicates that an expedited
|
that the CPU was online at the beginning of the expedited grace period
|
||||||
grace period is in flight.
|
(otherwise the second period would have instead been "o"), and that
|
||||||
|
the CPU has been online at least once since boot (otherwise, the third
|
||||||
|
period would instead have been "N"). The number before the "jiffies"
|
||||||
|
indicates that the expedited grace period has been going on for 21,119
|
||||||
|
jiffies. The number following the "s:" indicates that the expedited
|
||||||
|
grace-period sequence counter is 73. The fact that this last value is
|
||||||
|
odd indicates that an expedited grace period is in flight. The number
|
||||||
|
following "root:" is a bitmask that indicates which children of the root
|
||||||
|
rcu_node structure correspond to CPUs and/or tasks that are blocking the
|
||||||
|
current expedited grace period. If the tree had more than one level,
|
||||||
|
additional hex numbers would be printed for the states of the other
|
||||||
|
rcu_node structures in the tree.
|
||||||
|
|
||||||
|
As with normal grace periods, PREEMPT_RCU builds can be stalled by
|
||||||
|
tasks as well as by CPUs, and that the tasks will be indicated by PID,
|
||||||
|
for example, "P3421".
|
||||||
|
|
||||||
It is entirely possible to see stall warnings from normal and from
|
It is entirely possible to see stall warnings from normal and from
|
||||||
expedited grace periods at about the same time from the same run.
|
expedited grace periods at about the same time during the same run.
|
||||||
|
|||||||
25
Documentation/acpi/lpit.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
To enumerate platform Low Power Idle states, Intel platforms are using
|
||||||
|
“Low Power Idle Table” (LPIT). More details about this table can be
|
||||||
|
downloaded from:
|
||||||
|
http://www.uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf
|
||||||
|
|
||||||
|
Residencies for each low power state can be read via FFH
|
||||||
|
(Function fixed hardware) or a memory mapped interface.
|
||||||
|
|
||||||
|
On platforms supporting S0ix sleep states, there can be two types of
|
||||||
|
residencies:
|
||||||
|
- CPU PKG C10 (Read via FFH interface)
|
||||||
|
- Platform Controller Hub (PCH) SLP_S0 (Read via memory mapped interface)
|
||||||
|
|
||||||
|
The following attributes are added dynamically to the cpuidle
|
||||||
|
sysfs attribute group:
|
||||||
|
/sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us
|
||||||
|
/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us
|
||||||
|
|
||||||
|
The "low_power_idle_cpu_residency_us" attribute shows time spent
|
||||||
|
by the CPU package in PKG C10
|
||||||
|
|
||||||
|
The "low_power_idle_system_residency_us" attribute shows SLP_S0
|
||||||
|
residency, or system time spent with the SLP_S0# signal asserted.
|
||||||
|
This is the lowest possible system power state, achieved only when CPU is in
|
||||||
|
PKG C10 and all functional blocks in PCH are in a low power state.
|
||||||
@@ -350,7 +350,7 @@ If something goes wrong
|
|||||||
help debugging the problem. The text above the dump is also
|
help debugging the problem. The text above the dump is also
|
||||||
important: it tells something about why the kernel dumped code (in
|
important: it tells something about why the kernel dumped code (in
|
||||||
the above example, it's due to a bad kernel pointer). More information
|
the above example, it's due to a bad kernel pointer). More information
|
||||||
on making sense of the dump is in Documentation/admin-guide/oops-tracing.rst
|
on making sense of the dump is in Documentation/admin-guide/bug-hunting.rst
|
||||||
|
|
||||||
- If you compiled the kernel with CONFIG_KALLSYMS you can send the dump
|
- If you compiled the kernel with CONFIG_KALLSYMS you can send the dump
|
||||||
as is, otherwise you will have to use the ``ksymoops`` program to make
|
as is, otherwise you will have to use the ``ksymoops`` program to make
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ In order to report it upstream, you should identify the mailing list
|
|||||||
used for the development of the affected code. This can be done by using
|
used for the development of the affected code. This can be done by using
|
||||||
the ``get_maintainer.pl`` script.
|
the ``get_maintainer.pl`` script.
|
||||||
|
|
||||||
For example, if you find a bug at the gspca's conex.c file, you can get
|
For example, if you find a bug at the gspca's sonixj.c file, you can get
|
||||||
their maintainers with::
|
their maintainers with::
|
||||||
|
|
||||||
$ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c
|
$ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c
|
||||||
@@ -257,7 +257,7 @@ Please notice that it will point to:
|
|||||||
Tejun and Bhaktipriya (in this specific case, none really envolved on the
|
Tejun and Bhaktipriya (in this specific case, none really envolved on the
|
||||||
development of this file);
|
development of this file);
|
||||||
- The driver maintainer (Hans Verkuil);
|
- The driver maintainer (Hans Verkuil);
|
||||||
- The subsystem maintainer (Mauro Carvalho Chehab)
|
- The subsystem maintainer (Mauro Carvalho Chehab);
|
||||||
- The driver and/or subsystem mailing list (linux-media@vger.kernel.org);
|
- The driver and/or subsystem mailing list (linux-media@vger.kernel.org);
|
||||||
- the Linux Kernel mailing list (linux-kernel@vger.kernel.org).
|
- the Linux Kernel mailing list (linux-kernel@vger.kernel.org).
|
||||||
|
|
||||||
@@ -274,14 +274,14 @@ Fixing the bug
|
|||||||
--------------
|
--------------
|
||||||
|
|
||||||
If you know programming, you could help us by not only reporting the bug,
|
If you know programming, you could help us by not only reporting the bug,
|
||||||
but also providing us with a solution. After all open source is about
|
but also providing us with a solution. After all, open source is about
|
||||||
sharing what you do and don't you want to be recognised for your genius?
|
sharing what you do and don't you want to be recognised for your genius?
|
||||||
|
|
||||||
If you decide to take this way, once you have worked out a fix please submit
|
If you decide to take this way, once you have worked out a fix please submit
|
||||||
it upstream.
|
it upstream.
|
||||||
|
|
||||||
Please do read
|
Please do read
|
||||||
ref:`Documentation/process/submitting-patches.rst <submittingpatches>` though
|
:ref:`Documentation/process/submitting-patches.rst <submittingpatches>` though
|
||||||
to help your code get accepted.
|
to help your code get accepted.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ shortcut for ``print_hex_dump(KERN_DEBUG)``.
|
|||||||
|
|
||||||
For ``print_hex_dump_debug()``/``print_hex_dump_bytes()``, format string is
|
For ``print_hex_dump_debug()``/``print_hex_dump_bytes()``, format string is
|
||||||
its ``prefix_str`` argument, if it is constant string; or ``hexdump``
|
its ``prefix_str`` argument, if it is constant string; or ``hexdump``
|
||||||
in case ``prefix_str`` is build dynamically.
|
in case ``prefix_str`` is built dynamically.
|
||||||
|
|
||||||
Dynamic debug has even more useful features:
|
Dynamic debug has even more useful features:
|
||||||
|
|
||||||
@@ -197,8 +197,8 @@ line
|
|||||||
line number matches the callsite line number exactly. A
|
line number matches the callsite line number exactly. A
|
||||||
range of line numbers matches any callsite between the first
|
range of line numbers matches any callsite between the first
|
||||||
and last line number inclusive. An empty first number means
|
and last line number inclusive. An empty first number means
|
||||||
the first line in the file, an empty line number means the
|
the first line in the file, an empty last line number means the
|
||||||
last number in the file. Examples::
|
last line number in the file. Examples::
|
||||||
|
|
||||||
line 1603 // exactly line 1603
|
line 1603 // exactly line 1603
|
||||||
line 1600-1605 // the six lines from line 1600 to line 1605
|
line 1600-1605 // the six lines from line 1600 to line 1605
|
||||||
|
|||||||
@@ -314,7 +314,7 @@
|
|||||||
amijoy.map= [HW,JOY] Amiga joystick support
|
amijoy.map= [HW,JOY] Amiga joystick support
|
||||||
Map of devices attached to JOY0DAT and JOY1DAT
|
Map of devices attached to JOY0DAT and JOY1DAT
|
||||||
Format: <a>,<b>
|
Format: <a>,<b>
|
||||||
See also Documentation/input/joystick.txt
|
See also Documentation/input/joydev/joystick.rst
|
||||||
|
|
||||||
analog.map= [HW,JOY] Analog joystick and gamepad support
|
analog.map= [HW,JOY] Analog joystick and gamepad support
|
||||||
Specifies type or capabilities of an analog joystick
|
Specifies type or capabilities of an analog joystick
|
||||||
@@ -439,7 +439,7 @@
|
|||||||
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
|
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
|
||||||
bttv.radio= Most important insmod options are available as
|
bttv.radio= Most important insmod options are available as
|
||||||
kernel args too.
|
kernel args too.
|
||||||
bttv.pll= See Documentation/video4linux/bttv/Insmod-options
|
bttv.pll= See Documentation/media/v4l-drivers/bttv.rst
|
||||||
bttv.tuner=
|
bttv.tuner=
|
||||||
|
|
||||||
bulk_remove=off [PPC] This parameter disables the use of the pSeries
|
bulk_remove=off [PPC] This parameter disables the use of the pSeries
|
||||||
@@ -641,8 +641,8 @@
|
|||||||
For now, only VisioBraille is supported.
|
For now, only VisioBraille is supported.
|
||||||
|
|
||||||
consoleblank= [KNL] The console blank (screen saver) timeout in
|
consoleblank= [KNL] The console blank (screen saver) timeout in
|
||||||
seconds. Defaults to 10*60 = 10mins. A value of 0
|
seconds. A value of 0 disables the blank timer.
|
||||||
disables the blank timer.
|
Defaults to 0.
|
||||||
|
|
||||||
coredump_filter=
|
coredump_filter=
|
||||||
[KNL] Change the default value for
|
[KNL] Change the default value for
|
||||||
@@ -709,6 +709,9 @@
|
|||||||
It will be ignored when crashkernel=X,high is not used
|
It will be ignored when crashkernel=X,high is not used
|
||||||
or memory reserved is below 4G.
|
or memory reserved is below 4G.
|
||||||
|
|
||||||
|
crossrelease_fullstack
|
||||||
|
[KNL] Allow to record full stack trace in cross-release
|
||||||
|
|
||||||
cryptomgr.notests
|
cryptomgr.notests
|
||||||
[KNL] Disable crypto self-tests
|
[KNL] Disable crypto self-tests
|
||||||
|
|
||||||
@@ -724,7 +727,7 @@
|
|||||||
db9.dev[2|3]= [HW,JOY] Multisystem joystick support via parallel port
|
db9.dev[2|3]= [HW,JOY] Multisystem joystick support via parallel port
|
||||||
(one device per port)
|
(one device per port)
|
||||||
Format: <port#>,<type>
|
Format: <port#>,<type>
|
||||||
See also Documentation/input/joystick-parport.txt
|
See also Documentation/input/devices/joystick-parport.rst
|
||||||
|
|
||||||
ddebug_query= [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
|
ddebug_query= [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
|
||||||
time. See
|
time. See
|
||||||
@@ -854,7 +857,7 @@
|
|||||||
The filter can be disabled or changed to another
|
The filter can be disabled or changed to another
|
||||||
driver later using sysfs.
|
driver later using sysfs.
|
||||||
|
|
||||||
drm_kms_helper.edid_firmware=[<connector>:]<file>[,[<connector>:]<file>]
|
drm.edid_firmware=[<connector>:]<file>[,[<connector>:]<file>]
|
||||||
Broken monitors, graphic adapters, KVMs and EDIDless
|
Broken monitors, graphic adapters, KVMs and EDIDless
|
||||||
panels may send no or incorrect EDID data sets.
|
panels may send no or incorrect EDID data sets.
|
||||||
This parameter allows to specify an EDID data sets
|
This parameter allows to specify an EDID data sets
|
||||||
@@ -1220,7 +1223,7 @@
|
|||||||
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
||||||
support via parallel port (up to 5 devices per port)
|
support via parallel port (up to 5 devices per port)
|
||||||
Format: <port#>,<pad1>,<pad2>,<pad3>,<pad4>,<pad5>
|
Format: <port#>,<pad1>,<pad2>,<pad3>,<pad4>,<pad5>
|
||||||
See also Documentation/input/joystick-parport.txt
|
See also Documentation/input/devices/joystick-parport.rst
|
||||||
|
|
||||||
gamma= [HW,DRM]
|
gamma= [HW,DRM]
|
||||||
|
|
||||||
@@ -1713,6 +1716,13 @@
|
|||||||
irqaffinity= [SMP] Set the default irq affinity mask
|
irqaffinity= [SMP] Set the default irq affinity mask
|
||||||
The argument is a cpu list, as described above.
|
The argument is a cpu list, as described above.
|
||||||
|
|
||||||
|
irqchip.gicv2_force_probe=
|
||||||
|
[ARM, ARM64]
|
||||||
|
Format: <bool>
|
||||||
|
Force the kernel to look for the second 4kB page
|
||||||
|
of a GICv2 controller even if the memory range
|
||||||
|
exposed by the device tree is too small.
|
||||||
|
|
||||||
irqfixup [HW]
|
irqfixup [HW]
|
||||||
When an interrupt is not handled search all handlers
|
When an interrupt is not handled search all handlers
|
||||||
for it. Intended to get systems with badly broken
|
for it. Intended to get systems with badly broken
|
||||||
@@ -1727,20 +1737,33 @@
|
|||||||
isapnp= [ISAPNP]
|
isapnp= [ISAPNP]
|
||||||
Format: <RDP>,<reset>,<pci_scan>,<verbosity>
|
Format: <RDP>,<reset>,<pci_scan>,<verbosity>
|
||||||
|
|
||||||
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
|
isolcpus= [KNL,SMP] Isolate a given set of CPUs from disturbance.
|
||||||
The argument is a cpu list, as described above.
|
[Deprecated - use cpusets instead]
|
||||||
|
Format: [flag-list,]<cpu-list>
|
||||||
|
|
||||||
This option can be used to specify one or more CPUs
|
Specify one or more CPUs to isolate from disturbances
|
||||||
to isolate from the general SMP balancing and scheduling
|
specified in the flag list (default: domain):
|
||||||
algorithms. You can move a process onto or off an
|
|
||||||
"isolated" CPU via the CPU affinity syscalls or cpuset.
|
nohz
|
||||||
|
Disable the tick when a single task runs.
|
||||||
|
domain
|
||||||
|
Isolate from the general SMP balancing and scheduling
|
||||||
|
algorithms. Note that performing domain isolation this way
|
||||||
|
is irreversible: it's not possible to bring back a CPU to
|
||||||
|
the domains once isolated through isolcpus. It's strongly
|
||||||
|
advised to use cpusets instead to disable scheduler load
|
||||||
|
balancing through the "cpuset.sched_load_balance" file.
|
||||||
|
It offers a much more flexible interface where CPUs can
|
||||||
|
move in and out of an isolated set anytime.
|
||||||
|
|
||||||
|
You can move a process onto or off an "isolated" CPU via
|
||||||
|
the CPU affinity syscalls or cpuset.
|
||||||
<cpu number> begins at 0 and the maximum value is
|
<cpu number> begins at 0 and the maximum value is
|
||||||
"number of CPUs in system - 1".
|
"number of CPUs in system - 1".
|
||||||
|
|
||||||
This option is the preferred way to isolate CPUs. The
|
The format of <cpu-list> is described above.
|
||||||
alternative -- manually setting the CPU mask of all
|
|
||||||
tasks in the system -- can cause problems and
|
|
||||||
suboptimal load balancer performance.
|
|
||||||
|
|
||||||
iucv= [HW,NET]
|
iucv= [HW,NET]
|
||||||
|
|
||||||
@@ -1766,7 +1789,7 @@
|
|||||||
ivrs_acpihid[00:14.5]=AMD0020:0
|
ivrs_acpihid[00:14.5]=AMD0020:0
|
||||||
|
|
||||||
js= [HW,JOY] Analog joystick
|
js= [HW,JOY] Analog joystick
|
||||||
See Documentation/input/joystick.txt.
|
See Documentation/input/joydev/joystick.rst.
|
||||||
|
|
||||||
nokaslr [KNL]
|
nokaslr [KNL]
|
||||||
When CONFIG_RANDOMIZE_BASE is set, this disables
|
When CONFIG_RANDOMIZE_BASE is set, this disables
|
||||||
@@ -1841,13 +1864,6 @@
|
|||||||
Built with CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y,
|
Built with CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y,
|
||||||
the default is off.
|
the default is off.
|
||||||
|
|
||||||
kmemcheck= [X86] Boot-time kmemcheck enable/disable/one-shot mode
|
|
||||||
Valid arguments: 0, 1, 2
|
|
||||||
kmemcheck=0 (disabled)
|
|
||||||
kmemcheck=1 (enabled)
|
|
||||||
kmemcheck=2 (one-shot mode)
|
|
||||||
Default: 2 (one-shot mode)
|
|
||||||
|
|
||||||
kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
|
kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
|
||||||
Default is 0 (don't ignore, but inject #GP)
|
Default is 0 (don't ignore, but inject #GP)
|
||||||
|
|
||||||
@@ -1874,6 +1890,10 @@
|
|||||||
[KVM,ARM] Trap guest accesses to GICv3 common
|
[KVM,ARM] Trap guest accesses to GICv3 common
|
||||||
system registers
|
system registers
|
||||||
|
|
||||||
|
kvm-arm.vgic_v4_enable=
|
||||||
|
[KVM,ARM] Allow use of GICv4 for direct injection of
|
||||||
|
LPIs.
|
||||||
|
|
||||||
kvm-intel.ept= [KVM,Intel] Disable extended page tables
|
kvm-intel.ept= [KVM,Intel] Disable extended page tables
|
||||||
(virtualized MMU) support on capable Intel chips.
|
(virtualized MMU) support on capable Intel chips.
|
||||||
Default is 1 (enabled)
|
Default is 1 (enabled)
|
||||||
@@ -2248,10 +2268,10 @@
|
|||||||
s2idle - Suspend-To-Idle
|
s2idle - Suspend-To-Idle
|
||||||
shallow - Power-On Suspend or equivalent (if supported)
|
shallow - Power-On Suspend or equivalent (if supported)
|
||||||
deep - Suspend-To-RAM or equivalent (if supported)
|
deep - Suspend-To-RAM or equivalent (if supported)
|
||||||
See Documentation/power/states.txt.
|
See Documentation/admin-guide/pm/sleep-states.rst.
|
||||||
|
|
||||||
meye.*= [HW] Set MotionEye Camera parameters
|
meye.*= [HW] Set MotionEye Camera parameters
|
||||||
See Documentation/video4linux/meye.txt.
|
See Documentation/media/v4l-drivers/meye.rst.
|
||||||
|
|
||||||
mfgpt_irq= [IA-32] Specify the IRQ to use for the
|
mfgpt_irq= [IA-32] Specify the IRQ to use for the
|
||||||
Multi-Function General Purpose Timers on AMD Geode
|
Multi-Function General Purpose Timers on AMD Geode
|
||||||
@@ -2548,6 +2568,9 @@
|
|||||||
|
|
||||||
noalign [KNL,ARM]
|
noalign [KNL,ARM]
|
||||||
|
|
||||||
|
noaltinstr [S390] Disables alternative instructions patching
|
||||||
|
(CPU alternatives feature).
|
||||||
|
|
||||||
noapic [SMP,APIC] Tells the kernel to not make use of any
|
noapic [SMP,APIC] Tells the kernel to not make use of any
|
||||||
IOAPICs that may be present in the system.
|
IOAPICs that may be present in the system.
|
||||||
|
|
||||||
@@ -3134,7 +3157,7 @@
|
|||||||
|
|
||||||
plip= [PPT,NET] Parallel port network link
|
plip= [PPT,NET] Parallel port network link
|
||||||
Format: { parport<nr> | timid | 0 }
|
Format: { parport<nr> | timid | 0 }
|
||||||
See also Documentation/parport.txt.
|
See also Documentation/admin-guide/parport.rst.
|
||||||
|
|
||||||
pmtmr= [X86] Manual setup of pmtmr I/O Port.
|
pmtmr= [X86] Manual setup of pmtmr I/O Port.
|
||||||
Override pmtimer IOPort with a hex value.
|
Override pmtimer IOPort with a hex value.
|
||||||
@@ -3185,6 +3208,10 @@
|
|||||||
allowed (eg kernel_enable_fpu()/kernel_disable_fpu()).
|
allowed (eg kernel_enable_fpu()/kernel_disable_fpu()).
|
||||||
There is some performance impact when enabling this.
|
There is some performance impact when enabling this.
|
||||||
|
|
||||||
|
ppc_tm= [PPC]
|
||||||
|
Format: {"off"}
|
||||||
|
Disable Hardware Transactional Memory
|
||||||
|
|
||||||
print-fatal-signals=
|
print-fatal-signals=
|
||||||
[KNL] debug: print fatal signals
|
[KNL] debug: print fatal signals
|
||||||
|
|
||||||
@@ -3223,13 +3250,15 @@
|
|||||||
instead using the legacy FADT method
|
instead using the legacy FADT method
|
||||||
|
|
||||||
profile= [KNL] Enable kernel profiling via /proc/profile
|
profile= [KNL] Enable kernel profiling via /proc/profile
|
||||||
Format: [schedule,]<number>
|
Format: [<profiletype>,]<number>
|
||||||
|
Param: <profiletype>: "schedule", "sleep", or "kvm"
|
||||||
|
[defaults to kernel profiling]
|
||||||
Param: "schedule" - profile schedule points.
|
Param: "schedule" - profile schedule points.
|
||||||
Param: <number> - step/bucket size as a power of 2 for
|
|
||||||
statistical time based profiling.
|
|
||||||
Param: "sleep" - profile D-state sleeping (millisecs).
|
Param: "sleep" - profile D-state sleeping (millisecs).
|
||||||
Requires CONFIG_SCHEDSTATS
|
Requires CONFIG_SCHEDSTATS
|
||||||
Param: "kvm" - profile VM exits.
|
Param: "kvm" - profile VM exits.
|
||||||
|
Param: <number> - step/bucket size as a power of 2 for
|
||||||
|
statistical time based profiling.
|
||||||
|
|
||||||
prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
|
prompt_ramdisk= [RAM] List of RAM disks to prompt for floppy disk
|
||||||
before loading.
|
before loading.
|
||||||
@@ -3539,6 +3568,9 @@
|
|||||||
rcutorture.stall_cpu_holdoff= [KNL]
|
rcutorture.stall_cpu_holdoff= [KNL]
|
||||||
Time to wait (s) after boot before inducing stall.
|
Time to wait (s) after boot before inducing stall.
|
||||||
|
|
||||||
|
rcutorture.stall_cpu_irqsoff= [KNL]
|
||||||
|
Disable interrupts while stalling if set.
|
||||||
|
|
||||||
rcutorture.stat_interval= [KNL]
|
rcutorture.stat_interval= [KNL]
|
||||||
Time (s) between statistics printk()s.
|
Time (s) between statistics printk()s.
|
||||||
|
|
||||||
@@ -3885,6 +3917,12 @@
|
|||||||
[KNL] Should the soft-lockup detector generate panics.
|
[KNL] Should the soft-lockup detector generate panics.
|
||||||
Format: <integer>
|
Format: <integer>
|
||||||
|
|
||||||
|
A nonzero value instructs the soft-lockup detector
|
||||||
|
to panic the machine when a soft-lockup occurs. This
|
||||||
|
is also controlled by CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC
|
||||||
|
which is the respective build-time switch to that
|
||||||
|
functionality.
|
||||||
|
|
||||||
softlockup_all_cpu_backtrace=
|
softlockup_all_cpu_backtrace=
|
||||||
[KNL] Should the soft-lockup detector generate
|
[KNL] Should the soft-lockup detector generate
|
||||||
backtraces on all cpus.
|
backtraces on all cpus.
|
||||||
@@ -4194,12 +4232,15 @@
|
|||||||
Used to run time disable IRQ_TIME_ACCOUNTING on any
|
Used to run time disable IRQ_TIME_ACCOUNTING on any
|
||||||
platforms where RDTSC is slow and this accounting
|
platforms where RDTSC is slow and this accounting
|
||||||
can add overhead.
|
can add overhead.
|
||||||
|
[x86] unstable: mark the TSC clocksource as unstable, this
|
||||||
|
marks the TSC unconditionally unstable at bootup and
|
||||||
|
avoids any further wobbles once the TSC watchdog notices.
|
||||||
|
|
||||||
turbografx.map[2|3]= [HW,JOY]
|
turbografx.map[2|3]= [HW,JOY]
|
||||||
TurboGraFX parallel port interface
|
TurboGraFX parallel port interface
|
||||||
Format:
|
Format:
|
||||||
<port#>,<js1>,<js2>,<js3>,<js4>,<js5>,<js6>,<js7>
|
<port#>,<js1>,<js2>,<js3>,<js4>,<js5>,<js6>,<js7>
|
||||||
See also Documentation/input/joystick-parport.txt
|
See also Documentation/input/devices/joystick-parport.rst
|
||||||
|
|
||||||
udbg-immortal [PPC] When debugging early kernel crashes that
|
udbg-immortal [PPC] When debugging early kernel crashes that
|
||||||
happen after console_init() and before a proper
|
happen after console_init() and before a proper
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ step-by-step instructions for how a user can trigger the bug.
|
|||||||
|
|
||||||
If the failure includes an "OOPS:", take a picture of the screen, capture
|
If the failure includes an "OOPS:", take a picture of the screen, capture
|
||||||
a netconsole trace, or type the message from your screen into the bug
|
a netconsole trace, or type the message from your screen into the bug
|
||||||
report. Please read "Documentation/admin-guide/oops-tracing.rst" before posting your
|
report. Please read "Documentation/admin-guide/bug-hunting.rst" before posting your
|
||||||
bug report. This explains what you should do with the "Oops" information
|
bug report. This explains what you should do with the "Oops" information
|
||||||
to make it useful to the recipient.
|
to make it useful to the recipient.
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ summary from [1.]>" for easy identification by the developers::
|
|||||||
[4.2.] Kernel .config file:
|
[4.2.] Kernel .config file:
|
||||||
[5.] Most recent kernel version which did not have the bug:
|
[5.] Most recent kernel version which did not have the bug:
|
||||||
[6.] Output of Oops.. message (if applicable) with symbolic information
|
[6.] Output of Oops.. message (if applicable) with symbolic information
|
||||||
resolved (see Documentation/admin-guide/oops-tracing.rst)
|
resolved (see Documentation/admin-guide/bug-hunting.rst)
|
||||||
[7.] A small shell script or example program which triggers the
|
[7.] A small shell script or example program which triggers the
|
||||||
problem (if possible)
|
problem (if possible)
|
||||||
[8.] Environment
|
[8.] Environment
|
||||||
|
|||||||
@@ -197,3 +197,42 @@ information is missing.
|
|||||||
|
|
||||||
To recover from this mode, one needs to flash a valid NVM image to the
|
To recover from this mode, one needs to flash a valid NVM image to the
|
||||||
host host controller in the same way it is done in the previous chapter.
|
host host controller in the same way it is done in the previous chapter.
|
||||||
|
|
||||||
|
Networking over Thunderbolt cable
|
||||||
|
---------------------------------
|
||||||
|
Thunderbolt technology allows software communication across two hosts
|
||||||
|
connected by a Thunderbolt cable.
|
||||||
|
|
||||||
|
It is possible to tunnel any kind of traffic over Thunderbolt link but
|
||||||
|
currently we only support Apple ThunderboltIP protocol.
|
||||||
|
|
||||||
|
If the other host is running Windows or macOS only thing you need to
|
||||||
|
do is to connect Thunderbolt cable between the two hosts, the
|
||||||
|
``thunderbolt-net`` is loaded automatically. If the other host is also
|
||||||
|
Linux you should load ``thunderbolt-net`` manually on one host (it does
|
||||||
|
not matter which one)::
|
||||||
|
|
||||||
|
# modprobe thunderbolt-net
|
||||||
|
|
||||||
|
This triggers module load on the other host automatically. If the driver
|
||||||
|
is built-in to the kernel image, there is no need to do anything.
|
||||||
|
|
||||||
|
The driver will create one virtual ethernet interface per Thunderbolt
|
||||||
|
port which are named like ``thunderbolt0`` and so on. From this point
|
||||||
|
you can either use standard userspace tools like ``ifconfig`` to
|
||||||
|
configure the interface or let your GUI to handle it automatically.
|
||||||
|
|
||||||
|
Forcing power
|
||||||
|
-------------
|
||||||
|
Many OEMs include a method that can be used to force the power of a
|
||||||
|
thunderbolt controller to an "On" state even if nothing is connected.
|
||||||
|
If supported by your machine this will be exposed by the WMI bus with
|
||||||
|
a sysfs attribute called "force_power".
|
||||||
|
|
||||||
|
For example the intel-wmi-thunderbolt driver exposes this attribute in:
|
||||||
|
/sys/devices/platform/PNP0C14:00/wmi_bus/wmi_bus-PNP0C14:00/86CCFD48-205E-4A77-9C48-2021CBEDE341/force_power
|
||||||
|
|
||||||
|
To force the power to on, write 1 to this attribute file.
|
||||||
|
To disable force power, write 0 to this attribute file.
|
||||||
|
|
||||||
|
Note: it's currently not possible to query the force power state of a platform.
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ SunXi family
|
|||||||
|
|
||||||
- Next Thing Co GR8 (sun5i)
|
- Next Thing Co GR8 (sun5i)
|
||||||
|
|
||||||
|
* Single ARM Cortex-A7 based SoCs
|
||||||
|
- Allwinner V3s (sun8i)
|
||||||
|
+ Datasheet
|
||||||
|
http://linux-sunxi.org/File:Allwinner_V3s_Datasheet_V1.0.pdf
|
||||||
|
|
||||||
* Dual ARM Cortex-A7 based SoCs
|
* Dual ARM Cortex-A7 based SoCs
|
||||||
- Allwinner A20 (sun7i)
|
- Allwinner A20 (sun7i)
|
||||||
+ User Manual
|
+ User Manual
|
||||||
@@ -71,9 +76,11 @@ SunXi family
|
|||||||
+ Datasheet
|
+ Datasheet
|
||||||
http://dl.linux-sunxi.org/H3/Allwinner_H3_Datasheet_V1.0.pdf
|
http://dl.linux-sunxi.org/H3/Allwinner_H3_Datasheet_V1.0.pdf
|
||||||
|
|
||||||
- Allwinner V3s (sun8i)
|
- Allwinner R40 (sun8i)
|
||||||
+ Datasheet
|
+ Datasheet
|
||||||
http://linux-sunxi.org/File:Allwinner_V3s_Datasheet_V1.0.pdf
|
https://github.com/tinalinux/docs/raw/r40-v1.y/R40_Datasheet_V1.0.pdf
|
||||||
|
+ User Manual
|
||||||
|
https://github.com/tinalinux/docs/raw/r40-v1.y/Allwinner_R40_User_Manual_V1.0.pdf
|
||||||
|
|
||||||
* Quad ARM Cortex-A15, Quad ARM Cortex-A7 based SoCs
|
* Quad ARM Cortex-A15, Quad ARM Cortex-A7 based SoCs
|
||||||
- Allwinner A80
|
- Allwinner A80
|
||||||
|
|||||||
@@ -110,10 +110,20 @@ infrastructure:
|
|||||||
x--------------------------------------------------x
|
x--------------------------------------------------x
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
| RES0 | [63-32] | n |
|
| RES0 | [63-48] | n |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| DP | [47-44] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| SM4 | [43-40] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| SM3 | [39-36] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| SHA3 | [35-32] | y |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
| RDM | [31-28] | y |
|
| RDM | [31-28] | y |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
|
| RES0 | [27-24] | n |
|
||||||
|
|--------------------------------------------------|
|
||||||
| ATOMICS | [23-20] | y |
|
| ATOMICS | [23-20] | y |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
| CRC32 | [19-16] | y |
|
| CRC32 | [19-16] | y |
|
||||||
@@ -132,7 +142,11 @@ infrastructure:
|
|||||||
x--------------------------------------------------x
|
x--------------------------------------------------x
|
||||||
| Name | bits | visible |
|
| Name | bits | visible |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
| RES0 | [63-28] | n |
|
| RES0 | [63-36] | n |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| SVE | [35-32] | y |
|
||||||
|
|--------------------------------------------------|
|
||||||
|
| RES0 | [31-28] | n |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
| GIC | [27-24] | n |
|
| GIC | [27-24] | n |
|
||||||
|--------------------------------------------------|
|
|--------------------------------------------------|
|
||||||
|
|||||||
160
Documentation/arm64/elf_hwcaps.txt
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
ARM64 ELF hwcaps
|
||||||
|
================
|
||||||
|
|
||||||
|
This document describes the usage and semantics of the arm64 ELF hwcaps.
|
||||||
|
|
||||||
|
|
||||||
|
1. Introduction
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Some hardware or software features are only available on some CPU
|
||||||
|
implementations, and/or with certain kernel configurations, but have no
|
||||||
|
architected discovery mechanism available to userspace code at EL0. The
|
||||||
|
kernel exposes the presence of these features to userspace through a set
|
||||||
|
of flags called hwcaps, exposed in the auxilliary vector.
|
||||||
|
|
||||||
|
Userspace software can test for features by acquiring the AT_HWCAP entry
|
||||||
|
of the auxilliary vector, and testing whether the relevant flags are
|
||||||
|
set, e.g.
|
||||||
|
|
||||||
|
bool floating_point_is_present(void)
|
||||||
|
{
|
||||||
|
unsigned long hwcaps = getauxval(AT_HWCAP);
|
||||||
|
if (hwcaps & HWCAP_FP)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Where software relies on a feature described by a hwcap, it should check
|
||||||
|
the relevant hwcap flag to verify that the feature is present before
|
||||||
|
attempting to make use of the feature.
|
||||||
|
|
||||||
|
Features cannot be probed reliably through other means. When a feature
|
||||||
|
is not available, attempting to use it may result in unpredictable
|
||||||
|
behaviour, and is not guaranteed to result in any reliable indication
|
||||||
|
that the feature is unavailable, such as a SIGILL.
|
||||||
|
|
||||||
|
|
||||||
|
2. Interpretation of hwcaps
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
The majority of hwcaps are intended to indicate the presence of features
|
||||||
|
which are described by architected ID registers inaccessible to
|
||||||
|
userspace code at EL0. These hwcaps are defined in terms of ID register
|
||||||
|
fields, and should be interpreted with reference to the definition of
|
||||||
|
these fields in the ARM Architecture Reference Manual (ARM ARM).
|
||||||
|
|
||||||
|
Such hwcaps are described below in the form:
|
||||||
|
|
||||||
|
Functionality implied by idreg.field == val.
|
||||||
|
|
||||||
|
Such hwcaps indicate the availability of functionality that the ARM ARM
|
||||||
|
defines as being present when idreg.field has value val, but do not
|
||||||
|
indicate that idreg.field is precisely equal to val, nor do they
|
||||||
|
indicate the absence of functionality implied by other values of
|
||||||
|
idreg.field.
|
||||||
|
|
||||||
|
Other hwcaps may indicate the presence of features which cannot be
|
||||||
|
described by ID registers alone. These may be described without
|
||||||
|
reference to ID registers, and may refer to other documentation.
|
||||||
|
|
||||||
|
|
||||||
|
3. The hwcaps exposed in AT_HWCAP
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
HWCAP_FP
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64PFR0_EL1.FP == 0b0000.
|
||||||
|
|
||||||
|
HWCAP_ASIMD
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0000.
|
||||||
|
|
||||||
|
HWCAP_EVTSTRM
|
||||||
|
|
||||||
|
The generic timer is configured to generate events at a frequency of
|
||||||
|
approximately 100KHz.
|
||||||
|
|
||||||
|
HWCAP_AES
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.AES == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_PMULL
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.AES == 0b0010.
|
||||||
|
|
||||||
|
HWCAP_SHA1
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SHA1 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_SHA2
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_CRC32
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.CRC32 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_ATOMICS
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0010.
|
||||||
|
|
||||||
|
HWCAP_FPHP
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64PFR0_EL1.FP == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_ASIMDHP
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64PFR0_EL1.AdvSIMD == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_CPUID
|
||||||
|
|
||||||
|
EL0 access to certain ID registers is available, to the extent
|
||||||
|
described by Documentation/arm64/cpu-feature-registers.txt.
|
||||||
|
|
||||||
|
These ID registers may imply the availability of features.
|
||||||
|
|
||||||
|
HWCAP_ASIMDRDM
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.RDM == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_JSCVT
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.JSCVT == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_FCMA
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.FCMA == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_LRCPC
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.LRCPC == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_DCPOP
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR1_EL1.DPB == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_SHA3
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SHA3 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_SM3
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SM3 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_SM4
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SM4 == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_ASIMDDP
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.DP == 0b0001.
|
||||||
|
|
||||||
|
HWCAP_SHA512
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64ISAR0_EL1.SHA2 == 0b0002.
|
||||||
|
|
||||||
|
HWCAP_SVE
|
||||||
|
|
||||||
|
Functionality implied by ID_AA64PFR0_EL1.SVE == 0b0001.
|
||||||
@@ -86,9 +86,9 @@ Translation table lookup with 64KB pages:
|
|||||||
+-------------------------------------------------> [63] TTBR0/1
|
+-------------------------------------------------> [63] TTBR0/1
|
||||||
|
|
||||||
|
|
||||||
When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
|
When using KVM without the Virtualization Host Extensions, the hypervisor
|
||||||
offset from the kernel VA (top 24bits of the kernel VA set to zero):
|
maps kernel pages in EL2 at a fixed offset from the kernel VA. See the
|
||||||
|
kern_hyp_va macro for more details.
|
||||||
|
|
||||||
Start End Size Use
|
When using KVM with the Virtualization Host Extensions, no additional
|
||||||
-----------------------------------------------------------------------
|
mappings are created, since the host kernel runs directly in EL2.
|
||||||
0000004000000000 0000007fffffffff 256GB kernel objects mapped in HYP
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ stable kernels.
|
|||||||
| | | | |
|
| | | | |
|
||||||
| Hisilicon | Hip0{5,6,7} | #161010101 | HISILICON_ERRATUM_161010101 |
|
| Hisilicon | Hip0{5,6,7} | #161010101 | HISILICON_ERRATUM_161010101 |
|
||||||
| Hisilicon | Hip0{6,7} | #161010701 | N/A |
|
| Hisilicon | Hip0{6,7} | #161010701 | N/A |
|
||||||
|
| Hisilicon | Hip07 | #161600802 | HISILICON_ERRATUM_161600802 |
|
||||||
| | | | |
|
| | | | |
|
||||||
| Qualcomm Tech. | Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
| Qualcomm Tech. | Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
||||||
| Qualcomm Tech. | Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
| Qualcomm Tech. | Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
||||||
|
|||||||
508
Documentation/arm64/sve.txt
Normal file
@@ -0,0 +1,508 @@
|
|||||||
|
Scalable Vector Extension support for AArch64 Linux
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
Author: Dave Martin <Dave.Martin@arm.com>
|
||||||
|
Date: 4 August 2017
|
||||||
|
|
||||||
|
This document outlines briefly the interface provided to userspace by Linux in
|
||||||
|
order to support use of the ARM Scalable Vector Extension (SVE).
|
||||||
|
|
||||||
|
This is an outline of the most important features and issues only and not
|
||||||
|
intended to be exhaustive.
|
||||||
|
|
||||||
|
This document does not aim to describe the SVE architecture or programmer's
|
||||||
|
model. To aid understanding, a minimal description of relevant programmer's
|
||||||
|
model features for SVE is included in Appendix A.
|
||||||
|
|
||||||
|
|
||||||
|
1. General
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* SVE registers Z0..Z31, P0..P15 and FFR and the current vector length VL, are
|
||||||
|
tracked per-thread.
|
||||||
|
|
||||||
|
* The presence of SVE is reported to userspace via HWCAP_SVE in the aux vector
|
||||||
|
AT_HWCAP entry. Presence of this flag implies the presence of the SVE
|
||||||
|
instructions and registers, and the Linux-specific system interfaces
|
||||||
|
described in this document. SVE is reported in /proc/cpuinfo as "sve".
|
||||||
|
|
||||||
|
* Support for the execution of SVE instructions in userspace can also be
|
||||||
|
detected by reading the CPU ID register ID_AA64PFR0_EL1 using an MRS
|
||||||
|
instruction, and checking that the value of the SVE field is nonzero. [3]
|
||||||
|
|
||||||
|
It does not guarantee the presence of the system interfaces described in the
|
||||||
|
following sections: software that needs to verify that those interfaces are
|
||||||
|
present must check for HWCAP_SVE instead.
|
||||||
|
|
||||||
|
* Debuggers should restrict themselves to interacting with the target via the
|
||||||
|
NT_ARM_SVE regset. The recommended way of detecting support for this regset
|
||||||
|
is to connect to a target process first and then attempt a
|
||||||
|
ptrace(PTRACE_GETREGSET, pid, NT_ARM_SVE, &iov).
|
||||||
|
|
||||||
|
|
||||||
|
2. Vector length terminology
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
The size of an SVE vector (Z) register is referred to as the "vector length".
|
||||||
|
|
||||||
|
To avoid confusion about the units used to express vector length, the kernel
|
||||||
|
adopts the following conventions:
|
||||||
|
|
||||||
|
* Vector length (VL) = size of a Z-register in bytes
|
||||||
|
|
||||||
|
* Vector quadwords (VQ) = size of a Z-register in units of 128 bits
|
||||||
|
|
||||||
|
(So, VL = 16 * VQ.)
|
||||||
|
|
||||||
|
The VQ convention is used where the underlying granularity is important, such
|
||||||
|
as in data structure definitions. In most other situations, the VL convention
|
||||||
|
is used. This is consistent with the meaning of the "VL" pseudo-register in
|
||||||
|
the SVE instruction set architecture.
|
||||||
|
|
||||||
|
|
||||||
|
3. System call behaviour
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
* On syscall, V0..V31 are preserved (as without SVE). Thus, bits [127:0] of
|
||||||
|
Z0..Z31 are preserved. All other bits of Z0..Z31, and all of P0..P15 and FFR
|
||||||
|
become unspecified on return from a syscall.
|
||||||
|
|
||||||
|
* The SVE registers are not used to pass arguments to or receive results from
|
||||||
|
any syscall.
|
||||||
|
|
||||||
|
* In practice the affected registers/bits will be preserved or will be replaced
|
||||||
|
with zeros on return from a syscall, but userspace should not make
|
||||||
|
assumptions about this. The kernel behaviour may vary on a case-by-case
|
||||||
|
basis.
|
||||||
|
|
||||||
|
* All other SVE state of a thread, including the currently configured vector
|
||||||
|
length, the state of the PR_SVE_VL_INHERIT flag, and the deferred vector
|
||||||
|
length (if any), is preserved across all syscalls, subject to the specific
|
||||||
|
exceptions for execve() described in section 6.
|
||||||
|
|
||||||
|
In particular, on return from a fork() or clone(), the parent and new child
|
||||||
|
process or thread share identical SVE configuration, matching that of the
|
||||||
|
parent before the call.
|
||||||
|
|
||||||
|
|
||||||
|
4. Signal handling
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
* A new signal frame record sve_context encodes the SVE registers on signal
|
||||||
|
delivery. [1]
|
||||||
|
|
||||||
|
* This record is supplementary to fpsimd_context. The FPSR and FPCR registers
|
||||||
|
are only present in fpsimd_context. For convenience, the content of V0..V31
|
||||||
|
is duplicated between sve_context and fpsimd_context.
|
||||||
|
|
||||||
|
* The signal frame record for SVE always contains basic metadata, in particular
|
||||||
|
the thread's vector length (in sve_context.vl).
|
||||||
|
|
||||||
|
* The SVE registers may or may not be included in the record, depending on
|
||||||
|
whether the registers are live for the thread. The registers are present if
|
||||||
|
and only if:
|
||||||
|
sve_context.head.size >= SVE_SIG_CONTEXT_SIZE(sve_vq_from_vl(sve_context.vl)).
|
||||||
|
|
||||||
|
* If the registers are present, the remainder of the record has a vl-dependent
|
||||||
|
size and layout. Macros SVE_SIG_* are defined [1] to facilitate access to
|
||||||
|
the members.
|
||||||
|
|
||||||
|
* If the SVE context is too big to fit in sigcontext.__reserved[], then extra
|
||||||
|
space is allocated on the stack, an extra_context record is written in
|
||||||
|
__reserved[] referencing this space. sve_context is then written in the
|
||||||
|
extra space. Refer to [1] for further details about this mechanism.
|
||||||
|
|
||||||
|
|
||||||
|
5. Signal return
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
When returning from a signal handler:
|
||||||
|
|
||||||
|
* If there is no sve_context record in the signal frame, or if the record is
|
||||||
|
present but contains no register data as desribed in the previous section,
|
||||||
|
then the SVE registers/bits become non-live and take unspecified values.
|
||||||
|
|
||||||
|
* If sve_context is present in the signal frame and contains full register
|
||||||
|
data, the SVE registers become live and are populated with the specified
|
||||||
|
data. However, for backward compatibility reasons, bits [127:0] of Z0..Z31
|
||||||
|
are always restored from the corresponding members of fpsimd_context.vregs[]
|
||||||
|
and not from sve_context. The remaining bits are restored from sve_context.
|
||||||
|
|
||||||
|
* Inclusion of fpsimd_context in the signal frame remains mandatory,
|
||||||
|
irrespective of whether sve_context is present or not.
|
||||||
|
|
||||||
|
* The vector length cannot be changed via signal return. If sve_context.vl in
|
||||||
|
the signal frame does not match the current vector length, the signal return
|
||||||
|
attempt is treated as illegal, resulting in a forced SIGSEGV.
|
||||||
|
|
||||||
|
|
||||||
|
6. prctl extensions
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Some new prctl() calls are added to allow programs to manage the SVE vector
|
||||||
|
length:
|
||||||
|
|
||||||
|
prctl(PR_SVE_SET_VL, unsigned long arg)
|
||||||
|
|
||||||
|
Sets the vector length of the calling thread and related flags, where
|
||||||
|
arg == vl | flags. Other threads of the calling process are unaffected.
|
||||||
|
|
||||||
|
vl is the desired vector length, where sve_vl_valid(vl) must be true.
|
||||||
|
|
||||||
|
flags:
|
||||||
|
|
||||||
|
PR_SVE_SET_VL_INHERIT
|
||||||
|
|
||||||
|
Inherit the current vector length across execve(). Otherwise, the
|
||||||
|
vector length is reset to the system default at execve(). (See
|
||||||
|
Section 9.)
|
||||||
|
|
||||||
|
PR_SVE_SET_VL_ONEXEC
|
||||||
|
|
||||||
|
Defer the requested vector length change until the next execve()
|
||||||
|
performed by this thread.
|
||||||
|
|
||||||
|
The effect is equivalent to implicit exceution of the following
|
||||||
|
call immediately after the next execve() (if any) by the thread:
|
||||||
|
|
||||||
|
prctl(PR_SVE_SET_VL, arg & ~PR_SVE_SET_VL_ONEXEC)
|
||||||
|
|
||||||
|
This allows launching of a new program with a different vector
|
||||||
|
length, while avoiding runtime side effects in the caller.
|
||||||
|
|
||||||
|
|
||||||
|
Without PR_SVE_SET_VL_ONEXEC, the requested change takes effect
|
||||||
|
immediately.
|
||||||
|
|
||||||
|
|
||||||
|
Return value: a nonnegative on success, or a negative value on error:
|
||||||
|
EINVAL: SVE not supported, invalid vector length requested, or
|
||||||
|
invalid flags.
|
||||||
|
|
||||||
|
|
||||||
|
On success:
|
||||||
|
|
||||||
|
* Either the calling thread's vector length or the deferred vector length
|
||||||
|
to be applied at the next execve() by the thread (dependent on whether
|
||||||
|
PR_SVE_SET_VL_ONEXEC is present in arg), is set to the largest value
|
||||||
|
supported by the system that is less than or equal to vl. If vl ==
|
||||||
|
SVE_VL_MAX, the value set will be the largest value supported by the
|
||||||
|
system.
|
||||||
|
|
||||||
|
* Any previously outstanding deferred vector length change in the calling
|
||||||
|
thread is cancelled.
|
||||||
|
|
||||||
|
* The returned value describes the resulting configuration, encoded as for
|
||||||
|
PR_SVE_GET_VL. The vector length reported in this value is the new
|
||||||
|
current vector length for this thread if PR_SVE_SET_VL_ONEXEC was not
|
||||||
|
present in arg; otherwise, the reported vector length is the deferred
|
||||||
|
vector length that will be applied at the next execve() by the calling
|
||||||
|
thread.
|
||||||
|
|
||||||
|
* Changing the vector length causes all of P0..P15, FFR and all bits of
|
||||||
|
Z0..V31 except for Z0 bits [127:0] .. Z31 bits [127:0] to become
|
||||||
|
unspecified. Calling PR_SVE_SET_VL with vl equal to the thread's current
|
||||||
|
vector length, or calling PR_SVE_SET_VL with the PR_SVE_SET_VL_ONEXEC
|
||||||
|
flag, does not constitute a change to the vector length for this purpose.
|
||||||
|
|
||||||
|
|
||||||
|
prctl(PR_SVE_GET_VL)
|
||||||
|
|
||||||
|
Gets the vector length of the calling thread.
|
||||||
|
|
||||||
|
The following flag may be OR-ed into the result:
|
||||||
|
|
||||||
|
PR_SVE_SET_VL_INHERIT
|
||||||
|
|
||||||
|
Vector length will be inherited across execve().
|
||||||
|
|
||||||
|
There is no way to determine whether there is an outstanding deferred
|
||||||
|
vector length change (which would only normally be the case between a
|
||||||
|
fork() or vfork() and the corresponding execve() in typical use).
|
||||||
|
|
||||||
|
To extract the vector length from the result, and it with
|
||||||
|
PR_SVE_VL_LEN_MASK.
|
||||||
|
|
||||||
|
Return value: a nonnegative value on success, or a negative value on error:
|
||||||
|
EINVAL: SVE not supported.
|
||||||
|
|
||||||
|
|
||||||
|
7. ptrace extensions
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
* A new regset NT_ARM_SVE is defined for use with PTRACE_GETREGSET and
|
||||||
|
PTRACE_SETREGSET.
|
||||||
|
|
||||||
|
Refer to [2] for definitions.
|
||||||
|
|
||||||
|
The regset data starts with struct user_sve_header, containing:
|
||||||
|
|
||||||
|
size
|
||||||
|
|
||||||
|
Size of the complete regset, in bytes.
|
||||||
|
This depends on vl and possibly on other things in the future.
|
||||||
|
|
||||||
|
If a call to PTRACE_GETREGSET requests less data than the value of
|
||||||
|
size, the caller can allocate a larger buffer and retry in order to
|
||||||
|
read the complete regset.
|
||||||
|
|
||||||
|
max_size
|
||||||
|
|
||||||
|
Maximum size in bytes that the regset can grow to for the target
|
||||||
|
thread. The regset won't grow bigger than this even if the target
|
||||||
|
thread changes its vector length etc.
|
||||||
|
|
||||||
|
vl
|
||||||
|
|
||||||
|
Target thread's current vector length, in bytes.
|
||||||
|
|
||||||
|
max_vl
|
||||||
|
|
||||||
|
Maximum possible vector length for the target thread.
|
||||||
|
|
||||||
|
flags
|
||||||
|
|
||||||
|
either
|
||||||
|
|
||||||
|
SVE_PT_REGS_FPSIMD
|
||||||
|
|
||||||
|
SVE registers are not live (GETREGSET) or are to be made
|
||||||
|
non-live (SETREGSET).
|
||||||
|
|
||||||
|
The payload is of type struct user_fpsimd_state, with the same
|
||||||
|
meaning as for NT_PRFPREG, starting at offset
|
||||||
|
SVE_PT_FPSIMD_OFFSET from the start of user_sve_header.
|
||||||
|
|
||||||
|
Extra data might be appended in the future: the size of the
|
||||||
|
payload should be obtained using SVE_PT_FPSIMD_SIZE(vq, flags).
|
||||||
|
|
||||||
|
vq should be obtained using sve_vq_from_vl(vl).
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
SVE_PT_REGS_SVE
|
||||||
|
|
||||||
|
SVE registers are live (GETREGSET) or are to be made live
|
||||||
|
(SETREGSET).
|
||||||
|
|
||||||
|
The payload contains the SVE register data, starting at offset
|
||||||
|
SVE_PT_SVE_OFFSET from the start of user_sve_header, and with
|
||||||
|
size SVE_PT_SVE_SIZE(vq, flags);
|
||||||
|
|
||||||
|
... OR-ed with zero or more of the following flags, which have the same
|
||||||
|
meaning and behaviour as the corresponding PR_SET_VL_* flags:
|
||||||
|
|
||||||
|
SVE_PT_VL_INHERIT
|
||||||
|
|
||||||
|
SVE_PT_VL_ONEXEC (SETREGSET only).
|
||||||
|
|
||||||
|
* The effects of changing the vector length and/or flags are equivalent to
|
||||||
|
those documented for PR_SVE_SET_VL.
|
||||||
|
|
||||||
|
The caller must make a further GETREGSET call if it needs to know what VL is
|
||||||
|
actually set by SETREGSET, unless is it known in advance that the requested
|
||||||
|
VL is supported.
|
||||||
|
|
||||||
|
* In the SVE_PT_REGS_SVE case, the size and layout of the payload depends on
|
||||||
|
the header fields. The SVE_PT_SVE_*() macros are provided to facilitate
|
||||||
|
access to the members.
|
||||||
|
|
||||||
|
* In either case, for SETREGSET it is permissible to omit the payload, in which
|
||||||
|
case only the vector length and flags are changed (along with any
|
||||||
|
consequences of those changes).
|
||||||
|
|
||||||
|
* For SETREGSET, if an SVE_PT_REGS_SVE payload is present and the
|
||||||
|
requested VL is not supported, the effect will be the same as if the
|
||||||
|
payload were omitted, except that an EIO error is reported. No
|
||||||
|
attempt is made to translate the payload data to the correct layout
|
||||||
|
for the vector length actually set. The thread's FPSIMD state is
|
||||||
|
preserved, but the remaining bits of the SVE registers become
|
||||||
|
unspecified. It is up to the caller to translate the payload layout
|
||||||
|
for the actual VL and retry.
|
||||||
|
|
||||||
|
* The effect of writing a partial, incomplete payload is unspecified.
|
||||||
|
|
||||||
|
|
||||||
|
8. ELF coredump extensions
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* A NT_ARM_SVE note will be added to each coredump for each thread of the
|
||||||
|
dumped process. The contents will be equivalent to the data that would have
|
||||||
|
been read if a PTRACE_GETREGSET of NT_ARM_SVE were executed for each thread
|
||||||
|
when the coredump was generated.
|
||||||
|
|
||||||
|
|
||||||
|
9. System runtime configuration
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
* To mitigate the ABI impact of expansion of the signal frame, a policy
|
||||||
|
mechanism is provided for administrators, distro maintainers and developers
|
||||||
|
to set the default vector length for userspace processes:
|
||||||
|
|
||||||
|
/proc/sys/abi/sve_default_vector_length
|
||||||
|
|
||||||
|
Writing the text representation of an integer to this file sets the system
|
||||||
|
default vector length to the specified value, unless the value is greater
|
||||||
|
than the maximum vector length supported by the system in which case the
|
||||||
|
default vector length is set to that maximum.
|
||||||
|
|
||||||
|
The result can be determined by reopening the file and reading its
|
||||||
|
contents.
|
||||||
|
|
||||||
|
At boot, the default vector length is initially set to 64 or the maximum
|
||||||
|
supported vector length, whichever is smaller. This determines the initial
|
||||||
|
vector length of the init process (PID 1).
|
||||||
|
|
||||||
|
Reading this file returns the current system default vector length.
|
||||||
|
|
||||||
|
* At every execve() call, the new vector length of the new process is set to
|
||||||
|
the system default vector length, unless
|
||||||
|
|
||||||
|
* PR_SVE_SET_VL_INHERIT (or equivalently SVE_PT_VL_INHERIT) is set for the
|
||||||
|
calling thread, or
|
||||||
|
|
||||||
|
* a deferred vector length change is pending, established via the
|
||||||
|
PR_SVE_SET_VL_ONEXEC flag (or SVE_PT_VL_ONEXEC).
|
||||||
|
|
||||||
|
* Modifying the system default vector length does not affect the vector length
|
||||||
|
of any existing process or thread that does not make an execve() call.
|
||||||
|
|
||||||
|
|
||||||
|
Appendix A. SVE programmer's model (informative)
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
This section provides a minimal description of the additions made by SVE to the
|
||||||
|
ARMv8-A programmer's model that are relevant to this document.
|
||||||
|
|
||||||
|
Note: This section is for information only and not intended to be complete or
|
||||||
|
to replace any architectural specification.
|
||||||
|
|
||||||
|
A.1. Registers
|
||||||
|
---------------
|
||||||
|
|
||||||
|
In A64 state, SVE adds the following:
|
||||||
|
|
||||||
|
* 32 8VL-bit vector registers Z0..Z31
|
||||||
|
For each Zn, Zn bits [127:0] alias the ARMv8-A vector register Vn.
|
||||||
|
|
||||||
|
A register write using a Vn register name zeros all bits of the corresponding
|
||||||
|
Zn except for bits [127:0].
|
||||||
|
|
||||||
|
* 16 VL-bit predicate registers P0..P15
|
||||||
|
|
||||||
|
* 1 VL-bit special-purpose predicate register FFR (the "first-fault register")
|
||||||
|
|
||||||
|
* a VL "pseudo-register" that determines the size of each vector register
|
||||||
|
|
||||||
|
The SVE instruction set architecture provides no way to write VL directly.
|
||||||
|
Instead, it can be modified only by EL1 and above, by writing appropriate
|
||||||
|
system registers.
|
||||||
|
|
||||||
|
* The value of VL can be configured at runtime by EL1 and above:
|
||||||
|
16 <= VL <= VLmax, where VL must be a multiple of 16.
|
||||||
|
|
||||||
|
* The maximum vector length is determined by the hardware:
|
||||||
|
16 <= VLmax <= 256.
|
||||||
|
|
||||||
|
(The SVE architecture specifies 256, but permits future architecture
|
||||||
|
revisions to raise this limit.)
|
||||||
|
|
||||||
|
* FPSR and FPCR are retained from ARMv8-A, and interact with SVE floating-point
|
||||||
|
operations in a similar way to the way in which they interact with ARMv8
|
||||||
|
floating-point operations.
|
||||||
|
|
||||||
|
8VL-1 128 0 bit index
|
||||||
|
+---- //// -----------------+
|
||||||
|
Z0 | : V0 |
|
||||||
|
: :
|
||||||
|
Z7 | : V7 |
|
||||||
|
Z8 | : * V8 |
|
||||||
|
: : :
|
||||||
|
Z15 | : *V15 |
|
||||||
|
Z16 | : V16 |
|
||||||
|
: :
|
||||||
|
Z31 | : V31 |
|
||||||
|
+---- //// -----------------+
|
||||||
|
31 0
|
||||||
|
VL-1 0 +-------+
|
||||||
|
+---- //// --+ FPSR | |
|
||||||
|
P0 | | +-------+
|
||||||
|
: | | *FPCR | |
|
||||||
|
P15 | | +-------+
|
||||||
|
+---- //// --+
|
||||||
|
FFR | | +-----+
|
||||||
|
+---- //// --+ VL | |
|
||||||
|
+-----+
|
||||||
|
|
||||||
|
(*) callee-save:
|
||||||
|
This only applies to bits [63:0] of Z-/V-registers.
|
||||||
|
FPCR contains callee-save and caller-save bits. See [4] for details.
|
||||||
|
|
||||||
|
|
||||||
|
A.2. Procedure call standard
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
The ARMv8-A base procedure call standard is extended as follows with respect to
|
||||||
|
the additional SVE register state:
|
||||||
|
|
||||||
|
* All SVE register bits that are not shared with FP/SIMD are caller-save.
|
||||||
|
|
||||||
|
* Z8 bits [63:0] .. Z15 bits [63:0] are callee-save.
|
||||||
|
|
||||||
|
This follows from the way these bits are mapped to V8..V15, which are caller-
|
||||||
|
save in the base procedure call standard.
|
||||||
|
|
||||||
|
|
||||||
|
Appendix B. ARMv8-A FP/SIMD programmer's model
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
Note: This section is for information only and not intended to be complete or
|
||||||
|
to replace any architectural specification.
|
||||||
|
|
||||||
|
Refer to [4] for for more information.
|
||||||
|
|
||||||
|
ARMv8-A defines the following floating-point / SIMD register state:
|
||||||
|
|
||||||
|
* 32 128-bit vector registers V0..V31
|
||||||
|
* 2 32-bit status/control registers FPSR, FPCR
|
||||||
|
|
||||||
|
127 0 bit index
|
||||||
|
+---------------+
|
||||||
|
V0 | |
|
||||||
|
: : :
|
||||||
|
V7 | |
|
||||||
|
* V8 | |
|
||||||
|
: : : :
|
||||||
|
*V15 | |
|
||||||
|
V16 | |
|
||||||
|
: : :
|
||||||
|
V31 | |
|
||||||
|
+---------------+
|
||||||
|
|
||||||
|
31 0
|
||||||
|
+-------+
|
||||||
|
FPSR | |
|
||||||
|
+-------+
|
||||||
|
*FPCR | |
|
||||||
|
+-------+
|
||||||
|
|
||||||
|
(*) callee-save:
|
||||||
|
This only applies to bits [63:0] of V-registers.
|
||||||
|
FPCR contains a mixture of callee-save and caller-save bits.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
[1] arch/arm64/include/uapi/asm/sigcontext.h
|
||||||
|
AArch64 Linux signal ABI definitions
|
||||||
|
|
||||||
|
[2] arch/arm64/include/uapi/asm/ptrace.h
|
||||||
|
AArch64 Linux ptrace ABI definitions
|
||||||
|
|
||||||
|
[3] linux/Documentation/arm64/cpu-feature-registers.txt
|
||||||
|
|
||||||
|
[4] ARM IHI0055C
|
||||||
|
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055c/IHI0055C_beta_aapcs64.pdf
|
||||||
|
http://infocenter.arm.com/help/topic/com.arm.doc.subset.swdev.abi/index.html
|
||||||
|
Procedure Call Standard for the ARM 64-bit Architecture (AArch64)
|
||||||
@@ -20,12 +20,27 @@ for that device, by setting low_latency to 0. See Section 3 for
|
|||||||
details on how to configure BFQ for the desired tradeoff between
|
details on how to configure BFQ for the desired tradeoff between
|
||||||
latency and throughput, or on how to maximize throughput.
|
latency and throughput, or on how to maximize throughput.
|
||||||
|
|
||||||
On average CPUs, the current version of BFQ can handle devices
|
BFQ has a non-null overhead, which limits the maximum IOPS that a CPU
|
||||||
performing at most ~30K IOPS; at most ~50 KIOPS on faster CPUs. As a
|
can process for a device scheduled with BFQ. To give an idea of the
|
||||||
reference, 30-50 KIOPS correspond to very high bandwidths with
|
limits on slow or average CPUs, here are, first, the limits of BFQ for
|
||||||
sequential I/O (e.g., 8-12 GB/s if I/O requests are 256 KB large), and
|
three different CPUs, on, respectively, an average laptop, an old
|
||||||
to 120-200 MB/s with 4KB random I/O. BFQ is currently being tested on
|
desktop, and a cheap embedded system, in case full hierarchical
|
||||||
multi-queue devices too.
|
support is enabled (i.e., CONFIG_BFQ_GROUP_IOSCHED is set), but
|
||||||
|
CONFIG_DEBUG_BLK_CGROUP is not set (Section 4-2):
|
||||||
|
- Intel i7-4850HQ: 400 KIOPS
|
||||||
|
- AMD A8-3850: 250 KIOPS
|
||||||
|
- ARM CortexTM-A53 Octa-core: 80 KIOPS
|
||||||
|
|
||||||
|
If CONFIG_DEBUG_BLK_CGROUP is set (and of course full hierarchical
|
||||||
|
support is enabled), then the sustainable throughput with BFQ
|
||||||
|
decreases, because all blkio.bfq* statistics are created and updated
|
||||||
|
(Section 4-2). For BFQ, this leads to the following maximum
|
||||||
|
sustainable throughputs, on the same systems as above:
|
||||||
|
- Intel i7-4850HQ: 310 KIOPS
|
||||||
|
- AMD A8-3850: 200 KIOPS
|
||||||
|
- ARM CortexTM-A53 Octa-core: 56 KIOPS
|
||||||
|
|
||||||
|
BFQ works for multi-queue devices too.
|
||||||
|
|
||||||
The table of contents follow. Impatients can just jump to Section 3.
|
The table of contents follow. Impatients can just jump to Section 3.
|
||||||
|
|
||||||
@@ -500,6 +515,22 @@ BFQ-specific files is "blkio.bfq." or "io.bfq." For example, the group
|
|||||||
parameter to set the weight of a group with BFQ is blkio.bfq.weight
|
parameter to set the weight of a group with BFQ is blkio.bfq.weight
|
||||||
or io.bfq.weight.
|
or io.bfq.weight.
|
||||||
|
|
||||||
|
As for cgroups-v1 (blkio controller), the exact set of stat files
|
||||||
|
created, and kept up-to-date by bfq, depends on whether
|
||||||
|
CONFIG_DEBUG_BLK_CGROUP is set. If it is set, then bfq creates all
|
||||||
|
the stat files documented in
|
||||||
|
Documentation/cgroup-v1/blkio-controller.txt. If, instead,
|
||||||
|
CONFIG_DEBUG_BLK_CGROUP is not set, then bfq creates only the files
|
||||||
|
blkio.bfq.io_service_bytes
|
||||||
|
blkio.bfq.io_service_bytes_recursive
|
||||||
|
blkio.bfq.io_serviced
|
||||||
|
blkio.bfq.io_serviced_recursive
|
||||||
|
|
||||||
|
The value of CONFIG_DEBUG_BLK_CGROUP greatly influences the maximum
|
||||||
|
throughput sustainable with bfq, because updating the blkio.bfq.*
|
||||||
|
stats is rather costly, especially for some of the stats enabled by
|
||||||
|
CONFIG_DEBUG_BLK_CGROUP.
|
||||||
|
|
||||||
Parameters to set
|
Parameters to set
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|||||||
@@ -216,10 +216,9 @@ may need to abort DMA operations and revert to PIO for the transfer, in
|
|||||||
which case a virtual mapping of the page is required. For SCSI it is also
|
which case a virtual mapping of the page is required. For SCSI it is also
|
||||||
done in some scenarios where the low level driver cannot be trusted to
|
done in some scenarios where the low level driver cannot be trusted to
|
||||||
handle a single sg entry correctly. The driver is expected to perform the
|
handle a single sg entry correctly. The driver is expected to perform the
|
||||||
kmaps as needed on such occasions using the __bio_kmap_atomic and bio_kmap_irq
|
kmaps as needed on such occasions as appropriate. A driver could also use
|
||||||
routines as appropriate. A driver could also use the blk_queue_bounce()
|
the blk_queue_bounce() routine on its own to bounce highmem i/o to low
|
||||||
routine on its own to bounce highmem i/o to low memory for specific requests
|
memory for specific requests if so desired.
|
||||||
if so desired.
|
|
||||||
|
|
||||||
iii. The i/o scheduler algorithm itself can be replaced/set as appropriate
|
iii. The i/o scheduler algorithm itself can be replaced/set as appropriate
|
||||||
|
|
||||||
@@ -1137,8 +1136,8 @@ use dma_map_sg for scatter gather) to be able to ship it to the driver. For
|
|||||||
PIO drivers (or drivers that need to revert to PIO transfer once in a
|
PIO drivers (or drivers that need to revert to PIO transfer once in a
|
||||||
while (IDE for example)), where the CPU is doing the actual data
|
while (IDE for example)), where the CPU is doing the actual data
|
||||||
transfer a virtual mapping is needed. If the driver supports highmem I/O,
|
transfer a virtual mapping is needed. If the driver supports highmem I/O,
|
||||||
(Sec 1.1, (ii) ) it needs to use __bio_kmap_atomic and bio_kmap_irq to
|
(Sec 1.1, (ii) ) it needs to use kmap_atomic or similar to temporarily map
|
||||||
temporarily map a bio into the virtual address space.
|
a bio into the virtual address space.
|
||||||
|
|
||||||
|
|
||||||
8. Prior/Related/Impacted patches
|
8. Prior/Related/Impacted patches
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ gb=[Size in GB]: Default: 250GB
|
|||||||
bs=[Block size (in bytes)]: Default: 512 bytes
|
bs=[Block size (in bytes)]: Default: 512 bytes
|
||||||
The block size reported to the system.
|
The block size reported to the system.
|
||||||
|
|
||||||
nr_devices=[Number of devices]: Default: 2
|
nr_devices=[Number of devices]: Default: 1
|
||||||
Number of block devices instantiated. They are instantiated as /dev/nullb0,
|
Number of block devices instantiated. They are instantiated as /dev/nullb0,
|
||||||
etc.
|
etc.
|
||||||
|
|
||||||
@@ -52,13 +52,13 @@ irqmode=[0-2]: Default: 1-Soft-irq
|
|||||||
2: Timer: Waits a specific period (completion_nsec) for each IO before
|
2: Timer: Waits a specific period (completion_nsec) for each IO before
|
||||||
completion.
|
completion.
|
||||||
|
|
||||||
completion_nsec=[ns]: Default: 10.000ns
|
completion_nsec=[ns]: Default: 10,000ns
|
||||||
Combined with irqmode=2 (timer). The time each completion event must wait.
|
Combined with irqmode=2 (timer). The time each completion event must wait.
|
||||||
|
|
||||||
submit_queues=[0..nr_cpus]:
|
submit_queues=[1..nr_cpus]:
|
||||||
The number of submission queues attached to the device driver. If unset, it
|
The number of submission queues attached to the device driver. If unset, it
|
||||||
defaults to 1 on single-queue and bio-based instances. For multi-queue,
|
defaults to 1. For multi-queue, it is ignored when use_per_node_hctx module
|
||||||
it is ignored when use_per_node_hctx module parameter is 1.
|
parameter is 1.
|
||||||
|
|
||||||
hw_queue_depth=[0..qdepth]: Default: 64
|
hw_queue_depth=[0..qdepth]: Default: 64
|
||||||
The hardware queue depth of the device.
|
The hardware queue depth of the device.
|
||||||
@@ -73,3 +73,12 @@ use_per_node_hctx=[0/1]: Default: 0
|
|||||||
|
|
||||||
use_lightnvm=[0/1]: Default: 0
|
use_lightnvm=[0/1]: Default: 0
|
||||||
Register device with LightNVM. Requires blk-mq and CONFIG_NVM to be enabled.
|
Register device with LightNVM. Requires blk-mq and CONFIG_NVM to be enabled.
|
||||||
|
|
||||||
|
no_sched=[0/1]: Default: 0
|
||||||
|
0: nullb* use default blk-mq io scheduler.
|
||||||
|
1: nullb* doesn't use io scheduler.
|
||||||
|
|
||||||
|
shared_tags=[0/1]: Default: 0
|
||||||
|
0: Tag set is not shared.
|
||||||
|
1: Tag set shared between devices for blk-mq. Only makes sense with
|
||||||
|
nr_devices > 1, otherwise there's no tag set to share.
|
||||||
|
|||||||
156
Documentation/bpf/bpf_design_QA.txt
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
BPF extensibility and applicability to networking, tracing, security
|
||||||
|
in the linux kernel and several user space implementations of BPF
|
||||||
|
virtual machine led to a number of misunderstanding on what BPF actually is.
|
||||||
|
This short QA is an attempt to address that and outline a direction
|
||||||
|
of where BPF is heading long term.
|
||||||
|
|
||||||
|
Q: Is BPF a generic instruction set similar to x64 and arm64?
|
||||||
|
A: NO.
|
||||||
|
|
||||||
|
Q: Is BPF a generic virtual machine ?
|
||||||
|
A: NO.
|
||||||
|
|
||||||
|
BPF is generic instruction set _with_ C calling convention.
|
||||||
|
|
||||||
|
Q: Why C calling convention was chosen?
|
||||||
|
A: Because BPF programs are designed to run in the linux kernel
|
||||||
|
which is written in C, hence BPF defines instruction set compatible
|
||||||
|
with two most used architectures x64 and arm64 (and takes into
|
||||||
|
consideration important quirks of other architectures) and
|
||||||
|
defines calling convention that is compatible with C calling
|
||||||
|
convention of the linux kernel on those architectures.
|
||||||
|
|
||||||
|
Q: can multiple return values be supported in the future?
|
||||||
|
A: NO. BPF allows only register R0 to be used as return value.
|
||||||
|
|
||||||
|
Q: can more than 5 function arguments be supported in the future?
|
||||||
|
A: NO. BPF calling convention only allows registers R1-R5 to be used
|
||||||
|
as arguments. BPF is not a standalone instruction set.
|
||||||
|
(unlike x64 ISA that allows msft, cdecl and other conventions)
|
||||||
|
|
||||||
|
Q: can BPF programs access instruction pointer or return address?
|
||||||
|
A: NO.
|
||||||
|
|
||||||
|
Q: can BPF programs access stack pointer ?
|
||||||
|
A: NO. Only frame pointer (register R10) is accessible.
|
||||||
|
From compiler point of view it's necessary to have stack pointer.
|
||||||
|
For example LLVM defines register R11 as stack pointer in its
|
||||||
|
BPF backend, but it makes sure that generated code never uses it.
|
||||||
|
|
||||||
|
Q: Does C-calling convention diminishes possible use cases?
|
||||||
|
A: YES. BPF design forces addition of major functionality in the form
|
||||||
|
of kernel helper functions and kernel objects like BPF maps with
|
||||||
|
seamless interoperability between them. It lets kernel call into
|
||||||
|
BPF programs and programs call kernel helpers with zero overhead.
|
||||||
|
As all of them were native C code. That is particularly the case
|
||||||
|
for JITed BPF programs that are indistinguishable from
|
||||||
|
native kernel C code.
|
||||||
|
|
||||||
|
Q: Does it mean that 'innovative' extensions to BPF code are disallowed?
|
||||||
|
A: Soft yes. At least for now until BPF core has support for
|
||||||
|
bpf-to-bpf calls, indirect calls, loops, global variables,
|
||||||
|
jump tables, read only sections and all other normal constructs
|
||||||
|
that C code can produce.
|
||||||
|
|
||||||
|
Q: Can loops be supported in a safe way?
|
||||||
|
A: It's not clear yet. BPF developers are trying to find a way to
|
||||||
|
support bounded loops where the verifier can guarantee that
|
||||||
|
the program terminates in less than 4096 instructions.
|
||||||
|
|
||||||
|
Q: How come LD_ABS and LD_IND instruction are present in BPF whereas
|
||||||
|
C code cannot express them and has to use builtin intrinsics?
|
||||||
|
A: This is artifact of compatibility with classic BPF. Modern
|
||||||
|
networking code in BPF performs better without them.
|
||||||
|
See 'direct packet access'.
|
||||||
|
|
||||||
|
Q: It seems not all BPF instructions are one-to-one to native CPU.
|
||||||
|
For example why BPF_JNE and other compare and jumps are not cpu-like?
|
||||||
|
A: This was necessary to avoid introducing flags into ISA which are
|
||||||
|
impossible to make generic and efficient across CPU architectures.
|
||||||
|
|
||||||
|
Q: why BPF_DIV instruction doesn't map to x64 div?
|
||||||
|
A: Because if we picked one-to-one relationship to x64 it would have made
|
||||||
|
it more complicated to support on arm64 and other archs. Also it
|
||||||
|
needs div-by-zero runtime check.
|
||||||
|
|
||||||
|
Q: why there is no BPF_SDIV for signed divide operation?
|
||||||
|
A: Because it would be rarely used. llvm errors in such case and
|
||||||
|
prints a suggestion to use unsigned divide instead
|
||||||
|
|
||||||
|
Q: Why BPF has implicit prologue and epilogue?
|
||||||
|
A: Because architectures like sparc have register windows and in general
|
||||||
|
there are enough subtle differences between architectures, so naive
|
||||||
|
store return address into stack won't work. Another reason is BPF has
|
||||||
|
to be safe from division by zero (and legacy exception path
|
||||||
|
of LD_ABS insn). Those instructions need to invoke epilogue and
|
||||||
|
return implicitly.
|
||||||
|
|
||||||
|
Q: Why BPF_JLT and BPF_JLE instructions were not introduced in the beginning?
|
||||||
|
A: Because classic BPF didn't have them and BPF authors felt that compiler
|
||||||
|
workaround would be acceptable. Turned out that programs lose performance
|
||||||
|
due to lack of these compare instructions and they were added.
|
||||||
|
These two instructions is a perfect example what kind of new BPF
|
||||||
|
instructions are acceptable and can be added in the future.
|
||||||
|
These two already had equivalent instructions in native CPUs.
|
||||||
|
New instructions that don't have one-to-one mapping to HW instructions
|
||||||
|
will not be accepted.
|
||||||
|
|
||||||
|
Q: BPF 32-bit subregisters have a requirement to zero upper 32-bits of BPF
|
||||||
|
registers which makes BPF inefficient virtual machine for 32-bit
|
||||||
|
CPU architectures and 32-bit HW accelerators. Can true 32-bit registers
|
||||||
|
be added to BPF in the future?
|
||||||
|
A: NO. The first thing to improve performance on 32-bit archs is to teach
|
||||||
|
LLVM to generate code that uses 32-bit subregisters. Then second step
|
||||||
|
is to teach verifier to mark operations where zero-ing upper bits
|
||||||
|
is unnecessary. Then JITs can take advantage of those markings and
|
||||||
|
drastically reduce size of generated code and improve performance.
|
||||||
|
|
||||||
|
Q: Does BPF have a stable ABI?
|
||||||
|
A: YES. BPF instructions, arguments to BPF programs, set of helper
|
||||||
|
functions and their arguments, recognized return codes are all part
|
||||||
|
of ABI. However when tracing programs are using bpf_probe_read() helper
|
||||||
|
to walk kernel internal datastructures and compile with kernel
|
||||||
|
internal headers these accesses can and will break with newer
|
||||||
|
kernels. The union bpf_attr -> kern_version is checked at load time
|
||||||
|
to prevent accidentally loading kprobe-based bpf programs written
|
||||||
|
for a different kernel. Networking programs don't do kern_version check.
|
||||||
|
|
||||||
|
Q: How much stack space a BPF program uses?
|
||||||
|
A: Currently all program types are limited to 512 bytes of stack
|
||||||
|
space, but the verifier computes the actual amount of stack used
|
||||||
|
and both interpreter and most JITed code consume necessary amount.
|
||||||
|
|
||||||
|
Q: Can BPF be offloaded to HW?
|
||||||
|
A: YES. BPF HW offload is supported by NFP driver.
|
||||||
|
|
||||||
|
Q: Does classic BPF interpreter still exist?
|
||||||
|
A: NO. Classic BPF programs are converted into extend BPF instructions.
|
||||||
|
|
||||||
|
Q: Can BPF call arbitrary kernel functions?
|
||||||
|
A: NO. BPF programs can only call a set of helper functions which
|
||||||
|
is defined for every program type.
|
||||||
|
|
||||||
|
Q: Can BPF overwrite arbitrary kernel memory?
|
||||||
|
A: NO. Tracing bpf programs can _read_ arbitrary memory with bpf_probe_read()
|
||||||
|
and bpf_probe_read_str() helpers. Networking programs cannot read
|
||||||
|
arbitrary memory, since they don't have access to these helpers.
|
||||||
|
Programs can never read or write arbitrary memory directly.
|
||||||
|
|
||||||
|
Q: Can BPF overwrite arbitrary user memory?
|
||||||
|
A: Sort-of. Tracing BPF programs can overwrite the user memory
|
||||||
|
of the current task with bpf_probe_write_user(). Every time such
|
||||||
|
program is loaded the kernel will print warning message, so
|
||||||
|
this helper is only useful for experiments and prototypes.
|
||||||
|
Tracing BPF programs are root only.
|
||||||
|
|
||||||
|
Q: When bpf_trace_printk() helper is used the kernel prints nasty
|
||||||
|
warning message. Why is that?
|
||||||
|
A: This is done to nudge program authors into better interfaces when
|
||||||
|
programs need to pass data to user space. Like bpf_perf_event_output()
|
||||||
|
can be used to efficiently stream data via perf ring buffer.
|
||||||
|
BPF maps can be used for asynchronous data sharing between kernel
|
||||||
|
and user space. bpf_trace_printk() should only be used for debugging.
|
||||||
|
|
||||||
|
Q: Can BPF functionality such as new program or map types, new
|
||||||
|
helpers, etc be added out of kernel module code?
|
||||||
|
A: NO.
|
||||||
@@ -55,13 +55,9 @@ This driver provides the following features:
|
|||||||
(to compile support as a module which can be loaded and unloaded)
|
(to compile support as a module which can be loaded and unloaded)
|
||||||
to the options:
|
to the options:
|
||||||
|
|
||||||
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
|
ATA/ATAPI/MFM/RLL support
|
||||||
Include IDE/ATAPI CDROM support
|
Include IDE/ATAPI CDROM support
|
||||||
|
|
||||||
and `no' to
|
|
||||||
|
|
||||||
Use old disk-only driver on primary interface
|
|
||||||
|
|
||||||
Depending on what type of IDE interface you have, you may need to
|
Depending on what type of IDE interface you have, you may need to
|
||||||
specify additional configuration options. See
|
specify additional configuration options. See
|
||||||
Documentation/ide/ide.txt.
|
Documentation/ide/ide.txt.
|
||||||
|
|||||||
@@ -893,10 +893,6 @@ Controllers
|
|||||||
CPU
|
CPU
|
||||||
---
|
---
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The interface for the cpu controller hasn't been merged yet
|
|
||||||
|
|
||||||
The "cpu" controllers regulates distribution of CPU cycles. This
|
The "cpu" controllers regulates distribution of CPU cycles. This
|
||||||
controller implements weight and absolute bandwidth limit models for
|
controller implements weight and absolute bandwidth limit models for
|
||||||
normal scheduling policy and absolute bandwidth allocation model for
|
normal scheduling policy and absolute bandwidth allocation model for
|
||||||
@@ -910,12 +906,16 @@ All time durations are in microseconds.
|
|||||||
|
|
||||||
cpu.stat
|
cpu.stat
|
||||||
A read-only flat-keyed file which exists on non-root cgroups.
|
A read-only flat-keyed file which exists on non-root cgroups.
|
||||||
|
This file exists whether the controller is enabled or not.
|
||||||
|
|
||||||
It reports the following six stats:
|
It always reports the following three stats:
|
||||||
|
|
||||||
- usage_usec
|
- usage_usec
|
||||||
- user_usec
|
- user_usec
|
||||||
- system_usec
|
- system_usec
|
||||||
|
|
||||||
|
and the following three when the controller is enabled:
|
||||||
|
|
||||||
- nr_periods
|
- nr_periods
|
||||||
- nr_throttled
|
- nr_throttled
|
||||||
- throttled_usec
|
- throttled_usec
|
||||||
@@ -926,6 +926,18 @@ All time durations are in microseconds.
|
|||||||
|
|
||||||
The weight in the range [1, 10000].
|
The weight in the range [1, 10000].
|
||||||
|
|
||||||
|
cpu.weight.nice
|
||||||
|
A read-write single value file which exists on non-root
|
||||||
|
cgroups. The default is "0".
|
||||||
|
|
||||||
|
The nice value is in the range [-20, 19].
|
||||||
|
|
||||||
|
This interface file is an alternative interface for
|
||||||
|
"cpu.weight" and allows reading and setting weight using the
|
||||||
|
same values used by nice(2). Because the range is smaller and
|
||||||
|
granularity is coarser for the nice values, the read value is
|
||||||
|
the closest approximation of the current weight.
|
||||||
|
|
||||||
cpu.max
|
cpu.max
|
||||||
A read-write two value file which exists on non-root cgroups.
|
A read-write two value file which exists on non-root cgroups.
|
||||||
The default is "max 100000".
|
The default is "max 100000".
|
||||||
@@ -938,26 +950,6 @@ All time durations are in microseconds.
|
|||||||
$PERIOD duration. "max" for $MAX indicates no limit. If only
|
$PERIOD duration. "max" for $MAX indicates no limit. If only
|
||||||
one number is written, $MAX is updated.
|
one number is written, $MAX is updated.
|
||||||
|
|
||||||
cpu.rt.max
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
The semantics of this file is still under discussion and the
|
|
||||||
interface hasn't been merged yet
|
|
||||||
|
|
||||||
A read-write two value file which exists on all cgroups.
|
|
||||||
The default is "0 100000".
|
|
||||||
|
|
||||||
The maximum realtime runtime allocation. Over-committing
|
|
||||||
configurations are disallowed and process migrations are
|
|
||||||
rejected if not enough bandwidth is available. It's in the
|
|
||||||
following format::
|
|
||||||
|
|
||||||
$MAX $PERIOD
|
|
||||||
|
|
||||||
which indicates that the group may consume upto $MAX in each
|
|
||||||
$PERIOD duration. If only one number is written, $MAX is
|
|
||||||
updated.
|
|
||||||
|
|
||||||
|
|
||||||
Memory
|
Memory
|
||||||
------
|
------
|
||||||
|
|||||||
7
Documentation/clearing-warn-once.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
WARN_ONCE / WARN_ON_ONCE only print a warning once.
|
||||||
|
|
||||||
|
echo 1 > /sys/kernel/debug/clear_warn_once
|
||||||
|
|
||||||
|
clears the state and allows the warnings to print once again.
|
||||||
|
This can be useful after test suite runs to reproduce problems.
|
||||||
@@ -2,11 +2,9 @@
|
|||||||
The Linux Kernel API
|
The Linux Kernel API
|
||||||
====================
|
====================
|
||||||
|
|
||||||
Data Types
|
|
||||||
==========
|
|
||||||
|
|
||||||
Doubly Linked Lists
|
List Management Functions
|
||||||
-------------------
|
=========================
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/list.h
|
.. kernel-doc:: include/linux/list.h
|
||||||
:internal:
|
:internal:
|
||||||
@@ -55,12 +53,27 @@ The Linux kernel provides more basic utility functions.
|
|||||||
Bitmap Operations
|
Bitmap Operations
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/bitmap.c
|
||||||
|
:doc: bitmap introduction
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/bitmap.h
|
||||||
|
:doc: declare bitmap
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/bitmap.h
|
||||||
|
:doc: bitmap overview
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/bitmap.h
|
||||||
|
:doc: bitmap bitops
|
||||||
|
|
||||||
.. kernel-doc:: lib/bitmap.c
|
.. kernel-doc:: lib/bitmap.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: lib/bitmap.c
|
.. kernel-doc:: lib/bitmap.c
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/bitmap.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
Command-line Parsing
|
Command-line Parsing
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
@@ -70,20 +83,26 @@ Command-line Parsing
|
|||||||
CRC Functions
|
CRC Functions
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/crc4.c
|
||||||
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: lib/crc7.c
|
.. kernel-doc:: lib/crc7.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/crc8.c
|
||||||
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: lib/crc16.c
|
.. kernel-doc:: lib/crc16.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: lib/crc-itu-t.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: lib/crc32.c
|
.. kernel-doc:: lib/crc32.c
|
||||||
|
|
||||||
.. kernel-doc:: lib/crc-ccitt.c
|
.. kernel-doc:: lib/crc-ccitt.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/crc-itu-t.c
|
||||||
|
:export:
|
||||||
|
|
||||||
idr/ida Functions
|
idr/ida Functions
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
@@ -96,6 +115,30 @@ idr/ida Functions
|
|||||||
.. kernel-doc:: lib/idr.c
|
.. kernel-doc:: lib/idr.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
Math Functions in Linux
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Base 2 log and power Functions
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/log2.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
|
Division Functions
|
||||||
|
------------------
|
||||||
|
|
||||||
|
.. kernel-doc:: include/asm-generic/div64.h
|
||||||
|
:functions: do_div
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/math64.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/div64.c
|
||||||
|
:functions: div_s64_rem div64_u64_rem div64_u64 div64_s64
|
||||||
|
|
||||||
|
.. kernel-doc:: lib/gcd.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Memory Management in Linux
|
Memory Management in Linux
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
@@ -352,44 +395,30 @@ Read-Copy Update (RCU)
|
|||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rcupdate.h
|
.. kernel-doc:: include/linux/rcupdate.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rcupdate_wait.h
|
.. kernel-doc:: include/linux/rcupdate_wait.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rcutree.h
|
.. kernel-doc:: include/linux/rcutree.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/tree.c
|
.. kernel-doc:: kernel/rcu/tree.c
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/tree_plugin.h
|
.. kernel-doc:: kernel/rcu/tree_plugin.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/tree_exp.h
|
.. kernel-doc:: kernel/rcu/tree_exp.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/update.c
|
.. kernel-doc:: kernel/rcu/update.c
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/srcu.h
|
.. kernel-doc:: include/linux/srcu.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/srcutree.c
|
.. kernel-doc:: kernel/rcu/srcutree.c
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rculist_bl.h
|
.. kernel-doc:: include/linux/rculist_bl.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rculist.h
|
.. kernel-doc:: include/linux/rculist.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rculist_nulls.h
|
.. kernel-doc:: include/linux/rculist_nulls.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/linux/rcu_sync.h
|
.. kernel-doc:: include/linux/rcu_sync.h
|
||||||
:external:
|
|
||||||
|
|
||||||
.. kernel-doc:: kernel/rcu/sync.c
|
.. kernel-doc:: kernel/rcu/sync.c
|
||||||
:external:
|
|
||||||
|
|
||||||
|
|||||||
@@ -177,18 +177,14 @@ Here is a sample module which implements a basic per cpu counter using
|
|||||||
printk("Read : CPU %d, count %ld\n", cpu,
|
printk("Read : CPU %d, count %ld\n", cpu,
|
||||||
local_read(&per_cpu(counters, cpu)));
|
local_read(&per_cpu(counters, cpu)));
|
||||||
}
|
}
|
||||||
del_timer(&test_timer);
|
mod_timer(&test_timer, jiffies + 1000);
|
||||||
test_timer.expires = jiffies + 1000;
|
|
||||||
add_timer(&test_timer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init test_init(void)
|
static int __init test_init(void)
|
||||||
{
|
{
|
||||||
/* initialize the timer that will increment the counter */
|
/* initialize the timer that will increment the counter */
|
||||||
init_timer(&test_timer);
|
timer_setup(&test_timer, do_test_timer, 0);
|
||||||
test_timer.function = do_test_timer;
|
mod_timer(&test_timer, jiffies + 1);
|
||||||
test_timer.expires = jiffies + 1;
|
|
||||||
add_timer(&test_timer);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,9 @@ Freq_i to Freq_j. Freq_i is in descending order with increasing rows and
|
|||||||
Freq_j is in descending order with increasing columns. The output here also
|
Freq_j is in descending order with increasing columns. The output here also
|
||||||
contains the actual freq values for each row and column for better readability.
|
contains the actual freq values for each row and column for better readability.
|
||||||
|
|
||||||
|
If the transition table is bigger than PAGE_SIZE, reading this will
|
||||||
|
return an -EFBIG error.
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table
|
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table
|
||||||
From : To
|
From : To
|
||||||
|
|||||||
@@ -7,59 +7,27 @@ Code Example For Symmetric Key Cipher Operation
|
|||||||
::
|
::
|
||||||
|
|
||||||
|
|
||||||
struct tcrypt_result {
|
|
||||||
struct completion completion;
|
|
||||||
int err;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* tie all data structures together */
|
/* tie all data structures together */
|
||||||
struct skcipher_def {
|
struct skcipher_def {
|
||||||
struct scatterlist sg;
|
struct scatterlist sg;
|
||||||
struct crypto_skcipher *tfm;
|
struct crypto_skcipher *tfm;
|
||||||
struct skcipher_request *req;
|
struct skcipher_request *req;
|
||||||
struct tcrypt_result result;
|
struct crypto_wait wait;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Callback function */
|
|
||||||
static void test_skcipher_cb(struct crypto_async_request *req, int error)
|
|
||||||
{
|
|
||||||
struct tcrypt_result *result = req->data;
|
|
||||||
|
|
||||||
if (error == -EINPROGRESS)
|
|
||||||
return;
|
|
||||||
result->err = error;
|
|
||||||
complete(&result->completion);
|
|
||||||
pr_info("Encryption finished successfully\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform cipher operation */
|
/* Perform cipher operation */
|
||||||
static unsigned int test_skcipher_encdec(struct skcipher_def *sk,
|
static unsigned int test_skcipher_encdec(struct skcipher_def *sk,
|
||||||
int enc)
|
int enc)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc;
|
||||||
|
|
||||||
if (enc)
|
if (enc)
|
||||||
rc = crypto_skcipher_encrypt(sk->req);
|
rc = crypto_wait_req(crypto_skcipher_encrypt(sk->req), &sk->wait);
|
||||||
else
|
else
|
||||||
rc = crypto_skcipher_decrypt(sk->req);
|
rc = crypto_wait_req(crypto_skcipher_decrypt(sk->req), &sk->wait);
|
||||||
|
|
||||||
switch (rc) {
|
if (rc)
|
||||||
case 0:
|
pr_info("skcipher encrypt returned with result %d\n", rc);
|
||||||
break;
|
|
||||||
case -EINPROGRESS:
|
|
||||||
case -EBUSY:
|
|
||||||
rc = wait_for_completion_interruptible(
|
|
||||||
&sk->result.completion);
|
|
||||||
if (!rc && !sk->result.err) {
|
|
||||||
reinit_completion(&sk->result.completion);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
pr_info("skcipher encrypt returned with %d result %d\n",
|
|
||||||
rc, sk->result.err);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
init_completion(&sk->result.completion);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -89,8 +57,8 @@ Code Example For Symmetric Key Cipher Operation
|
|||||||
}
|
}
|
||||||
|
|
||||||
skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||||
test_skcipher_cb,
|
crypto_req_done,
|
||||||
&sk.result);
|
&sk.wait);
|
||||||
|
|
||||||
/* AES 256 with random key */
|
/* AES 256 with random key */
|
||||||
get_random_bytes(&key, 32);
|
get_random_bytes(&key, 32);
|
||||||
@@ -122,7 +90,7 @@ Code Example For Symmetric Key Cipher Operation
|
|||||||
/* We encrypt one block */
|
/* We encrypt one block */
|
||||||
sg_init_one(&sk.sg, scratchpad, 16);
|
sg_init_one(&sk.sg, scratchpad, 16);
|
||||||
skcipher_request_set_crypt(req, &sk.sg, &sk.sg, 16, ivdata);
|
skcipher_request_set_crypt(req, &sk.sg, &sk.sg, 16, ivdata);
|
||||||
init_completion(&sk.result.completion);
|
crypto_init_wait(&sk.wait);
|
||||||
|
|
||||||
/* encrypt data */
|
/* encrypt data */
|
||||||
ret = test_skcipher_encdec(&sk, 1);
|
ret = test_skcipher_encdec(&sk, 1);
|
||||||
|
|||||||
@@ -33,9 +33,6 @@ of many distributions, e.g. :
|
|||||||
You can get the latest version released from the Coccinelle homepage at
|
You can get the latest version released from the Coccinelle homepage at
|
||||||
http://coccinelle.lip6.fr/
|
http://coccinelle.lip6.fr/
|
||||||
|
|
||||||
Information and tips about Coccinelle are also provided on the wiki
|
|
||||||
pages at http://cocci.ekstranet.diku.dk/wiki/doku.php
|
|
||||||
|
|
||||||
Once you have it, run the following command::
|
Once you have it, run the following command::
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
@@ -209,7 +206,7 @@ err.log will now have the profiling information, while stdout will
|
|||||||
provide some progress information as Coccinelle moves forward with
|
provide some progress information as Coccinelle moves forward with
|
||||||
work.
|
work.
|
||||||
|
|
||||||
DEBUG_FILE support is only supported when using coccinelle >= 1.2.
|
DEBUG_FILE support is only supported when using coccinelle >= 1.0.2.
|
||||||
|
|
||||||
.cocciconfig support
|
.cocciconfig support
|
||||||
--------------------
|
--------------------
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ whole; patches welcome!
|
|||||||
kasan
|
kasan
|
||||||
ubsan
|
ubsan
|
||||||
kmemleak
|
kmemleak
|
||||||
kmemcheck
|
|
||||||
gdb-kernel-debugging
|
gdb-kernel-debugging
|
||||||
kgdb
|
kgdb
|
||||||
kselftest
|
kselftest
|
||||||
|
|||||||
@@ -12,19 +12,30 @@ To achieve this goal it does not collect coverage in soft/hard interrupts
|
|||||||
and instrumentation of some inherently non-deterministic parts of kernel is
|
and instrumentation of some inherently non-deterministic parts of kernel is
|
||||||
disabled (e.g. scheduler, locking).
|
disabled (e.g. scheduler, locking).
|
||||||
|
|
||||||
Usage
|
kcov is also able to collect comparison operands from the instrumented code
|
||||||
-----
|
(this feature currently requires that the kernel is compiled with clang).
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
Configure the kernel with::
|
Configure the kernel with::
|
||||||
|
|
||||||
CONFIG_KCOV=y
|
CONFIG_KCOV=y
|
||||||
|
|
||||||
CONFIG_KCOV requires gcc built on revision 231296 or later.
|
CONFIG_KCOV requires gcc built on revision 231296 or later.
|
||||||
|
|
||||||
|
If the comparison operands need to be collected, set::
|
||||||
|
|
||||||
|
CONFIG_KCOV_ENABLE_COMPARISONS=y
|
||||||
|
|
||||||
Profiling data will only become accessible once debugfs has been mounted::
|
Profiling data will only become accessible once debugfs has been mounted::
|
||||||
|
|
||||||
mount -t debugfs none /sys/kernel/debug
|
mount -t debugfs none /sys/kernel/debug
|
||||||
|
|
||||||
The following program demonstrates kcov usage from within a test program:
|
Coverage collection
|
||||||
|
-------------------
|
||||||
|
The following program demonstrates coverage collection from within a test
|
||||||
|
program using kcov:
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
@@ -44,6 +55,9 @@ The following program demonstrates kcov usage from within a test program:
|
|||||||
#define KCOV_DISABLE _IO('c', 101)
|
#define KCOV_DISABLE _IO('c', 101)
|
||||||
#define COVER_SIZE (64<<10)
|
#define COVER_SIZE (64<<10)
|
||||||
|
|
||||||
|
#define KCOV_TRACE_PC 0
|
||||||
|
#define KCOV_TRACE_CMP 1
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
@@ -64,7 +78,7 @@ The following program demonstrates kcov usage from within a test program:
|
|||||||
if ((void*)cover == MAP_FAILED)
|
if ((void*)cover == MAP_FAILED)
|
||||||
perror("mmap"), exit(1);
|
perror("mmap"), exit(1);
|
||||||
/* Enable coverage collection on the current thread. */
|
/* Enable coverage collection on the current thread. */
|
||||||
if (ioctl(fd, KCOV_ENABLE, 0))
|
if (ioctl(fd, KCOV_ENABLE, KCOV_TRACE_PC))
|
||||||
perror("ioctl"), exit(1);
|
perror("ioctl"), exit(1);
|
||||||
/* Reset coverage from the tail of the ioctl() call. */
|
/* Reset coverage from the tail of the ioctl() call. */
|
||||||
__atomic_store_n(&cover[0], 0, __ATOMIC_RELAXED);
|
__atomic_store_n(&cover[0], 0, __ATOMIC_RELAXED);
|
||||||
@@ -111,3 +125,80 @@ The interface is fine-grained to allow efficient forking of test processes.
|
|||||||
That is, a parent process opens /sys/kernel/debug/kcov, enables trace mode,
|
That is, a parent process opens /sys/kernel/debug/kcov, enables trace mode,
|
||||||
mmaps coverage buffer and then forks child processes in a loop. Child processes
|
mmaps coverage buffer and then forks child processes in a loop. Child processes
|
||||||
only need to enable coverage (disable happens automatically on thread end).
|
only need to enable coverage (disable happens automatically on thread end).
|
||||||
|
|
||||||
|
Comparison operands collection
|
||||||
|
------------------------------
|
||||||
|
Comparison operands collection is similar to coverage collection:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
/* Same includes and defines as above. */
|
||||||
|
|
||||||
|
/* Number of 64-bit words per record. */
|
||||||
|
#define KCOV_WORDS_PER_CMP 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The format for the types of collected comparisons.
|
||||||
|
*
|
||||||
|
* Bit 0 shows whether one of the arguments is a compile-time constant.
|
||||||
|
* Bits 1 & 2 contain log2 of the argument size, up to 8 bytes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define KCOV_CMP_CONST (1 << 0)
|
||||||
|
#define KCOV_CMP_SIZE(n) ((n) << 1)
|
||||||
|
#define KCOV_CMP_MASK KCOV_CMP_SIZE(3)
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
uint64_t *cover, type, arg1, arg2, is_const, size;
|
||||||
|
unsigned long n, i;
|
||||||
|
|
||||||
|
fd = open("/sys/kernel/debug/kcov", O_RDWR);
|
||||||
|
if (fd == -1)
|
||||||
|
perror("open"), exit(1);
|
||||||
|
if (ioctl(fd, KCOV_INIT_TRACE, COVER_SIZE))
|
||||||
|
perror("ioctl"), exit(1);
|
||||||
|
/*
|
||||||
|
* Note that the buffer pointer is of type uint64_t*, because all
|
||||||
|
* the comparison operands are promoted to uint64_t.
|
||||||
|
*/
|
||||||
|
cover = (uint64_t *)mmap(NULL, COVER_SIZE * sizeof(unsigned long),
|
||||||
|
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
|
if ((void*)cover == MAP_FAILED)
|
||||||
|
perror("mmap"), exit(1);
|
||||||
|
/* Note KCOV_TRACE_CMP instead of KCOV_TRACE_PC. */
|
||||||
|
if (ioctl(fd, KCOV_ENABLE, KCOV_TRACE_CMP))
|
||||||
|
perror("ioctl"), exit(1);
|
||||||
|
__atomic_store_n(&cover[0], 0, __ATOMIC_RELAXED);
|
||||||
|
read(-1, NULL, 0);
|
||||||
|
/* Read number of comparisons collected. */
|
||||||
|
n = __atomic_load_n(&cover[0], __ATOMIC_RELAXED);
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
type = cover[i * KCOV_WORDS_PER_CMP + 1];
|
||||||
|
/* arg1 and arg2 - operands of the comparison. */
|
||||||
|
arg1 = cover[i * KCOV_WORDS_PER_CMP + 2];
|
||||||
|
arg2 = cover[i * KCOV_WORDS_PER_CMP + 3];
|
||||||
|
/* ip - caller address. */
|
||||||
|
ip = cover[i * KCOV_WORDS_PER_CMP + 4];
|
||||||
|
/* size of the operands. */
|
||||||
|
size = 1 << ((type & KCOV_CMP_MASK) >> 1);
|
||||||
|
/* is_const - true if either operand is a compile-time constant.*/
|
||||||
|
is_const = type & KCOV_CMP_CONST;
|
||||||
|
printf("ip: 0x%lx type: 0x%lx, arg1: 0x%lx, arg2: 0x%lx, "
|
||||||
|
"size: %lu, %s\n",
|
||||||
|
ip, type, arg1, arg2, size,
|
||||||
|
is_const ? "const" : "non-const");
|
||||||
|
}
|
||||||
|
if (ioctl(fd, KCOV_DISABLE, 0))
|
||||||
|
perror("ioctl"), exit(1);
|
||||||
|
/* Free resources. */
|
||||||
|
if (munmap(cover, COVER_SIZE * sizeof(unsigned long)))
|
||||||
|
perror("munmap"), exit(1);
|
||||||
|
if (close(fd))
|
||||||
|
perror("close"), exit(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Note that the kcov modes (coverage collection or comparison operands) are
|
||||||
|
mutually exclusive.
|
||||||
|
|||||||
@@ -1,733 +0,0 @@
|
|||||||
Getting started with kmemcheck
|
|
||||||
==============================
|
|
||||||
|
|
||||||
Vegard Nossum <vegardno@ifi.uio.no>
|
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
kmemcheck is a debugging feature for the Linux Kernel. More specifically, it
|
|
||||||
is a dynamic checker that detects and warns about some uses of uninitialized
|
|
||||||
memory.
|
|
||||||
|
|
||||||
Userspace programmers might be familiar with Valgrind's memcheck. The main
|
|
||||||
difference between memcheck and kmemcheck is that memcheck works for userspace
|
|
||||||
programs only, and kmemcheck works for the kernel only. The implementations
|
|
||||||
are of course vastly different. Because of this, kmemcheck is not as accurate
|
|
||||||
as memcheck, but it turns out to be good enough in practice to discover real
|
|
||||||
programmer errors that the compiler is not able to find through static
|
|
||||||
analysis.
|
|
||||||
|
|
||||||
Enabling kmemcheck on a kernel will probably slow it down to the extent that
|
|
||||||
the machine will not be usable for normal workloads such as e.g. an
|
|
||||||
interactive desktop. kmemcheck will also cause the kernel to use about twice
|
|
||||||
as much memory as normal. For this reason, kmemcheck is strictly a debugging
|
|
||||||
feature.
|
|
||||||
|
|
||||||
|
|
||||||
Downloading
|
|
||||||
-----------
|
|
||||||
|
|
||||||
As of version 2.6.31-rc1, kmemcheck is included in the mainline kernel.
|
|
||||||
|
|
||||||
|
|
||||||
Configuring and compiling
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
kmemcheck only works for the x86 (both 32- and 64-bit) platform. A number of
|
|
||||||
configuration variables must have specific settings in order for the kmemcheck
|
|
||||||
menu to even appear in "menuconfig". These are:
|
|
||||||
|
|
||||||
- ``CONFIG_CC_OPTIMIZE_FOR_SIZE=n``
|
|
||||||
This option is located under "General setup" / "Optimize for size".
|
|
||||||
|
|
||||||
Without this, gcc will use certain optimizations that usually lead to
|
|
||||||
false positive warnings from kmemcheck. An example of this is a 16-bit
|
|
||||||
field in a struct, where gcc may load 32 bits, then discard the upper
|
|
||||||
16 bits. kmemcheck sees only the 32-bit load, and may trigger a
|
|
||||||
warning for the upper 16 bits (if they're uninitialized).
|
|
||||||
|
|
||||||
- ``CONFIG_SLAB=y`` or ``CONFIG_SLUB=y``
|
|
||||||
This option is located under "General setup" / "Choose SLAB
|
|
||||||
allocator".
|
|
||||||
|
|
||||||
- ``CONFIG_FUNCTION_TRACER=n``
|
|
||||||
This option is located under "Kernel hacking" / "Tracers" / "Kernel
|
|
||||||
Function Tracer"
|
|
||||||
|
|
||||||
When function tracing is compiled in, gcc emits a call to another
|
|
||||||
function at the beginning of every function. This means that when the
|
|
||||||
page fault handler is called, the ftrace framework will be called
|
|
||||||
before kmemcheck has had a chance to handle the fault. If ftrace then
|
|
||||||
modifies memory that was tracked by kmemcheck, the result is an
|
|
||||||
endless recursive page fault.
|
|
||||||
|
|
||||||
- ``CONFIG_DEBUG_PAGEALLOC=n``
|
|
||||||
This option is located under "Kernel hacking" / "Memory Debugging"
|
|
||||||
/ "Debug page memory allocations".
|
|
||||||
|
|
||||||
In addition, I highly recommend turning on ``CONFIG_DEBUG_INFO=y``. This is also
|
|
||||||
located under "Kernel hacking". With this, you will be able to get line number
|
|
||||||
information from the kmemcheck warnings, which is extremely valuable in
|
|
||||||
debugging a problem. This option is not mandatory, however, because it slows
|
|
||||||
down the compilation process and produces a much bigger kernel image.
|
|
||||||
|
|
||||||
Now the kmemcheck menu should be visible (under "Kernel hacking" / "Memory
|
|
||||||
Debugging" / "kmemcheck: trap use of uninitialized memory"). Here follows
|
|
||||||
a description of the kmemcheck configuration variables:
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK``
|
|
||||||
This must be enabled in order to use kmemcheck at all...
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK_``[``DISABLED`` | ``ENABLED`` | ``ONESHOT``]``_BY_DEFAULT``
|
|
||||||
This option controls the status of kmemcheck at boot-time. "Enabled"
|
|
||||||
will enable kmemcheck right from the start, "disabled" will boot the
|
|
||||||
kernel as normal (but with the kmemcheck code compiled in, so it can
|
|
||||||
be enabled at run-time after the kernel has booted), and "one-shot" is
|
|
||||||
a special mode which will turn kmemcheck off automatically after
|
|
||||||
detecting the first use of uninitialized memory.
|
|
||||||
|
|
||||||
If you are using kmemcheck to actively debug a problem, then you
|
|
||||||
probably want to choose "enabled" here.
|
|
||||||
|
|
||||||
The one-shot mode is mostly useful in automated test setups because it
|
|
||||||
can prevent floods of warnings and increase the chances of the machine
|
|
||||||
surviving in case something is really wrong. In other cases, the one-
|
|
||||||
shot mode could actually be counter-productive because it would turn
|
|
||||||
itself off at the very first error -- in the case of a false positive
|
|
||||||
too -- and this would come in the way of debugging the specific
|
|
||||||
problem you were interested in.
|
|
||||||
|
|
||||||
If you would like to use your kernel as normal, but with a chance to
|
|
||||||
enable kmemcheck in case of some problem, it might be a good idea to
|
|
||||||
choose "disabled" here. When kmemcheck is disabled, most of the run-
|
|
||||||
time overhead is not incurred, and the kernel will be almost as fast
|
|
||||||
as normal.
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK_QUEUE_SIZE``
|
|
||||||
Select the maximum number of error reports to store in an internal
|
|
||||||
(fixed-size) buffer. Since errors can occur virtually anywhere and in
|
|
||||||
any context, we need a temporary storage area which is guaranteed not
|
|
||||||
to generate any other page faults when accessed. The queue will be
|
|
||||||
emptied as soon as a tasklet may be scheduled. If the queue is full,
|
|
||||||
new error reports will be lost.
|
|
||||||
|
|
||||||
The default value of 64 is probably fine. If some code produces more
|
|
||||||
than 64 errors within an irqs-off section, then the code is likely to
|
|
||||||
produce many, many more, too, and these additional reports seldom give
|
|
||||||
any more information (the first report is usually the most valuable
|
|
||||||
anyway).
|
|
||||||
|
|
||||||
This number might have to be adjusted if you are not using serial
|
|
||||||
console or similar to capture the kernel log. If you are using the
|
|
||||||
"dmesg" command to save the log, then getting a lot of kmemcheck
|
|
||||||
warnings might overflow the kernel log itself, and the earlier reports
|
|
||||||
will get lost in that way instead. Try setting this to 10 or so on
|
|
||||||
such a setup.
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK_SHADOW_COPY_SHIFT``
|
|
||||||
Select the number of shadow bytes to save along with each entry of the
|
|
||||||
error-report queue. These bytes indicate what parts of an allocation
|
|
||||||
are initialized, uninitialized, etc. and will be displayed when an
|
|
||||||
error is detected to help the debugging of a particular problem.
|
|
||||||
|
|
||||||
The number entered here is actually the logarithm of the number of
|
|
||||||
bytes that will be saved. So if you pick for example 5 here, kmemcheck
|
|
||||||
will save 2^5 = 32 bytes.
|
|
||||||
|
|
||||||
The default value should be fine for debugging most problems. It also
|
|
||||||
fits nicely within 80 columns.
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK_PARTIAL_OK``
|
|
||||||
This option (when enabled) works around certain GCC optimizations that
|
|
||||||
produce 32-bit reads from 16-bit variables where the upper 16 bits are
|
|
||||||
thrown away afterwards.
|
|
||||||
|
|
||||||
The default value (enabled) is recommended. This may of course hide
|
|
||||||
some real errors, but disabling it would probably produce a lot of
|
|
||||||
false positives.
|
|
||||||
|
|
||||||
- ``CONFIG_KMEMCHECK_BITOPS_OK``
|
|
||||||
This option silences warnings that would be generated for bit-field
|
|
||||||
accesses where not all the bits are initialized at the same time. This
|
|
||||||
may also hide some real bugs.
|
|
||||||
|
|
||||||
This option is probably obsolete, or it should be replaced with
|
|
||||||
the kmemcheck-/bitfield-annotations for the code in question. The
|
|
||||||
default value is therefore fine.
|
|
||||||
|
|
||||||
Now compile the kernel as usual.
|
|
||||||
|
|
||||||
|
|
||||||
How to use
|
|
||||||
----------
|
|
||||||
|
|
||||||
Booting
|
|
||||||
~~~~~~~
|
|
||||||
|
|
||||||
First some information about the command-line options. There is only one
|
|
||||||
option specific to kmemcheck, and this is called "kmemcheck". It can be used
|
|
||||||
to override the default mode as chosen by the ``CONFIG_KMEMCHECK_*_BY_DEFAULT``
|
|
||||||
option. Its possible settings are:
|
|
||||||
|
|
||||||
- ``kmemcheck=0`` (disabled)
|
|
||||||
- ``kmemcheck=1`` (enabled)
|
|
||||||
- ``kmemcheck=2`` (one-shot mode)
|
|
||||||
|
|
||||||
If SLUB debugging has been enabled in the kernel, it may take precedence over
|
|
||||||
kmemcheck in such a way that the slab caches which are under SLUB debugging
|
|
||||||
will not be tracked by kmemcheck. In order to ensure that this doesn't happen
|
|
||||||
(even though it shouldn't by default), use SLUB's boot option ``slub_debug``,
|
|
||||||
like this: ``slub_debug=-``
|
|
||||||
|
|
||||||
In fact, this option may also be used for fine-grained control over SLUB vs.
|
|
||||||
kmemcheck. For example, if the command line includes
|
|
||||||
``kmemcheck=1 slub_debug=,dentry``, then SLUB debugging will be used only
|
|
||||||
for the "dentry" slab cache, and with kmemcheck tracking all the other
|
|
||||||
caches. This is advanced usage, however, and is not generally recommended.
|
|
||||||
|
|
||||||
|
|
||||||
Run-time enable/disable
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
When the kernel has booted, it is possible to enable or disable kmemcheck at
|
|
||||||
run-time. WARNING: This feature is still experimental and may cause false
|
|
||||||
positive warnings to appear. Therefore, try not to use this. If you find that
|
|
||||||
it doesn't work properly (e.g. you see an unreasonable amount of warnings), I
|
|
||||||
will be happy to take bug reports.
|
|
||||||
|
|
||||||
Use the file ``/proc/sys/kernel/kmemcheck`` for this purpose, e.g.::
|
|
||||||
|
|
||||||
$ echo 0 > /proc/sys/kernel/kmemcheck # disables kmemcheck
|
|
||||||
|
|
||||||
The numbers are the same as for the ``kmemcheck=`` command-line option.
|
|
||||||
|
|
||||||
|
|
||||||
Debugging
|
|
||||||
~~~~~~~~~
|
|
||||||
|
|
||||||
A typical report will look something like this::
|
|
||||||
|
|
||||||
WARNING: kmemcheck: Caught 32-bit read from uninitialized memory (ffff88003e4a2024)
|
|
||||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
|
||||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
|
||||||
^
|
|
||||||
|
|
||||||
Pid: 1856, comm: ntpdate Not tainted 2.6.29-rc5 #264 945P-A
|
|
||||||
RIP: 0010:[<ffffffff8104ede8>] [<ffffffff8104ede8>] __dequeue_signal+0xc8/0x190
|
|
||||||
RSP: 0018:ffff88003cdf7d98 EFLAGS: 00210002
|
|
||||||
RAX: 0000000000000030 RBX: ffff88003d4ea968 RCX: 0000000000000009
|
|
||||||
RDX: ffff88003e5d6018 RSI: ffff88003e5d6024 RDI: ffff88003cdf7e84
|
|
||||||
RBP: ffff88003cdf7db8 R08: ffff88003e5d6000 R09: 0000000000000000
|
|
||||||
R10: 0000000000000080 R11: 0000000000000000 R12: 000000000000000e
|
|
||||||
R13: ffff88003cdf7e78 R14: ffff88003d530710 R15: ffff88003d5a98c8
|
|
||||||
FS: 0000000000000000(0000) GS:ffff880001982000(0063) knlGS:00000
|
|
||||||
CS: 0010 DS: 002b ES: 002b CR0: 0000000080050033
|
|
||||||
CR2: ffff88003f806ea0 CR3: 000000003c036000 CR4: 00000000000006a0
|
|
||||||
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
|
|
||||||
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
|
|
||||||
[<ffffffff8104f04e>] dequeue_signal+0x8e/0x170
|
|
||||||
[<ffffffff81050bd8>] get_signal_to_deliver+0x98/0x390
|
|
||||||
[<ffffffff8100b87d>] do_notify_resume+0xad/0x7d0
|
|
||||||
[<ffffffff8100c7b5>] int_signal+0x12/0x17
|
|
||||||
[<ffffffffffffffff>] 0xffffffffffffffff
|
|
||||||
|
|
||||||
The single most valuable information in this report is the RIP (or EIP on 32-
|
|
||||||
bit) value. This will help us pinpoint exactly which instruction that caused
|
|
||||||
the warning.
|
|
||||||
|
|
||||||
If your kernel was compiled with ``CONFIG_DEBUG_INFO=y``, then all we have to do
|
|
||||||
is give this address to the addr2line program, like this::
|
|
||||||
|
|
||||||
$ addr2line -e vmlinux -i ffffffff8104ede8
|
|
||||||
arch/x86/include/asm/string_64.h:12
|
|
||||||
include/asm-generic/siginfo.h:287
|
|
||||||
kernel/signal.c:380
|
|
||||||
kernel/signal.c:410
|
|
||||||
|
|
||||||
The "``-e vmlinux``" tells addr2line which file to look in. **IMPORTANT:**
|
|
||||||
This must be the vmlinux of the kernel that produced the warning in the
|
|
||||||
first place! If not, the line number information will almost certainly be
|
|
||||||
wrong.
|
|
||||||
|
|
||||||
The "``-i``" tells addr2line to also print the line numbers of inlined
|
|
||||||
functions. In this case, the flag was very important, because otherwise,
|
|
||||||
it would only have printed the first line, which is just a call to
|
|
||||||
``memcpy()``, which could be called from a thousand places in the kernel, and
|
|
||||||
is therefore not very useful. These inlined functions would not show up in
|
|
||||||
the stack trace above, simply because the kernel doesn't load the extra
|
|
||||||
debugging information. This technique can of course be used with ordinary
|
|
||||||
kernel oopses as well.
|
|
||||||
|
|
||||||
In this case, it's the caller of ``memcpy()`` that is interesting, and it can be
|
|
||||||
found in ``include/asm-generic/siginfo.h``, line 287::
|
|
||||||
|
|
||||||
281 static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
|
||||||
282 {
|
|
||||||
283 if (from->si_code < 0)
|
|
||||||
284 memcpy(to, from, sizeof(*to));
|
|
||||||
285 else
|
|
||||||
286 /* _sigchld is currently the largest know union member */
|
|
||||||
287 memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
|
|
||||||
288 }
|
|
||||||
|
|
||||||
Since this was a read (kmemcheck usually warns about reads only, though it can
|
|
||||||
warn about writes to unallocated or freed memory as well), it was probably the
|
|
||||||
"from" argument which contained some uninitialized bytes. Following the chain
|
|
||||||
of calls, we move upwards to see where "from" was allocated or initialized,
|
|
||||||
``kernel/signal.c``, line 380::
|
|
||||||
|
|
||||||
359 static void collect_signal(int sig, struct sigpending *list, siginfo_t *info)
|
|
||||||
360 {
|
|
||||||
...
|
|
||||||
367 list_for_each_entry(q, &list->list, list) {
|
|
||||||
368 if (q->info.si_signo == sig) {
|
|
||||||
369 if (first)
|
|
||||||
370 goto still_pending;
|
|
||||||
371 first = q;
|
|
||||||
...
|
|
||||||
377 if (first) {
|
|
||||||
378 still_pending:
|
|
||||||
379 list_del_init(&first->list);
|
|
||||||
380 copy_siginfo(info, &first->info);
|
|
||||||
381 __sigqueue_free(first);
|
|
||||||
...
|
|
||||||
392 }
|
|
||||||
393 }
|
|
||||||
|
|
||||||
Here, it is ``&first->info`` that is being passed on to ``copy_siginfo()``. The
|
|
||||||
variable ``first`` was found on a list -- passed in as the second argument to
|
|
||||||
``collect_signal()``. We continue our journey through the stack, to figure out
|
|
||||||
where the item on "list" was allocated or initialized. We move to line 410::
|
|
||||||
|
|
||||||
395 static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
|
|
||||||
396 siginfo_t *info)
|
|
||||||
397 {
|
|
||||||
...
|
|
||||||
410 collect_signal(sig, pending, info);
|
|
||||||
...
|
|
||||||
414 }
|
|
||||||
|
|
||||||
Now we need to follow the ``pending`` pointer, since that is being passed on to
|
|
||||||
``collect_signal()`` as ``list``. At this point, we've run out of lines from the
|
|
||||||
"addr2line" output. Not to worry, we just paste the next addresses from the
|
|
||||||
kmemcheck stack dump, i.e.::
|
|
||||||
|
|
||||||
[<ffffffff8104f04e>] dequeue_signal+0x8e/0x170
|
|
||||||
[<ffffffff81050bd8>] get_signal_to_deliver+0x98/0x390
|
|
||||||
[<ffffffff8100b87d>] do_notify_resume+0xad/0x7d0
|
|
||||||
[<ffffffff8100c7b5>] int_signal+0x12/0x17
|
|
||||||
|
|
||||||
$ addr2line -e vmlinux -i ffffffff8104f04e ffffffff81050bd8 \
|
|
||||||
ffffffff8100b87d ffffffff8100c7b5
|
|
||||||
kernel/signal.c:446
|
|
||||||
kernel/signal.c:1806
|
|
||||||
arch/x86/kernel/signal.c:805
|
|
||||||
arch/x86/kernel/signal.c:871
|
|
||||||
arch/x86/kernel/entry_64.S:694
|
|
||||||
|
|
||||||
Remember that since these addresses were found on the stack and not as the
|
|
||||||
RIP value, they actually point to the _next_ instruction (they are return
|
|
||||||
addresses). This becomes obvious when we look at the code for line 446::
|
|
||||||
|
|
||||||
422 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
|
|
||||||
423 {
|
|
||||||
...
|
|
||||||
431 signr = __dequeue_signal(&tsk->signal->shared_pending,
|
|
||||||
432 mask, info);
|
|
||||||
433 /*
|
|
||||||
434 * itimer signal ?
|
|
||||||
435 *
|
|
||||||
436 * itimers are process shared and we restart periodic
|
|
||||||
437 * itimers in the signal delivery path to prevent DoS
|
|
||||||
438 * attacks in the high resolution timer case. This is
|
|
||||||
439 * compliant with the old way of self restarting
|
|
||||||
440 * itimers, as the SIGALRM is a legacy signal and only
|
|
||||||
441 * queued once. Changing the restart behaviour to
|
|
||||||
442 * restart the timer in the signal dequeue path is
|
|
||||||
443 * reducing the timer noise on heavy loaded !highres
|
|
||||||
444 * systems too.
|
|
||||||
445 */
|
|
||||||
446 if (unlikely(signr == SIGALRM)) {
|
|
||||||
...
|
|
||||||
489 }
|
|
||||||
|
|
||||||
So instead of looking at 446, we should be looking at 431, which is the line
|
|
||||||
that executes just before 446. Here we see that what we are looking for is
|
|
||||||
``&tsk->signal->shared_pending``.
|
|
||||||
|
|
||||||
Our next task is now to figure out which function that puts items on this
|
|
||||||
``shared_pending`` list. A crude, but efficient tool, is ``git grep``::
|
|
||||||
|
|
||||||
$ git grep -n 'shared_pending' kernel/
|
|
||||||
...
|
|
||||||
kernel/signal.c:828: pending = group ? &t->signal->shared_pending : &t->pending;
|
|
||||||
kernel/signal.c:1339: pending = group ? &t->signal->shared_pending : &t->pending;
|
|
||||||
...
|
|
||||||
|
|
||||||
There were more results, but none of them were related to list operations,
|
|
||||||
and these were the only assignments. We inspect the line numbers more closely
|
|
||||||
and find that this is indeed where items are being added to the list::
|
|
||||||
|
|
||||||
816 static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
|
||||||
817 int group)
|
|
||||||
818 {
|
|
||||||
...
|
|
||||||
828 pending = group ? &t->signal->shared_pending : &t->pending;
|
|
||||||
...
|
|
||||||
851 q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
|
||||||
852 (is_si_special(info) ||
|
|
||||||
853 info->si_code >= 0)));
|
|
||||||
854 if (q) {
|
|
||||||
855 list_add_tail(&q->list, &pending->list);
|
|
||||||
...
|
|
||||||
890 }
|
|
||||||
|
|
||||||
and::
|
|
||||||
|
|
||||||
1309 int send_sigqueue(struct sigqueue *q, struct task_struct *t, int group)
|
|
||||||
1310 {
|
|
||||||
....
|
|
||||||
1339 pending = group ? &t->signal->shared_pending : &t->pending;
|
|
||||||
1340 list_add_tail(&q->list, &pending->list);
|
|
||||||
....
|
|
||||||
1347 }
|
|
||||||
|
|
||||||
In the first case, the list element we are looking for, ``q``, is being
|
|
||||||
returned from the function ``__sigqueue_alloc()``, which looks like an
|
|
||||||
allocation function. Let's take a look at it::
|
|
||||||
|
|
||||||
187 static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags,
|
|
||||||
188 int override_rlimit)
|
|
||||||
189 {
|
|
||||||
190 struct sigqueue *q = NULL;
|
|
||||||
191 struct user_struct *user;
|
|
||||||
192
|
|
||||||
193 /*
|
|
||||||
194 * We won't get problems with the target's UID changing under us
|
|
||||||
195 * because changing it requires RCU be used, and if t != current, the
|
|
||||||
196 * caller must be holding the RCU readlock (by way of a spinlock) and
|
|
||||||
197 * we use RCU protection here
|
|
||||||
198 */
|
|
||||||
199 user = get_uid(__task_cred(t)->user);
|
|
||||||
200 atomic_inc(&user->sigpending);
|
|
||||||
201 if (override_rlimit ||
|
|
||||||
202 atomic_read(&user->sigpending) <=
|
|
||||||
203 t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
|
|
||||||
204 q = kmem_cache_alloc(sigqueue_cachep, flags);
|
|
||||||
205 if (unlikely(q == NULL)) {
|
|
||||||
206 atomic_dec(&user->sigpending);
|
|
||||||
207 free_uid(user);
|
|
||||||
208 } else {
|
|
||||||
209 INIT_LIST_HEAD(&q->list);
|
|
||||||
210 q->flags = 0;
|
|
||||||
211 q->user = user;
|
|
||||||
212 }
|
|
||||||
213
|
|
||||||
214 return q;
|
|
||||||
215 }
|
|
||||||
|
|
||||||
We see that this function initializes ``q->list``, ``q->flags``, and
|
|
||||||
``q->user``. It seems that now is the time to look at the definition of
|
|
||||||
``struct sigqueue``, e.g.::
|
|
||||||
|
|
||||||
14 struct sigqueue {
|
|
||||||
15 struct list_head list;
|
|
||||||
16 int flags;
|
|
||||||
17 siginfo_t info;
|
|
||||||
18 struct user_struct *user;
|
|
||||||
19 };
|
|
||||||
|
|
||||||
And, you might remember, it was a ``memcpy()`` on ``&first->info`` that
|
|
||||||
caused the warning, so this makes perfect sense. It also seems reasonable
|
|
||||||
to assume that it is the caller of ``__sigqueue_alloc()`` that has the
|
|
||||||
responsibility of filling out (initializing) this member.
|
|
||||||
|
|
||||||
But just which fields of the struct were uninitialized? Let's look at
|
|
||||||
kmemcheck's report again::
|
|
||||||
|
|
||||||
WARNING: kmemcheck: Caught 32-bit read from uninitialized memory (ffff88003e4a2024)
|
|
||||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
|
||||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
|
||||||
^
|
|
||||||
|
|
||||||
These first two lines are the memory dump of the memory object itself, and
|
|
||||||
the shadow bytemap, respectively. The memory object itself is in this case
|
|
||||||
``&first->info``. Just beware that the start of this dump is NOT the start
|
|
||||||
of the object itself! The position of the caret (^) corresponds with the
|
|
||||||
address of the read (ffff88003e4a2024).
|
|
||||||
|
|
||||||
The shadow bytemap dump legend is as follows:
|
|
||||||
|
|
||||||
- i: initialized
|
|
||||||
- u: uninitialized
|
|
||||||
- a: unallocated (memory has been allocated by the slab layer, but has not
|
|
||||||
yet been handed off to anybody)
|
|
||||||
- f: freed (memory has been allocated by the slab layer, but has been freed
|
|
||||||
by the previous owner)
|
|
||||||
|
|
||||||
In order to figure out where (relative to the start of the object) the
|
|
||||||
uninitialized memory was located, we have to look at the disassembly. For
|
|
||||||
that, we'll need the RIP address again::
|
|
||||||
|
|
||||||
RIP: 0010:[<ffffffff8104ede8>] [<ffffffff8104ede8>] __dequeue_signal+0xc8/0x190
|
|
||||||
|
|
||||||
$ objdump -d --no-show-raw-insn vmlinux | grep -C 8 ffffffff8104ede8:
|
|
||||||
ffffffff8104edc8: mov %r8,0x8(%r8)
|
|
||||||
ffffffff8104edcc: test %r10d,%r10d
|
|
||||||
ffffffff8104edcf: js ffffffff8104ee88 <__dequeue_signal+0x168>
|
|
||||||
ffffffff8104edd5: mov %rax,%rdx
|
|
||||||
ffffffff8104edd8: mov $0xc,%ecx
|
|
||||||
ffffffff8104eddd: mov %r13,%rdi
|
|
||||||
ffffffff8104ede0: mov $0x30,%eax
|
|
||||||
ffffffff8104ede5: mov %rdx,%rsi
|
|
||||||
ffffffff8104ede8: rep movsl %ds:(%rsi),%es:(%rdi)
|
|
||||||
ffffffff8104edea: test $0x2,%al
|
|
||||||
ffffffff8104edec: je ffffffff8104edf0 <__dequeue_signal+0xd0>
|
|
||||||
ffffffff8104edee: movsw %ds:(%rsi),%es:(%rdi)
|
|
||||||
ffffffff8104edf0: test $0x1,%al
|
|
||||||
ffffffff8104edf2: je ffffffff8104edf5 <__dequeue_signal+0xd5>
|
|
||||||
ffffffff8104edf4: movsb %ds:(%rsi),%es:(%rdi)
|
|
||||||
ffffffff8104edf5: mov %r8,%rdi
|
|
||||||
ffffffff8104edf8: callq ffffffff8104de60 <__sigqueue_free>
|
|
||||||
|
|
||||||
As expected, it's the "``rep movsl``" instruction from the ``memcpy()``
|
|
||||||
that causes the warning. We know about ``REP MOVSL`` that it uses the register
|
|
||||||
``RCX`` to count the number of remaining iterations. By taking a look at the
|
|
||||||
register dump again (from the kmemcheck report), we can figure out how many
|
|
||||||
bytes were left to copy::
|
|
||||||
|
|
||||||
RAX: 0000000000000030 RBX: ffff88003d4ea968 RCX: 0000000000000009
|
|
||||||
|
|
||||||
By looking at the disassembly, we also see that ``%ecx`` is being loaded
|
|
||||||
with the value ``$0xc`` just before (ffffffff8104edd8), so we are very
|
|
||||||
lucky. Keep in mind that this is the number of iterations, not bytes. And
|
|
||||||
since this is a "long" operation, we need to multiply by 4 to get the
|
|
||||||
number of bytes. So this means that the uninitialized value was encountered
|
|
||||||
at 4 * (0xc - 0x9) = 12 bytes from the start of the object.
|
|
||||||
|
|
||||||
We can now try to figure out which field of the "``struct siginfo``" that
|
|
||||||
was not initialized. This is the beginning of the struct::
|
|
||||||
|
|
||||||
40 typedef struct siginfo {
|
|
||||||
41 int si_signo;
|
|
||||||
42 int si_errno;
|
|
||||||
43 int si_code;
|
|
||||||
44
|
|
||||||
45 union {
|
|
||||||
..
|
|
||||||
92 } _sifields;
|
|
||||||
93 } siginfo_t;
|
|
||||||
|
|
||||||
On 64-bit, the int is 4 bytes long, so it must the union member that has
|
|
||||||
not been initialized. We can verify this using gdb::
|
|
||||||
|
|
||||||
$ gdb vmlinux
|
|
||||||
...
|
|
||||||
(gdb) p &((struct siginfo *) 0)->_sifields
|
|
||||||
$1 = (union {...} *) 0x10
|
|
||||||
|
|
||||||
Actually, it seems that the union member is located at offset 0x10 -- which
|
|
||||||
means that gcc has inserted 4 bytes of padding between the members ``si_code``
|
|
||||||
and ``_sifields``. We can now get a fuller picture of the memory dump::
|
|
||||||
|
|
||||||
_----------------------------=> si_code
|
|
||||||
/ _--------------------=> (padding)
|
|
||||||
| / _------------=> _sifields(._kill._pid)
|
|
||||||
| | / _----=> _sifields(._kill._uid)
|
|
||||||
| | | /
|
|
||||||
-------|-------|-------|-------|
|
|
||||||
80000000000000000000000000000000000000000088ffff0000000000000000
|
|
||||||
i i i i u u u u i i i i i i i i u u u u u u u u u u u u u u u u
|
|
||||||
|
|
||||||
This allows us to realize another important fact: ``si_code`` contains the
|
|
||||||
value 0x80. Remember that x86 is little endian, so the first 4 bytes
|
|
||||||
"80000000" are really the number 0x00000080. With a bit of research, we
|
|
||||||
find that this is actually the constant ``SI_KERNEL`` defined in
|
|
||||||
``include/asm-generic/siginfo.h``::
|
|
||||||
|
|
||||||
144 #define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
|
|
||||||
|
|
||||||
This macro is used in exactly one place in the x86 kernel: In ``send_signal()``
|
|
||||||
in ``kernel/signal.c``::
|
|
||||||
|
|
||||||
816 static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
|
||||||
817 int group)
|
|
||||||
818 {
|
|
||||||
...
|
|
||||||
828 pending = group ? &t->signal->shared_pending : &t->pending;
|
|
||||||
...
|
|
||||||
851 q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
|
||||||
852 (is_si_special(info) ||
|
|
||||||
853 info->si_code >= 0)));
|
|
||||||
854 if (q) {
|
|
||||||
855 list_add_tail(&q->list, &pending->list);
|
|
||||||
856 switch ((unsigned long) info) {
|
|
||||||
...
|
|
||||||
865 case (unsigned long) SEND_SIG_PRIV:
|
|
||||||
866 q->info.si_signo = sig;
|
|
||||||
867 q->info.si_errno = 0;
|
|
||||||
868 q->info.si_code = SI_KERNEL;
|
|
||||||
869 q->info.si_pid = 0;
|
|
||||||
870 q->info.si_uid = 0;
|
|
||||||
871 break;
|
|
||||||
...
|
|
||||||
890 }
|
|
||||||
|
|
||||||
Not only does this match with the ``.si_code`` member, it also matches the place
|
|
||||||
we found earlier when looking for where siginfo_t objects are enqueued on the
|
|
||||||
``shared_pending`` list.
|
|
||||||
|
|
||||||
So to sum up: It seems that it is the padding introduced by the compiler
|
|
||||||
between two struct fields that is uninitialized, and this gets reported when
|
|
||||||
we do a ``memcpy()`` on the struct. This means that we have identified a false
|
|
||||||
positive warning.
|
|
||||||
|
|
||||||
Normally, kmemcheck will not report uninitialized accesses in ``memcpy()`` calls
|
|
||||||
when both the source and destination addresses are tracked. (Instead, we copy
|
|
||||||
the shadow bytemap as well). In this case, the destination address clearly
|
|
||||||
was not tracked. We can dig a little deeper into the stack trace from above::
|
|
||||||
|
|
||||||
arch/x86/kernel/signal.c:805
|
|
||||||
arch/x86/kernel/signal.c:871
|
|
||||||
arch/x86/kernel/entry_64.S:694
|
|
||||||
|
|
||||||
And we clearly see that the destination siginfo object is located on the
|
|
||||||
stack::
|
|
||||||
|
|
||||||
782 static void do_signal(struct pt_regs *regs)
|
|
||||||
783 {
|
|
||||||
784 struct k_sigaction ka;
|
|
||||||
785 siginfo_t info;
|
|
||||||
...
|
|
||||||
804 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
|
||||||
...
|
|
||||||
854 }
|
|
||||||
|
|
||||||
And this ``&info`` is what eventually gets passed to ``copy_siginfo()`` as the
|
|
||||||
destination argument.
|
|
||||||
|
|
||||||
Now, even though we didn't find an actual error here, the example is still a
|
|
||||||
good one, because it shows how one would go about to find out what the report
|
|
||||||
was all about.
|
|
||||||
|
|
||||||
|
|
||||||
Annotating false positives
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
There are a few different ways to make annotations in the source code that
|
|
||||||
will keep kmemcheck from checking and reporting certain allocations. Here
|
|
||||||
they are:
|
|
||||||
|
|
||||||
- ``__GFP_NOTRACK_FALSE_POSITIVE``
|
|
||||||
This flag can be passed to ``kmalloc()`` or ``kmem_cache_alloc()``
|
|
||||||
(therefore also to other functions that end up calling one of
|
|
||||||
these) to indicate that the allocation should not be tracked
|
|
||||||
because it would lead to a false positive report. This is a "big
|
|
||||||
hammer" way of silencing kmemcheck; after all, even if the false
|
|
||||||
positive pertains to particular field in a struct, for example, we
|
|
||||||
will now lose the ability to find (real) errors in other parts of
|
|
||||||
the same struct.
|
|
||||||
|
|
||||||
Example::
|
|
||||||
|
|
||||||
/* No warnings will ever trigger on accessing any part of x */
|
|
||||||
x = kmalloc(sizeof *x, GFP_KERNEL | __GFP_NOTRACK_FALSE_POSITIVE);
|
|
||||||
|
|
||||||
- ``kmemcheck_bitfield_begin(name)``/``kmemcheck_bitfield_end(name)`` and
|
|
||||||
``kmemcheck_annotate_bitfield(ptr, name)``
|
|
||||||
The first two of these three macros can be used inside struct
|
|
||||||
definitions to signal, respectively, the beginning and end of a
|
|
||||||
bitfield. Additionally, this will assign the bitfield a name, which
|
|
||||||
is given as an argument to the macros.
|
|
||||||
|
|
||||||
Having used these markers, one can later use
|
|
||||||
kmemcheck_annotate_bitfield() at the point of allocation, to indicate
|
|
||||||
which parts of the allocation is part of a bitfield.
|
|
||||||
|
|
||||||
Example::
|
|
||||||
|
|
||||||
struct foo {
|
|
||||||
int x;
|
|
||||||
|
|
||||||
kmemcheck_bitfield_begin(flags);
|
|
||||||
int flag_a:1;
|
|
||||||
int flag_b:1;
|
|
||||||
kmemcheck_bitfield_end(flags);
|
|
||||||
|
|
||||||
int y;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct foo *x = kmalloc(sizeof *x);
|
|
||||||
|
|
||||||
/* No warnings will trigger on accessing the bitfield of x */
|
|
||||||
kmemcheck_annotate_bitfield(x, flags);
|
|
||||||
|
|
||||||
Note that ``kmemcheck_annotate_bitfield()`` can be used even before the
|
|
||||||
return value of ``kmalloc()`` is checked -- in other words, passing NULL
|
|
||||||
as the first argument is legal (and will do nothing).
|
|
||||||
|
|
||||||
|
|
||||||
Reporting errors
|
|
||||||
----------------
|
|
||||||
|
|
||||||
As we have seen, kmemcheck will produce false positive reports. Therefore, it
|
|
||||||
is not very wise to blindly post kmemcheck warnings to mailing lists and
|
|
||||||
maintainers. Instead, I encourage maintainers and developers to find errors
|
|
||||||
in their own code. If you get a warning, you can try to work around it, try
|
|
||||||
to figure out if it's a real error or not, or simply ignore it. Most
|
|
||||||
developers know their own code and will quickly and efficiently determine the
|
|
||||||
root cause of a kmemcheck report. This is therefore also the most efficient
|
|
||||||
way to work with kmemcheck.
|
|
||||||
|
|
||||||
That said, we (the kmemcheck maintainers) will always be on the lookout for
|
|
||||||
false positives that we can annotate and silence. So whatever you find,
|
|
||||||
please drop us a note privately! Kernel configs and steps to reproduce (if
|
|
||||||
available) are of course a great help too.
|
|
||||||
|
|
||||||
Happy hacking!
|
|
||||||
|
|
||||||
|
|
||||||
Technical description
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
kmemcheck works by marking memory pages non-present. This means that whenever
|
|
||||||
somebody attempts to access the page, a page fault is generated. The page
|
|
||||||
fault handler notices that the page was in fact only hidden, and so it calls
|
|
||||||
on the kmemcheck code to make further investigations.
|
|
||||||
|
|
||||||
When the investigations are completed, kmemcheck "shows" the page by marking
|
|
||||||
it present (as it would be under normal circumstances). This way, the
|
|
||||||
interrupted code can continue as usual.
|
|
||||||
|
|
||||||
But after the instruction has been executed, we should hide the page again, so
|
|
||||||
that we can catch the next access too! Now kmemcheck makes use of a debugging
|
|
||||||
feature of the processor, namely single-stepping. When the processor has
|
|
||||||
finished the one instruction that generated the memory access, a debug
|
|
||||||
exception is raised. From here, we simply hide the page again and continue
|
|
||||||
execution, this time with the single-stepping feature turned off.
|
|
||||||
|
|
||||||
kmemcheck requires some assistance from the memory allocator in order to work.
|
|
||||||
The memory allocator needs to
|
|
||||||
|
|
||||||
1. Tell kmemcheck about newly allocated pages and pages that are about to
|
|
||||||
be freed. This allows kmemcheck to set up and tear down the shadow memory
|
|
||||||
for the pages in question. The shadow memory stores the status of each
|
|
||||||
byte in the allocation proper, e.g. whether it is initialized or
|
|
||||||
uninitialized.
|
|
||||||
|
|
||||||
2. Tell kmemcheck which parts of memory should be marked uninitialized.
|
|
||||||
There are actually a few more states, such as "not yet allocated" and
|
|
||||||
"recently freed".
|
|
||||||
|
|
||||||
If a slab cache is set up using the SLAB_NOTRACK flag, it will never return
|
|
||||||
memory that can take page faults because of kmemcheck.
|
|
||||||
|
|
||||||
If a slab cache is NOT set up using the SLAB_NOTRACK flag, callers can still
|
|
||||||
request memory with the __GFP_NOTRACK or __GFP_NOTRACK_FALSE_POSITIVE flags.
|
|
||||||
This does not prevent the page faults from occurring, however, but marks the
|
|
||||||
object in question as being initialized so that no warnings will ever be
|
|
||||||
produced for this object.
|
|
||||||
|
|
||||||
Currently, the SLAB and SLUB allocators are supported by kmemcheck.
|
|
||||||
@@ -31,6 +31,17 @@ To build and run the tests with a single command, use::
|
|||||||
|
|
||||||
Note that some tests will require root privileges.
|
Note that some tests will require root privileges.
|
||||||
|
|
||||||
|
Build and run from user specific object directory (make O=dir)::
|
||||||
|
|
||||||
|
$ make O=/tmp/kselftest kselftest
|
||||||
|
|
||||||
|
Build and run KBUILD_OUTPUT directory (make KBUILD_OUTPUT=)::
|
||||||
|
|
||||||
|
$ make KBUILD_OUTPUT=/tmp/kselftest kselftest
|
||||||
|
|
||||||
|
The above commands run the tests and print pass/fail summary to make it
|
||||||
|
easier to understand the test results. Please find the detailed individual
|
||||||
|
test results for each test in /tmp/testname file(s).
|
||||||
|
|
||||||
Running a subset of selftests
|
Running a subset of selftests
|
||||||
=============================
|
=============================
|
||||||
@@ -46,10 +57,21 @@ You can specify multiple tests to build and run::
|
|||||||
|
|
||||||
$ make TARGETS="size timers" kselftest
|
$ make TARGETS="size timers" kselftest
|
||||||
|
|
||||||
|
Build and run from user specific object directory (make O=dir)::
|
||||||
|
|
||||||
|
$ make O=/tmp/kselftest TARGETS="size timers" kselftest
|
||||||
|
|
||||||
|
Build and run KBUILD_OUTPUT directory (make KBUILD_OUTPUT=)::
|
||||||
|
|
||||||
|
$ make KBUILD_OUTPUT=/tmp/kselftest TARGETS="size timers" kselftest
|
||||||
|
|
||||||
|
The above commands run the tests and print pass/fail summary to make it
|
||||||
|
easier to understand the test results. Please find the detailed individual
|
||||||
|
test results for each test in /tmp/testname file(s).
|
||||||
|
|
||||||
See the top-level tools/testing/selftests/Makefile for the list of all
|
See the top-level tools/testing/selftests/Makefile for the list of all
|
||||||
possible targets.
|
possible targets.
|
||||||
|
|
||||||
|
|
||||||
Running the full range hotplug selftests
|
Running the full range hotplug selftests
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
@@ -113,9 +135,17 @@ Contributing new tests (details)
|
|||||||
* Use TEST_GEN_XXX if such binaries or files are generated during
|
* Use TEST_GEN_XXX if such binaries or files are generated during
|
||||||
compiling.
|
compiling.
|
||||||
|
|
||||||
TEST_PROGS, TEST_GEN_PROGS mean it is the excutable tested by
|
TEST_PROGS, TEST_GEN_PROGS mean it is the executable tested by
|
||||||
default.
|
default.
|
||||||
|
|
||||||
|
TEST_CUSTOM_PROGS should be used by tests that require custom build
|
||||||
|
rule and prevent common build rule use.
|
||||||
|
|
||||||
|
TEST_PROGS are for test shell scripts. Please ensure shell script has
|
||||||
|
its exec bit set. Otherwise, lib.mk run_tests will generate a warning.
|
||||||
|
|
||||||
|
TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests.
|
||||||
|
|
||||||
TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the
|
TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the
|
||||||
executable which is not tested by default.
|
executable which is not tested by default.
|
||||||
TEST_FILES, TEST_GEN_FILES mean it is the file which is used by
|
TEST_FILES, TEST_GEN_FILES mean it is the file which is used by
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ Boards:
|
|||||||
|
|
||||||
Root node property compatible must contain, depending on board:
|
Root node property compatible must contain, depending on board:
|
||||||
|
|
||||||
|
- Cubietech CubieBoard6: "cubietech,cubieboard6"
|
||||||
- LeMaker Guitar Base Board rev. B: "lemaker,guitar-bb-rev-b", "lemaker,guitar"
|
- LeMaker Guitar Base Board rev. B: "lemaker,guitar-bb-rev-b", "lemaker,guitar"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ Boards with the Amlogic Meson GXM S912 SoC shall have the following properties:
|
|||||||
Required root node property:
|
Required root node property:
|
||||||
compatible: "amlogic,s912", "amlogic,meson-gxm";
|
compatible: "amlogic,s912", "amlogic,meson-gxm";
|
||||||
|
|
||||||
|
Boards with the Amlogic Meson AXG A113D SoC shall have the following properties:
|
||||||
|
Required root node property:
|
||||||
|
compatible: "amlogic,a113d", "amlogic,meson-axg";
|
||||||
|
|
||||||
Board compatible values (alphabetically, grouped by SoC):
|
Board compatible values (alphabetically, grouped by SoC):
|
||||||
|
|
||||||
- "geniatech,atv1200" (Meson6)
|
- "geniatech,atv1200" (Meson6)
|
||||||
@@ -71,8 +75,12 @@ Board compatible values (alphabetically, grouped by SoC):
|
|||||||
|
|
||||||
- "amlogic,q200" (Meson gxm s912)
|
- "amlogic,q200" (Meson gxm s912)
|
||||||
- "amlogic,q201" (Meson gxm s912)
|
- "amlogic,q201" (Meson gxm s912)
|
||||||
|
- "khadas,vim2" (Meson gxm s912)
|
||||||
- "kingnovel,r-box-pro" (Meson gxm S912)
|
- "kingnovel,r-box-pro" (Meson gxm S912)
|
||||||
- "nexbox,a1" (Meson gxm s912)
|
- "nexbox,a1" (Meson gxm s912)
|
||||||
|
- "tronsmart,vega-s96" (Meson gxm s912)
|
||||||
|
|
||||||
|
- "amlogic,s400" (Meson axg a113d)
|
||||||
|
|
||||||
Amlogic Meson Firmware registers Interface
|
Amlogic Meson Firmware registers Interface
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|||||||
20
Documentation/devicetree/bindings/arm/amlogic/analog-top.txt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Amlogic Meson8 and Meson8b "analog top" registers:
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
The analog top registers contain information about the so-called
|
||||||
|
"metal revision" (which encodes the "minor version") of the SoC.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- reg: the register range of the analog top registers
|
||||||
|
- compatible: depending on the SoC this should be one of:
|
||||||
|
- "amlogic,meson8-analog-top"
|
||||||
|
- "amlogic,meson8b-analog-top"
|
||||||
|
along with "syscon"
|
||||||
|
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
analog_top: analog-top@81a8 {
|
||||||
|
compatible = "amlogic,meson8-analog-top", "syscon";
|
||||||
|
reg = <0x81a8 0x14>;
|
||||||
|
};
|
||||||
17
Documentation/devicetree/bindings/arm/amlogic/assist.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Amlogic Meson6/Meson8/Meson8b assist registers:
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
The assist registers contain basic information about the SoC,
|
||||||
|
for example the encoded SoC part number.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- reg: the register range of the assist registers
|
||||||
|
- compatible: should be "amlogic,meson-mx-assist" along with "syscon"
|
||||||
|
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
assist: assist@7c00 {
|
||||||
|
compatible = "amlogic,meson-mx-assist", "syscon";
|
||||||
|
reg = <0x7c00 0x200>;
|
||||||
|
};
|
||||||
17
Documentation/devicetree/bindings/arm/amlogic/bootrom.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Amlogic Meson6/Meson8/Meson8b bootrom:
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
The bootrom register area can be used to access SoC specific
|
||||||
|
information, such as the "misc version".
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- reg: the register range of the bootrom registers
|
||||||
|
- compatible: should be "amlogic,meson-mx-bootrom" along with "syscon"
|
||||||
|
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
bootrom: bootrom@d9040000 {
|
||||||
|
compatible = "amlogic,meson-mx-bootrom", "syscon";
|
||||||
|
reg = <0xd9040000 0x10000>;
|
||||||
|
};
|
||||||
18
Documentation/devicetree/bindings/arm/amlogic/pmu.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Amlogic Meson8 and Meson8b power-management-unit:
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
The pmu is used to turn off and on different power domains of the SoCs
|
||||||
|
This includes the power to the CPU cores.
|
||||||
|
|
||||||
|
Required node properties:
|
||||||
|
- compatible value : depending on the SoC this should be one of:
|
||||||
|
"amlogic,meson8-pmu"
|
||||||
|
"amlogic,meson8b-pmu"
|
||||||
|
- reg : physical base address and the size of the registers window
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
pmu@c81000e4 {
|
||||||
|
compatible = "amlogic,meson8b-pmu", "syscon";
|
||||||
|
reg = <0xc81000e0 0x18>;
|
||||||
|
};
|
||||||
32
Documentation/devicetree/bindings/arm/amlogic/smp-sram.txt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Amlogic Meson8 and Meson8b SRAM for smp bringup:
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
Amlogic's SMP-capable SoCs use part of the sram for the bringup of the cores.
|
||||||
|
Once the core gets powered up it executes the code that is residing at a
|
||||||
|
specific location.
|
||||||
|
|
||||||
|
Therefore a reserved section sub-node has to be added to the mmio-sram
|
||||||
|
declaration.
|
||||||
|
|
||||||
|
Required sub-node properties:
|
||||||
|
- compatible : depending on the SoC this should be one of:
|
||||||
|
"amlogic,meson8-smp-sram"
|
||||||
|
"amlogic,meson8b-smp-sram"
|
||||||
|
|
||||||
|
The rest of the properties should follow the generic mmio-sram discription
|
||||||
|
found in ../../misc/sram.txt
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
sram: sram@d9000000 {
|
||||||
|
compatible = "mmio-sram";
|
||||||
|
reg = <0xd9000000 0x20000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0 0xd9000000 0x20000>;
|
||||||
|
|
||||||
|
smp-sram@1ff80 {
|
||||||
|
compatible = "amlogic,meson8b-smp-sram";
|
||||||
|
reg = <0x1ff80 0x8>;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -164,6 +164,8 @@ Control registers for this memory controller's DDR PHY.
|
|||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : should contain one of these
|
- compatible : should contain one of these
|
||||||
|
"brcm,brcmstb-ddr-phy-v71.1"
|
||||||
|
"brcm,brcmstb-ddr-phy-v72.0"
|
||||||
"brcm,brcmstb-ddr-phy-v225.1"
|
"brcm,brcmstb-ddr-phy-v225.1"
|
||||||
"brcm,brcmstb-ddr-phy-v240.1"
|
"brcm,brcmstb-ddr-phy-v240.1"
|
||||||
"brcm,brcmstb-ddr-phy-v240.2"
|
"brcm,brcmstb-ddr-phy-v240.2"
|
||||||
@@ -184,7 +186,9 @@ Sequencer DRAM parameters and control registers. Used for Self-Refresh
|
|||||||
Power-Down (SRPD), among other things.
|
Power-Down (SRPD), among other things.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : should contain "brcm,brcmstb-memc-ddr"
|
- compatible : should contain one of these
|
||||||
|
"brcm,brcmstb-memc-ddr-rev-b.2.2"
|
||||||
|
"brcm,brcmstb-memc-ddr"
|
||||||
- reg : the MEMC DDR register range
|
- reg : the MEMC DDR register range
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|||||||
14
Documentation/devicetree/bindings/arm/bcm/brcm,hr2.txt
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Broadcom Hurricane 2 device tree bindings
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
Broadcom Hurricane 2 family of SoCs are used for switching control. These SoCs
|
||||||
|
are based on Broadcom's iProc SoC architecture and feature a single core Cortex
|
||||||
|
A9 ARM CPUs, DDR2/DDR3 memory, PCIe GEN-2, USB 2.0 and USB 3.0, serial and NAND
|
||||||
|
flash and a PCIe attached integrated switching engine.
|
||||||
|
|
||||||
|
Boards with Hurricane SoCs shall have the following properties:
|
||||||
|
|
||||||
|
Required root node property:
|
||||||
|
|
||||||
|
BCM53342
|
||||||
|
compatible = "brcm,bcm53342", "brcm,hr2";
|
||||||
@@ -197,6 +197,8 @@ described below.
|
|||||||
"actions,s500-smp"
|
"actions,s500-smp"
|
||||||
"allwinner,sun6i-a31"
|
"allwinner,sun6i-a31"
|
||||||
"allwinner,sun8i-a23"
|
"allwinner,sun8i-a23"
|
||||||
|
"amlogic,meson8-smp"
|
||||||
|
"amlogic,meson8b-smp"
|
||||||
"arm,realview-smp"
|
"arm,realview-smp"
|
||||||
"brcm,bcm11351-cpu-method"
|
"brcm,bcm11351-cpu-method"
|
||||||
"brcm,bcm23550"
|
"brcm,bcm23550"
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-apmixedsys"
|
- "mediatek,mt2701-apmixedsys"
|
||||||
|
- "mediatek,mt2712-apmixedsys", "syscon"
|
||||||
- "mediatek,mt6797-apmixedsys"
|
- "mediatek,mt6797-apmixedsys"
|
||||||
|
- "mediatek,mt7622-apmixedsys"
|
||||||
- "mediatek,mt8135-apmixedsys"
|
- "mediatek,mt8135-apmixedsys"
|
||||||
- "mediatek,mt8173-apmixedsys"
|
- "mediatek,mt8173-apmixedsys"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
MediaTek AUDSYS controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The MediaTek AUDSYS controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be one of:
|
||||||
|
- "mediatek,mt7622-audsys", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The AUDSYS controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
audsys: audsys@11220000 {
|
||||||
|
compatible = "mediatek,mt7622-audsys", "syscon";
|
||||||
|
reg = <0 0x11220000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -7,6 +7,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be:
|
- compatible: Should be:
|
||||||
- "mediatek,mt2701-bdpsys", "syscon"
|
- "mediatek,mt2701-bdpsys", "syscon"
|
||||||
|
- "mediatek,mt2712-bdpsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
The bdpsys controller uses the common clk binding from
|
The bdpsys controller uses the common clk binding from
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be:
|
- compatible: Should be:
|
||||||
- "mediatek,mt2701-ethsys", "syscon"
|
- "mediatek,mt2701-ethsys", "syscon"
|
||||||
|
- "mediatek,mt7622-ethsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
The ethsys controller uses the common clk binding from
|
The ethsys controller uses the common clk binding from
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be:
|
- compatible: Should be:
|
||||||
- "mediatek,mt2701-hifsys", "syscon"
|
- "mediatek,mt2701-hifsys", "syscon"
|
||||||
|
- "mediatek,mt7622-hifsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
The hifsys controller uses the common clk binding from
|
The hifsys controller uses the common clk binding from
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-imgsys", "syscon"
|
- "mediatek,mt2701-imgsys", "syscon"
|
||||||
|
- "mediatek,mt2712-imgsys", "syscon"
|
||||||
- "mediatek,mt6797-imgsys", "syscon"
|
- "mediatek,mt6797-imgsys", "syscon"
|
||||||
- "mediatek,mt8173-imgsys", "syscon"
|
- "mediatek,mt8173-imgsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-infracfg", "syscon"
|
- "mediatek,mt2701-infracfg", "syscon"
|
||||||
|
- "mediatek,mt2712-infracfg", "syscon"
|
||||||
- "mediatek,mt6797-infracfg", "syscon"
|
- "mediatek,mt6797-infracfg", "syscon"
|
||||||
|
- "mediatek,mt7622-infracfg", "syscon"
|
||||||
- "mediatek,mt8135-infracfg", "syscon"
|
- "mediatek,mt8135-infracfg", "syscon"
|
||||||
- "mediatek,mt8173-infracfg", "syscon"
|
- "mediatek,mt8173-infracfg", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
Mediatek jpgdecsys controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The Mediatek jpgdecsys controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be:
|
||||||
|
- "mediatek,mt2712-jpgdecsys", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The jpgdecsys controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
jpgdecsys: syscon@19000000 {
|
||||||
|
compatible = "mediatek,mt2712-jpgdecsys", "syscon";
|
||||||
|
reg = <0 0x19000000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
Mediatek mcucfg controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The Mediatek mcucfg controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be one of:
|
||||||
|
- "mediatek,mt2712-mcucfg", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The mcucfg controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mcucfg: syscon@10220000 {
|
||||||
|
compatible = "mediatek,mt2712-mcucfg", "syscon";
|
||||||
|
reg = <0 0x10220000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
Mediatek mfgcfg controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The Mediatek mfgcfg controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be one of:
|
||||||
|
- "mediatek,mt2712-mfgcfg", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The mfgcfg controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mfgcfg: syscon@13000000 {
|
||||||
|
compatible = "mediatek,mt2712-mfgcfg", "syscon";
|
||||||
|
reg = <0 0x13000000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -7,6 +7,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-mmsys", "syscon"
|
- "mediatek,mt2701-mmsys", "syscon"
|
||||||
|
- "mediatek,mt2712-mmsys", "syscon"
|
||||||
- "mediatek,mt6797-mmsys", "syscon"
|
- "mediatek,mt6797-mmsys", "syscon"
|
||||||
- "mediatek,mt8173-mmsys", "syscon"
|
- "mediatek,mt8173-mmsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
MediaTek PCIESYS controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The MediaTek PCIESYS controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be:
|
||||||
|
- "mediatek,mt7622-pciesys", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The PCIESYS controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
pciesys: pciesys@1a100800 {
|
||||||
|
compatible = "mediatek,mt7622-pciesys", "syscon";
|
||||||
|
reg = <0 0x1a100800 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -8,6 +8,8 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-pericfg", "syscon"
|
- "mediatek,mt2701-pericfg", "syscon"
|
||||||
|
- "mediatek,mt2712-pericfg", "syscon"
|
||||||
|
- "mediatek,mt7622-pericfg", "syscon"
|
||||||
- "mediatek,mt8135-pericfg", "syscon"
|
- "mediatek,mt8135-pericfg", "syscon"
|
||||||
- "mediatek,mt8173-pericfg", "syscon"
|
- "mediatek,mt8173-pericfg", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
MediaTek SGMIISYS controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The MediaTek SGMIISYS controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be:
|
||||||
|
- "mediatek,mt7622-sgmiisys", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The SGMIISYS controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
sgmiisys: sgmiisys@1b128000 {
|
||||||
|
compatible = "mediatek,mt7622-sgmiisys", "syscon";
|
||||||
|
reg = <0 0x1b128000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
MediaTek SSUSBSYS controller
|
||||||
|
============================
|
||||||
|
|
||||||
|
The MediaTek SSUSBSYS controller provides various clocks to the system.
|
||||||
|
|
||||||
|
Required Properties:
|
||||||
|
|
||||||
|
- compatible: Should be:
|
||||||
|
- "mediatek,mt7622-ssusbsys", "syscon"
|
||||||
|
- #clock-cells: Must be 1
|
||||||
|
|
||||||
|
The SSUSBSYS controller uses the common clk binding from
|
||||||
|
Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||||
|
The available clocks are defined in dt-bindings/clock/mt*-clk.h.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
ssusbsys: ssusbsys@1a000000 {
|
||||||
|
compatible = "mediatek,mt7622-ssusbsys", "syscon";
|
||||||
|
reg = <0 0x1a000000 0 0x1000>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
@@ -7,7 +7,9 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-topckgen"
|
- "mediatek,mt2701-topckgen"
|
||||||
|
- "mediatek,mt2712-topckgen", "syscon"
|
||||||
- "mediatek,mt6797-topckgen"
|
- "mediatek,mt6797-topckgen"
|
||||||
|
- "mediatek,mt7622-topckgen"
|
||||||
- "mediatek,mt8135-topckgen"
|
- "mediatek,mt8135-topckgen"
|
||||||
- "mediatek,mt8173-topckgen"
|
- "mediatek,mt8173-topckgen"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Required Properties:
|
|||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
- "mediatek,mt2701-vdecsys", "syscon"
|
- "mediatek,mt2701-vdecsys", "syscon"
|
||||||
|
- "mediatek,mt2712-vdecsys", "syscon"
|
||||||
- "mediatek,mt6797-vdecsys", "syscon"
|
- "mediatek,mt6797-vdecsys", "syscon"
|
||||||
- "mediatek,mt8173-vdecsys", "syscon"
|
- "mediatek,mt8173-vdecsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ The Mediatek vencsys controller provides various clocks to the system.
|
|||||||
Required Properties:
|
Required Properties:
|
||||||
|
|
||||||
- compatible: Should be one of:
|
- compatible: Should be one of:
|
||||||
|
- "mediatek,mt2712-vencsys", "syscon"
|
||||||
- "mediatek,mt6797-vencsys", "syscon"
|
- "mediatek,mt6797-vencsys", "syscon"
|
||||||
- "mediatek,mt8173-vencsys", "syscon"
|
- "mediatek,mt8173-vencsys", "syscon"
|
||||||
- #clock-cells: Must be 1
|
- #clock-cells: Must be 1
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ Required properties:
|
|||||||
"ti,omap3-scm"
|
"ti,omap3-scm"
|
||||||
"ti,omap4-scm-core"
|
"ti,omap4-scm-core"
|
||||||
"ti,omap4-scm-padconf-core"
|
"ti,omap4-scm-padconf-core"
|
||||||
|
"ti,omap4-scm-wkup"
|
||||||
|
"ti,omap4-scm-padconf-wkup"
|
||||||
"ti,omap5-scm-core"
|
"ti,omap5-scm-core"
|
||||||
"ti,omap5-scm-padconf-core"
|
"ti,omap5-scm-padconf-core"
|
||||||
"ti,dra7-scm-core"
|
"ti,dra7-scm-core"
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ Required root node properties:
|
|||||||
|
|
||||||
Root node property compatible must contain, depending on board:
|
Root node property compatible must contain, depending on board:
|
||||||
|
|
||||||
|
- MeLE V9: "mele,v9"
|
||||||
|
- ProBox2 AVA: "probox2,ava"
|
||||||
- Zidoo X9S: "zidoo,x9s"
|
- Zidoo X9S: "zidoo,x9s"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
Rockchip platforms device tree bindings
|
Rockchip platforms device tree bindings
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
- Amarula Vyasa RK3288 board
|
||||||
|
Required root node properties:
|
||||||
|
- compatible = "amarula,vyasa-rk3288", "rockchip,rk3288";
|
||||||
|
|
||||||
- Asus Tinker board
|
- Asus Tinker board
|
||||||
Required root node properties:
|
Required root node properties:
|
||||||
- compatible = "asus,rk3288-tinker", "rockchip,rk3288";
|
- compatible = "asus,rk3288-tinker", "rockchip,rk3288";
|
||||||
|
|||||||