diff options
Diffstat (limited to 'Documentation')
313 files changed, 8270 insertions, 1691 deletions
diff --git a/Documentation/ABI/testing/ima_policy b/Documentation/ABI/testing/ima_policy index c2385183826c..d4b3696a9efb 100644 --- a/Documentation/ABI/testing/ima_policy +++ b/Documentation/ABI/testing/ima_policy @@ -20,9 +20,10 @@ Description: rule format: action [condition ...] action: measure | dont_measure | appraise | dont_appraise | - audit | hash | dont_hash + audit | dont_audit | hash | dont_hash condition:= base | lsm [option] base: [[func=] [mask=] [fsmagic=] [fsuuid=] [fsname=] + [fs_subtype=] [uid=] [euid=] [gid=] [egid=] [fowner=] [fgroup=]] lsm: [[subj_user=] [subj_role=] [subj_type=] diff --git a/Documentation/ABI/testing/sysfs-block-bcache b/Documentation/ABI/testing/sysfs-block-bcache index 9e4bbc5d51fd..9344a657ca70 100644 --- a/Documentation/ABI/testing/sysfs-block-bcache +++ b/Documentation/ABI/testing/sysfs-block-bcache @@ -106,13 +106,6 @@ Description: will be discarded from the cache. Should not be turned off with writeback caching enabled. -What: /sys/block/<disk>/bcache/discard -Date: November 2010 -Contact: Kent Overstreet <kent.overstreet@gmail.com> -Description: - For a cache, a boolean allowing discard/TRIM to be turned off - or back on if the device supports it. - What: /sys/block/<disk>/bcache/bucket_size Date: November 2010 Contact: Kent Overstreet <kent.overstreet@gmail.com> diff --git a/Documentation/ABI/testing/sysfs-module b/Documentation/ABI/testing/sysfs-module index 62addab47d0c..6bc9af6229f0 100644 --- a/Documentation/ABI/testing/sysfs-module +++ b/Documentation/ABI/testing/sysfs-module @@ -59,6 +59,8 @@ Description: Module taint flags: F force-loaded module C staging driver module E unsigned module + K livepatch module + N in-kernel test module == ===================== What: /sys/module/grant_table/parameters/free_per_iteration diff --git a/Documentation/ABI/testing/sysfs-power b/Documentation/ABI/testing/sysfs-power index 4d8e1ad020f0..d38da077905a 100644 --- a/Documentation/ABI/testing/sysfs-power +++ b/Documentation/ABI/testing/sysfs-power @@ -454,3 +454,19 @@ Description: disables it. Reads from the file return the current value. The default is "1" if the build-time "SUSPEND_SKIP_SYNC" config flag is unset, or "0" otherwise. + +What: /sys/power/hibernate_compression_threads +Date: October 2025 +Contact: <luoxueqin@kylinos.cn> +Description: + Controls the number of threads used for compression + and decompression of hibernation images. + + The value can be adjusted at runtime to balance + performance and CPU utilization. + + The change takes effect on the next hibernation or + resume operation. + + Minimum value: 1 + Default value: 3 diff --git a/Documentation/Kconfig b/Documentation/Kconfig index 3a0e7ac0c4e3..8b6c4b84b218 100644 --- a/Documentation/Kconfig +++ b/Documentation/Kconfig @@ -19,7 +19,7 @@ config WARN_ABI_ERRORS described at Documentation/ABI/README. Yet, as they're manually written, it would be possible that some of those files would have errors that would break them for being parsed by - scripts/get_abi.pl. Add a check to verify them. + tools/docs/get_abi.py. Add a check to verify them. If unsure, select 'N'. diff --git a/Documentation/Makefile b/Documentation/Makefile index 3609cb86137b..e96ac6dcac4f 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -8,12 +8,12 @@ subdir- := devicetree/bindings ifneq ($(MAKECMDGOALS),cleandocs) # Check for broken documentation file references ifeq ($(CONFIG_WARN_MISSING_DOCUMENTS),y) -$(shell $(srctree)/scripts/documentation-file-ref-check --warn) +$(shell $(srctree)/tools/docs/documentation-file-ref-check --warn) endif # Check for broken ABI files ifeq ($(CONFIG_WARN_ABI_ERRORS),y) -$(shell $(srctree)/scripts/get_abi.py --dir $(srctree)/Documentation/ABI validate) +$(shell $(srctree)/tools/docs/get_abi.py --dir $(srctree)/Documentation/ABI validate) endif endif @@ -23,21 +23,22 @@ SPHINXOPTS = SPHINXDIRS = . DOCS_THEME = DOCS_CSS = -_SPHINXDIRS = $(sort $(patsubst $(srctree)/Documentation/%/index.rst,%,$(wildcard $(srctree)/Documentation/*/index.rst))) -SPHINX_CONF = conf.py +RUSTDOC = PAPER = BUILDDIR = $(obj)/output PDFLATEX = xelatex LATEXOPTS = -interaction=batchmode -no-shell-escape +PYTHONPYCACHEPREFIX ?= $(abspath $(BUILDDIR)/__pycache__) + +# Wrapper for sphinx-build + +BUILD_WRAPPER = $(srctree)/tools/docs/sphinx-build-wrapper + # For denylisting "variable font" files # Can be overridden by setting as an env variable FONTS_CONF_DENY_VF ?= $(HOME)/deny-vf -ifeq ($(findstring 1, $(KBUILD_VERBOSE)),) -SPHINXOPTS += "-q" -endif - # User-friendly check for sphinx-build HAVE_SPHINX := $(shell if which $(SPHINXBUILD) >/dev/null 2>&1; then echo 1; else echo 0; fi) @@ -46,141 +47,46 @@ ifeq ($(HAVE_SPHINX),0) .DEFAULT: $(warning The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed and in PATH, or set the SPHINXBUILD make variable to point to the full path of the '$(SPHINXBUILD)' executable.) @echo - @$(srctree)/scripts/sphinx-pre-install + @$(srctree)/tools/docs/sphinx-pre-install @echo " SKIP Sphinx $@ target." else # HAVE_SPHINX -# User-friendly check for pdflatex and latexmk -HAVE_PDFLATEX := $(shell if which $(PDFLATEX) >/dev/null 2>&1; then echo 1; else echo 0; fi) -HAVE_LATEXMK := $(shell if which latexmk >/dev/null 2>&1; then echo 1; else echo 0; fi) - -ifeq ($(HAVE_LATEXMK),1) - PDFLATEX := latexmk -$(PDFLATEX) -endif #HAVE_LATEXMK - -# Internal variables. -PAPEROPT_a4 = -D latex_elements.papersize=a4paper -PAPEROPT_letter = -D latex_elements.papersize=letterpaper -ALLSPHINXOPTS = -D kerneldoc_srctree=$(srctree) -D kerneldoc_bin=$(KERNELDOC) -ALLSPHINXOPTS += $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) -ifneq ($(wildcard $(srctree)/.config),) -ifeq ($(CONFIG_RUST),y) - # Let Sphinx know we will include rustdoc - ALLSPHINXOPTS += -t rustdoc -endif -endif -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# Common documentation targets +htmldocs mandocs infodocs texinfodocs latexdocs epubdocs xmldocs pdfdocs linkcheckdocs: + $(Q)PYTHONPYCACHEPREFIX="$(PYTHONPYCACHEPREFIX)" \ + $(srctree)/tools/docs/sphinx-pre-install --version-check + +$(Q)PYTHONPYCACHEPREFIX="$(PYTHONPYCACHEPREFIX)" \ + $(PYTHON3) $(BUILD_WRAPPER) $@ \ + --sphinxdirs="$(SPHINXDIRS)" $(RUSTDOC) \ + --builddir="$(BUILDDIR)" --deny-vf=$(FONTS_CONF_DENY_VF) \ + --theme=$(DOCS_THEME) --css=$(DOCS_CSS) --paper=$(PAPER) -# commands; the 'cmd' from scripts/Kbuild.include is not *loopable* -loop_cmd = $(echo-cmd) $(cmd_$(1)) || exit; -# $2 sphinx builder e.g. "html" -# $3 name of the build subfolder / e.g. "userspace-api/media", used as: -# * dest folder relative to $(BUILDDIR) and -# * cache folder relative to $(BUILDDIR)/.doctrees -# $4 dest subfolder e.g. "man" for man pages at userspace-api/media/man -# $5 reST source folder relative to $(src), -# e.g. "userspace-api/media" for the linux-tv book-set at ./Documentation/userspace-api/media - -PYTHONPYCACHEPREFIX ?= $(abspath $(BUILDDIR)/__pycache__) - -quiet_cmd_sphinx = SPHINX $@ --> file://$(abspath $(BUILDDIR)/$3/$4) - cmd_sphinx = \ - PYTHONPYCACHEPREFIX="$(PYTHONPYCACHEPREFIX)" \ - BUILDDIR=$(abspath $(BUILDDIR)) SPHINX_CONF=$(abspath $(src)/$5/$(SPHINX_CONF)) \ - $(PYTHON3) $(srctree)/scripts/jobserver-exec \ - $(CONFIG_SHELL) $(srctree)/Documentation/sphinx/parallel-wrapper.sh \ - $(SPHINXBUILD) \ - -b $2 \ - -c $(abspath $(src)) \ - -d $(abspath $(BUILDDIR)/.doctrees/$3) \ - -D version=$(KERNELVERSION) -D release=$(KERNELRELEASE) \ - $(ALLSPHINXOPTS) \ - $(abspath $(src)/$5) \ - $(abspath $(BUILDDIR)/$3/$4) && \ - if [ "x$(DOCS_CSS)" != "x" ]; then \ - cp $(if $(patsubst /%,,$(DOCS_CSS)),$(abspath $(srctree)/$(DOCS_CSS)),$(DOCS_CSS)) $(BUILDDIR)/$3/_static/; \ - fi - -htmldocs: - @$(srctree)/scripts/sphinx-pre-install --version-check - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var))) - -htmldocs-redirects: $(srctree)/Documentation/.renames.txt - @tools/docs/gen-redirects.py --output $(BUILDDIR) < $< - -# If Rust support is available and .config exists, add rustdoc generated contents. -# If there are any, the errors from this make rustdoc will be displayed but -# won't stop the execution of htmldocs - -ifneq ($(wildcard $(srctree)/.config),) -ifeq ($(CONFIG_RUST),y) - $(Q)$(MAKE) rustdoc || true -endif endif -texinfodocs: - @$(srctree)/scripts/sphinx-pre-install --version-check - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,texinfo,$(var),texinfo,$(var))) - -# Note: the 'info' Make target is generated by sphinx itself when -# running the texinfodocs target define above. -infodocs: texinfodocs - $(MAKE) -C $(BUILDDIR)/texinfo info - -linkcheckdocs: - @$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,linkcheck,$(var),,$(var))) - -latexdocs: - @$(srctree)/scripts/sphinx-pre-install --version-check - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,latex,$(var),latex,$(var))) - -ifeq ($(HAVE_PDFLATEX),0) - -pdfdocs: - $(warning The '$(PDFLATEX)' command was not found. Make sure you have it installed and in PATH to produce PDF output.) - @echo " SKIP Sphinx $@ target." - -else # HAVE_PDFLATEX - -pdfdocs: DENY_VF = XDG_CONFIG_HOME=$(FONTS_CONF_DENY_VF) -pdfdocs: latexdocs - @$(srctree)/scripts/sphinx-pre-install --version-check - $(foreach var,$(SPHINXDIRS), \ - $(MAKE) PDFLATEX="$(PDFLATEX)" LATEXOPTS="$(LATEXOPTS)" $(DENY_VF) -C $(BUILDDIR)/$(var)/latex || sh $(srctree)/scripts/check-variable-fonts.sh || exit; \ - mkdir -p $(BUILDDIR)/$(var)/pdf; \ - mv $(subst .tex,.pdf,$(wildcard $(BUILDDIR)/$(var)/latex/*.tex)) $(BUILDDIR)/$(var)/pdf/; \ - ) - -endif # HAVE_PDFLATEX - -epubdocs: - @$(srctree)/scripts/sphinx-pre-install --version-check - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,epub,$(var),epub,$(var))) - -xmldocs: - @$(srctree)/scripts/sphinx-pre-install --version-check - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,xml,$(var),xml,$(var))) - -endif # HAVE_SPHINX - # The following targets are independent of HAVE_SPHINX, and the rules should # work or silently pass without Sphinx. +htmldocs-redirects: $(srctree)/Documentation/.renames.txt + @tools/docs/gen-redirects.py --output $(BUILDDIR) < $< + refcheckdocs: - $(Q)cd $(srctree);scripts/documentation-file-ref-check + $(Q)cd $(srctree); tools/docs/documentation-file-ref-check cleandocs: $(Q)rm -rf $(BUILDDIR) +# Used only on help +_SPHINXDIRS = $(shell printf "%s\n" $(patsubst $(srctree)/Documentation/%/index.rst,%,$(wildcard $(srctree)/Documentation/*/index.rst)) | sort -f) + dochelp: @echo ' Linux kernel internal documentation in different formats from ReST:' @echo ' htmldocs - HTML' @echo ' htmldocs-redirects - generate HTML redirects for moved pages' @echo ' texinfodocs - Texinfo' @echo ' infodocs - Info' + @echo ' mandocs - Man pages' @echo ' latexdocs - LaTeX' @echo ' pdfdocs - PDF' @echo ' epubdocs - EPUB' @@ -192,13 +98,17 @@ dochelp: @echo ' cleandocs - clean all generated files' @echo @echo ' make SPHINXDIRS="s1 s2" [target] Generate only docs of folder s1, s2' - @echo ' valid values for SPHINXDIRS are: $(_SPHINXDIRS)' - @echo - @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 ' top level values for SPHINXDIRS are: $(_SPHINXDIRS)' + @echo ' you may also use a subdirectory like SPHINXDIRS=userspace-api/media,' + @echo ' provided that there is an index.rst file at the subdirectory.' @echo @echo ' make DOCS_THEME={sphinx-theme} selects a different Sphinx theme.' @echo @echo ' make DOCS_CSS={a .css file} adds a DOCS_CSS override file for html/epub output.' @echo + @echo ' make PAPER={a4|letter} Specifies the paper size used for LaTeX/PDF output.' + @echo + @echo ' make FONTS_CONF_DENY_VF={path} sets a deny list to block variable Noto CJK fonts' + @echo ' for PDF build. See tools/lib/python/kdoc/latex_fonts.py for more details' + @echo @echo ' Default location for the generated documents is Documentation/output' diff --git a/Documentation/RCU/Design/Requirements/Requirements.rst b/Documentation/RCU/Design/Requirements/Requirements.rst index f24b3c0b9b0d..ba417a08b93d 100644 --- a/Documentation/RCU/Design/Requirements/Requirements.rst +++ b/Documentation/RCU/Design/Requirements/Requirements.rst @@ -2637,15 +2637,16 @@ synchronize_srcu() for some other domain ``ss1``, and if an that was held across as ``ss``-domain synchronize_srcu(), deadlock would again be possible. Such a deadlock cycle could extend across an arbitrarily large number of different SRCU domains. Again, with great -power comes great responsibility. +power comes great responsibility, though lockdep is now able to detect +this sort of deadlock. -Unlike the other RCU flavors, SRCU read-side critical sections can run -on idle and even offline CPUs. This ability requires that -srcu_read_lock() and srcu_read_unlock() contain memory barriers, -which means that SRCU readers will run a bit slower than would RCU -readers. It also motivates the smp_mb__after_srcu_read_unlock() API, -which, in combination with srcu_read_unlock(), guarantees a full -memory barrier. +Unlike the other RCU flavors, SRCU read-side critical sections can run on +idle and even offline CPUs, with the exception of srcu_read_lock_fast() +and friends. This ability requires that srcu_read_lock() and +srcu_read_unlock() contain memory barriers, which means that SRCU +readers will run a bit slower than would RCU readers. It also motivates +the smp_mb__after_srcu_read_unlock() API, which, in combination with +srcu_read_unlock(), guarantees a full memory barrier. Also unlike other RCU flavors, synchronize_srcu() may **not** be invoked from CPU-hotplug notifiers, due to the fact that SRCU grace @@ -2681,15 +2682,15 @@ run some tests first. SRCU just might need a few adjustment to deal with that sort of load. Of course, your mileage may vary based on the speed of your CPUs and the size of your memory. -The `SRCU -API <https://lwn.net/Articles/609973/#RCU%20Per-Flavor%20API%20Table>`__ +The `SRCU API +<https://lwn.net/Articles/609973/#RCU%20Per-Flavor%20API%20Table>`__ includes srcu_read_lock(), srcu_read_unlock(), -srcu_dereference(), srcu_dereference_check(), -synchronize_srcu(), synchronize_srcu_expedited(), -call_srcu(), srcu_barrier(), and srcu_read_lock_held(). It -also includes DEFINE_SRCU(), DEFINE_STATIC_SRCU(), and -init_srcu_struct() APIs for defining and initializing -``srcu_struct`` structures. +srcu_dereference(), srcu_dereference_check(), synchronize_srcu(), +synchronize_srcu_expedited(), call_srcu(), srcu_barrier(), +and srcu_read_lock_held(). It also includes DEFINE_SRCU(), +DEFINE_STATIC_SRCU(), DEFINE_SRCU_FAST(), DEFINE_STATIC_SRCU_FAST(), +init_srcu_struct(), and init_srcu_struct_fast() APIs for defining and +initializing ``srcu_struct`` structures. More recently, the SRCU API has added polling interfaces: diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst index c9bfb2b218e5..4b30f701225f 100644 --- a/Documentation/RCU/checklist.rst +++ b/Documentation/RCU/checklist.rst @@ -417,11 +417,13 @@ over a rather long period of time, but improvements are always welcome! you should be using RCU rather than SRCU, because RCU is almost always faster and easier to use than is SRCU. - Also unlike other forms of RCU, explicit initialization and - cleanup is required either at build time via DEFINE_SRCU() - or DEFINE_STATIC_SRCU() or at runtime via init_srcu_struct() - and cleanup_srcu_struct(). These last two are passed a - "struct srcu_struct" that defines the scope of a given + Also unlike other forms of RCU, explicit initialization + and cleanup is required either at build time via + DEFINE_SRCU(), DEFINE_STATIC_SRCU(), DEFINE_SRCU_FAST(), + or DEFINE_STATIC_SRCU_FAST() or at runtime via either + init_srcu_struct() or init_srcu_struct_fast() and + cleanup_srcu_struct(). These last three are passed a + `struct srcu_struct` that defines the scope of a given SRCU domain. Once initialized, the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock() synchronize_srcu(), synchronize_srcu_expedited(), and call_srcu(). A given diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst index cf0b0ac9f463..a1582bd653d1 100644 --- a/Documentation/RCU/whatisRCU.rst +++ b/Documentation/RCU/whatisRCU.rst @@ -1227,7 +1227,10 @@ SRCU: Initialization/cleanup/ordering:: DEFINE_SRCU DEFINE_STATIC_SRCU + DEFINE_SRCU_FAST // for srcu_read_lock_fast() and friends + DEFINE_STATIC_SRCU_FAST // for srcu_read_lock_fast() and friends init_srcu_struct + init_srcu_struct_fast cleanup_srcu_struct smp_mb__after_srcu_read_unlock diff --git a/Documentation/accounting/taskstats.rst b/Documentation/accounting/taskstats.rst index 2a28b7f55c10..173c1e7bf5ef 100644 --- a/Documentation/accounting/taskstats.rst +++ b/Documentation/accounting/taskstats.rst @@ -76,41 +76,43 @@ The messages are in the format:: The taskstats payload is one of the following three kinds: 1. Commands: Sent from user to kernel. Commands to get data on -a pid/tgid consist of one attribute, of type TASKSTATS_CMD_ATTR_PID/TGID, -containing a u32 pid or tgid in the attribute payload. The pid/tgid denotes -the task/process for which userspace wants statistics. - -Commands to register/deregister interest in exit data from a set of cpus -consist of one attribute, of type -TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK and contain a cpumask in the -attribute payload. The cpumask is specified as an ascii string of -comma-separated cpu ranges e.g. to listen to exit data from cpus 1,2,3,5,7,8 -the cpumask would be "1-3,5,7-8". If userspace forgets to deregister interest -in cpus before closing the listening socket, the kernel cleans up its interest -set over time. However, for the sake of efficiency, an explicit deregistration -is advisable. + a pid/tgid consist of one attribute, of type TASKSTATS_CMD_ATTR_PID/TGID, + containing a u32 pid or tgid in the attribute payload. The pid/tgid denotes + the task/process for which userspace wants statistics. + + Commands to register/deregister interest in exit data from a set of cpus + consist of one attribute, of type + TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK and contain a cpumask in the + attribute payload. The cpumask is specified as an ascii string of + comma-separated cpu ranges e.g. to listen to exit data from cpus 1,2,3,5,7,8 + the cpumask would be "1-3,5,7-8". If userspace forgets to deregister + interest in cpus before closing the listening socket, the kernel cleans up + its interest set over time. However, for the sake of efficiency, an explicit + deregistration is advisable. 2. Response for a command: sent from the kernel in response to a userspace -command. The payload is a series of three attributes of type: + command. The payload is a series of three attributes of type: -a) TASKSTATS_TYPE_AGGR_PID/TGID : attribute containing no payload but indicates -a pid/tgid will be followed by some stats. + a) TASKSTATS_TYPE_AGGR_PID/TGID: attribute containing no payload but + indicates a pid/tgid will be followed by some stats. -b) TASKSTATS_TYPE_PID/TGID: attribute whose payload is the pid/tgid whose stats -are being returned. + b) TASKSTATS_TYPE_PID/TGID: attribute whose payload is the pid/tgid whose + stats are being returned. -c) TASKSTATS_TYPE_STATS: attribute with a struct taskstats as payload. The -same structure is used for both per-pid and per-tgid stats. + c) TASKSTATS_TYPE_STATS: attribute with a struct taskstats as payload. The + same structure is used for both per-pid and per-tgid stats. 3. New message sent by kernel whenever a task exits. The payload consists of a series of attributes of the following type: -a) TASKSTATS_TYPE_AGGR_PID: indicates next two attributes will be pid+stats -b) TASKSTATS_TYPE_PID: contains exiting task's pid -c) TASKSTATS_TYPE_STATS: contains the exiting task's per-pid stats -d) TASKSTATS_TYPE_AGGR_TGID: indicates next two attributes will be tgid+stats -e) TASKSTATS_TYPE_TGID: contains tgid of process to which task belongs -f) TASKSTATS_TYPE_STATS: contains the per-tgid stats for exiting task's process + a) TASKSTATS_TYPE_AGGR_PID: indicates next two attributes will be pid+stats + b) TASKSTATS_TYPE_PID: contains exiting task's pid + c) TASKSTATS_TYPE_STATS: contains the exiting task's per-pid stats + d) TASKSTATS_TYPE_AGGR_TGID: indicates next two attributes will be + tgid+stats + e) TASKSTATS_TYPE_TGID: contains tgid of process to which task belongs + f) TASKSTATS_TYPE_STATS: contains the per-tgid stats for exiting task's + process per-tgid stats diff --git a/Documentation/admin-guide/LSM/Smack.rst b/Documentation/admin-guide/LSM/Smack.rst index 6d44f4fdbf59..c5ed775f2d10 100644 --- a/Documentation/admin-guide/LSM/Smack.rst +++ b/Documentation/admin-guide/LSM/Smack.rst @@ -601,10 +601,15 @@ specification. Task Attribute ~~~~~~~~~~~~~~ -The Smack label of a process can be read from /proc/<pid>/attr/current. A -process can read its own Smack label from /proc/self/attr/current. A +The Smack label of a process can be read from ``/proc/<pid>/attr/current``. A +process can read its own Smack label from ``/proc/self/attr/current``. A privileged process can change its own Smack label by writing to -/proc/self/attr/current but not the label of another process. +``/proc/self/attr/current`` but not the label of another process. + +Format of writing is : only the label or the label followed by one of the +3 trailers: ``\n`` (by common agreement for ``/proc/...`` interfaces), +``\0`` (because some applications incorrectly include it), +``\n\0`` (because we think some applications may incorrectly include it). File Attribute ~~~~~~~~~~~~~~ @@ -696,6 +701,11 @@ sockets. A privileged program may set this to match the label of another task with which it hopes to communicate. +UNIX domain socket (UDS) with a BSD address functions both as a file in a +filesystem and as a socket. As a file, it carries the SMACK64 attribute. This +attribute is not involved in Smack security enforcement and is immutably +assigned the label "*". + Smack Netlabel Exceptions ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Documentation/admin-guide/LSM/ipe.rst b/Documentation/admin-guide/LSM/ipe.rst index dc7088451f9d..a756d8158531 100644 --- a/Documentation/admin-guide/LSM/ipe.rst +++ b/Documentation/admin-guide/LSM/ipe.rst @@ -95,7 +95,20 @@ languages when these scripts are invoked by passing these program files to the interpreter. This is because the way interpreters execute these files; the scripts themselves are not evaluated as executable code through one of IPE's hooks, but they are merely text files that are read -(as opposed to compiled executables) [#interpreters]_. +(as opposed to compiled executables). However, with the introduction of the +``AT_EXECVE_CHECK`` flag (:doc:`AT_EXECVE_CHECK </userspace-api/check_exec>`), +interpreters can use it to signal the kernel that a script file will be executed, +and request the kernel to perform LSM security checks on it. + +IPE's EXECUTE operation enforcement differs between compiled executables and +interpreted scripts: For compiled executables, enforcement is triggered +automatically by the kernel during ``execve()``, ``execveat()``, ``mmap()`` +and ``mprotect()`` syscalls when loading executable content. For interpreted +scripts, enforcement requires explicit interpreter integration using +``execveat()`` with ``AT_EXECVE_CHECK`` flag. Unlike exec syscalls that IPE +intercepts during the execution process, this mechanism needs the interpreter +to take the initiative, and existing interpreters won't be automatically +supported unless the signal call is added. Threat Model ------------ @@ -806,8 +819,6 @@ A: .. [#digest_cache_lsm] https://lore.kernel.org/lkml/20240415142436.2545003-1-roberto.sassu@huaweicloud.com/ -.. [#interpreters] There is `some interest in solving this issue <https://lore.kernel.org/lkml/20220321161557.495388-1-mic@digikod.net/>`_. - .. [#devdoc] Please see :doc:`the design docs </security/ipe>` for more on this topic. diff --git a/Documentation/admin-guide/RAS/main.rst b/Documentation/admin-guide/RAS/main.rst index 447bfde509fb..5a45db32c49b 100644 --- a/Documentation/admin-guide/RAS/main.rst +++ b/Documentation/admin-guide/RAS/main.rst @@ -406,24 +406,8 @@ index of the MC:: |->mc2 .... -Under each ``mcX`` directory each ``csrowX`` is again represented by a -``csrowX``, where ``X`` is the csrow index:: - - .../mc/mc0/ - | - |->csrow0 - |->csrow2 - |->csrow3 - .... - -Notice that there is no csrow1, which indicates that csrow0 is composed -of a single ranked DIMMs. This should also apply in both Channels, in -order to have dual-channel mode be operational. Since both csrow2 and -csrow3 are populated, this indicates a dual ranked set of DIMMs for -channels 0 and 1. - -Within each of the ``mcX`` and ``csrowX`` directories are several EDAC -control and attribute files. +Within each of the ``mcX`` directory are several EDAC control and +attribute files. ``mcX`` directories ------------------- @@ -569,7 +553,7 @@ this ``X`` memory module: - Unbuffered-DDR .. [#f5] On some systems, the memory controller doesn't have any logic - to identify the memory module. On such systems, the directory is called ``rankX`` and works on a similar way as the ``csrowX`` directories. + to identify the memory module. On such systems, the directory is called ``rankX``. On modern Intel memory controllers, the memory controller identifies the memory modules directly. On such systems, the directory is called ``dimmX``. @@ -577,126 +561,6 @@ this ``X`` memory module: symlinks inside the sysfs mapping that are automatically created by the sysfs subsystem. Currently, they serve no purpose. -``csrowX`` directories ----------------------- - -When CONFIG_EDAC_LEGACY_SYSFS is enabled, sysfs will contain the ``csrowX`` -directories. As this API doesn't work properly for Rambus, FB-DIMMs and -modern Intel Memory Controllers, this is being deprecated in favor of -``dimmX`` directories. - -In the ``csrowX`` directories are EDAC control and attribute files for -this ``X`` instance of csrow: - - -- ``ue_count`` - Total Uncorrectable Errors count attribute file - - This attribute file displays the total count of uncorrectable - errors that have occurred on this csrow. If panic_on_ue is set - this counter will not have a chance to increment, since EDAC - will panic the system. - - -- ``ce_count`` - Total Correctable Errors count attribute file - - This attribute file displays the total count of correctable - errors that have occurred on this csrow. This count is very - important to examine. CEs provide early indications that a - DIMM is beginning to fail. This count field should be - monitored for non-zero values and report such information - to the system administrator. - - -- ``size_mb`` - Total memory managed by this csrow attribute file - - This attribute file displays, in count of megabytes, the memory - that this csrow contains. - - -- ``mem_type`` - Memory Type attribute file - - This attribute file will display what type of memory is currently - on this csrow. Normally, either buffered or unbuffered memory. - Examples: - - - Registered-DDR - - Unbuffered-DDR - - -- ``edac_mode`` - EDAC Mode of operation attribute file - - This attribute file will display what type of Error detection - and correction is being utilized. - - -- ``dev_type`` - Device type attribute file - - This attribute file will display what type of DRAM device is - being utilized on this DIMM. - Examples: - - - x1 - - x2 - - x4 - - x8 - - -- ``ch0_ce_count`` - Channel 0 CE Count attribute file - - This attribute file will display the count of CEs on this - DIMM located in channel 0. - - -- ``ch0_ue_count`` - Channel 0 UE Count attribute file - - This attribute file will display the count of UEs on this - DIMM located in channel 0. - - -- ``ch0_dimm_label`` - Channel 0 DIMM Label control file - - - This control file allows this DIMM to have a label assigned - to it. With this label in the module, when errors occur - the output can provide the DIMM label in the system log. - This becomes vital for panic events to isolate the - cause of the UE event. - - DIMM Labels must be assigned after booting, with information - that correctly identifies the physical slot with its - silk screen label. This information is currently very - motherboard specific and determination of this information - must occur in userland at this time. - - -- ``ch1_ce_count`` - Channel 1 CE Count attribute file - - - This attribute file will display the count of CEs on this - DIMM located in channel 1. - - -- ``ch1_ue_count`` - Channel 1 UE Count attribute file - - - This attribute file will display the count of UEs on this - DIMM located in channel 0. - - -- ``ch1_dimm_label`` - Channel 1 DIMM Label control file - - This control file allows this DIMM to have a label assigned - to it. With this label in the module, when errors occur - the output can provide the DIMM label in the system log. - This becomes vital for panic events to isolate the - cause of the UE event. - - DIMM Labels must be assigned after booting, with information - that correctly identifies the physical slot with its - silk screen label. This information is currently very - motherboard specific and determination of this information - must occur in userland at this time. - System Logging -------------- diff --git a/Documentation/admin-guide/bcache.rst b/Documentation/admin-guide/bcache.rst index 6fdb495ac466..f71f349553e4 100644 --- a/Documentation/admin-guide/bcache.rst +++ b/Documentation/admin-guide/bcache.rst @@ -17,8 +17,7 @@ The latest bcache kernel code can be found from mainline Linux kernel: It's designed around the performance characteristics of SSDs - it only allocates in erase block sized buckets, and it uses a hybrid btree/log to track cached extents (which can be anywhere from a single sector to the bucket size). It's -designed to avoid random writes at all costs; it fills up an erase block -sequentially, then issues a discard before reusing it. +designed to avoid random writes at all costs. Both writethrough and writeback caching are supported. Writeback defaults to off, but can be switched on and off arbitrarily at runtime. Bcache goes to @@ -618,19 +617,11 @@ bucket_size cache_replacement_policy One of either lru, fifo or random. -discard - Boolean; if on a discard/TRIM will be issued to each bucket before it is - reused. Defaults to off, since SATA TRIM is an unqueued command (and thus - slow). - freelist_percent Size of the freelist as a percentage of nbuckets. Can be written to to increase the number of buckets kept on the freelist, which lets you artificially reduce the size of the cache at runtime. Mostly for testing - purposes (i.e. testing how different size caches affect your hit rate), but - since buckets are discarded when they move on to the freelist will also make - the SSD's garbage collection easier by effectively giving it more reserved - space. + purposes (i.e. testing how different size caches affect your hit rate). io_errors Number of errors that have occurred, decayed by io_error_halflife. diff --git a/Documentation/admin-guide/blockdev/zoned_loop.rst b/Documentation/admin-guide/blockdev/zoned_loop.rst index 64dcfde7450a..806adde664db 100644 --- a/Documentation/admin-guide/blockdev/zoned_loop.rst +++ b/Documentation/admin-guide/blockdev/zoned_loop.rst @@ -68,30 +68,43 @@ The options available for the add command can be listed by reading the In more details, the options that can be used with the "add" command are as follows. -================ =========================================================== -id Device number (the X in /dev/zloopX). - Default: automatically assigned. -capacity_mb Device total capacity in MiB. This is always rounded up to - the nearest higher multiple of the zone size. - Default: 16384 MiB (16 GiB). -zone_size_mb Device zone size in MiB. Default: 256 MiB. -zone_capacity_mb Device zone capacity (must always be equal to or lower than - the zone size. Default: zone size. -conv_zones Total number of conventioanl zones starting from sector 0. - Default: 8. -base_dir Path to the base directory where to create the directory - containing the zone files of the device. - Default=/var/local/zloop. - The device directory containing the zone files is always - named with the device ID. E.g. the default zone file - directory for /dev/zloop0 is /var/local/zloop/0. -nr_queues Number of I/O queues of the zoned block device. This value is - always capped by the number of online CPUs - Default: 1 -queue_depth Maximum I/O queue depth per I/O queue. - Default: 64 -buffered_io Do buffered IOs instead of direct IOs (default: false) -================ =========================================================== +=================== ========================================================= +id Device number (the X in /dev/zloopX). + Default: automatically assigned. +capacity_mb Device total capacity in MiB. This is always rounded up + to the nearest higher multiple of the zone size. + Default: 16384 MiB (16 GiB). +zone_size_mb Device zone size in MiB. Default: 256 MiB. +zone_capacity_mb Device zone capacity (must always be equal to or lower + than the zone size. Default: zone size. +conv_zones Total number of conventioanl zones starting from + sector 0 + Default: 8 +base_dir Path to the base directory where to create the directory + containing the zone files of the device. + Default=/var/local/zloop. + The device directory containing the zone files is always + named with the device ID. E.g. the default zone file + directory for /dev/zloop0 is /var/local/zloop/0. +nr_queues Number of I/O queues of the zoned block device. This + value is always capped by the number of online CPUs + Default: 1 +queue_depth Maximum I/O queue depth per I/O queue. + Default: 64 +buffered_io Do buffered IOs instead of direct IOs (default: false) +zone_append Enable or disable a zloop device native zone append + support. + Default: 1 (enabled). + If native zone append support is disabled, the block layer + will emulate this operation using regular write + operations. +ordered_zone_append Enable zloop mitigation of zone append reordering. + Default: disabled. + This is useful for testing file systems file data mapping + (extents), as when enabled, this can significantly reduce + the number of data extents needed to for a file data + mapping. +=================== ========================================================= 3) Deleting a Zoned Device -------------------------- diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst index 0e6c67ac585a..4c072e85acdf 100644 --- a/Documentation/admin-guide/cgroup-v2.rst +++ b/Documentation/admin-guide/cgroup-v2.rst @@ -53,7 +53,8 @@ v1 is available under :ref:`Documentation/admin-guide/cgroup-v1/index.rst <cgrou 5-2. Memory 5-2-1. Memory Interface Files 5-2-2. Usage Guidelines - 5-2-3. Memory Ownership + 5-2-3. Reclaim Protection + 5-2-4. Memory Ownership 5-3. IO 5-3-1. IO Interface Files 5-3-2. Writeback @@ -1317,7 +1318,7 @@ PAGE_SIZE multiple when read back. smaller overages. Effective min boundary is limited by memory.min values of - all ancestor cgroups. If there is memory.min overcommitment + ancestor cgroups. If there is memory.min overcommitment (child cgroup or cgroups are requiring more protected memory than parent will allow), then each child cgroup will get the part of parent's protection proportional to its @@ -1326,9 +1327,6 @@ PAGE_SIZE multiple when read back. Putting more memory than generally available under this protection is discouraged and may lead to constant OOMs. - If a memory cgroup is not populated with processes, - its memory.min is ignored. - memory.low A read-write single value file which exists on non-root cgroups. The default is "0". @@ -1343,7 +1341,7 @@ PAGE_SIZE multiple when read back. smaller overages. Effective low boundary is limited by memory.low values of - all ancestor cgroups. If there is memory.low overcommitment + ancestor cgroups. If there is memory.low overcommitment (child cgroup or cgroups are requiring more protected memory than parent will allow), then each child cgroup will get the part of parent's protection proportional to its @@ -1934,6 +1932,27 @@ memory - is necessary to determine whether a workload needs more memory; unfortunately, memory pressure monitoring mechanism isn't implemented yet. +Reclaim Protection +~~~~~~~~~~~~~~~~~~ + +The protection configured with "memory.low" or "memory.min" applies relatively +to the target of the reclaim (i.e. any of memory cgroup limits, proactive +memory.reclaim or global reclaim apparently located in the root cgroup). +The protection value configured for B applies unchanged to the reclaim +targeting A (i.e. caused by competition with the sibling E):: + + root - ... - A - B - C + \ ` D + ` E + +When the reclaim targets ancestors of A, the effective protection of B is +capped by the protection value configured for A (and any other intermediate +ancestors between A and the target). + +To express indifference about relative sibling protection, it is suggested to +use memory_recursiveprot. Configuring all descendants of a parent with finite +protection to "max" works but it may unnecessarily skew memory.events:low +field. Memory Ownership ~~~~~~~~~~~~~~~~ diff --git a/Documentation/admin-guide/efi-stub.rst b/Documentation/admin-guide/efi-stub.rst index 090f3a185e18..f8e7407698bd 100644 --- a/Documentation/admin-guide/efi-stub.rst +++ b/Documentation/admin-guide/efi-stub.rst @@ -79,6 +79,9 @@ because the image we're executing is interpreted by the EFI shell, which understands relative paths, whereas the rest of the command line is passed to bzImage.efi. +.. hint:: + It is also possible to provide an initrd using a Linux-specific UEFI + protocol at boot time. See :ref:`pe-coff-entry-point` for details. The "dtb=" option ----------------- diff --git a/Documentation/admin-guide/hw-vuln/l1d_flush.rst b/Documentation/admin-guide/hw-vuln/l1d_flush.rst index 210020bc3f56..35dc25159b28 100644 --- a/Documentation/admin-guide/hw-vuln/l1d_flush.rst +++ b/Documentation/admin-guide/hw-vuln/l1d_flush.rst @@ -31,7 +31,7 @@ specifically opt into the feature to enable it. Mitigation ---------- -When PR_SET_L1D_FLUSH is enabled for a task a flush of the L1D cache is +When PR_SPEC_L1D_FLUSH is enabled for a task a flush of the L1D cache is performed when the task is scheduled out and the incoming task belongs to a different process and therefore to a different address space. diff --git a/Documentation/admin-guide/hw-vuln/spectre.rst b/Documentation/admin-guide/hw-vuln/spectre.rst index 991f12adef8d..4bb8549bee82 100644 --- a/Documentation/admin-guide/hw-vuln/spectre.rst +++ b/Documentation/admin-guide/hw-vuln/spectre.rst @@ -406,7 +406,7 @@ The possible values in this file are: - Single threaded indirect branch prediction (STIBP) status for protection between different hyper threads. This feature can be controlled through - prctl per process, or through kernel command line options. This is x86 + prctl per process, or through kernel command line options. This is an x86 only feature. For more details see below. ==================== ======================================================== diff --git a/Documentation/admin-guide/kernel-parameters.rst b/Documentation/admin-guide/kernel-parameters.rst index 7bf8cc7df6b5..02a725536cc5 100644 --- a/Documentation/admin-guide/kernel-parameters.rst +++ b/Documentation/admin-guide/kernel-parameters.rst @@ -110,102 +110,7 @@ The parameters listed below are only valid if certain kernel build options were enabled and if respective hardware is present. This list should be kept in alphabetical order. The text in square brackets at the beginning of each description states the restrictions within which a parameter -is applicable:: - - ACPI ACPI support is enabled. - AGP AGP (Accelerated Graphics Port) is enabled. - ALSA ALSA sound support is enabled. - APIC APIC support is enabled. - APM Advanced Power Management support is enabled. - APPARMOR AppArmor support is enabled. - ARM ARM architecture is enabled. - ARM64 ARM64 architecture is enabled. - AX25 Appropriate AX.25 support is enabled. - CLK Common clock infrastructure is enabled. - CMA Contiguous Memory Area support is enabled. - DRM Direct Rendering Management support is enabled. - DYNAMIC_DEBUG Build in debug messages and enable them at runtime - EARLY Parameter processed too early to be embedded in initrd. - EDD BIOS Enhanced Disk Drive Services (EDD) is enabled - EFI EFI Partitioning (GPT) is enabled - EVM Extended Verification Module - FB The frame buffer device is enabled. - FTRACE Function tracing enabled. - GCOV GCOV profiling is enabled. - HIBERNATION HIBERNATION is enabled. - HW Appropriate hardware is enabled. - HYPER_V HYPERV support is enabled. - IMA Integrity measurement architecture is enabled. - IP_PNP IP DHCP, BOOTP, or RARP is enabled. - IPV6 IPv6 support is enabled. - ISAPNP ISA PnP code is enabled. - ISDN Appropriate ISDN support is enabled. - ISOL CPU Isolation is enabled. - JOY Appropriate joystick support is enabled. - KGDB Kernel debugger support is enabled. - KVM Kernel Virtual Machine support is enabled. - LIBATA Libata driver is enabled - LOONGARCH LoongArch architecture is enabled. - LOOP Loopback device support is enabled. - LP Printer support is enabled. - M68k M68k architecture is enabled. - These options have more detailed description inside of - Documentation/arch/m68k/kernel-options.rst. - MDA MDA console support is enabled. - MIPS MIPS architecture is enabled. - MOUSE Appropriate mouse support is enabled. - MSI Message Signaled Interrupts (PCI). - MTD MTD (Memory Technology Device) support is enabled. - NET Appropriate network support is enabled. - NFS Appropriate NFS support is enabled. - NUMA NUMA support is enabled. - OF Devicetree is enabled. - PARISC The PA-RISC architecture is enabled. - PCI PCI bus support is enabled. - PCIE PCI Express support is enabled. - PCMCIA The PCMCIA subsystem is enabled. - PNP Plug & Play support is enabled. - PPC PowerPC architecture is enabled. - PPT Parallel port support is enabled. - PS2 Appropriate PS/2 support is enabled. - PV_OPS A paravirtualized kernel is enabled. - RAM RAM disk support is enabled. - RDT Intel Resource Director Technology. - RISCV RISCV architecture is enabled. - S390 S390 architecture is enabled. - SCSI Appropriate SCSI support is enabled. - A lot of drivers have their options described inside - the Documentation/scsi/ sub-directory. - SDW SoundWire support is enabled. - SECURITY Different security models are enabled. - SELINUX SELinux support is enabled. - SERIAL Serial support is enabled. - SH SuperH architecture is enabled. - SMP The kernel is an SMP kernel. - SPARC Sparc architecture is enabled. - SUSPEND System suspend states are enabled. - SWSUSP Software suspend (hibernation) is enabled. - TPM TPM drivers are enabled. - UMS USB Mass Storage support is enabled. - USB USB support is enabled. - USBHID USB Human Interface Device support is enabled. - V4L Video For Linux support is enabled. - VGA The VGA console has been enabled. - VMMIO Driver for memory mapped virtio devices is enabled. - VT Virtual terminal support is enabled. - WDT Watchdog support is enabled. - X86-32 X86-32, aka i386 architecture is enabled. - X86-64 X86-64 architecture is enabled. - X86 Either 32-bit or 64-bit x86 (same as X86-32+X86-64) - X86_UV SGI UV support is enabled. - XEN Xen support is enabled - XTENSA xtensa architecture is enabled. - -In addition, the following text indicates that the option:: - - BOOT Is a boot loader parameter. - BUGS= Relates to possible processor bugs on the said processor. - KNL Is a kernel start-up parameter. +is applicable. Parameters denoted with BOOT are actually interpreted by the boot loader, and have no meaning to the kernel directly. diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 6c42061ca20e..1e89d122f084 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -1,3 +1,101 @@ + ACPI ACPI support is enabled. + AGP AGP (Accelerated Graphics Port) is enabled. + ALSA ALSA sound support is enabled. + APIC APIC support is enabled. + APM Advanced Power Management support is enabled. + APPARMOR AppArmor support is enabled. + ARM ARM architecture is enabled. + ARM64 ARM64 architecture is enabled. + AX25 Appropriate AX.25 support is enabled. + CLK Common clock infrastructure is enabled. + CMA Contiguous Memory Area support is enabled. + DRM Direct Rendering Management support is enabled. + DYNAMIC_DEBUG Build in debug messages and enable them at runtime + EARLY Parameter processed too early to be embedded in initrd. + EDD BIOS Enhanced Disk Drive Services (EDD) is enabled + EFI EFI Partitioning (GPT) is enabled + EVM Extended Verification Module + FB The frame buffer device is enabled. + FTRACE Function tracing enabled. + GCOV GCOV profiling is enabled. + HIBERNATION HIBERNATION is enabled. + HW Appropriate hardware is enabled. + HYPER_V HYPERV support is enabled. + IMA Integrity measurement architecture is enabled. + IP_PNP IP DHCP, BOOTP, or RARP is enabled. + IPV6 IPv6 support is enabled. + ISAPNP ISA PnP code is enabled. + ISDN Appropriate ISDN support is enabled. + ISOL CPU Isolation is enabled. + JOY Appropriate joystick support is enabled. + KGDB Kernel debugger support is enabled. + KVM Kernel Virtual Machine support is enabled. + LIBATA Libata driver is enabled + LOONGARCH LoongArch architecture is enabled. + LOOP Loopback device support is enabled. + LP Printer support is enabled. + M68k M68k architecture is enabled. + These options have more detailed description inside of + Documentation/arch/m68k/kernel-options.rst. + MDA MDA console support is enabled. + MIPS MIPS architecture is enabled. + MOUSE Appropriate mouse support is enabled. + MSI Message Signaled Interrupts (PCI). + MTD MTD (Memory Technology Device) support is enabled. + NET Appropriate network support is enabled. + NFS Appropriate NFS support is enabled. + NUMA NUMA support is enabled. + OF Devicetree is enabled. + PARISC The PA-RISC architecture is enabled. + PCI PCI bus support is enabled. + PCIE PCI Express support is enabled. + PCMCIA The PCMCIA subsystem is enabled. + PNP Plug & Play support is enabled. + PPC PowerPC architecture is enabled. + PPT Parallel port support is enabled. + PS2 Appropriate PS/2 support is enabled. + PV_OPS A paravirtualized kernel is enabled. + RAM RAM disk support is enabled. + RDT Intel Resource Director Technology. + RISCV RISCV architecture is enabled. + S390 S390 architecture is enabled. + SCSI Appropriate SCSI support is enabled. + A lot of drivers have their options described inside + the Documentation/scsi/ sub-directory. + SDW SoundWire support is enabled. + SECURITY Different security models are enabled. + SELINUX SELinux support is enabled. + SERIAL Serial support is enabled. + SH SuperH architecture is enabled. + SMP The kernel is an SMP kernel. + SPARC Sparc architecture is enabled. + SUSPEND System suspend states are enabled. + SWSUSP Software suspend (hibernation) is enabled. + TPM TPM drivers are enabled. + UMS USB Mass Storage support is enabled. + USB USB support is enabled. + USBHID USB Human Interface Device support is enabled. + V4L Video For Linux support is enabled. + VGA The VGA console has been enabled. + VMMIO Driver for memory mapped virtio devices is enabled. + VT Virtual terminal support is enabled. + WDT Watchdog support is enabled. + X86-32 X86-32, aka i386 architecture is enabled. + X86-64 X86-64 architecture is enabled. + X86 Either 32-bit or 64-bit x86 (same as X86-32+X86-64) + X86_UV SGI UV support is enabled. + XEN Xen support is enabled + XTENSA xtensa architecture is enabled. + +In addition, the following text indicates that the option + + BOOT Is a boot loader parameter. + BUGS= Relates to possible processor bugs on the said processor. + KNL Is a kernel start-up parameter. + + +Kernel parameters + accept_memory= [MM] Format: { eager | lazy } default: lazy @@ -1907,6 +2005,16 @@ /sys/power/pm_test). Only available when CONFIG_PM_DEBUG is set. Default value is 5. + hibernate_compression_threads= + [HIBERNATION] + Set the number of threads used for compressing or decompressing + hibernation images. + + Format: <integer> + Default: 3 + Minimum: 1 + Example: hibernate_compression_threads=4 + highmem=nn[KMG] [KNL,BOOT,EARLY] forces the highmem zone to have an exact size of <nn>. This works even on boxes that have no highmem otherwise. This also works to reduce highmem @@ -6207,7 +6315,7 @@ rdt= [HW,X86,RDT] Turn on/off individual RDT features. List is: cmt, mbmtotal, mbmlocal, l3cat, l3cdp, l2cat, l2cdp, - mba, smba, bmec, abmc. + mba, smba, bmec, abmc, sdciae. E.g. to turn on cmt and turn off mba use: rdt=cmt,!mba @@ -6404,7 +6512,7 @@ that don't. off - no mitigation - auto - automatically select a migitation + auto - automatically select a mitigation auto,nosmt - automatically select a mitigation, disabling SMT if necessary for the full mitigation (only on Zen1 @@ -6500,6 +6608,10 @@ Memory area to be used by remote processor image, managed by CMA. + rseq_debug= [KNL] Enable or disable restartable sequence + debug mode. Defaults to CONFIG_RSEQ_DEBUG_DEFAULT_ENABLE. + Format: <bool> + rt_group_sched= [KNL] Enable or disable SCHED_RR/FIFO group scheduling when CONFIG_RT_GROUP_SCHED=y. Defaults to !CONFIG_RT_GROUP_SCHED_DEFAULT_DISABLED. @@ -7150,7 +7262,7 @@ limit. Default value is 8191 pools. stacktrace [FTRACE] - Enabled the stack tracer on boot up. + Enable the stack tracer on boot up. stacktrace_filter=[function-list] [FTRACE] Limit the functions that the stack tracer diff --git a/Documentation/admin-guide/md.rst b/Documentation/admin-guide/md.rst index deed823eab01..dc7eab191caa 100644 --- a/Documentation/admin-guide/md.rst +++ b/Documentation/admin-guide/md.rst @@ -238,6 +238,16 @@ All md devices contain: the number of devices in a raid4/5/6, or to support external metadata formats which mandate such clipping. + logical_block_size + Configure the array's logical block size in bytes. This attribute + is only supported for 1.x meta. Write the value before starting + array. The final array LBS uses the maximum between this + configuration and LBS of all combined devices. Note that + LBS cannot exceed PAGE_SIZE before RAID supports folio. + WARNING: Arrays created on new kernel cannot be assembled at old + kernel due to padding check, Set module parameter 'check_new_feature' + to false to bypass, but data loss may occur. + reshape_position This is either ``none`` or a sector number within the devices of the array where ``reshape`` is up to. If this is set, the three diff --git a/Documentation/admin-guide/pm/cpuidle.rst b/Documentation/admin-guide/pm/cpuidle.rst index 0c090b076224..be4c1120e3f0 100644 --- a/Documentation/admin-guide/pm/cpuidle.rst +++ b/Documentation/admin-guide/pm/cpuidle.rst @@ -580,6 +580,15 @@ the given CPU as the upper limit for the exit latency of the idle states that they are allowed to select for that CPU. They should never select any idle states with exit latency beyond that limit. +While the above CPU QoS constraints apply to CPU idle time management, user +space may also request a CPU system wakeup latency QoS limit, via the +`cpu_wakeup_latency` file. This QoS constraint is respected when selecting a +suitable idle state for the CPUs, while entering the system-wide suspend-to-idle +sleep state, but also to the regular CPU idle time management. + +Note that, the management of the `cpu_wakeup_latency` file works according to +the 'cpu_dma_latency' file from user space point of view. Moreover, the unit +is also microseconds. Idle States Control Via Kernel Command Line =========================================== diff --git a/Documentation/admin-guide/pm/intel_pstate.rst b/Documentation/admin-guide/pm/intel_pstate.rst index 26e702c7016e..fde967b0c2e0 100644 --- a/Documentation/admin-guide/pm/intel_pstate.rst +++ b/Documentation/admin-guide/pm/intel_pstate.rst @@ -48,8 +48,9 @@ only way to pass early-configuration-time parameters to it is via the kernel command line. However, its configuration can be adjusted via ``sysfs`` to a great extent. In some configurations it even is possible to unregister it via ``sysfs`` which allows another ``CPUFreq`` scaling driver to be loaded and -registered (see `below <status_attr_>`_). +registered (see :ref:`below <status_attr>`). +.. _operation_modes: Operation Modes =============== @@ -62,6 +63,8 @@ a certain performance scaling algorithm. Which of them will be in effect depends on what kernel command line options are used and on the capabilities of the processor. +.. _active_mode: + Active Mode ----------- @@ -94,6 +97,8 @@ Which of the P-state selection algorithms is used by default depends on the Namely, if that option is set, the ``performance`` algorithm will be used by default, and the other one will be used by default if it is not set. +.. _active_mode_hwp: + Active Mode With HWP ~~~~~~~~~~~~~~~~~~~~ @@ -123,7 +128,7 @@ Energy-Performance Bias (EPB) knob (otherwise), which means that the processor's internal P-state selection logic is expected to focus entirely on performance. This will override the EPP/EPB setting coming from the ``sysfs`` interface -(see `Energy vs Performance Hints`_ below). Moreover, any attempts to change +(see :ref:`energy_performance_hints` below). Moreover, any attempts to change the EPP/EPB to a value different from 0 ("performance") via ``sysfs`` in this configuration will be rejected. @@ -192,6 +197,8 @@ This is the default P-state selection algorithm if the :c:macro:`CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE` kernel configuration option is not set. +.. _passive_mode: + Passive Mode ------------ @@ -289,12 +296,12 @@ Unlike ``_PSS`` objects in the ACPI tables, ``intel_pstate`` always exposes the entire range of available P-states, including the whole turbo range, to the ``CPUFreq`` core and (in the passive mode) to generic scaling governors. This generally causes turbo P-states to be set more often when ``intel_pstate`` is -used relative to ACPI-based CPU performance scaling (see `below <acpi-cpufreq_>`_ -for more information). +used relative to ACPI-based CPU performance scaling (see +:ref:`below <acpi-cpufreq>` for more information). Moreover, since ``intel_pstate`` always knows what the real turbo threshold is (even if the Configurable TDP feature is enabled in the processor), its -``no_turbo`` attribute in ``sysfs`` (described `below <no_turbo_attr_>`_) should +``no_turbo`` attribute in ``sysfs`` (described :ref:`below <no_turbo_attr>`) should work as expected in all cases (that is, if set to disable turbo P-states, it always should prevent ``intel_pstate`` from using them). @@ -307,12 +314,12 @@ pieces of information on it to be known, including: * The minimum supported P-state. - * The maximum supported `non-turbo P-state <turbo_>`_. + * The maximum supported :ref:`non-turbo P-state <turbo>`. * Whether or not turbo P-states are supported at all. - * The maximum supported `one-core turbo P-state <turbo_>`_ (if turbo P-states - are supported). + * The maximum supported :ref:`one-core turbo P-state <turbo>` (if turbo + P-states are supported). * The scaling formula to translate the driver's internal representation of P-states into frequencies and the other way around. @@ -400,10 +407,10 @@ Energy-Aware Scheduling Support If ``CONFIG_ENERGY_MODEL`` has been set during kernel configuration and ``intel_pstate`` runs on a hybrid processor without SMT, in addition to enabling -`CAS <CAS_>`_ it registers an Energy Model for the processor. This allows the +:ref:`CAS` it registers an Energy Model for the processor. This allows the Energy-Aware Scheduling (EAS) support to be enabled in the CPU scheduler if ``schedutil`` is used as the ``CPUFreq`` governor which requires ``intel_pstate`` -to operate in the `passive mode <Passive Mode_>`_. +to operate in the :ref:`passive mode <passive_mode>`. The Energy Model registered by ``intel_pstate`` is artificial (that is, it is based on abstract cost values and it does not include any real power numbers) @@ -432,6 +439,8 @@ the ``energy_model`` directory in ``debugfs`` (typlically mounted on User Space Interface in ``sysfs`` ================================= +.. _global_attributes: + Global Attributes ----------------- @@ -444,8 +453,8 @@ argument is passed to the kernel in the command line. ``max_perf_pct`` Maximum P-state the driver is allowed to set in percent of the - maximum supported performance level (the highest supported `turbo - P-state <turbo_>`_). + maximum supported performance level (the highest supported :ref:`turbo + P-state <turbo>`). This attribute will not be exposed if the ``intel_pstate=per_cpu_perf_limits`` argument is present in the kernel @@ -453,8 +462,8 @@ argument is passed to the kernel in the command line. ``min_perf_pct`` Minimum P-state the driver is allowed to set in percent of the - maximum supported performance level (the highest supported `turbo - P-state <turbo_>`_). + maximum supported performance level (the highest supported :ref:`turbo + P-state <turbo>`). This attribute will not be exposed if the ``intel_pstate=per_cpu_perf_limits`` argument is present in the kernel @@ -463,18 +472,18 @@ argument is passed to the kernel in the command line. ``num_pstates`` Number of P-states supported by the processor (between 0 and 255 inclusive) including both turbo and non-turbo P-states (see - `Turbo P-states Support`_). + :ref:`turbo`). This attribute is present only if the value exposed by it is the same for all of the CPUs in the system. The value of this attribute is not affected by the ``no_turbo`` - setting described `below <no_turbo_attr_>`_. + setting described :ref:`below <no_turbo_attr>`. This attribute is read-only. ``turbo_pct`` - Ratio of the `turbo range <turbo_>`_ size to the size of the entire + Ratio of the :ref:`turbo range <turbo>` size to the size of the entire range of supported P-states, in percent. This attribute is present only if the value exposed by it is the same @@ -486,7 +495,7 @@ argument is passed to the kernel in the command line. ``no_turbo`` If set (equal to 1), the driver is not allowed to set any turbo P-states - (see `Turbo P-states Support`_). If unset (equal to 0, which is the + (see :ref:`turbo`). If unset (equal to 0, which is the default), turbo P-states can be set by the driver. [Note that ``intel_pstate`` does not support the general ``boost`` attribute (supported by some other scaling drivers) which is replaced @@ -495,11 +504,11 @@ argument is passed to the kernel in the command line. This attribute does not affect the maximum supported frequency value supplied to the ``CPUFreq`` core and exposed via the policy interface, but it affects the maximum possible value of per-policy P-state limits - (see `Interpretation of Policy Attributes`_ below for details). + (see :ref:`policy_attributes_interpretation` below for details). ``hwp_dynamic_boost`` This attribute is only present if ``intel_pstate`` works in the - `active mode with the HWP feature enabled <Active Mode With HWP_>`_ in + :ref:`active mode with the HWP feature enabled <active_mode_hwp>` in the processor. If set (equal to 1), it causes the minimum P-state limit to be increased dynamically for a short time whenever a task previously waiting on I/O is selected to run on a given logical CPU (the purpose @@ -514,12 +523,12 @@ argument is passed to the kernel in the command line. Operation mode of the driver: "active", "passive" or "off". "active" - The driver is functional and in the `active mode - <Active Mode_>`_. + The driver is functional and in the :ref:`active mode + <active_mode>`. "passive" - The driver is functional and in the `passive mode - <Passive Mode_>`_. + The driver is functional and in the :ref:`passive mode + <passive_mode>`. "off" The driver is not functional (it is not registered as a scaling @@ -547,13 +556,15 @@ argument is passed to the kernel in the command line. attribute to "1" enables the energy-efficiency optimizations and setting to "0" disables them. +.. _policy_attributes_interpretation: + Interpretation of Policy Attributes ----------------------------------- The interpretation of some ``CPUFreq`` policy attributes described in Documentation/admin-guide/pm/cpufreq.rst is special with ``intel_pstate`` as the current scaling driver and it generally depends on the driver's -`operation mode <Operation Modes_>`_. +:ref:`operation mode <operation_modes>`. First of all, the values of the ``cpuinfo_max_freq``, ``cpuinfo_min_freq`` and ``scaling_cur_freq`` attributes are produced by applying a processor-specific @@ -562,9 +573,10 @@ Also, the values of the ``scaling_max_freq`` and ``scaling_min_freq`` attributes are capped by the frequency corresponding to the maximum P-state that the driver is allowed to set. -If the ``no_turbo`` `global attribute <no_turbo_attr_>`_ is set, the driver is -not allowed to use turbo P-states, so the maximum value of ``scaling_max_freq`` -and ``scaling_min_freq`` is limited to the maximum non-turbo P-state frequency. +If the ``no_turbo`` :ref:`global attribute <no_turbo_attr>` is set, the driver +is not allowed to use turbo P-states, so the maximum value of +``scaling_max_freq`` and ``scaling_min_freq`` is limited to the maximum +non-turbo P-state frequency. Accordingly, setting ``no_turbo`` causes ``scaling_max_freq`` and ``scaling_min_freq`` to go down to that value if they were above it before. However, the old values of ``scaling_max_freq`` and ``scaling_min_freq`` will be @@ -576,7 +588,7 @@ and ``scaling_min_freq`` corresponds to the maximum supported turbo P-state, which also is the value of ``cpuinfo_max_freq`` in either case. Next, the following policy attributes have special meaning if -``intel_pstate`` works in the `active mode <Active Mode_>`_: +``intel_pstate`` works in the :ref:`active mode <active_mode>`: ``scaling_available_governors`` List of P-state selection algorithms provided by ``intel_pstate``. @@ -597,20 +609,22 @@ processor: Shows the base frequency of the CPU. Any frequency above this will be in the turbo frequency range. -The meaning of these attributes in the `passive mode <Passive Mode_>`_ is the +The meaning of these attributes in the :ref:`passive mode <passive_mode>` is the same as for other scaling drivers. Additionally, the value of the ``scaling_driver`` attribute for ``intel_pstate`` depends on the operation mode of the driver. Namely, it is either -"intel_pstate" (in the `active mode <Active Mode_>`_) or "intel_cpufreq" (in the -`passive mode <Passive Mode_>`_). +"intel_pstate" (in the :ref:`active mode <active_mode>`) or "intel_cpufreq" +(in the :ref:`passive mode <passive_mode>`). + +.. _pstate_limits_coordination: Coordination of P-State Limits ------------------------------ ``intel_pstate`` allows P-state limits to be set in two ways: with the help of -the ``max_perf_pct`` and ``min_perf_pct`` `global attributes -<Global Attributes_>`_ or via the ``scaling_max_freq`` and ``scaling_min_freq`` +the ``max_perf_pct`` and ``min_perf_pct`` :ref:`global attributes +<global_attributes>` or via the ``scaling_max_freq`` and ``scaling_min_freq`` ``CPUFreq`` policy attributes. The coordination between those limits is based on the following rules, regardless of the current operation mode of the driver: @@ -632,17 +646,18 @@ on the following rules, regardless of the current operation mode of the driver: 3. The global and per-policy limits can be set independently. -In the `active mode with the HWP feature enabled <Active Mode With HWP_>`_, the +In the :ref:`active mode with the HWP feature enabled <active_mode_hwp>`, the resulting effective values are written into hardware registers whenever the limits change in order to request its internal P-state selection logic to always set P-states within these limits. Otherwise, the limits are taken into account -by scaling governors (in the `passive mode <Passive Mode_>`_) and by the driver -every time before setting a new P-state for a CPU. +by scaling governors (in the :ref:`passive mode <passive_mode>`) and by the +driver every time before setting a new P-state for a CPU. Additionally, if the ``intel_pstate=per_cpu_perf_limits`` command line argument is passed to the kernel, ``max_perf_pct`` and ``min_perf_pct`` are not exposed at all and the only way to set the limits is by using the policy attributes. +.. _energy_performance_hints: Energy vs Performance Hints --------------------------- @@ -702,9 +717,9 @@ output. On those systems each ``_PSS`` object returns a list of P-states supported by the corresponding CPU which basically is a subset of the P-states range that can be used by ``intel_pstate`` on the same system, with one exception: the whole -`turbo range <turbo_>`_ is represented by one item in it (the topmost one). By -convention, the frequency returned by ``_PSS`` for that item is greater by 1 MHz -than the frequency of the highest non-turbo P-state listed by it, but the +:ref:`turbo range <turbo>` is represented by one item in it (the topmost one). +By convention, the frequency returned by ``_PSS`` for that item is greater by +1 MHz than the frequency of the highest non-turbo P-state listed by it, but the corresponding P-state representation (following the hardware specification) returned for it matches the maximum supported turbo P-state (or is the special value 255 meaning essentially "go as high as you can get"). @@ -730,18 +745,18 @@ benefit from running at turbo frequencies will be given non-turbo P-states instead. One more issue related to that may appear on systems supporting the -`Configurable TDP feature <turbo_>`_ allowing the platform firmware to set the -turbo threshold. Namely, if that is not coordinated with the lists of P-states -returned by ``_PSS`` properly, there may be more than one item corresponding to -a turbo P-state in those lists and there may be a problem with avoiding the -turbo range (if desirable or necessary). Usually, to avoid using turbo -P-states overall, ``acpi-cpufreq`` simply avoids using the topmost state listed -by ``_PSS``, but that is not sufficient when there are other turbo P-states in -the list returned by it. +:ref:`Configurable TDP feature <turbo>` allowing the platform firmware to set +the turbo threshold. Namely, if that is not coordinated with the lists of +P-states returned by ``_PSS`` properly, there may be more than one item +corresponding to a turbo P-state in those lists and there may be a problem with +avoiding the turbo range (if desirable or necessary). Usually, to avoid using +turbo P-states overall, ``acpi-cpufreq`` simply avoids using the topmost state +listed by ``_PSS``, but that is not sufficient when there are other turbo +P-states in the list returned by it. Apart from the above, ``acpi-cpufreq`` works like ``intel_pstate`` in the -`passive mode <Passive Mode_>`_, except that the number of P-states it can set -is limited to the ones listed by the ACPI ``_PSS`` objects. +:ref:`passive mode <passive_mode>`, except that the number of P-states it can +set is limited to the ones listed by the ACPI ``_PSS`` objects. Kernel Command Line Options for ``intel_pstate`` @@ -756,11 +771,11 @@ of them have to be prepended with the ``intel_pstate=`` prefix. processor is supported by it. ``active`` - Register ``intel_pstate`` in the `active mode <Active Mode_>`_ to start - with. + Register ``intel_pstate`` in the :ref:`active mode <active_mode>` to + start with. ``passive`` - Register ``intel_pstate`` in the `passive mode <Passive Mode_>`_ to + Register ``intel_pstate`` in the :ref:`passive mode <passive_mode>` to start with. ``force`` @@ -793,12 +808,12 @@ of them have to be prepended with the ``intel_pstate=`` prefix. and this option has no effect. ``per_cpu_perf_limits`` - Use per-logical-CPU P-State limits (see `Coordination of P-state - Limits`_ for details). + Use per-logical-CPU P-State limits (see + :ref:`pstate_limits_coordination` for details). ``no_cas`` - Do not enable `capacity-aware scheduling <CAS_>`_ which is enabled by - default on hybrid systems without SMT. + Do not enable :ref:`capacity-aware scheduling <CAS>` which is enabled + by default on hybrid systems without SMT. Diagnostics and Tuning ====================== @@ -810,7 +825,7 @@ There are two static trace events that can be used for ``intel_pstate`` diagnostics. One of them is the ``cpu_frequency`` trace event generally used by ``CPUFreq``, and the other one is the ``pstate_sample`` trace event specific to ``intel_pstate``. Both of them are triggered by ``intel_pstate`` only if -it works in the `active mode <Active Mode_>`_. +it works in the :ref:`active mode <active_mode>`. The following sequence of shell commands can be used to enable them and see their output (if the kernel is generally configured to support event tracing):: @@ -822,7 +837,7 @@ their output (if the kernel is generally configured to support event tracing):: gnome-terminal--4510 [001] ..s. 1177.680733: pstate_sample: core_busy=107 scaled=94 from=26 to=26 mperf=1143818 aperf=1230607 tsc=29838618 freq=2474476 cat-5235 [002] ..s. 1177.681723: cpu_frequency: state=2900000 cpu_id=2 -If ``intel_pstate`` works in the `passive mode <Passive Mode_>`_, the +If ``intel_pstate`` works in the :ref:`passive mode <passive_mode>`, the ``cpu_frequency`` trace event will be triggered either by the ``schedutil`` scaling governor (for the policies it is attached to), or by the ``CPUFreq`` core (for the policies with other scaling governors). diff --git a/Documentation/admin-guide/tainted-kernels.rst b/Documentation/admin-guide/tainted-kernels.rst index a0cc017e4424..ed1f8f1e86c5 100644 --- a/Documentation/admin-guide/tainted-kernels.rst +++ b/Documentation/admin-guide/tainted-kernels.rst @@ -186,6 +186,6 @@ More detailed explanation for tainting 18) ``N`` if an in-kernel test, such as a KUnit test, has been run. - 19) ``J`` if userpace opened /dev/fwctl/* and performed a FWTCL_RPC_DEBUG_WRITE + 19) ``J`` if userspace opened /dev/fwctl/* and performed a FWTCL_RPC_DEBUG_WRITE to use the devices debugging features. Device debugging features could cause the device to malfunction in undefined ways. diff --git a/Documentation/admin-guide/thermal/index.rst b/Documentation/admin-guide/thermal/index.rst index 193b7b01a87d..e48bc0a1951b 100644 --- a/Documentation/admin-guide/thermal/index.rst +++ b/Documentation/admin-guide/thermal/index.rst @@ -6,3 +6,4 @@ Thermal Subsystem :maxdepth: 1 intel_powerclamp + intel_thermal_throttle diff --git a/Documentation/admin-guide/thermal/intel_thermal_throttle.rst b/Documentation/admin-guide/thermal/intel_thermal_throttle.rst new file mode 100644 index 000000000000..f4fbf9d5a4ec --- /dev/null +++ b/Documentation/admin-guide/thermal/intel_thermal_throttle.rst @@ -0,0 +1,91 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: <isonum.txt> + +======================================= +Intel thermal throttle events reporting +======================================= + +:Author: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> + +Introduction +------------ + +Intel processors have built in automatic and adaptive thermal monitoring +mechanisms that force the processor to reduce its power consumption in order +to operate within predetermined temperature limits. + +Refer to section "THERMAL MONITORING AND PROTECTION" in the "Intel® 64 and +IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C, & 3D): +System Programming Guide" for more details. + +In general, there are two mechanisms to control the core temperature of the +processor. They are called "Thermal Monitor 1 (TM1) and Thermal Monitor 2 (TM2)". + +The status of the temperature sensor that triggers the thermal monitor (TM1/TM2) +is indicated through the "thermal status flag" and "thermal status log flag" in +MSR_IA32_THERM_STATUS for core level and MSR_IA32_PACKAGE_THERM_STATUS for +package level. + +Thermal Status flag, bit 0 — When set, indicates that the processor core +temperature is currently at the trip temperature of the thermal monitor and that +the processor power consumption is being reduced via either TM1 or TM2, depending +on which is enabled. When clear, the flag indicates that the core temperature is +below the thermal monitor trip temperature. This flag is read only. + +Thermal Status Log flag, bit 1 — When set, indicates that the thermal sensor has +tripped since the last power-up or reset or since the last time that software +cleared this flag. This flag is a sticky bit; once set it remains set until +cleared by software or until a power-up or reset of the processor. The default +state is clear. + +It is possible that when user reads MSR_IA32_THERM_STATUS or +MSR_IA32_PACKAGE_THERM_STATUS, TM1/TM2 is not active. In this case, +"Thermal Status flag" will read "0" and the "Thermal Status Log flag" will be set +to show any previous "TM1/TM2" activation. But since it needs to be cleared by +the software, it can't show the number of occurrences of "TM1/TM2" activations. + +Hence, Linux provides counters of how many times the "Thermal Status flag" was +set. Also presents how long the "Thermal Status flag" was active in milliseconds. +Using these counters, users can check if the performance was limited because of +thermal events. It is recommended to read from sysfs instead of directly reading +MSRs as the "Thermal Status Log flag" is reset by the driver to implement rate +control. + +Sysfs Interface +--------------- + +Thermal throttling events are presented for each CPU under +"/sys/devices/system/cpu/cpuX/thermal_throttle/", where "X" is the CPU number. + +All these counters are read-only. They can't be reset to 0. So, they can potentially +overflow after reaching the maximum 64 bit unsigned integer. + +``core_throttle_count`` + Shows the number of times "Thermal Status flag" changed from 0 to 1 for this + CPU since OS boot and thermal vector is initialized. This is a 64 bit counter. + +``package_throttle_count`` + Shows the number of times "Thermal Status flag" changed from 0 to 1 for the + package containing this CPU since OS boot and thermal vector is initialized. + Package status is broadcast to all CPUs; all CPUs in the package increment + this count. This is a 64-bit counter. + +``core_throttle_max_time_ms`` + Shows the maximum amount of time for which "Thermal Status flag" has been + set to 1 for this CPU at the core level since OS boot and thermal vector + is initialized. + +``package_throttle_max_time_ms`` + Shows the maximum amount of time for which "Thermal Status flag" has been + set to 1 for the package containing this CPU since OS boot and thermal + vector is initialized. + +``core_throttle_total_time_ms`` + Shows the cumulative time for which "Thermal Status flag" has been + set to 1 for this CPU for core level since OS boot and thermal vector + is initialized. + +``package_throttle_total_time_ms`` + Shows the cumulative time for which "Thermal Status flag" has been set + to 1 for the package containing this CPU since OS boot and thermal vector + is initialized. diff --git a/Documentation/admin-guide/workload-tracing.rst b/Documentation/admin-guide/workload-tracing.rst index d6313890ee41..35963491b9f1 100644 --- a/Documentation/admin-guide/workload-tracing.rst +++ b/Documentation/admin-guide/workload-tracing.rst @@ -196,11 +196,11 @@ Let’s checkout the latest Linux repository and build cscope database:: cscope -R -p10 # builds cscope.out database before starting browse session cscope -d -p10 # starts browse session on cscope.out database -Note: Run "cscope -R -p10" to build the database and c"scope -d -p10" to -enter into the browsing session. cscope by default cscope.out database. -To get out of this mode press ctrl+d. -p option is used to specify the -number of file path components to display. -p10 is optimal for browsing -kernel sources. +Note: Run "cscope -R -p10" to build the database and "cscope -d -p10" to +enter into the browsing session. cscope by default uses the cscope.out +database. To get out of this mode press ctrl+d. -p option is used to +specify the number of file path components to display. -p10 is optimal +for browsing kernel sources. What is perf and how do we use it? ================================== diff --git a/Documentation/arch/arm64/booting.rst b/Documentation/arch/arm64/booting.rst index e4f953839f71..26efca09aef3 100644 --- a/Documentation/arch/arm64/booting.rst +++ b/Documentation/arch/arm64/booting.rst @@ -391,13 +391,13 @@ Before jumping into the kernel, the following conditions must be met: - SMCR_EL2.LEN must be initialised to the same value for all CPUs the kernel will execute on. - - HWFGRTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01. + - HFGRTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01. - - HWFGWTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01. + - HFGWTR_EL2.nTPIDR2_EL0 (bit 55) must be initialised to 0b01. - - HWFGRTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01. + - HFGRTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01. - - HWFGWTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01. + - HFGWTR_EL2.nSMPRI_EL1 (bit 54) must be initialised to 0b01. For CPUs with the Scalable Matrix Extension FA64 feature (FEAT_SME_FA64): diff --git a/Documentation/arch/arm64/sve.rst b/Documentation/arch/arm64/sve.rst index 28152492c29c..a61c9d0efe4d 100644 --- a/Documentation/arch/arm64/sve.rst +++ b/Documentation/arch/arm64/sve.rst @@ -402,6 +402,11 @@ The regset data starts with struct user_sve_header, containing: streaming mode and any SETREGSET of NT_ARM_SSVE will enter streaming mode if the target was not in streaming mode. +* On systems that do not support SVE it is permitted to use SETREGSET to + write SVE_PT_REGS_FPSIMD formatted data via NT_ARM_SVE, in this case the + vector length should be specified as 0. This allows streaming mode to be + disabled on systems with SME but not SVE. + * If any register data is provided along with SVE_PT_VL_ONEXEC then the registers data will be interpreted with the current vector length, not the vector length configured for use on exec. diff --git a/Documentation/arch/s390/s390dbf.rst b/Documentation/arch/s390/s390dbf.rst index af8bdc3629e7..aad6d88974fe 100644 --- a/Documentation/arch/s390/s390dbf.rst +++ b/Documentation/arch/s390/s390dbf.rst @@ -243,9 +243,8 @@ Examples: Changing the size of debug areas ------------------------------------ -It is possible the change the size of debug areas through piping -the number of pages to the debugfs file "pages". The resize request will -also flush the debug areas. +To resize a debug area, write the desired page count to the "pages" file. +Existing data is preserved if it fits; otherwise, oldest entries are dropped. Example: diff --git a/Documentation/arch/x86/boot.rst b/Documentation/arch/x86/boot.rst index 77e6163288db..32eea3d2807e 100644 --- a/Documentation/arch/x86/boot.rst +++ b/Documentation/arch/x86/boot.rst @@ -1431,12 +1431,34 @@ The boot loader *must* fill out the following fields in bp:: All other fields should be zero. .. note:: - The EFI Handover Protocol is deprecated in favour of the ordinary PE/COFF - entry point, combined with the LINUX_EFI_INITRD_MEDIA_GUID based initrd - loading protocol (refer to [0] for an example of the bootloader side of - this), which removes the need for any knowledge on the part of the EFI - bootloader regarding the internal representation of boot_params or any - requirements/limitations regarding the placement of the command line - and ramdisk in memory, or the placement of the kernel image itself. - -[0] https://github.com/u-boot/u-boot/commit/ec80b4735a593961fe701cc3a5d717d4739b0fd0 + The EFI Handover Protocol is deprecated in favour of the ordinary PE/COFF + entry point described below. + +.. _pe-coff-entry-point: + +PE/COFF entry point +=================== + +When compiled with ``CONFIG_EFI_STUB=y``, the kernel can be executed as a +regular PE/COFF binary. See Documentation/admin-guide/efi-stub.rst for +implementation details. + +The stub loader can request the initrd via a UEFI protocol. For this to work, +the firmware or bootloader needs to register a handle which carries +implementations of the ``EFI_LOAD_FILE2`` protocol and the device path +protocol exposing the ``LINUX_EFI_INITRD_MEDIA_GUID`` vendor media device path. +In this case, a kernel booting via the EFI stub will invoke +``LoadFile2::LoadFile()`` method on the registered protocol to instruct the +firmware to load the initrd into a memory location chosen by the kernel/EFI +stub. + +This approach removes the need for any knowledge on the part of the EFI +bootloader regarding the internal representation of boot_params or any +requirements/limitations regarding the placement of the command line and +ramdisk in memory, or the placement of the kernel image itself. + +For sample implementations, refer to `the original u-boot implementation`_ or +`the OVMF implementation`_. + +.. _the original u-boot implementation: https://github.com/u-boot/u-boot/commit/ec80b4735a593961fe701cc3a5d717d4739b0fd0 +.. _the OVMF implementation: https://github.com/tianocore/edk2/blob/1780373897f12c25075f8883e073144506441168/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c diff --git a/Documentation/bpf/libbpf/program_types.rst b/Documentation/bpf/libbpf/program_types.rst index 218b020a2f81..3b837522834b 100644 --- a/Documentation/bpf/libbpf/program_types.rst +++ b/Documentation/bpf/libbpf/program_types.rst @@ -100,10 +100,26 @@ described in more detail in the footnotes. | | | ``uretprobe.s+`` [#uprobe]_ | Yes | + + +----------------------------------+-----------+ | | | ``usdt+`` [#usdt]_ | | ++ + +----------------------------------+-----------+ +| | | ``usdt.s+`` [#usdt]_ | Yes | + +----------------------------------------+----------------------------------+-----------+ | | ``BPF_TRACE_KPROBE_MULTI`` | ``kprobe.multi+`` [#kpmulti]_ | | + + +----------------------------------+-----------+ | | | ``kretprobe.multi+`` [#kpmulti]_ | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_KPROBE_SESSION`` | ``kprobe.session+`` [#kpmulti]_ | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_UPROBE_MULTI`` | ``uprobe.multi+`` [#upmul]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe.multi.s+`` [#upmul]_ | Yes | ++ + +----------------------------------+-----------+ +| | | ``uretprobe.multi+`` [#upmul]_ | | ++ + +----------------------------------+-----------+ +| | | ``uretprobe.multi.s+`` [#upmul]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_UPROBE_SESSION`` | ``uprobe.session+`` [#upmul]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe.session.s+`` [#upmul]_ | Yes | +-------------------------------------------+----------------------------------------+----------------------------------+-----------+ | ``BPF_PROG_TYPE_LIRC_MODE2`` | ``BPF_LIRC_MODE2`` | ``lirc_mode2`` | | +-------------------------------------------+----------------------------------------+----------------------------------+-----------+ @@ -219,6 +235,8 @@ described in more detail in the footnotes. non-negative integer. .. [#ksyscall] The ``ksyscall`` attach format is ``ksyscall/<syscall>``. .. [#uprobe] The ``uprobe`` attach format is ``uprobe[.s]/<path>:<function>[+<offset>]``. +.. [#upmul] The ``uprobe.multi`` attach format is ``uprobe.multi[.s]/<path>:<function-pattern>`` + where ``function-pattern`` supports ``*`` and ``?`` wildcards. .. [#usdt] The ``usdt`` attach format is ``usdt/<path>:<provider>:<name>``. .. [#kpmulti] The ``kprobe.multi`` attach format is ``kprobe.multi/<pattern>`` where ``pattern`` supports ``*`` and ``?`` wildcards. Valid characters for pattern are diff --git a/Documentation/bpf/map_array.rst b/Documentation/bpf/map_array.rst index f2f51a53e8ae..fa56ff75190c 100644 --- a/Documentation/bpf/map_array.rst +++ b/Documentation/bpf/map_array.rst @@ -15,8 +15,9 @@ of constant size. The size of the array is defined in ``max_entries`` at creation time. All array elements are pre-allocated and zero initialized when created. ``BPF_MAP_TYPE_PERCPU_ARRAY`` uses a different memory region for each CPU whereas ``BPF_MAP_TYPE_ARRAY`` uses the same memory region. The value -stored can be of any size, however, all array elements are aligned to 8 -bytes. +stored can be of any size for ``BPF_MAP_TYPE_ARRAY`` and not more than +``PCPU_MIN_UNIT_SIZE`` (32 kB) for ``BPF_MAP_TYPE_PERCPU_ARRAY``. All +array elements are aligned to 8 bytes. Since kernel 5.5, memory mapping may be enabled for ``BPF_MAP_TYPE_ARRAY`` by setting the flag ``BPF_F_MMAPABLE``. The map definition is page-aligned and diff --git a/Documentation/conf.py b/Documentation/conf.py index 574896cca198..1ea2ae5c6276 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -18,8 +18,6 @@ import sphinx # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath("sphinx")) -from load_config import loadConfig # pylint: disable=C0413,E0401 - # Minimal supported version needs_sphinx = "3.4.3" @@ -93,8 +91,12 @@ def config_init(app, config): # LaTeX and PDF output require a list of documents with are dependent # of the app.srcdir. Add them here - # When SPHINXDIRS is used, we just need to get index.rst, if it exists + # Handle the case where SPHINXDIRS is used if not os.path.samefile(doctree, app.srcdir): + # Add a tag to mark that the build is actually a subproject + tags.add("subproject") + + # get index.rst, if it exists doc = os.path.basename(app.srcdir) fname = "index" if os.path.exists(os.path.join(app.srcdir, fname + ".rst")): @@ -583,13 +585,6 @@ pdf_documents = [ kerneldoc_bin = "../scripts/kernel-doc.py" kerneldoc_srctree = ".." -# ------------------------------------------------------------------------------ -# Since loadConfig overwrites settings from the global namespace, it has to be -# the last statement in the conf.py file -# ------------------------------------------------------------------------------ -loadConfig(globals()) - - def setup(app): """Patterns need to be updated at init time on older Sphinx versions""" diff --git a/Documentation/core-api/assoc_array.rst b/Documentation/core-api/assoc_array.rst index 792bbf9939e1..19d89f92bf8d 100644 --- a/Documentation/core-api/assoc_array.rst +++ b/Documentation/core-api/assoc_array.rst @@ -92,18 +92,18 @@ There are two functions for dealing with the script: void assoc_array_apply_edit(struct assoc_array_edit *edit); -This will perform the edit functions, interpolating various write barriers -to permit accesses under the RCU read lock to continue. The edit script -will then be passed to ``call_rcu()`` to free it and any dead stuff it points -to. + This will perform the edit functions, interpolating various write barriers + to permit accesses under the RCU read lock to continue. The edit script + will then be passed to ``call_rcu()`` to free it and any dead stuff it + points to. 2. Cancel an edit script:: void assoc_array_cancel_edit(struct assoc_array_edit *edit); -This frees the edit script and all preallocated memory immediately. If -this was for insertion, the new object is _not_ released by this function, -but must rather be released by the caller. + This frees the edit script and all preallocated memory immediately. If + this was for insertion, the new object is *not* released by this function, + but must rather be released by the caller. These functions are guaranteed not to fail. @@ -123,43 +123,43 @@ This points to a number of methods, all of which need to be provided: unsigned long (*get_key_chunk)(const void *index_key, int level); -This should return a chunk of caller-supplied index key starting at the -*bit* position given by the level argument. The level argument will be a -multiple of ``ASSOC_ARRAY_KEY_CHUNK_SIZE`` and the function should return -``ASSOC_ARRAY_KEY_CHUNK_SIZE bits``. No error is possible. + This should return a chunk of caller-supplied index key starting at the + *bit* position given by the level argument. The level argument will be a + multiple of ``ASSOC_ARRAY_KEY_CHUNK_SIZE`` and the function should return + ``ASSOC_ARRAY_KEY_CHUNK_SIZE bits``. No error is possible. 2. Get a chunk of an object's index key:: unsigned long (*get_object_key_chunk)(const void *object, int level); -As the previous function, but gets its data from an object in the array -rather than from a caller-supplied index key. + As the previous function, but gets its data from an object in the array + rather than from a caller-supplied index key. 3. See if this is the object we're looking for:: bool (*compare_object)(const void *object, const void *index_key); -Compare the object against an index key and return ``true`` if it matches and -``false`` if it doesn't. + Compare the object against an index key and return ``true`` if it matches + and ``false`` if it doesn't. 4. Diff the index keys of two objects:: int (*diff_objects)(const void *object, const void *index_key); -Return the bit position at which the index key of the specified object -differs from the given index key or -1 if they are the same. + Return the bit position at which the index key of the specified object + differs from the given index key or -1 if they are the same. 5. Free an object:: void (*free_object)(void *object); -Free the specified object. Note that this may be called an RCU grace period -after ``assoc_array_apply_edit()`` was called, so ``synchronize_rcu()`` may be -necessary on module unloading. + Free the specified object. Note that this may be called an RCU grace period + after ``assoc_array_apply_edit()`` was called, so ``synchronize_rcu()`` may + be necessary on module unloading. Manipulation Functions @@ -171,7 +171,7 @@ There are a number of functions for manipulating an associative array: void assoc_array_init(struct assoc_array *array); -This initialises the base structure for an associative array. It can't fail. + This initialises the base structure for an associative array. It can't fail. 2. Insert/replace an object in an associative array:: @@ -182,21 +182,21 @@ This initialises the base structure for an associative array. It can't fail. const void *index_key, void *object); -This inserts the given object into the array. Note that the least -significant bit of the pointer must be zero as it's used to type-mark -pointers internally. + This inserts the given object into the array. Note that the least + significant bit of the pointer must be zero as it's used to type-mark + pointers internally. -If an object already exists for that key then it will be replaced with the -new object and the old one will be freed automatically. + If an object already exists for that key then it will be replaced with the + new object and the old one will be freed automatically. -The ``index_key`` argument should hold index key information and is -passed to the methods in the ops table when they are called. + The ``index_key`` argument should hold index key information and is + passed to the methods in the ops table when they are called. -This function makes no alteration to the array itself, but rather returns -an edit script that must be applied. ``-ENOMEM`` is returned in the case of -an out-of-memory error. + This function makes no alteration to the array itself, but rather returns + an edit script that must be applied. ``-ENOMEM`` is returned in the case of + an out-of-memory error. -The caller should lock exclusively against other modifiers of the array. + The caller should lock exclusively against other modifiers of the array. 3. Delete an object from an associative array:: @@ -206,15 +206,15 @@ The caller should lock exclusively against other modifiers of the array. const struct assoc_array_ops *ops, const void *index_key); -This deletes an object that matches the specified data from the array. + This deletes an object that matches the specified data from the array. -The ``index_key`` argument should hold index key information and is -passed to the methods in the ops table when they are called. + The ``index_key`` argument should hold index key information and is + passed to the methods in the ops table when they are called. -This function makes no alteration to the array itself, but rather returns -an edit script that must be applied. ``-ENOMEM`` is returned in the case of -an out-of-memory error. ``NULL`` will be returned if the specified object is -not found within the array. + This function makes no alteration to the array itself, but rather returns + an edit script that must be applied. ``-ENOMEM`` is returned in the case of + an out-of-memory error. ``NULL`` will be returned if the specified object + is not found within the array. The caller should lock exclusively against other modifiers of the array. @@ -225,14 +225,14 @@ The caller should lock exclusively against other modifiers of the array. assoc_array_clear(struct assoc_array *array, const struct assoc_array_ops *ops); -This deletes all the objects from an associative array and leaves it -completely empty. + This deletes all the objects from an associative array and leaves it + completely empty. -This function makes no alteration to the array itself, but rather returns -an edit script that must be applied. ``-ENOMEM`` is returned in the case of -an out-of-memory error. + This function makes no alteration to the array itself, but rather returns + an edit script that must be applied. ``-ENOMEM`` is returned in the case of + an out-of-memory error. -The caller should lock exclusively against other modifiers of the array. + The caller should lock exclusively against other modifiers of the array. 5. Destroy an associative array, deleting all objects:: @@ -240,14 +240,14 @@ The caller should lock exclusively against other modifiers of the array. void assoc_array_destroy(struct assoc_array *array, const struct assoc_array_ops *ops); -This destroys the contents of the associative array and leaves it -completely empty. It is not permitted for another thread to be traversing -the array under the RCU read lock at the same time as this function is -destroying it as no RCU deferral is performed on memory release - -something that would require memory to be allocated. + This destroys the contents of the associative array and leaves it + completely empty. It is not permitted for another thread to be traversing + the array under the RCU read lock at the same time as this function is + destroying it as no RCU deferral is performed on memory release - + something that would require memory to be allocated. -The caller should lock exclusively against other modifiers and accessors -of the array. + The caller should lock exclusively against other modifiers and accessors + of the array. 6. Garbage collect an associative array:: @@ -257,24 +257,24 @@ of the array. bool (*iterator)(void *object, void *iterator_data), void *iterator_data); -This iterates over the objects in an associative array and passes each one to -``iterator()``. If ``iterator()`` returns ``true``, the object is kept. If it -returns ``false``, the object will be freed. If the ``iterator()`` function -returns ``true``, it must perform any appropriate refcount incrementing on the -object before returning. + This iterates over the objects in an associative array and passes each one + to ``iterator()``. If ``iterator()`` returns ``true``, the object is kept. + If it returns ``false``, the object will be freed. If the ``iterator()`` + function returns ``true``, it must perform any appropriate refcount + incrementing on the object before returning. -The internal tree will be packed down if possible as part of the iteration -to reduce the number of nodes in it. + The internal tree will be packed down if possible as part of the iteration + to reduce the number of nodes in it. -The ``iterator_data`` is passed directly to ``iterator()`` and is otherwise -ignored by the function. + The ``iterator_data`` is passed directly to ``iterator()`` and is otherwise + ignored by the function. -The function will return ``0`` if successful and ``-ENOMEM`` if there wasn't -enough memory. + The function will return ``0`` if successful and ``-ENOMEM`` if there wasn't + enough memory. -It is possible for other threads to iterate over or search the array under -the RCU read lock while this function is in progress. The caller should -lock exclusively against other modifiers of the array. + It is possible for other threads to iterate over or search the array under + the RCU read lock while this function is in progress. The caller should + lock exclusively against other modifiers of the array. Access Functions @@ -289,19 +289,19 @@ There are two functions for accessing an associative array: void *iterator_data), void *iterator_data); -This passes each object in the array to the iterator callback function. -``iterator_data`` is private data for that function. + This passes each object in the array to the iterator callback function. + ``iterator_data`` is private data for that function. -This may be used on an array at the same time as the array is being -modified, provided the RCU read lock is held. Under such circumstances, -it is possible for the iteration function to see some objects twice. If -this is a problem, then modification should be locked against. The -iteration algorithm should not, however, miss any objects. + This may be used on an array at the same time as the array is being + modified, provided the RCU read lock is held. Under such circumstances, + it is possible for the iteration function to see some objects twice. If + this is a problem, then modification should be locked against. The + iteration algorithm should not, however, miss any objects. -The function will return ``0`` if no objects were in the array or else it will -return the result of the last iterator function called. Iteration stops -immediately if any call to the iteration function results in a non-zero -return. + The function will return ``0`` if no objects were in the array or else it + will return the result of the last iterator function called. Iteration + stops immediately if any call to the iteration function results in a + non-zero return. 2. Find an object in an associative array:: @@ -310,14 +310,14 @@ return. const struct assoc_array_ops *ops, const void *index_key); -This walks through the array's internal tree directly to the object -specified by the index key.. + This walks through the array's internal tree directly to the object + specified by the index key. -This may be used on an array at the same time as the array is being -modified, provided the RCU read lock is held. + This may be used on an array at the same time as the array is being + modified, provided the RCU read lock is held. -The function will return the object if found (and set ``*_type`` to the object -type) or will return ``NULL`` if the object was not found. + The function will return the object if found (and set ``*_type`` to the + object type) or will return ``NULL`` if the object was not found. Index Key Form @@ -399,10 +399,11 @@ fixed levels. For example:: In the above example, there are 7 nodes (A-G), each with 16 slots (0-f). Assuming no other meta data nodes in the tree, the key space is divided -thusly:: +thusly: + =========== ==== KEY PREFIX NODE - ========== ==== + =========== ==== 137* D 138* E 13[0-69-f]* C @@ -410,10 +411,12 @@ thusly:: e6* G e[0-57-f]* F [02-df]* A + =========== ==== So, for instance, keys with the following example index keys will be found in -the appropriate nodes:: +the appropriate nodes: + =============== ======= ==== INDEX KEY PREFIX NODE =============== ======= ==== 13694892892489 13 C @@ -422,12 +425,13 @@ the appropriate nodes:: 138bbb89003093 138 E 1394879524789 12 C 1458952489 1 B - 9431809de993ba - A - b4542910809cd - A + 9431809de993ba \- A + b4542910809cd \- A e5284310def98 e F e68428974237 e6 G e7fffcbd443 e F - f3842239082 - A + f3842239082 \- A + =============== ======= ==== To save memory, if a node can hold all the leaves in its portion of keyspace, then the node will have all those leaves in it and will not have any metadata @@ -441,8 +445,9 @@ metadata pointer. If the metadata pointer is there, any leaf whose key matches the metadata key prefix must be in the subtree that the metadata pointer points to. -In the above example list of index keys, node A will contain:: +In the above example list of index keys, node A will contain: + ==== =============== ================== SLOT CONTENT INDEX KEY (PREFIX) ==== =============== ================== 1 PTR TO NODE B 1* @@ -450,11 +455,16 @@ In the above example list of index keys, node A will contain:: any LEAF b4542910809cd e PTR TO NODE F e* any LEAF f3842239082 + ==== =============== ================== -and node B:: +and node B: - 3 PTR TO NODE C 13* - any LEAF 1458952489 + ==== =============== ================== + SLOT CONTENT INDEX KEY (PREFIX) + ==== =============== ================== + 3 PTR TO NODE C 13* + any LEAF 1458952489 + ==== =============== ================== Shortcuts diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst index 7f2f11b48286..c0b1b6089307 100644 --- a/Documentation/core-api/printk-formats.rst +++ b/Documentation/core-api/printk-formats.rst @@ -547,11 +547,13 @@ Time and date %pt[RT]s YYYY-mm-dd HH:MM:SS %pt[RT]d YYYY-mm-dd %pt[RT]t HH:MM:SS - %pt[RT][dt][r][s] + %ptSp <seconds>.<nanoseconds> + %pt[RST][dt][r][s] For printing date and time as represented by:: - R struct rtc_time structure + R content of struct rtc_time + S content of struct timespec64 T time64_t type in human readable format. @@ -563,6 +565,11 @@ The %pt[RT]s (space) will override ISO 8601 separator by using ' ' (space) instead of 'T' (Capital T) between date and time. It won't have any effect when date or time is omitted. +The %ptSp is equivalent to %lld.%09ld for the content of the struct timespec64. +When the other specifiers are given, it becomes the respective equivalent of +%ptT[dt][r][s].%09ld. In other words, the seconds are being printed in +the human readable format followed by a dot and nanoseconds. + Passed by reference. struct clk diff --git a/Documentation/crypto/index.rst b/Documentation/crypto/index.rst index 100b47d049c0..4ee667c446f9 100644 --- a/Documentation/crypto/index.rst +++ b/Documentation/crypto/index.rst @@ -27,3 +27,4 @@ for cryptographic use cases, as well as programming examples. descore-readme device_drivers/index krb5 + sha3 diff --git a/Documentation/crypto/sha3.rst b/Documentation/crypto/sha3.rst new file mode 100644 index 000000000000..37640f295118 --- /dev/null +++ b/Documentation/crypto/sha3.rst @@ -0,0 +1,130 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +========================== +SHA-3 Algorithm Collection +========================== + +.. contents:: + +Overview +======== + +The SHA-3 family of algorithms, as specified in NIST FIPS-202 [1]_, contains six +algorithms based on the Keccak sponge function. The differences between them +are: the "rate" (how much of the state buffer gets updated with new data between +invocations of the Keccak function and analogous to the "block size"), what +domain separation suffix gets appended to the input data, and how much output +data is extracted at the end. The Keccak sponge function is designed such that +arbitrary amounts of output can be obtained for certain algorithms. + +Four digest algorithms are provided: + + - SHA3-224 + - SHA3-256 + - SHA3-384 + - SHA3-512 + +Additionally, two Extendable-Output Functions (XOFs) are provided: + + - SHAKE128 + - SHAKE256 + +The SHA-3 library API supports all six of these algorithms. The four digest +algorithms are also supported by the crypto_shash and crypto_ahash APIs. + +This document describes the SHA-3 library API. + + +Digests +======= + +The following functions compute SHA-3 digests:: + + void sha3_224(const u8 *in, size_t in_len, u8 out[SHA3_224_DIGEST_SIZE]); + void sha3_256(const u8 *in, size_t in_len, u8 out[SHA3_256_DIGEST_SIZE]); + void sha3_384(const u8 *in, size_t in_len, u8 out[SHA3_384_DIGEST_SIZE]); + void sha3_512(const u8 *in, size_t in_len, u8 out[SHA3_512_DIGEST_SIZE]); + +For users that need to pass in data incrementally, an incremental API is also +provided. The incremental API uses the following struct:: + + struct sha3_ctx { ... }; + +Initialization is done with one of:: + + void sha3_224_init(struct sha3_ctx *ctx); + void sha3_256_init(struct sha3_ctx *ctx); + void sha3_384_init(struct sha3_ctx *ctx); + void sha3_512_init(struct sha3_ctx *ctx); + +Input data is then added with any number of calls to:: + + void sha3_update(struct sha3_ctx *ctx, const u8 *in, size_t in_len); + +Finally, the digest is generated using:: + + void sha3_final(struct sha3_ctx *ctx, u8 *out); + +which also zeroizes the context. The length of the digest is determined by the +initialization function that was called. + + +Extendable-Output Functions +=========================== + +The following functions compute the SHA-3 extendable-output functions (XOFs):: + + void shake128(const u8 *in, size_t in_len, u8 *out, size_t out_len); + void shake256(const u8 *in, size_t in_len, u8 *out, size_t out_len); + +For users that need to provide the input data incrementally and/or receive the +output data incrementally, an incremental API is also provided. The incremental +API uses the following struct:: + + struct shake_ctx { ... }; + +Initialization is done with one of:: + + void shake128_init(struct shake_ctx *ctx); + void shake256_init(struct shake_ctx *ctx); + +Input data is then added with any number of calls to:: + + void shake_update(struct shake_ctx *ctx, const u8 *in, size_t in_len); + +Finally, the output data is extracted with any number of calls to:: + + void shake_squeeze(struct shake_ctx *ctx, u8 *out, size_t out_len); + +and telling it how much data should be extracted. Note that performing multiple +squeezes, with the output laid consecutively in a buffer, gets exactly the same +output as doing a single squeeze for the combined amount over the same buffer. + +More input data cannot be added after squeezing has started. + +Once all the desired output has been extracted, zeroize the context:: + + void shake_zeroize_ctx(struct shake_ctx *ctx); + + +Testing +======= + +To test the SHA-3 code, use sha3_kunit (CONFIG_CRYPTO_LIB_SHA3_KUNIT_TEST). + +Since the SHA-3 algorithms are FIPS-approved, when the kernel is booted in FIPS +mode the SHA-3 library also performs a simple self-test. This is purely to meet +a FIPS requirement. Normal testing done by kernel developers and integrators +should use the much more comprehensive KUnit test suite instead. + + +References +========== + +.. [1] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf + + +API Function Reference +====================== + +.. kernel-doc:: include/crypto/sha3.h diff --git a/Documentation/crypto/userspace-if.rst b/Documentation/crypto/userspace-if.rst index f80f243e227e..8158b363cd98 100644 --- a/Documentation/crypto/userspace-if.rst +++ b/Documentation/crypto/userspace-if.rst @@ -302,10 +302,9 @@ follows: Depending on the RNG type, the RNG must be seeded. The seed is provided -using the setsockopt interface to set the key. For example, the -ansi_cprng requires a seed. The DRBGs do not require a seed, but may be -seeded. The seed is also known as a *Personalization String* in NIST SP 800-90A -standard. +using the setsockopt interface to set the key. The SP800-90A DRBGs do +not require a seed, but may be seeded. The seed is also known as a +*Personalization String* in NIST SP 800-90A standard. Using the read()/recvmsg() system calls, random numbers can be obtained. The kernel generates at most 128 bytes in one call. If user space diff --git a/Documentation/dev-tools/checkpatch.rst b/Documentation/dev-tools/checkpatch.rst index d5c47e560324..dfaad0a279ff 100644 --- a/Documentation/dev-tools/checkpatch.rst +++ b/Documentation/dev-tools/checkpatch.rst @@ -461,16 +461,9 @@ Comments line comments is:: /* - * This is the preferred style - * for multi line comments. - */ - - The networking comment style is a bit different, with the first line - not empty like the former:: - - /* This is the preferred comment style - * for files in net/ and drivers/net/ - */ + * This is the preferred style + * for multi line comments. + */ See: https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting diff --git a/Documentation/dev-tools/kunit/run_manual.rst b/Documentation/dev-tools/kunit/run_manual.rst index 699d92885075..98e8d5b28808 100644 --- a/Documentation/dev-tools/kunit/run_manual.rst +++ b/Documentation/dev-tools/kunit/run_manual.rst @@ -35,6 +35,12 @@ or be built into the kernel. a good way of quickly testing everything applicable to the current config. + KUnit can be enabled or disabled at boot time, and this behavior is + controlled by the kunit.enable kernel parameter. + By default, kunit.enable is set to 1 because KUNIT_DEFAULT_ENABLED is + enabled by default. To ensure that tests are executed as expected, + verify that kunit.enable=1 at boot time. + Once we have built our kernel (and/or modules), it is simple to run the tests. If the tests are built-in, they will run automatically on the kernel boot. The results will be written to the kernel log (``dmesg``) diff --git a/Documentation/devicetree/bindings/crypto/amd,ccp-seattle-v1a.yaml b/Documentation/devicetree/bindings/crypto/amd,ccp-seattle-v1a.yaml index 32bf3a1c3b42..5fb708471059 100644 --- a/Documentation/devicetree/bindings/crypto/amd,ccp-seattle-v1a.yaml +++ b/Documentation/devicetree/bindings/crypto/amd,ccp-seattle-v1a.yaml @@ -21,6 +21,9 @@ properties: dma-coherent: true + iommus: + maxItems: 4 + required: - compatible - reg diff --git a/Documentation/devicetree/bindings/crypto/qcom,inline-crypto-engine.yaml b/Documentation/devicetree/bindings/crypto/qcom,inline-crypto-engine.yaml index 08fe6a707a37..c3408dcf5d20 100644 --- a/Documentation/devicetree/bindings/crypto/qcom,inline-crypto-engine.yaml +++ b/Documentation/devicetree/bindings/crypto/qcom,inline-crypto-engine.yaml @@ -13,6 +13,7 @@ properties: compatible: items: - enum: + - qcom,kaanapali-inline-crypto-engine - qcom,qcs8300-inline-crypto-engine - qcom,sa8775p-inline-crypto-engine - qcom,sc7180-inline-crypto-engine diff --git a/Documentation/devicetree/bindings/crypto/qcom,prng.yaml b/Documentation/devicetree/bindings/crypto/qcom,prng.yaml index ed7e16bd11d3..597441d94cf1 100644 --- a/Documentation/devicetree/bindings/crypto/qcom,prng.yaml +++ b/Documentation/devicetree/bindings/crypto/qcom,prng.yaml @@ -20,6 +20,7 @@ properties: - qcom,ipq5332-trng - qcom,ipq5424-trng - qcom,ipq9574-trng + - qcom,kaanapali-trng - qcom,qcs615-trng - qcom,qcs8300-trng - qcom,sa8255p-trng diff --git a/Documentation/devicetree/bindings/crypto/qcom-qce.yaml b/Documentation/devicetree/bindings/crypto/qcom-qce.yaml index e009cb712fb8..79d5be2548bc 100644 --- a/Documentation/devicetree/bindings/crypto/qcom-qce.yaml +++ b/Documentation/devicetree/bindings/crypto/qcom-qce.yaml @@ -45,6 +45,7 @@ properties: - items: - enum: + - qcom,kaanapali-qce - qcom,qcs615-qce - qcom,qcs8300-qce - qcom,sa8775p-qce diff --git a/Documentation/devicetree/bindings/interrupt-controller/amlogic,meson-gpio-intc.yaml b/Documentation/devicetree/bindings/interrupt-controller/amlogic,meson-gpio-intc.yaml index 3d60d9e9e208..d0fad930de9d 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/amlogic,meson-gpio-intc.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/amlogic,meson-gpio-intc.yaml @@ -39,6 +39,9 @@ properties: - amlogic,a4-gpio-ao-intc - amlogic,a5-gpio-intc - amlogic,c3-gpio-intc + - amlogic,s6-gpio-intc + - amlogic,s7-gpio-intc + - amlogic,s7d-gpio-intc - amlogic,t7-gpio-intc - const: amlogic,meson-gpio-intc diff --git a/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml index 55636d06a674..999df5b905c5 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-intc.yaml @@ -25,13 +25,14 @@ properties: interrupt-controller: true '#interrupt-cells': - const: 2 + const: 1 description: The first cell is the IRQ number, the second cell is the trigger type as defined in interrupt.txt in this directory. interrupts: - maxItems: 6 + minItems: 1 + maxItems: 10 description: | Depend to which INTC0 or INTC1 used. INTC0 and INTC1 are two kinds of interrupt controller with enable and raw @@ -74,13 +75,17 @@ examples: interrupt-controller@12101b00 { compatible = "aspeed,ast2700-intc-ic"; reg = <0 0x12101b00 0 0x10>; - #interrupt-cells = <2>; + #interrupt-cells = <1>; interrupt-controller; interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, - <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>; + <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>; }; }; diff --git a/Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml b/Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml index f683d696909b..6fdb7ae9e85a 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml @@ -58,6 +58,7 @@ properties: - const: andestech,nceplic100 - items: - enum: + - anlogic,dr1v90-plic - canaan,k210-plic - eswin,eic7700-plic - sifive,fu540-c000-plic @@ -76,6 +77,9 @@ properties: - thead,th1520-plic - const: thead,c900-plic - items: + - const: ultrarisc,dp1000-plic + - const: ultrarisc,cp100-plic + - items: - const: sifive,plic-1.0.0 - const: riscv,plic0 deprecated: true diff --git a/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml b/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml index d6fb08a54167..62fd220e126e 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-mswi.yaml @@ -4,18 +4,23 @@ $id: http://devicetree.org/schemas/interrupt-controller/thead,c900-aclint-mswi.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# -title: Sophgo sg2042 CLINT Machine-level Software Interrupt Device +title: ACLINT Machine-level Software Interrupt Device maintainers: - Inochi Amaoto <inochiama@outlook.com> properties: compatible: - items: - - enum: - - sophgo,sg2042-aclint-mswi - - sophgo,sg2044-aclint-mswi - - const: thead,c900-aclint-mswi + oneOf: + - items: + - enum: + - sophgo,sg2042-aclint-mswi + - sophgo,sg2044-aclint-mswi + - const: thead,c900-aclint-mswi + - items: + - enum: + - anlogic,dr1v90-aclint-mswi + - const: nuclei,ux900-aclint-mswi reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-sswi.yaml b/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-sswi.yaml index c1ab865fcd64..d02c6886283a 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-sswi.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclint-sswi.yaml @@ -30,6 +30,10 @@ properties: - const: thead,c900-aclint-sswi - items: - const: mips,p8700-aclint-sswi + - items: + - enum: + - anlogic,dr1v90-aclint-sswi + - const: nuclei,ux900-aclint-sswi reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml b/Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml index d2e578d6b83b..103e4aec2439 100644 --- a/Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml +++ b/Documentation/devicetree/bindings/perf/fsl-imx-ddr.yaml @@ -14,6 +14,7 @@ properties: oneOf: - enum: - fsl,imx8-ddr-pmu + - fsl,imx8dxl-db-pmu - fsl,imx8m-ddr-pmu - fsl,imx8mq-ddr-pmu - fsl,imx8mm-ddr-pmu @@ -28,7 +29,10 @@ properties: - fsl,imx8mp-ddr-pmu - const: fsl,imx8m-ddr-pmu - items: - - const: fsl,imx8dxl-ddr-pmu + - enum: + - fsl,imx8dxl-ddr-pmu + - fsl,imx8qm-ddr-pmu + - fsl,imx8qxp-ddr-pmu - const: fsl,imx8-ddr-pmu - items: - enum: @@ -43,6 +47,14 @@ properties: interrupts: maxItems: 1 + clocks: + maxItems: 2 + + clock-names: + items: + - const: ipg + - const: cnt + required: - compatible - reg @@ -50,6 +62,21 @@ required: additionalProperties: false +allOf: + - if: + properties: + compatible: + contains: + const: fsl,imx8dxl-db-pmu + then: + required: + - clocks + - clock-names + else: + properties: + clocks: false + clock-names: false + examples: - | #include <dt-bindings/interrupt-controller/arm-gic.h> diff --git a/Documentation/devicetree/bindings/rng/microchip,pic32-rng.txt b/Documentation/devicetree/bindings/rng/microchip,pic32-rng.txt deleted file mode 100644 index c6d1003befb7..000000000000 --- a/Documentation/devicetree/bindings/rng/microchip,pic32-rng.txt +++ /dev/null @@ -1,17 +0,0 @@ -* Microchip PIC32 Random Number Generator - -The PIC32 RNG provides a pseudo random number generator which can be seeded by -another true random number generator. - -Required properties: -- compatible : should be "microchip,pic32mzda-rng" -- reg : Specifies base physical address and size of the registers. -- clocks: clock phandle. - -Example: - - rng: rng@1f8e6000 { - compatible = "microchip,pic32mzda-rng"; - reg = <0x1f8e6000 0x1000>; - clocks = <&PBCLK5>; - }; diff --git a/Documentation/devicetree/bindings/rng/microchip,pic32-rng.yaml b/Documentation/devicetree/bindings/rng/microchip,pic32-rng.yaml new file mode 100644 index 000000000000..1f6f6fb81ddc --- /dev/null +++ b/Documentation/devicetree/bindings/rng/microchip,pic32-rng.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/rng/microchip,pic32-rng.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Microchip PIC32 Random Number Generator + +description: | + The PIC32 RNG provides a pseudo random number generator which can be seeded + by another true random number generator. + +maintainers: + - Joshua Henderson <joshua.henderson@microchip.com> + +properties: + compatible: + enum: + - microchip,pic32mzda-rng + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + +required: + - compatible + - reg + - clocks + +additionalProperties: false + +examples: + - | + rng: rng@1f8e6000 { + compatible = "microchip,pic32mzda-rng"; + reg = <0x1f8e6000 0x1000>; + clocks = <&PBCLK5>; + }; diff --git a/Documentation/devicetree/bindings/thermal/fsl,imx91-tmu.yaml b/Documentation/devicetree/bindings/thermal/fsl,imx91-tmu.yaml new file mode 100644 index 000000000000..7fd1a86d7287 --- /dev/null +++ b/Documentation/devicetree/bindings/thermal/fsl,imx91-tmu.yaml @@ -0,0 +1,87 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/thermal/fsl,imx91-tmu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NXP i.MX91 Thermal + +maintainers: + - Pengfei Li <pengfei.li_1@nxp.com> + +description: + i.MX91 features a new temperature sensor. It includes programmable + temperature threshold comparators for both normal and privileged + accesses and allows a programmable measurement frequency for the + Periodic One-Shot Measurement mode. Additionally, it provides + status registers for indicating the end of measurement and threshold + violation events. + +properties: + compatible: + items: + - const: fsl,imx91-tmu + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + interrupts: + items: + - description: Comparator 1 irq + - description: Comparator 2 irq + - description: Data ready irq + + interrupt-names: + items: + - const: thr1 + - const: thr2 + - const: ready + + nvmem-cells: + items: + - description: Phandle to the trim control 1 provided by ocotp + - description: Phandle to the trim control 2 provided by ocotp + + nvmem-cell-names: + items: + - const: trim1 + - const: trim2 + + "#thermal-sensor-cells": + const: 0 + +required: + - compatible + - reg + - clocks + - interrupts + - interrupt-names + +allOf: + - $ref: thermal-sensor.yaml + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/clock/imx93-clock.h> + + thermal-sensor@44482000 { + compatible = "fsl,imx91-tmu"; + reg = <0x44482000 0x1000>; + #thermal-sensor-cells = <0>; + clocks = <&clk IMX93_CLK_TMC_GATE>; + interrupt-parent = <&gic>; + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "thr1", "thr2", "ready"; + nvmem-cells = <&tmu_trim1>, <&tmu_trim2>; + nvmem-cell-names = "trim1", "trim2"; + }; + +... diff --git a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml index 78e2f6573b96..3c5256b0cd9f 100644 --- a/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml +++ b/Documentation/devicetree/bindings/thermal/qcom-tsens.yaml @@ -36,10 +36,15 @@ properties: - qcom,msm8974-tsens - const: qcom,tsens-v0_1 + - description: + v1 of TSENS without RPM which requires to be explicitly reset + and enabled in the driver. + enum: + - qcom,ipq5018-tsens + - description: v1 of TSENS items: - enum: - - qcom,ipq5018-tsens - qcom,msm8937-tsens - qcom,msm8956-tsens - qcom,msm8976-tsens @@ -50,11 +55,13 @@ properties: items: - enum: - qcom,glymur-tsens + - qcom,kaanapali-tsens - qcom,milos-tsens - qcom,msm8953-tsens - qcom,msm8996-tsens - qcom,msm8998-tsens - qcom,qcm2290-tsens + - qcom,qcs8300-tsens - qcom,qcs615-tsens - qcom,sa8255p-tsens - qcom,sa8775p-tsens diff --git a/Documentation/devicetree/bindings/thermal/renesas,r9a09g047-tsu.yaml b/Documentation/devicetree/bindings/thermal/renesas,r9a09g047-tsu.yaml index 8d3f3c24f0f2..befdc8b7a082 100644 --- a/Documentation/devicetree/bindings/thermal/renesas,r9a09g047-tsu.yaml +++ b/Documentation/devicetree/bindings/thermal/renesas,r9a09g047-tsu.yaml @@ -16,7 +16,11 @@ description: properties: compatible: - const: renesas,r9a09g047-tsu + oneOf: + - const: renesas,r9a09g047-tsu # RZ/G3E + - items: + - const: renesas,r9a09g057-tsu # RZ/V2H + - const: renesas,r9a09g047-tsu # RZ/G3E reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/timer/realtek,rtd1625-systimer.yaml b/Documentation/devicetree/bindings/timer/realtek,rtd1625-systimer.yaml new file mode 100644 index 000000000000..e08d3d2d306b --- /dev/null +++ b/Documentation/devicetree/bindings/timer/realtek,rtd1625-systimer.yaml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/timer/realtek,rtd1625-systimer.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Realtek System Timer + +maintainers: + - Hao-Wen Ting <haowen.ting@realtek.com> + +description: + The Realtek SYSTIMER (System Timer) is a 64-bit global hardware counter operating + at a fixed 1MHz frequency. Thanks to its compare match interrupt capability, + the timer natively supports oneshot mode for tick broadcast functionality. + +properties: + compatible: + oneOf: + - const: realtek,rtd1625-systimer + - items: + - const: realtek,rtd1635-systimer + - const: realtek,rtd1625-systimer + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + + timer@89420 { + compatible = "realtek,rtd1635-systimer", + "realtek,rtd1625-systimer"; + reg = <0x89420 0x18>; + interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; + }; diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 424aa7b911a7..beab81e462d2 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1705,6 +1705,8 @@ patternProperties: description: Universal Scientific Industrial Co., Ltd. "^usr,.*": description: U.S. Robotics Corporation + "^ultrarisc,.*": + description: UltraRISC Technology Co., Ltd. "^ultratronik,.*": description: Ultratronik GmbH "^utoo,.*": diff --git a/Documentation/doc-guide/checktransupdate.rst b/Documentation/doc-guide/checktransupdate.rst index dfaf9d373747..7b25375cc6d9 100644 --- a/Documentation/doc-guide/checktransupdate.rst +++ b/Documentation/doc-guide/checktransupdate.rst @@ -27,15 +27,15 @@ Usage :: - ./scripts/checktransupdate.py --help + tools/docs/checktransupdate.py --help Please refer to the output of argument parser for usage details. Samples -- ``./scripts/checktransupdate.py -l zh_CN`` +- ``tools/docs/checktransupdate.py -l zh_CN`` This will print all the files that need to be updated in the zh_CN locale. -- ``./scripts/checktransupdate.py Documentation/translations/zh_CN/dev-tools/testing-overview.rst`` +- ``tools/docs/checktransupdate.py Documentation/translations/zh_CN/dev-tools/testing-overview.rst`` This will only print the status of the specified file. Then the output is something like: diff --git a/Documentation/doc-guide/contributing.rst b/Documentation/doc-guide/contributing.rst index 662c7a840cd5..f8047e633113 100644 --- a/Documentation/doc-guide/contributing.rst +++ b/Documentation/doc-guide/contributing.rst @@ -152,7 +152,7 @@ generate links to that documentation. Adding ``kernel-doc`` directives to the documentation to bring those comments in can help the community derive the full value of the work that has gone into creating them. -The ``scripts/find-unused-docs.sh`` tool can be used to find these +The ``tools/docs/find-unused-docs.sh`` tool can be used to find these overlooked comments. Note that the most value comes from pulling in the documentation for diff --git a/Documentation/doc-guide/kernel-doc.rst b/Documentation/doc-guide/kernel-doc.rst index af9697e60165..fd89a6d56ea9 100644 --- a/Documentation/doc-guide/kernel-doc.rst +++ b/Documentation/doc-guide/kernel-doc.rst @@ -405,6 +405,10 @@ Domain`_ references. ``%CONST`` Name of a constant. (No cross-referencing, just formatting.) + Examples:: + + %0 %NULL %-1 %-EFAULT %-EINVAL %-ENOMEM + ````literal```` A literal block that should be handled as-is. The output will use a ``monospaced font``. @@ -579,20 +583,23 @@ source. How to use kernel-doc to generate man pages ------------------------------------------- -If you just want to use kernel-doc to generate man pages you can do this -from the kernel git tree:: +To generate man pages for all files that contain kernel-doc markups, run:: + + $ make mandocs - $ scripts/kernel-doc -man \ - $(git grep -l '/\*\*' -- :^Documentation :^tools) \ - | scripts/split-man.pl /tmp/man +Or calling ``script-build-wrapper`` directly:: -Some older versions of git do not support some of the variants of syntax for -path exclusion. One of the following commands may work for those versions:: + $ ./tools/docs/sphinx-build-wrapper mandocs - $ scripts/kernel-doc -man \ - $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ - | scripts/split-man.pl /tmp/man +The output will be at ``/man`` directory inside the output directory +(by default: ``Documentation/output``). + +Optionally, it is possible to generate a partial set of man pages by +using SPHINXDIRS: + + $ make SPHINXDIRS=driver-api/media mandocs + +.. note:: - $ scripts/kernel-doc -man \ - $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ - | scripts/split-man.pl /tmp/man + When SPHINXDIRS={subdir} is used, it will only generate man pages for + the files explicitly inside a ``Documentation/{subdir}/.../*.rst`` file. diff --git a/Documentation/doc-guide/parse-headers.rst b/Documentation/doc-guide/parse-headers.rst index 204b025f1349..a7bb01ff04eb 100644 --- a/Documentation/doc-guide/parse-headers.rst +++ b/Documentation/doc-guide/parse-headers.rst @@ -5,173 +5,168 @@ Including uAPI header files Sometimes, it is useful to include header files and C example codes in order to describe the userspace API and to generate cross-references between the code and the documentation. Adding cross-references for -userspace API files has an additional vantage: Sphinx will generate warnings +userspace API files has an additional advantage: Sphinx will generate warnings if a symbol is not found at the documentation. That helps to keep the uAPI documentation in sync with the Kernel changes. -The :ref:`parse_headers.pl <parse_headers>` provide a way to generate such +The :ref:`parse_headers.py <parse_headers>` provides a way to generate such cross-references. It has to be called via Makefile, while building the documentation. Please see ``Documentation/userspace-api/media/Makefile`` for an example about how to use it inside the Kernel tree. .. _parse_headers: -parse_headers.pl -^^^^^^^^^^^^^^^^ +tools/docs/parse_headers.py +^^^^^^^^^^^^^^^^^^^^^^^^^^^ NAME **** - -parse_headers.pl - parse a C file, in order to identify functions, structs, +parse_headers.py - parse a C file, in order to identify functions, structs, enums and defines and create cross-references to a Sphinx book. +USAGE +***** + +parse-headers.py [-h] [-d] [-t] ``FILE_IN`` ``FILE_OUT`` ``FILE_RULES`` SYNOPSIS ******** - -\ **parse_headers.pl**\ [<options>] <C_FILE> <OUT_FILE> [<EXCEPTIONS_FILE>] - -Where <options> can be: --debug, --help or --usage. - - -OPTIONS -******* - - - -\ **--debug**\ - - Put the script in verbose mode, useful for debugging. - - - -\ **--usage**\ - - Prints a brief help message and exits. - - - -\ **--help**\ - - Prints a more detailed help message and exits. - - -DESCRIPTION -*********** - - -Convert a C header or source file (C_FILE), into a reStructuredText +Converts a C header or source file ``FILE_IN`` into a ReStructured Text included via ..parsed-literal block with cross-references for the documentation files that describe the API. It accepts an optional -EXCEPTIONS_FILE with describes what elements will be either ignored or -be pointed to a non-default reference. - -The output is written at the (OUT_FILE). +``FILE_RULES`` file to describe what elements will be either ignored or +be pointed to a non-default reference type/name. -It is capable of identifying defines, functions, structs, typedefs, -enums and enum symbols and create cross-references for all of them. -It is also capable of distinguish #define used for specifying a Linux -ioctl. +The output is written at ``FILE_OUT``. -The EXCEPTIONS_FILE contain two types of statements: \ **ignore**\ or \ **replace**\ . +It is capable of identifying ``define``, ``struct``, ``typedef``, ``enum`` +and enum ``symbol``, creating cross-references for all of them. -The syntax for the ignore tag is: +It is also capable of distinguishing ``#define`` used for specifying +Linux-specific macros used to define ``ioctl``. +The optional ``FILE_RULES`` contains a set of rules like:: -ignore \ **type**\ \ **name**\ + ignore ioctl VIDIOC_ENUM_FMT + replace ioctl VIDIOC_DQBUF vidioc_qbuf + replace define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ :c:type:`v4l2_event_motion_det` -The \ **ignore**\ means that it won't generate cross references for a -\ **name**\ symbol of type \ **type**\ . +POSITIONAL ARGUMENTS +******************** -The syntax for the replace tag is: + ``FILE_IN`` + Input C file + ``FILE_OUT`` + Output RST file -replace \ **type**\ \ **name**\ \ **new_value**\ + ``FILE_RULES`` + Exceptions file (optional) -The \ **replace**\ means that it will generate cross references for a -\ **name**\ symbol of type \ **type**\ , but, instead of using the default -replacement rule, it will use \ **new_value**\ . - -For both statements, \ **type**\ can be either one of the following: +OPTIONS +******* + ``-h``, ``--help`` + show a help message and exit + ``-d``, ``--debug`` + Increase debug level. Can be used multiple times + ``-t``, ``--toc`` + instead of a literal block, outputs a TOC table at the RST file -\ **ioctl**\ - The ignore or replace statement will apply to ioctl definitions like: +DESCRIPTION +*********** - #define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_dbg_register) +Creates an enriched version of a Kernel header file with cross-links +to each C data structure type, from ``FILE_IN``, formatting it with +reStructuredText notation, either as-is or as a table of contents. +It accepts an optional ``FILE_RULES`` which describes what elements will be +either ignored or be pointed to a non-default reference, and optionally +defines the C namespace to be used. +It is meant to allow having more comprehensive documentation, where +uAPI headers will create cross-reference links to the code. -\ **define**\ +The output is written at the ``FILE_OUT``. - The ignore or replace statement will apply to any other #define found - at C_FILE. +The ``FILE_RULES`` may contain contain three types of statements: +**ignore**, **replace** and **namespace**. +By default, it create rules for all symbols and defines, but it also +allows parsing an exception file. Such file contains a set of rules +using the syntax below: +1. Ignore rules: -\ **typedef**\ + ignore *type* *symbol* - The ignore or replace statement will apply to typedef statements at C_FILE. +Removes the symbol from reference generation. +2. Replace rules: + replace *type* *old_symbol* *new_reference* -\ **struct**\ + Replaces *old_symbol* with a *new_reference*. + The *new_reference* can be: - The ignore or replace statement will apply to the name of struct statements - at C_FILE. + - A simple symbol name; + - A full Sphinx reference. +3. Namespace rules + namespace *namespace* -\ **enum**\ + Sets C *namespace* to be used during cross-reference generation. Can + be overridden by replace rules. - The ignore or replace statement will apply to the name of enum statements - at C_FILE. +On ignore and replace rules, *type* can be: + - ioctl: + for defines of the form ``_IO*``, e.g., ioctl definitions + - define: + for other defines -\ **symbol**\ + - symbol: + for symbols defined within enums; - The ignore or replace statement will apply to the name of enum value - at C_FILE. + - typedef: + for typedefs; - For replace statements, \ **new_value**\ will automatically use :c:type: - references for \ **typedef**\ , \ **enum**\ and \ **struct**\ types. It will use :ref: - for \ **ioctl**\ , \ **define**\ and \ **symbol**\ types. The type of reference can - also be explicitly defined at the replace statement. + - enum: + for the name of a non-anonymous enum; + - struct: + for structs. EXAMPLES ******** +- Ignore a define ``_VIDEODEV2_H`` at ``FILE_IN``:: -ignore define _VIDEODEV2_H - - -Ignore a #define _VIDEODEV2_H at the C_FILE. - -ignore symbol PRIVATE - + ignore define _VIDEODEV2_H -On a struct like: +- On an data structure like this enum:: -enum foo { BAR1, BAR2, PRIVATE }; + enum foo { BAR1, BAR2, PRIVATE }; -It won't generate cross-references for \ **PRIVATE**\ . + It won't generate cross-references for ``PRIVATE``:: -replace symbol BAR1 :c:type:\`foo\` -replace symbol BAR2 :c:type:\`foo\` + ignore symbol PRIVATE + At the same struct, instead of creating one cross reference per symbol, + make them all point to the ``enum foo`` C type:: -On a struct like: + replace symbol BAR1 :c:type:\`foo\` + replace symbol BAR2 :c:type:\`foo\` -enum foo { BAR1, BAR2, PRIVATE }; -It will make the BAR1 and BAR2 enum symbols to cross reference the foo -symbol at the C domain. +- Use C namespace ``MC`` for all symbols at ``FILE_IN``:: + namespace MC BUGS **** @@ -184,7 +179,7 @@ COPYRIGHT ********* -Copyright (c) 2016 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>. +Copyright (c) 2016, 2025 by Mauro Carvalho Chehab <mchehab+huawei@kernel.org>. License GPLv2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>. diff --git a/Documentation/doc-guide/sphinx.rst b/Documentation/doc-guide/sphinx.rst index 607589592bfb..51c370260f3b 100644 --- a/Documentation/doc-guide/sphinx.rst +++ b/Documentation/doc-guide/sphinx.rst @@ -106,7 +106,7 @@ There's a script that automatically checks for Sphinx dependencies. If it can recognize your distribution, it will also give a hint about the install command line options for your distro:: - $ ./scripts/sphinx-pre-install + $ ./tools/docs/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are available Warning: better to also install "texlive-luatex85". You should run: @@ -116,7 +116,7 @@ command line options for your distro:: . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/docs/sphinx-pre-install line 468. By default, it checks all the requirements for both html and PDF, including the requirements for images, math expressions and LaTeX build, and assumes @@ -149,7 +149,7 @@ a venv with it with, and install minimal requirements with:: A more comprehensive test can be done by using: - scripts/test_doc_build.py + tools/docs/test_doc_build.py Such script create one Python venv per supported version, optionally building documentation for a range of Sphinx versions. diff --git a/Documentation/driver-api/parport-lowlevel.rst b/Documentation/driver-api/parport-lowlevel.rst index 0633d70ffda7..a907e279f509 100644 --- a/Documentation/driver-api/parport-lowlevel.rst +++ b/Documentation/driver-api/parport-lowlevel.rst @@ -7,6 +7,7 @@ PARPORT interface documentation Described here are the following functions: Global functions:: + parport_register_driver parport_unregister_driver parport_enumerate @@ -34,6 +35,7 @@ Global functions:: Port functions (can be overridden by low-level drivers): SPP:: + port->ops->read_data port->ops->write_data port->ops->read_status @@ -46,17 +48,20 @@ Port functions (can be overridden by low-level drivers): port->ops->data_reverse EPP:: + port->ops->epp_write_data port->ops->epp_read_data port->ops->epp_write_addr port->ops->epp_read_addr ECP:: + port->ops->ecp_write_data port->ops->ecp_read_data port->ops->ecp_write_addr Other:: + port->ops->nibble_read_data port->ops->byte_read_data port->ops->compat_write_data diff --git a/Documentation/driver-api/pldmfw/index.rst b/Documentation/driver-api/pldmfw/index.rst index fd871b83f34f..e59beca374c1 100644 --- a/Documentation/driver-api/pldmfw/index.rst +++ b/Documentation/driver-api/pldmfw/index.rst @@ -14,7 +14,6 @@ the PLDM for Firmware Update standard file-format driver-ops -================================== Overview of the ``pldmfw`` library ================================== diff --git a/Documentation/driver-api/thermal/intel_dptf.rst b/Documentation/driver-api/thermal/intel_dptf.rst index c51ac793dc06..916bf0f36a03 100644 --- a/Documentation/driver-api/thermal/intel_dptf.rst +++ b/Documentation/driver-api/thermal/intel_dptf.rst @@ -409,3 +409,26 @@ based on the processor generation. Limit 1 from being exhausted. 4 – Unknown: Can't classify. + + On processors starting from Panther Lake additional hints are provided. + The hardware analyzes workload residencies over an extended period to + determine whether the workload classification tends toward idle/battery + life states or sustained/performance states. Based on this long-term + analysis, it classifies: + + Power Classification: If the workload exhibits more idle or battery life + residencies, it is classified as "power". + + Performance Classification: If the workload exhibits more sustained or + performance residencies, it is classified as "performance". + + This approach enables applications to ignore short-term workload + fluctuations and instead respond to longer-term power vs. performance + trends. + + Residency thresholds for this classification are CPU generation-specific. + Classification is reported via bit 4 of the workload_type_index: + + Bit 4 = 1: Power classification + + Bit 4 = 0: Performance classification diff --git a/Documentation/driver-api/usb/writing_musb_glue_layer.rst b/Documentation/driver-api/usb/writing_musb_glue_layer.rst index 0bb96ecdf527..b748b9fb1965 100644 --- a/Documentation/driver-api/usb/writing_musb_glue_layer.rst +++ b/Documentation/driver-api/usb/writing_musb_glue_layer.rst @@ -709,7 +709,7 @@ Resources USB Home Page: https://www.usb.org -linux-usb Mailing List Archives: https://marc.info/?l=linux-usb +linux-usb Mailing List Archives: https://lore.kernel.org/linux-usb USB On-the-Go Basics: https://www.maximintegrated.com/app-notes/index.mvp/id/1822 diff --git a/Documentation/features/list-arch.sh b/Documentation/features/list-arch.sh deleted file mode 100755 index ac8ff7f6f859..000000000000 --- a/Documentation/features/list-arch.sh +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Small script that visualizes the kernel feature support status -# of an architecture. -# -# (If no arguments are given then it will print the host architecture's status.) -# - -ARCH=${1:-$(uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/' | sed 's/s390x/s390/')} - -$(dirname $0)/../../scripts/get_feat.pl list --arch $ARCH diff --git a/Documentation/features/scripts/features-refresh.sh b/Documentation/features/scripts/features-refresh.sh deleted file mode 100755 index c2288124e94a..000000000000 --- a/Documentation/features/scripts/features-refresh.sh +++ /dev/null @@ -1,98 +0,0 @@ -# -# Small script that refreshes the kernel feature support status in place. -# - -for F_FILE in Documentation/features/*/*/arch-support.txt; do - F=$(grep "^# Kconfig:" "$F_FILE" | cut -c26-) - - # - # Each feature F is identified by a pair (O, K), where 'O' can - # be either the empty string (for 'nop') or "not" (the logical - # negation operator '!'); other operators are not supported. - # - O="" - K=$F - if [[ "$F" == !* ]]; then - O="not" - K=$(echo $F | sed -e 's/^!//g') - fi - - # - # F := (O, K) is 'valid' iff there is a Kconfig file (for some - # arch) which contains K. - # - # Notice that this definition entails an 'asymmetry' between - # the case 'O = ""' and the case 'O = "not"'. E.g., F may be - # _invalid_ if: - # - # [case 'O = ""'] - # 1) no arch provides support for F, - # 2) K does not exist (e.g., it was renamed/mis-typed); - # - # [case 'O = "not"'] - # 3) all archs provide support for F, - # 4) as in (2). - # - # The rationale for adopting this definition (and, thus, for - # keeping the asymmetry) is: - # - # We want to be able to 'detect' (2) (or (4)). - # - # (1) and (3) may further warn the developers about the fact - # that K can be removed. - # - F_VALID="false" - for ARCH_DIR in arch/*/; do - K_FILES=$(find $ARCH_DIR -name "Kconfig*") - K_GREP=$(grep "$K" $K_FILES) - if [ ! -z "$K_GREP" ]; then - F_VALID="true" - break - fi - done - if [ "$F_VALID" = "false" ]; then - printf "WARNING: '%s' is not a valid Kconfig\n" "$F" - fi - - T_FILE="$F_FILE.tmp" - grep "^#" $F_FILE > $T_FILE - echo " -----------------------" >> $T_FILE - echo " | arch |status|" >> $T_FILE - echo " -----------------------" >> $T_FILE - for ARCH_DIR in arch/*/; do - ARCH=$(echo $ARCH_DIR | sed -e 's/^arch//g' | sed -e 's/\///g') - K_FILES=$(find $ARCH_DIR -name "Kconfig*") - K_GREP=$(grep "$K" $K_FILES) - # - # Arch support status values for (O, K) are updated according - # to the following rules. - # - # - ("", K) is 'supported by a given arch', if there is a - # Kconfig file for that arch which contains K; - # - # - ("not", K) is 'supported by a given arch', if there is - # no Kconfig file for that arch which contains K; - # - # - otherwise: preserve the previous status value (if any), - # default to 'not yet supported'. - # - # Notice that, according these rules, invalid features may be - # updated/modified. - # - if [ "$O" = "" ] && [ ! -z "$K_GREP" ]; then - printf " |%12s: | ok |\n" "$ARCH" >> $T_FILE - elif [ "$O" = "not" ] && [ -z "$K_GREP" ]; then - printf " |%12s: | ok |\n" "$ARCH" >> $T_FILE - else - S=$(grep -v "^#" "$F_FILE" | grep " $ARCH:") - if [ ! -z "$S" ]; then - echo "$S" >> $T_FILE - else - printf " |%12s: | TODO |\n" "$ARCH" \ - >> $T_FILE - fi - fi - done - echo " -----------------------" >> $T_FILE - mv $T_FILE $F_FILE -done diff --git a/Documentation/filesystems/ext4/inodes.rst b/Documentation/filesystems/ext4/inodes.rst index cfc6c1659931..55cd5c380e92 100644 --- a/Documentation/filesystems/ext4/inodes.rst +++ b/Documentation/filesystems/ext4/inodes.rst @@ -297,6 +297,8 @@ The ``i_flags`` field is a combination of these values: - Inode has inline data (EXT4_INLINE_DATA_FL). * - 0x20000000 - Create children with the same project ID (EXT4_PROJINHERIT_FL). + * - 0x40000000 + - Use case-insensitive lookups for directory contents (EXT4_CASEFOLD_FL). * - 0x80000000 - Reserved for ext4 library (EXT4_RESERVED_FL). * - diff --git a/Documentation/filesystems/ext4/super.rst b/Documentation/filesystems/ext4/super.rst index 1b240661bfa3..9a59cded9bd7 100644 --- a/Documentation/filesystems/ext4/super.rst +++ b/Documentation/filesystems/ext4/super.rst @@ -671,7 +671,9 @@ following: * - 0x8000 - Data in inode (INCOMPAT_INLINE_DATA). * - 0x10000 - - Encrypted inodes are present on the filesystem. (INCOMPAT_ENCRYPT). + - Encrypted inodes can be present. (INCOMPAT_ENCRYPT). + * - 0x20000 + - Directories can be marked case-insensitive. (INCOMPAT_CASEFOLD). .. _super_rocompat: diff --git a/Documentation/filesystems/fscrypt.rst b/Documentation/filesystems/fscrypt.rst index 696a5844bfa3..70af896822e1 100644 --- a/Documentation/filesystems/fscrypt.rst +++ b/Documentation/filesystems/fscrypt.rst @@ -450,9 +450,7 @@ API, but the filenames mode still does. - CONFIG_CRYPTO_HCTR2 - Recommended: - arm64: CONFIG_CRYPTO_AES_ARM64_CE_BLK - - arm64: CONFIG_CRYPTO_POLYVAL_ARM64_CE - x86: CONFIG_CRYPTO_AES_NI_INTEL - - x86: CONFIG_CRYPTO_POLYVAL_CLMUL_NI - Adiantum - Mandatory: diff --git a/Documentation/filesystems/gfs2-glocks.rst b/Documentation/filesystems/gfs2/glocks.rst index ce5ff08cbd59..ce5ff08cbd59 100644 --- a/Documentation/filesystems/gfs2-glocks.rst +++ b/Documentation/filesystems/gfs2/glocks.rst diff --git a/Documentation/filesystems/gfs2.rst b/Documentation/filesystems/gfs2/index.rst index 1bc48a13430c..e5e195403561 100644 --- a/Documentation/filesystems/gfs2.rst +++ b/Documentation/filesystems/gfs2/index.rst @@ -4,6 +4,9 @@ Global File System 2 ==================== +Overview +======== + GFS2 is a cluster file system. It allows a cluster of computers to simultaneously use a block device that is shared between them (with FC, iSCSI, NBD, etc). GFS2 reads and writes to the block device like a local @@ -50,3 +53,12 @@ The following man pages are available from gfs2-utils: gfs2_convert to convert a gfs filesystem to GFS2 in-place mkfs.gfs2 to make a filesystem ============ ============================================= + +Implementation Notes +==================== + +.. toctree:: + :maxdepth: 1 + + glocks + uevents diff --git a/Documentation/filesystems/gfs2-uevents.rst b/Documentation/filesystems/gfs2/uevents.rst index f162a2c76c69..f162a2c76c69 100644 --- a/Documentation/filesystems/gfs2-uevents.rst +++ b/Documentation/filesystems/gfs2/uevents.rst diff --git a/Documentation/filesystems/index.rst b/Documentation/filesystems/index.rst index af516e528ded..f4873197587d 100644 --- a/Documentation/filesystems/index.rst +++ b/Documentation/filesystems/index.rst @@ -89,9 +89,7 @@ Documentation for filesystem implementations. ext3 ext4/index f2fs - gfs2 - gfs2-uevents - gfs2-glocks + gfs2/index hfs hfsplus hpfs diff --git a/Documentation/filesystems/iomap/operations.rst b/Documentation/filesystems/iomap/operations.rst index 387fd9cc72ca..da982ca7e413 100644 --- a/Documentation/filesystems/iomap/operations.rst +++ b/Documentation/filesystems/iomap/operations.rst @@ -135,6 +135,27 @@ These ``struct kiocb`` flags are significant for buffered I/O with iomap: * ``IOCB_DONTCACHE``: Turns on ``IOMAP_DONTCACHE``. +``struct iomap_read_ops`` +-------------------------- + +.. code-block:: c + + struct iomap_read_ops { + int (*read_folio_range)(const struct iomap_iter *iter, + struct iomap_read_folio_ctx *ctx, size_t len); + void (*submit_read)(struct iomap_read_folio_ctx *ctx); + }; + +iomap calls these functions: + + - ``read_folio_range``: Called to read in the range. This must be provided + by the caller. If this succeeds, iomap_finish_folio_read() must be called + after the range is read in, regardless of whether the read succeeded or + failed. + + - ``submit_read``: Submit any pending read requests. This function is + optional. + Internal per-Folio State ------------------------ @@ -182,6 +203,28 @@ The ``flags`` argument to ``->iomap_begin`` will be set to zero. The pagecache takes whatever locks it needs before calling the filesystem. +Both ``iomap_readahead`` and ``iomap_read_folio`` pass in a ``struct +iomap_read_folio_ctx``: + +.. code-block:: c + + struct iomap_read_folio_ctx { + const struct iomap_read_ops *ops; + struct folio *cur_folio; + struct readahead_control *rac; + void *read_ctx; + }; + +``iomap_readahead`` must set: + * ``ops->read_folio_range()`` and ``rac`` + +``iomap_read_folio`` must set: + * ``ops->read_folio_range()`` and ``cur_folio`` + +``ops->submit_read()`` and ``read_ctx`` are optional. ``read_ctx`` is used to +pass in any custom data the caller needs accessible in the ops callbacks for +fulfilling reads. + Buffered Writes --------------- @@ -317,6 +360,9 @@ The fields are as follows: delalloc reservations to avoid having delalloc reservations for clean pagecache. This function must be supplied by the filesystem. + If this succeeds, iomap_finish_folio_write() must be called once writeback + completes for the range, regardless of whether the writeback succeeded or + failed. - ``writeback_submit``: Submit the previous built writeback context. Block based file systems should use the iomap_ioend_writeback_submit @@ -444,10 +490,6 @@ These ``struct kiocb`` flags are significant for direct I/O with iomap: Only meaningful for asynchronous I/O, and only if the entire I/O can be issued as a single ``struct bio``. - * ``IOCB_DIO_CALLER_COMP``: Try to run I/O completion from the caller's - process context. - See ``linux/fs.h`` for more details. - Filesystems should call ``iomap_dio_rw`` from ``->read_iter`` and ``->write_iter``, and set ``FMODE_CAN_ODIRECT`` in the ``->open`` function for the file. diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst index 7233b04668fc..d33429294252 100644 --- a/Documentation/filesystems/porting.rst +++ b/Documentation/filesystems/porting.rst @@ -211,7 +211,7 @@ test and set for you. e.g.:: inode = iget_locked(sb, ino); - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { err = read_inode_from_disk(inode); if (err < 0) { iget_failed(inode); @@ -1309,3 +1309,16 @@ a different length, use vfs_parse_fs_qstr(fc, key, &QSTR_LEN(value, len)) instead. + +--- + +**mandatory** + +vfs_mkdir() now returns a dentry - the one returned by ->mkdir(). If +that dentry is different from the dentry passed in, including if it is +an IS_ERR() dentry pointer, the original dentry is dput(). + +When vfs_mkdir() returns an error, and so both dputs() the original +dentry and doesn't provide a replacement, it also unlocks the parent. +Consequently the return value from vfs_mkdir() can be passed to +end_creating() and the parent will be unlocked precisely when necessary. diff --git a/Documentation/filesystems/ramfs-rootfs-initramfs.rst b/Documentation/filesystems/ramfs-rootfs-initramfs.rst index fa4f81099cb4..a9d271e171c3 100644 --- a/Documentation/filesystems/ramfs-rootfs-initramfs.rst +++ b/Documentation/filesystems/ramfs-rootfs-initramfs.rst @@ -290,11 +290,11 @@ Why cpio rather than tar? This decision was made back in December, 2001. The discussion started here: - http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html +- https://lore.kernel.org/lkml/a03cke$640$1@cesium.transmeta.com/ And spawned a second thread (specifically on tar vs cpio), starting here: - http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html +- https://lore.kernel.org/lkml/3C25A06D.7030408@zytor.com/ The quick and dirty summary version (which is no substitute for reading the above threads) is: @@ -310,7 +310,7 @@ the above threads) is: either way about the archive format, and there are alternative tools, such as: - http://freecode.com/projects/afio + https://linux.die.net/man/1/afio 2) The cpio archive format chosen by the kernel is simpler and cleaner (and thus easier to create and parse) than any of the (literally dozens of) @@ -331,12 +331,12 @@ the above threads) is: 5) Al Viro made the decision (quote: "tar is ugly as hell and not going to be supported on the kernel side"): - http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html + - https://lore.kernel.org/lkml/Pine.GSO.4.21.0112222109050.21702-100000@weyl.math.psu.edu/ explained his reasoning: - - http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html - - http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html + - https://lore.kernel.org/lkml/Pine.GSO.4.21.0112222240530.21702-100000@weyl.math.psu.edu/ + - https://lore.kernel.org/lkml/Pine.GSO.4.21.0112230849550.23300-100000@weyl.math.psu.edu/ and, most importantly, designed and implemented the initramfs code. diff --git a/Documentation/filesystems/resctrl.rst b/Documentation/filesystems/resctrl.rst index b7f35b07876a..8c8ce678148a 100644 --- a/Documentation/filesystems/resctrl.rst +++ b/Documentation/filesystems/resctrl.rst @@ -17,17 +17,18 @@ AMD refers to this feature as AMD Platform Quality of Service(AMD QoS). This feature is enabled by the CONFIG_X86_CPU_RESCTRL and the x86 /proc/cpuinfo flag bits: -=============================================== ================================ -RDT (Resource Director Technology) Allocation "rdt_a" -CAT (Cache Allocation Technology) "cat_l3", "cat_l2" -CDP (Code and Data Prioritization) "cdp_l3", "cdp_l2" -CQM (Cache QoS Monitoring) "cqm_llc", "cqm_occup_llc" -MBM (Memory Bandwidth Monitoring) "cqm_mbm_total", "cqm_mbm_local" -MBA (Memory Bandwidth Allocation) "mba" -SMBA (Slow Memory Bandwidth Allocation) "" -BMEC (Bandwidth Monitoring Event Configuration) "" -ABMC (Assignable Bandwidth Monitoring Counters) "" -=============================================== ================================ +=============================================================== ================================ +RDT (Resource Director Technology) Allocation "rdt_a" +CAT (Cache Allocation Technology) "cat_l3", "cat_l2" +CDP (Code and Data Prioritization) "cdp_l3", "cdp_l2" +CQM (Cache QoS Monitoring) "cqm_llc", "cqm_occup_llc" +MBM (Memory Bandwidth Monitoring) "cqm_mbm_total", "cqm_mbm_local" +MBA (Memory Bandwidth Allocation) "mba" +SMBA (Slow Memory Bandwidth Allocation) "" +BMEC (Bandwidth Monitoring Event Configuration) "" +ABMC (Assignable Bandwidth Monitoring Counters) "" +SDCIAE (Smart Data Cache Injection Allocation Enforcement) "" +=============================================================== ================================ Historically, new features were made visible by default in /proc/cpuinfo. This resulted in the feature flags becoming hard to parse by humans. Adding a new @@ -72,6 +73,11 @@ The 'info' directory contains information about the enabled resources. Each resource has its own subdirectory. The subdirectory names reflect the resource names. +Most of the files in the resource's subdirectory are read-only, and +describe properties of the resource. Resources that support global +configuration options also include writable files that can be used +to modify those settings. + Each subdirectory contains the following files with respect to allocation: @@ -90,12 +96,19 @@ related to allocation: must be set when writing a mask. "shareable_bits": - Bitmask of shareable resource with other executing - entities (e.g. I/O). User can use this when - setting up exclusive cache partitions. Note that - some platforms support devices that have their - own settings for cache use which can over-ride - these bits. + Bitmask of shareable resource with other executing entities + (e.g. I/O). Applies to all instances of this resource. User + can use this when setting up exclusive cache partitions. + Note that some platforms support devices that have their + own settings for cache use which can over-ride these bits. + + When "io_alloc" is enabled, a portion of each cache instance can + be configured for shared use between hardware and software. + "bit_usage" should be used to see which portions of each cache + instance is configured for hardware use via "io_alloc" feature + because every cache instance can have its "io_alloc" bitmask + configured independently via "io_alloc_cbm". + "bit_usage": Annotated capacity bitmasks showing how all instances of the resource are used. The legend is: @@ -109,16 +122,16 @@ related to allocation: "H": Corresponding region is used by hardware only but available for software use. If a resource - has bits set in "shareable_bits" but not all - of these bits appear in the resource groups' - schematas then the bits appearing in - "shareable_bits" but no resource group will - be marked as "H". + has bits set in "shareable_bits" or "io_alloc_cbm" + but not all of these bits appear in the resource + groups' schemata then the bits appearing in + "shareable_bits" or "io_alloc_cbm" but no + resource group will be marked as "H". "X": Corresponding region is available for sharing and - used by hardware and software. These are the - bits that appear in "shareable_bits" as - well as a resource group's allocation. + used by hardware and software. These are the bits + that appear in "shareable_bits" or "io_alloc_cbm" + as well as a resource group's allocation. "S": Corresponding region is used by software and available for sharing. @@ -136,6 +149,77 @@ related to allocation: "1": Non-contiguous 1s value in CBM is supported. +"io_alloc": + "io_alloc" enables system software to configure the portion of + the cache allocated for I/O traffic. File may only exist if the + system supports this feature on some of its cache resources. + + "disabled": + Resource supports "io_alloc" but the feature is disabled. + Portions of cache used for allocation of I/O traffic cannot + be configured. + "enabled": + Portions of cache used for allocation of I/O traffic + can be configured using "io_alloc_cbm". + "not supported": + Support not available for this resource. + + The feature can be modified by writing to the interface, for example: + + To enable:: + + # echo 1 > /sys/fs/resctrl/info/L3/io_alloc + + To disable:: + + # echo 0 > /sys/fs/resctrl/info/L3/io_alloc + + The underlying implementation may reduce resources available to + general (CPU) cache allocation. See architecture specific notes + below. Depending on usage requirements the feature can be enabled + or disabled. + + On AMD systems, io_alloc feature is supported by the L3 Smart + Data Cache Injection Allocation Enforcement (SDCIAE). The CLOSID for + io_alloc is the highest CLOSID supported by the resource. When + io_alloc is enabled, the highest CLOSID is dedicated to io_alloc and + no longer available for general (CPU) cache allocation. When CDP is + enabled, io_alloc routes I/O traffic using the highest CLOSID allocated + for the instruction cache (CDP_CODE), making this CLOSID no longer + available for general (CPU) cache allocation for both the CDP_CODE + and CDP_DATA resources. + +"io_alloc_cbm": + Capacity bitmasks that describe the portions of cache instances to + which I/O traffic from supported I/O devices are routed when "io_alloc" + is enabled. + + CBMs are displayed in the following format: + + <cache_id0>=<cbm>;<cache_id1>=<cbm>;... + + Example:: + + # cat /sys/fs/resctrl/info/L3/io_alloc_cbm + 0=ffff;1=ffff + + CBMs can be configured by writing to the interface. + + Example:: + + # echo 1=ff > /sys/fs/resctrl/info/L3/io_alloc_cbm + # cat /sys/fs/resctrl/info/L3/io_alloc_cbm + 0=ffff;1=00ff + + # echo "0=ff;1=f" > /sys/fs/resctrl/info/L3/io_alloc_cbm + # cat /sys/fs/resctrl/info/L3/io_alloc_cbm + 0=00ff;1=000f + + When CDP is enabled "io_alloc_cbm" associated with the CDP_DATA and CDP_CODE + resources may reflect the same values. For example, values read from and + written to /sys/fs/resctrl/info/L3DATA/io_alloc_cbm may be reflected by + /sys/fs/resctrl/info/L3CODE/io_alloc_cbm and vice versa. + Memory bandwidth(MB) subdirectory contains the following files with respect to allocation: diff --git a/Documentation/filesystems/xfs/xfs-online-fsck-design.rst b/Documentation/filesystems/xfs/xfs-online-fsck-design.rst index 8cbcd3c26434..3d9233f403db 100644 --- a/Documentation/filesystems/xfs/xfs-online-fsck-design.rst +++ b/Documentation/filesystems/xfs/xfs-online-fsck-design.rst @@ -105,10 +105,8 @@ occur; this capability aids both strategies. TLDR; Show Me the Code! ----------------------- -Code is posted to the kernel.org git trees as follows: -`kernel changes <https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-symlink>`_, -`userspace changes <https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-media-scan-service>`_, and -`QA test changes <https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=repair-dirs>`_. +Kernel and userspace code has been fully merged as of October 2025. + Each kernel patchset adding an online repair function will use the same branch name across the kernel, xfsprogs, and fstests git repos. @@ -249,7 +247,7 @@ sharing and lock acquisition rules as the regular filesystem. This means that scrub cannot take *any* shortcuts to save time, because doing so could lead to concurrency problems. In other words, online fsck is not a complete replacement for offline fsck, and -a complete run of online fsck may take longer than online fsck. +a complete run of online fsck may take longer than offline fsck. However, both of these limitations are acceptable tradeoffs to satisfy the different motivations of online fsck, which are to **minimize system downtime** and to **increase predictability of operation**. @@ -764,12 +762,8 @@ allow the online fsck developers to compare online fsck against offline fsck, and they enable XFS developers to find deficiencies in the code base. Proposed patchsets include -`general fuzzer improvements -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=fuzzer-improvements>`_, `fuzzing baselines -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=fuzz-baseline>`_, -and `improvements in fuzz testing comprehensiveness -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=more-fuzz-testing>`_. +<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=fuzz-baseline>`_. Stress Testing -------------- @@ -801,11 +795,6 @@ Success is defined by the ability to run all of these tests without observing any unexpected filesystem shutdowns due to corrupted metadata, kernel hang check warnings, or any other sort of mischief. -Proposed patchsets include `general stress testing -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=race-scrub-and-mount-state-changes>`_ -and the `evolution of existing per-function stress testing -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfstests-dev.git/log/?h=refactor-scrub-stress>`_. - 4. User Interface ================= @@ -886,10 +875,6 @@ apply as nice of a priority to IO and CPU scheduling as possible. This measure was taken to minimize delays in the rest of the filesystem. No such hardening has been performed for the cron job. -Proposed patchset: -`Enabling the xfs_scrub background service -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-media-scan-service>`_. - Health Reporting ---------------- @@ -912,13 +897,6 @@ notifications and initiate a repair? *Answer*: These questions remain unanswered, but should be a part of the conversation with early adopters and potential downstream users of XFS. -Proposed patchsets include -`wiring up health reports to correction returns -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=corruption-health-reports>`_ -and -`preservation of sickness info during memory reclaim -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=indirect-health-reporting>`_. - 5. Kernel Algorithms and Data Structures ======================================== @@ -1310,21 +1288,6 @@ Space allocation records are cross-referenced as follows: are there the same number of reverse mapping records for each block as the reference count record claims? -Proposed patchsets are the series to find gaps in -`refcount btree -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-detect-refcount-gaps>`_, -`inode btree -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-detect-inobt-gaps>`_, and -`rmap btree -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-detect-rmapbt-gaps>`_ records; -to find -`mergeable records -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-detect-mergeable-records>`_; -and to -`improve cross referencing with rmap -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-strengthen-rmap-checking>`_ -before starting a repair. - Checking Extended Attributes ```````````````````````````` @@ -1756,10 +1719,6 @@ For scrub, the drain works as follows: To avoid polling in step 4, the drain provides a waitqueue for scrub threads to be woken up whenever the intent count drops to zero. -The proposed patchset is the -`scrub intent drain series -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-drain-intents>`_. - .. _jump_labels: Static Keys (aka Jump Label Patching) @@ -2036,10 +1995,6 @@ The ``xfarray_store_anywhere`` function is used to insert a record in any null record slot in the bag; and the ``xfarray_unset`` function removes a record from the bag. -The proposed patchset is the -`big in-memory array -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=big-array>`_. - Iterating Array Elements ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2172,10 +2127,6 @@ However, it should be noted that these repair functions only use blob storage to cache a small number of entries before adding them to a temporary ondisk file, which is why compaction is not required. -The proposed patchset is at the start of the -`extended attribute repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-xattrs>`_ series. - .. _xfbtree: In-Memory B+Trees @@ -2214,11 +2165,6 @@ xfiles enables reuse of the entire btree library. Btrees built atop an xfile are collectively known as ``xfbtrees``. The next few sections describe how they actually work. -The proposed patchset is the -`in-memory btree -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=in-memory-btrees>`_ -series. - Using xfiles as a Buffer Cache Target ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2459,14 +2405,6 @@ This enables the log to release the old EFI to keep the log moving forwards. EFIs have a role to play during the commit and reaping phases; please see the next section and the section about :ref:`reaping<reaping>` for more details. -Proposed patchsets are the -`bitmap rework -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-bitmap-rework>`_ -and the -`preparation for bulk loading btrees -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-prep-for-bulk-loading>`_. - - Writing the New Tree ```````````````````` @@ -2623,11 +2561,6 @@ The number of records for the inode btree is the number of xfarray records, but the record count for the free inode btree has to be computed as inode chunk records are stored in the xfarray. -The proposed patchset is the -`AG btree repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-ag-btrees>`_ -series. - Case Study: Rebuilding the Space Reference Counts ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2716,11 +2649,6 @@ Reverse mappings are added to the bag using ``xfarray_store_anywhere`` and removed via ``xfarray_unset``. Bag members are examined through ``xfarray_iter`` loops. -The proposed patchset is the -`AG btree repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-ag-btrees>`_ -series. - Case Study: Rebuilding File Fork Mapping Indices ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2757,11 +2685,6 @@ EXTENTS format instead of BMBT, which may require a conversion. Third, the incore extent map must be reloaded carefully to avoid disturbing any delayed allocation extents. -The proposed patchset is the -`file mapping repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-file-mappings>`_ -series. - .. _reaping: Reaping Old Metadata Blocks @@ -2843,11 +2766,6 @@ blocks. As stated earlier, online repair functions use very large transactions to minimize the chances of this occurring. -The proposed patchset is the -`preparation for bulk loading btrees -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-prep-for-bulk-loading>`_ -series. - Case Study: Reaping After a Regular Btree Repair ```````````````````````````````````````````````` @@ -2943,11 +2861,6 @@ When the walk is complete, the bitmap disunion operation ``(ag_owner_bitmap & btrees. These blocks can then be reaped using the methods outlined above. -The proposed patchset is the -`AG btree repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-ag-btrees>`_ -series. - .. _rmap_reap: Case Study: Reaping After Repairing Reverse Mapping Btrees @@ -2972,11 +2885,6 @@ methods outlined above. The rest of the process of rebuildng the reverse mapping btree is discussed in a separate :ref:`case study<rmap_repair>`. -The proposed patchset is the -`AG btree repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-ag-btrees>`_ -series. - Case Study: Rebuilding the AGFL ``````````````````````````````` @@ -3024,11 +2932,6 @@ more complicated, because computing the correct value requires traversing the forks, or if that fails, leaving the fields invalid and waiting for the fork fsck functions to run. -The proposed patchset is the -`inode -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-inodes>`_ -repair series. - Quota Record Repairs -------------------- @@ -3045,11 +2948,6 @@ checking are obviously bad limits and timer values. Quota usage counters are checked, repaired, and discussed separately in the section about :ref:`live quotacheck <quotacheck>`. -The proposed patchset is the -`quota -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-quota>`_ -repair series. - .. _fscounters: Freezing to Fix Summary Counters @@ -3145,11 +3043,6 @@ long enough to check and correct the summary counters. | This bug was fixed in Linux 5.17. | +--------------------------------------------------------------------------+ -The proposed patchset is the -`summary counter cleanup -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-fscounters>`_ -series. - Full Filesystem Scans --------------------- @@ -3277,15 +3170,6 @@ Second, if the incore inode is stuck in some intermediate state, the scan coordinator must release the AGI and push the main filesystem to get the inode back into a loadable state. -The proposed patches are the -`inode scanner -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-iscan>`_ -series. -The first user of the new functionality is the -`online quotacheck -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-quotacheck>`_ -series. - Inode Management ```````````````` @@ -3381,12 +3265,6 @@ To capture these nuances, the online fsck code has a separate ``xchk_irele`` function to set or clear the ``DONTCACHE`` flag to get the required release behavior. -Proposed patchsets include fixing -`scrub iget usage -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-iget-fixes>`_ and -`dir iget usage -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-dir-iget-fixes>`_. - .. _ilocking: Locking Inodes @@ -3443,11 +3321,6 @@ If the dotdot entry changes while the directory is unlocked, then a move or rename operation must have changed the child's parentage, and the scan can exit early. -The proposed patchset is the -`directory repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-dirs>`_ -series. - .. _fshooks: Filesystem Hooks @@ -3594,11 +3467,6 @@ The inode scan APIs are pretty simple: - ``xchk_iscan_teardown`` to finish the scan -This functionality is also a part of the -`inode scanner -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-iscan>`_ -series. - .. _quotacheck: Case Study: Quota Counter Checking @@ -3686,11 +3554,6 @@ needing to hold any locks for a long duration. If repairs are desired, the real and shadow dquots are locked and their resource counts are set to the values in the shadow dquot. -The proposed patchset is the -`online quotacheck -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-quotacheck>`_ -series. - .. _nlinks: Case Study: File Link Count Checking @@ -3744,11 +3607,6 @@ shadow information. If no parents are found, the file must be :ref:`reparented <orphanage>` to the orphanage to prevent the file from being lost forever. -The proposed patchset is the -`file link count repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-nlinks>`_ -series. - .. _rmap_repair: Case Study: Rebuilding Reverse Mapping Records @@ -3828,11 +3686,6 @@ scan for reverse mapping records. 12. Free the xfbtree now that it not needed. -The proposed patchset is the -`rmap repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-rmap-btree>`_ -series. - Staging Repairs with Temporary Files on Disk -------------------------------------------- @@ -3971,11 +3824,6 @@ Once a good copy of a data file has been constructed in a temporary file, it must be conveyed to the file being repaired, which is the topic of the next section. -The proposed patches are in the -`repair temporary files -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-tempfiles>`_ -series. - Logged File Content Exchanges ----------------------------- @@ -4025,11 +3873,6 @@ The new ``XFS_SB_FEAT_INCOMPAT_EXCHRANGE`` incompatible feature flag in the superblock protects these new log item records from being replayed on old kernels. -The proposed patchset is the -`file contents exchange -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=atomic-file-updates>`_ -series. - +--------------------------------------------------------------------------+ | **Sidebar: Using Log-Incompatible Feature Flags** | +--------------------------------------------------------------------------+ @@ -4323,11 +4166,6 @@ To repair the summary file, write the xfile contents into the temporary file and use atomic mapping exchange to commit the new contents. The temporary file is then reaped. -The proposed patchset is the -`realtime summary repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-rtsummary>`_ -series. - Case Study: Salvaging Extended Attributes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4369,11 +4207,6 @@ Salvaging extended attributes is done as follows: 4. Reap the temporary file. -The proposed patchset is the -`extended attribute repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-xattrs>`_ -series. - Fixing Directories ------------------ @@ -4448,11 +4281,6 @@ Unfortunately, the current dentry cache design doesn't provide a means to walk every child dentry of a specific directory, which makes this a hard problem. There is no known solution. -The proposed patchset is the -`directory repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-dirs>`_ -series. - Parent Pointers ``````````````` @@ -4612,11 +4440,6 @@ a :ref:`directory entry live update hook <liveupdate>` as follows: 7. Reap the temporary directory. -The proposed patchset is the -`parent pointers directory repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=pptrs-fsck>`_ -series. - Case Study: Repairing Parent Pointers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4662,11 +4485,6 @@ directory reconstruction: 8. Reap the temporary file. -The proposed patchset is the -`parent pointers repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=pptrs-fsck>`_ -series. - Digression: Offline Checking of Parent Pointers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -4755,11 +4573,6 @@ connectivity checks: 4. Move on to examining link counts, as we do today. -The proposed patchset is the -`offline parent pointers repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=pptrs-fsck>`_ -series. - Rebuilding directories from parent pointers in offline repair would be very challenging because xfs_repair currently uses two single-pass scans of the filesystem during phases 3 and 4 to decide which files are corrupt enough to be @@ -4903,12 +4716,6 @@ Repairing the directory tree works as follows: 6. If the subdirectory has zero paths, attach it to the lost and found. -The proposed patches are in the -`directory tree repair -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=scrub-directory-tree>`_ -series. - - .. _orphanage: The Orphanage @@ -4973,11 +4780,6 @@ Orphaned files are adopted by the orphanage as follows: 7. If a runtime error happens, call ``xrep_adoption_cancel`` to release all resources. -The proposed patches are in the -`orphanage adoption -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=repair-orphanage>`_ -series. - 6. Userspace Algorithms and Data Structures =========================================== @@ -5091,14 +4893,6 @@ first workqueue's workers until the backlog eases. This doesn't completely solve the balancing problem, but reduces it enough to move on to more pressing issues. -The proposed patchsets are the scrub -`performance tweaks -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-performance-tweaks>`_ -and the -`inode scan rebalance -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-iscan-rebalance>`_ -series. - .. _scrubrepair: Scheduling Repairs @@ -5179,20 +4973,6 @@ immediately. Corrupt file data blocks reported by phase 6 cannot be recovered by the filesystem. -The proposed patchsets are the -`repair warning improvements -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-better-repair-warnings>`_, -refactoring of the -`repair data dependency -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-repair-data-deps>`_ -and -`object tracking -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-object-tracking>`_, -and the -`repair scheduling -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=scrub-repair-scheduling>`_ -improvement series. - Checking Names for Confusable Unicode Sequences ----------------------------------------------- @@ -5372,6 +5152,8 @@ The extra flexibility enables several new use cases: This emulates an atomic device write in software, and can support arbitrary scattered writes. +(This functionality was merged into mainline as of 2025) + Vectorized Scrub ---------------- @@ -5393,13 +5175,7 @@ It is hoped that ``io_uring`` will pick up enough of this functionality that online fsck can use that instead of adding a separate vectored scrub system call to XFS. -The relevant patchsets are the -`kernel vectorized scrub -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=vectorized-scrub>`_ -and -`userspace vectorized scrub -<https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=vectorized-scrub>`_ -series. +(This functionality was merged into mainline as of 2025) Quality of Service Targets for Scrub ------------------------------------ diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.rst index 3388a10f2dcc..82826b0332df 100644 --- a/Documentation/kbuild/kbuild.rst +++ b/Documentation/kbuild/kbuild.rst @@ -328,8 +328,14 @@ KBUILD_BUILD_TIMESTAMP ---------------------- Setting this to a date string overrides the timestamp used in the UTS_VERSION definition (uname -v in the running kernel). The value has to -be a string that can be passed to date -d. The default value -is the output of the date command at one point during build. +be a string that can be passed to date -d. E.g.:: + + $ KBUILD_BUILD_TIMESTAMP="Mon Oct 13 00:00:00 UTC 2025" make + +The default value is the output of the date command at one point during +build. If provided, this timestamp will also be used for mtime fields +within any initramfs archive. Initramfs mtimes are 32-bit, so dates before +the 1970 Unix epoch, or after 2106-02-07 06:28:15 UTC will fail. KBUILD_BUILD_USER, KBUILD_BUILD_HOST ------------------------------------ diff --git a/Documentation/locking/seqlock.rst b/Documentation/locking/seqlock.rst index 3fb7ea3ab22a..9899871d3d9a 100644 --- a/Documentation/locking/seqlock.rst +++ b/Documentation/locking/seqlock.rst @@ -220,13 +220,14 @@ Read path, three categories: according to a passed marker. This is used to avoid lockless readers starvation (too much retry loops) in case of a sharp spike in write activity. First, a lockless read is tried (even marker passed). If - that trial fails (odd sequence counter is returned, which is used as - the next iteration marker), the lockless read is transformed to a - full locking read and no retry loop is necessary:: + that trial fails (sequence counter doesn't match), make the marker + odd for the next iteration, the lockless read is transformed to a + full locking read and no retry loop is necessary, for example:: /* marker; even initialization */ - int seq = 0; + int seq = 1; do { + seq++; /* 2 on the 1st/lockless path, otherwise odd */ read_seqbegin_or_lock(&foo_seqlock, &seq); /* ... [[read-side critical section]] ... */ diff --git a/Documentation/memory-barriers.txt b/Documentation/memory-barriers.txt index 1d164e005776..61b7317bcf2e 100644 --- a/Documentation/memory-barriers.txt +++ b/Documentation/memory-barriers.txt @@ -2182,9 +2182,11 @@ set_current_state() may be wrapped by: which therefore also imply a general memory barrier after setting the state. The whole sequence above is available in various canned forms, all of which -interpolate the memory barrier in the right place: +interpolate the memory barrier in the right place, for example: wait_event(); + wait_event_cmd(); + wait_event_exclusive_cmd(); wait_event_interruptible(); wait_event_interruptible_exclusive(); wait_event_interruptible_timeout(); @@ -2192,8 +2194,6 @@ interpolate the memory barrier in the right place: wait_event_timeout(); wait_on_bit(); wait_on_bit_lock(); - wait_event_cmd(); - wait_event_exclusive_cmd(); Secondly, code that performs a wake up normally follows something like this: diff --git a/Documentation/misc-devices/amd-sbi.rst b/Documentation/misc-devices/amd-sbi.rst index 5648fc6ec572..07ceb44fbe5e 100644 --- a/Documentation/misc-devices/amd-sbi.rst +++ b/Documentation/misc-devices/amd-sbi.rst @@ -28,8 +28,10 @@ MCAMSR and register xfer commands. Register sets is common across APML protocols. IOCTL is providing synchronization among protocols as transactions may create race condition. -$ ls -al /dev/sbrmi-3c -crw------- 1 root root 10, 53 Jul 10 11:13 /dev/sbrmi-3c +.. code-block:: bash + + $ ls -al /dev/sbrmi-3c + crw------- 1 root root 10, 53 Jul 10 11:13 /dev/sbrmi-3c apml_sbrmi driver registers hwmon sensors for monitoring power_cap_max, current power consumption and managing power_cap. diff --git a/Documentation/misc-devices/mrvl_cn10k_dpi.rst b/Documentation/misc-devices/mrvl_cn10k_dpi.rst index a75e372723d8..fa9b8cd6806f 100644 --- a/Documentation/misc-devices/mrvl_cn10k_dpi.rst +++ b/Documentation/misc-devices/mrvl_cn10k_dpi.rst @@ -33,12 +33,12 @@ drivers/misc/mrvl_cn10k_dpi.c Driver IOCTLs ============= -:c:macro::`DPI_MPS_MRRS_CFG` +:c:macro:`DPI_MPS_MRRS_CFG` ioctl that sets max payload size & max read request size parameters of a pem port to which DMA engines are wired. -:c:macro::`DPI_ENGINE_CFG` +:c:macro:`DPI_ENGINE_CFG` ioctl that sets DMA engine's fifo sizes & max outstanding load request thresholds. diff --git a/Documentation/misc-devices/tps6594-pfsm.rst b/Documentation/misc-devices/tps6594-pfsm.rst index 4ada37ccdcba..5f17a4fd9579 100644 --- a/Documentation/misc-devices/tps6594-pfsm.rst +++ b/Documentation/misc-devices/tps6594-pfsm.rst @@ -39,28 +39,28 @@ include/uapi/linux/tps6594_pfsm.h Driver IOCTLs ============= -:c:macro::`PMIC_GOTO_STANDBY` +:c:macro:`PMIC_GOTO_STANDBY` All device resources are powered down. The processor is off, and no voltage domains are energized. -:c:macro::`PMIC_GOTO_LP_STANDBY` +:c:macro:`PMIC_GOTO_LP_STANDBY` The digital and analog functions of the PMIC, which are not required to be always-on, are turned off (low-power). -:c:macro::`PMIC_UPDATE_PGM` +:c:macro:`PMIC_UPDATE_PGM` Triggers a firmware update. -:c:macro::`PMIC_SET_ACTIVE_STATE` +:c:macro:`PMIC_SET_ACTIVE_STATE` One of the operational modes. The PMICs are fully functional and supply power to all PDN loads. All voltage domains are energized in both MCU and Main processor sections. -:c:macro::`PMIC_SET_MCU_ONLY_STATE` +:c:macro:`PMIC_SET_MCU_ONLY_STATE` One of the operational modes. Only the power resources assigned to the MCU Safety Island are on. -:c:macro::`PMIC_SET_RETENTION_STATE` +:c:macro:`PMIC_SET_RETENTION_STATE` One of the operational modes. Depending on the triggers set, some DDR/GPIO voltage domains can remain energized, while all other domains are off to minimize diff --git a/Documentation/misc-devices/uacce.rst b/Documentation/misc-devices/uacce.rst index 1db412e9b1a3..5f78d413e379 100644 --- a/Documentation/misc-devices/uacce.rst +++ b/Documentation/misc-devices/uacce.rst @@ -1,7 +1,10 @@ .. SPDX-License-Identifier: GPL-2.0 -Introduction of Uacce ---------------------- +Uacce (Unified/User-space-access-intended Accelerator Framework) +================================================================ + +Introduction +------------ Uacce (Unified/User-space-access-intended Accelerator Framework) targets to provide Shared Virtual Addressing (SVA) between accelerators and processes. diff --git a/Documentation/mm/active_mm.rst b/Documentation/mm/active_mm.rst index d096fc091e23..60d819d7d043 100644 --- a/Documentation/mm/active_mm.rst +++ b/Documentation/mm/active_mm.rst @@ -92,4 +92,4 @@ helpers, which abstract this config option. and register state is separate, the alpha PALcode joins the two, and you need to switch both together). - (From http://marc.info/?l=linux-kernel&m=93337278602211&w=2) + (From https://lore.kernel.org/lkml/Pine.LNX.4.10.9907301410280.752-100000@penguin.transmeta.com/) diff --git a/Documentation/netlink/specs/em.yaml b/Documentation/netlink/specs/em.yaml new file mode 100644 index 000000000000..9905ca482325 --- /dev/null +++ b/Documentation/netlink/specs/em.yaml @@ -0,0 +1,113 @@ +# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) + +name: em + +doc: | + Energy model netlink interface to notify its changes. + +protocol: genetlink + +uapi-header: linux/energy_model.h + +attribute-sets: + - + name: pds + attributes: + - + name: pd + type: nest + nested-attributes: pd + multi-attr: true + - + name: pd + attributes: + - + name: pad + type: pad + - + name: pd-id + type: u32 + - + name: flags + type: u64 + - + name: cpus + type: string + - + name: pd-table + attributes: + - + name: pd-id + type: u32 + - + name: ps + type: nest + nested-attributes: ps + multi-attr: true + - + name: ps + attributes: + - + name: pad + type: pad + - + name: performance + type: u64 + - + name: frequency + type: u64 + - + name: power + type: u64 + - + name: cost + type: u64 + - + name: flags + type: u64 + +operations: + list: + - + name: get-pds + attribute-set: pds + doc: Get the list of information for all performance domains. + do: + reply: + attributes: + - pd + - + name: get-pd-table + attribute-set: pd-table + doc: Get the energy model table of a performance domain. + do: + request: + attributes: + - pd-id + reply: + attributes: + - pd-id + - ps + - + name: pd-created + doc: A performance domain is created. + notify: get-pd-table + mcgrp: event + - + name: pd-updated + doc: A performance domain is updated. + notify: get-pd-table + mcgrp: event + - + name: pd-deleted + doc: A performance domain is deleted. + attribute-set: pd-table + event: + attributes: + - pd-id + mcgrp: event + +mcast-groups: + list: + - + name: event diff --git a/Documentation/power/index.rst b/Documentation/power/index.rst index a0f5244fb427..ea70633d9ce6 100644 --- a/Documentation/power/index.rst +++ b/Documentation/power/index.rst @@ -19,6 +19,7 @@ Power Management power_supply_class runtime_pm s2ram + shutdown-debugging suspend-and-cpuhotplug suspend-and-interrupts swsusp-and-swap-files diff --git a/Documentation/power/pm_qos_interface.rst b/Documentation/power/pm_qos_interface.rst index 5019c79c7710..4c008e2202f0 100644 --- a/Documentation/power/pm_qos_interface.rst +++ b/Documentation/power/pm_qos_interface.rst @@ -55,7 +55,8 @@ int cpu_latency_qos_request_active(handle): From user space: -The infrastructure exposes one device node, /dev/cpu_dma_latency, for the CPU +The infrastructure exposes two separate device nodes, /dev/cpu_dma_latency for +the CPU latency QoS and /dev/cpu_wakeup_latency for the CPU system wakeup latency QoS. Only processes can register a PM QoS request. To provide for automatic @@ -63,15 +64,15 @@ cleanup of a process, the interface requires the process to register its parameter requests as follows. To register the default PM QoS target for the CPU latency QoS, the process must -open /dev/cpu_dma_latency. +open /dev/cpu_dma_latency. To register a CPU system wakeup QoS limit, the +process must open /dev/cpu_wakeup_latency. As long as the device node is held open that process has a registered request on the parameter. To change the requested target value, the process needs to write an s32 value to the open device node. Alternatively, it can write a hex string for the value -using the 10 char long format e.g. "0x12345678". This translates to a -cpu_latency_qos_update_request() call. +using the 10 char long format e.g. "0x12345678". To remove the user mode request for a target value simply close the device node. diff --git a/Documentation/power/runtime_pm.rst b/Documentation/power/runtime_pm.rst index c8dbdb8595e5..8246df3cecd7 100644 --- a/Documentation/power/runtime_pm.rst +++ b/Documentation/power/runtime_pm.rst @@ -480,16 +480,6 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: `bool pm_runtime_status_suspended(struct device *dev);` - return true if the device's runtime PM status is 'suspended' - `void pm_runtime_allow(struct device *dev);` - - set the power.runtime_auto flag for the device and decrease its usage - counter (used by the /sys/devices/.../power/control interface to - effectively allow the device to be power managed at run time) - - `void pm_runtime_forbid(struct device *dev);` - - unset the power.runtime_auto flag for the device and increase its usage - counter (used by the /sys/devices/.../power/control interface to - effectively prevent the device from being power managed at run time) - `void pm_runtime_no_callbacks(struct device *dev);` - set the power.no_callbacks flag for the device and remove the runtime PM attributes from /sys/devices/.../power (or prevent them from being diff --git a/Documentation/power/shutdown-debugging.rst b/Documentation/power/shutdown-debugging.rst new file mode 100644 index 000000000000..c510122e0bbc --- /dev/null +++ b/Documentation/power/shutdown-debugging.rst @@ -0,0 +1,53 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Debugging Kernel Shutdown Hangs with pstore ++++++++++++++++++++++++++++++++++++++++++++ + +Overview +======== +If the system hangs while shutting down, the kernel logs may need to be +retrieved to debug the issue. + +On systems that have a UART available, it is best to configure the kernel to use +this UART for kernel console output. + +If a UART isn't available, the ``pstore`` subsystem provides a mechanism to +persist this data across a system reset, allowing it to be retrieved on the next +boot. + +Kernel Configuration +==================== +To enable ``pstore`` and enable saving kernel ring buffer logs, set the +following kernel configuration options: + +* ``CONFIG_PSTORE=y`` +* ``CONFIG_PSTORE_CONSOLE=y`` + +Additionally, enable a backend to store the data. Depending upon your platform +some potential options include: + +* ``CONFIG_EFI_VARS_PSTORE=y`` +* ``CONFIG_PSTORE_RAM=y`` +* ``CONFIG_CHROMEOS_PSTORE=y`` +* ``CONFIG_PSTORE_BLK=y`` + +Kernel Command-line Parameters +============================== +Add these parameters to your kernel command line: + +* ``printk.always_kmsg_dump=Y`` + * Forces the kernel to dump the entire message buffer to pstore during + shutdown +* ``efi_pstore.pstore_disable=N`` + * For EFI-based systems, ensures the EFI backend is active + +Userspace Interaction and Log Retrieval +======================================= +On the next boot after a hang, pstore logs will be available in the pstore +filesystem (``/sys/fs/pstore``) and can be retrieved by userspace. + +On systemd systems, the ``systemd-pstore`` service will help do the following: + +#. Locate pstore data in ``/sys/fs/pstore`` +#. Read and save it to ``/var/lib/systemd/pstore`` +#. Clear pstore data for the next event diff --git a/Documentation/process/2.Process.rst b/Documentation/process/2.Process.rst index ef3b116492df..7bd41838a546 100644 --- a/Documentation/process/2.Process.rst +++ b/Documentation/process/2.Process.rst @@ -13,24 +13,19 @@ how the process works is required in order to be an effective part of it. The big picture --------------- -The kernel developers use a loosely time-based release process, with a new -major kernel release happening every two or three months. The recent -release history looks like this: - - ====== ================= - 5.0 March 3, 2019 - 5.1 May 5, 2019 - 5.2 July 7, 2019 - 5.3 September 15, 2019 - 5.4 November 24, 2019 - 5.5 January 6, 2020 - ====== ================= - -Every 5.x release is a major kernel release with new features, internal -API changes, and more. A typical release can contain about 13,000 -changesets with changes to several hundred thousand lines of code. 5.x is -the leading edge of Linux kernel development; the kernel uses a -rolling development model which is continually integrating major changes. +The Linux kernel uses a loosely time-based, rolling release development +model. A new major kernel release (which we will call, as an example, 9.x) +[1]_ happens every two or three months, which comes with new features, +internal API changes, and more. A typical release can contain about 13,000 +changesets with changes to several hundred thousand lines of code. Recent +releases, along with their dates, can be found at `Wikipedia +<https://en.wikipedia.org/wiki/Linux_kernel_version_history>`_. + +.. [1] Strictly speaking, the Linux kernel does not use semantic versioning + number scheme, but rather the 9.x pair identifies major release + version as a whole number. For each release, x is incremented, + but 9 is incremented only if x is deemed large enough (e.g. + Linux 5.0 is released following Linux 4.20). A relatively straightforward discipline is followed with regard to the merging of patches for each release. At the beginning of each development @@ -48,9 +43,9 @@ detail later on). The merge window lasts for approximately two weeks. At the end of this time, Linus Torvalds will declare that the window is closed and release the -first of the "rc" kernels. For the kernel which is destined to be 5.6, +first of the "rc" kernels. For the kernel which is destined to be 9.x, for example, the release which happens at the end of the merge window will -be called 5.6-rc1. The -rc1 release is the signal that the time to +be called 9.x-rc1. The -rc1 release is the signal that the time to merge new features has passed, and that the time to stabilize the next kernel has begun. @@ -99,13 +94,15 @@ release is made. In the real world, this kind of perfection is hard to achieve; there are just too many variables in a project of this size. There comes a point where delaying the final release just makes the problem worse; the pile of changes waiting for the next merge window will grow -larger, creating even more regressions the next time around. So most 5.x -kernels go out with a handful of known regressions though, hopefully, none -of them are serious. +larger, creating even more regressions the next time around. So most kernels +go out with a handful of known regressions, though, hopefully, none of them +are serious. Once a stable release is made, its ongoing maintenance is passed off to the -"stable team," currently Greg Kroah-Hartman. The stable team will release -occasional updates to the stable release using the 5.x.y numbering scheme. +"stable team," currently consists of Greg Kroah-Hartman and Sasha Levin. The +stable team will release occasional updates to the stable release using the +9.x.y numbering scheme. + To be considered for an update release, a patch must (1) fix a significant bug, and (2) already be merged into the mainline for the next development kernel. Kernels will typically receive stable updates for a little more diff --git a/Documentation/process/coding-style.rst b/Documentation/process/coding-style.rst index d1a8e5465ed9..2969ca378dbb 100644 --- a/Documentation/process/coding-style.rst +++ b/Documentation/process/coding-style.rst @@ -76,7 +76,7 @@ Don't use commas to avoid using braces: if (condition) do_this(), do_that(); -Always uses braces for multiple statements: +Always use braces for multiple statements: .. code-block:: c diff --git a/Documentation/process/submitting-patches.rst b/Documentation/process/submitting-patches.rst index 910e8fc9e3c8..9a509f1a6873 100644 --- a/Documentation/process/submitting-patches.rst +++ b/Documentation/process/submitting-patches.rst @@ -592,8 +592,9 @@ Both Tested-by and Reviewed-by tags, once received on mailing list from tester or reviewer, should be added by author to the applicable patches when sending next versions. However if the patch has changed substantially in following version, these tags might not be applicable anymore and thus should be removed. -Usually removal of someone's Tested-by or Reviewed-by tags should be mentioned -in the patch changelog (after the '---' separator). +Usually removal of someone's Acked-by, Tested-by or Reviewed-by tags should be +mentioned in the patch changelog with an explanation (after the '---' +separator). A Suggested-by: tag indicates that the patch idea is suggested by the person named and ensures credit to the person for the idea: if we diligently credit diff --git a/Documentation/rust/quick-start.rst b/Documentation/rust/quick-start.rst index 155f7107329a..152289f0bed2 100644 --- a/Documentation/rust/quick-start.rst +++ b/Documentation/rust/quick-start.rst @@ -39,8 +39,8 @@ of the box, e.g.:: Debian ****** -Debian Testing and Debian Unstable (Sid), outside of the freeze period, provide -recent Rust releases and thus they should generally work out of the box, e.g.:: +Debian 13 (Trixie), as well as Testing and Debian Unstable (Sid) provide recent +Rust releases and thus they should generally work out of the box, e.g.:: apt install rustc rust-src bindgen rustfmt rust-clippy diff --git a/Documentation/security/keys/trusted-encrypted.rst b/Documentation/security/keys/trusted-encrypted.rst index f4d7e162d5e4..eae6a36b1c9a 100644 --- a/Documentation/security/keys/trusted-encrypted.rst +++ b/Documentation/security/keys/trusted-encrypted.rst @@ -10,6 +10,37 @@ of a Trust Source for greater security, while Encrypted Keys can be used on any system. All user level blobs, are displayed and loaded in hex ASCII for convenience, and are integrity verified. +Trusted Keys as Protected key +============================= +It is the secure way of keeping the keys in the kernel key-ring as Trusted-Key, +such that: + +- Key-blob, an encrypted key-data, created to be stored, loaded and seen by + userspace. +- Key-data, the plain-key text in the system memory, to be used by + kernel space only. + +Though key-data is not accessible to the user-space in plain-text, but it is in +plain-text in system memory, when used in kernel space. Even though kernel-space +attracts small surface attack, but with compromised kernel or side-channel +attack accessing the system memory can lead to a chance of the key getting +compromised/leaked. + +In order to protect the key in kernel space, the concept of "protected-keys" is +introduced which will act as an added layer of protection. The key-data of the +protected keys is encrypted with Key-Encryption-Key(KEK), and decrypted inside +the trust source boundary. The plain-key text never available out-side in the +system memory. Thus, any crypto operation that is to be executed using the +protected key, can only be done by the trust source, which generated the +key blob. + +Hence, if the protected-key is leaked or compromised, it is of no use to the +hacker. + +Trusted keys as protected keys, with trust source having the capability of +generating: + +- Key-Blob, to be loaded, stored and seen by user-space. Trust Source ============ @@ -252,7 +283,7 @@ in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits). Trusted Keys usage: CAAM ------------------------ -Usage:: +Trusted Keys Usage:: keyctl add trusted name "new keylen" ring keyctl add trusted name "load hex_blob" ring @@ -262,6 +293,21 @@ Usage:: CAAM-specific format. The key length for new keys is always in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits). +Trusted Keys as Protected Keys Usage:: + + keyctl add trusted name "new keylen pk [options]" ring + keyctl add trusted name "load hex_blob [options]" ring + keyctl print keyid + + where, 'pk' is used to direct trust source to generate protected key. + + options: + key_enc_algo = For CAAM, supported enc algo are ECB(2), CCM(1). + +"keyctl print" returns an ASCII hex copy of the sealed key, which is in a +CAAM-specific format. The key length for new keys is always in bytes. +Trusted Keys can be 32 - 128 bytes (256 - 1024 bits). + Trusted Keys usage: DCP ----------------------- @@ -343,6 +389,46 @@ Load a trusted key from the saved blob:: f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b e4a8aea2b607ec96931e6f4d4fe563ba +Create and save a trusted key as protected key named "kmk" of length 32 bytes. + +:: + + $ keyctl add trusted kmk "new 32 pk key_enc_algo=1" @u + 440502848 + + $ keyctl show + Session Keyring + -3 --alswrv 500 500 keyring: _ses + 97833714 --alswrv 500 -1 \_ keyring: _uid.500 + 440502848 --alswrv 500 500 \_ trusted: kmk + + $ keyctl print 440502848 + 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 + 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b + 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 + a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec + d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d + dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 + f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b + e4a8aea2b607ec96931e6f4d4fe563ba + + $ keyctl pipe 440502848 > kmk.blob + +Load a trusted key from the saved blob:: + + $ keyctl add trusted kmk "load `cat kmk.blob` key_enc_algo=1" @u + 268728824 + + $ keyctl print 268728824 + 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 + 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b + 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 + a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec + d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d + dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 + f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b + e4a8aea2b607ec96931e6f4d4fe563ba + Reseal (TPM specific) a trusted key under new PCR values:: $ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`" diff --git a/Documentation/sphinx/kernel_abi.py b/Documentation/sphinx/kernel_abi.py index 4c4375201b9e..5667f207d175 100644 --- a/Documentation/sphinx/kernel_abi.py +++ b/Documentation/sphinx/kernel_abi.py @@ -14,7 +14,7 @@ :license: GPL Version 2, June 1991 see Linux/COPYING for details. The ``kernel-abi`` (:py:class:`KernelCmd`) directive calls the - scripts/get_abi.py script to parse the Kernel ABI files. + AbiParser class to parse the Kernel ABI files. Overview of directive's argument and options. @@ -43,9 +43,9 @@ from sphinx.util.docutils import switch_source_input from sphinx.util import logging srctree = os.path.abspath(os.environ["srctree"]) -sys.path.insert(0, os.path.join(srctree, "scripts/lib/abi")) +sys.path.insert(0, os.path.join(srctree, "tools/lib/python")) -from abi_parser import AbiParser +from abi.abi_parser import AbiParser __version__ = "1.0" diff --git a/Documentation/sphinx/kernel_feat.py b/Documentation/sphinx/kernel_feat.py index aaac76892ceb..bdc0fef5c87f 100644 --- a/Documentation/sphinx/kernel_feat.py +++ b/Documentation/sphinx/kernel_feat.py @@ -13,7 +13,7 @@ :license: GPL Version 2, June 1991 see Linux/COPYING for details. The ``kernel-feat`` (:py:class:`KernelFeat`) directive calls the - scripts/get_feat.pl script to parse the Kernel ABI files. + tools/docs/get_feat.pl script to parse the Kernel ABI files. Overview of directive's argument and options. @@ -34,7 +34,6 @@ import codecs import os import re -import subprocess import sys from docutils import nodes, statemachine @@ -42,6 +41,11 @@ from docutils.statemachine import ViewList from docutils.parsers.rst import directives, Directive from sphinx.util.docutils import switch_source_input +srctree = os.path.abspath(os.environ["srctree"]) +sys.path.insert(0, os.path.join(srctree, "tools/lib/python")) + +from feat.parse_features import ParseFeature # pylint: disable=C0413 + def ErrorString(exc): # Shamelessly stolen from docutils return f'{exc.__class__.__name}: {exc}' @@ -84,18 +88,16 @@ class KernelFeat(Directive): srctree = os.path.abspath(os.environ["srctree"]) - args = [ - os.path.join(srctree, 'scripts/get_feat.pl'), - 'rest', - '--enable-fname', - '--dir', - os.path.join(srctree, 'Documentation', self.arguments[0]), - ] + feature_dir = os.path.join(srctree, 'Documentation', self.arguments[0]) - if len(self.arguments) > 1: - args.extend(['--arch', self.arguments[1]]) + feat = ParseFeature(feature_dir, False, True) + feat.parse() - lines = subprocess.check_output(args, cwd=os.path.dirname(doc.current_source)).decode('utf-8') + if len(self.arguments) > 1: + arch = self.arguments[1] + lines = feat.output_arch_table(arch) + else: + lines = feat.output_matrix() line_regex = re.compile(r"^\.\. FILE (\S+)$") diff --git a/Documentation/sphinx/kernel_include.py b/Documentation/sphinx/kernel_include.py index f94412cd17c9..626762ff6af3 100755 --- a/Documentation/sphinx/kernel_include.py +++ b/Documentation/sphinx/kernel_include.py @@ -87,6 +87,8 @@ import os.path import re import sys +from difflib import get_close_matches + from docutils import io, nodes, statemachine from docutils.statemachine import ViewList from docutils.parsers.rst import Directive, directives @@ -95,15 +97,17 @@ from docutils.parsers.rst.directives.body import CodeBlock, NumberLines from sphinx.util import logging srctree = os.path.abspath(os.environ["srctree"]) -sys.path.insert(0, os.path.join(srctree, "tools/docs/lib")) +sys.path.insert(0, os.path.join(srctree, "tools/lib/python")) -from parse_data_structs import ParseDataStructs +from kdoc.parse_data_structs import ParseDataStructs __version__ = "1.0" logger = logging.getLogger(__name__) RE_DOMAIN_REF = re.compile(r'\\ :(ref|c:type|c:func):`([^<`]+)(?:<([^>]+)>)?`\\') RE_SIMPLE_REF = re.compile(r'`([^`]+)`') +RE_LINENO_REF = re.compile(r'^\s*-\s+LINENO_(\d+):\s+(.*)') +RE_SPLIT_DOMAIN = re.compile(r"(.*)\.(.*)") def ErrorString(exc): # Shamelessly stolen from docutils return f'{exc.__class__.__name}: {exc}' @@ -212,14 +216,16 @@ class KernelInclude(Directive): - a TOC table containing cross references. """ parser = ParseDataStructs() - parser.parse_file(path) if 'exception-file' in self.options: source_dir = os.path.dirname(os.path.abspath( self.state_machine.input_lines.source( self.lineno - self.state_machine.input_offset - 1))) exceptions_file = os.path.join(source_dir, self.options['exception-file']) - parser.process_exceptions(exceptions_file) + else: + exceptions_file = None + + parser.parse_file(path, exceptions_file) # Store references on a symbol dict to be used at check time if 'warn-broken' in self.options: @@ -242,23 +248,32 @@ class KernelInclude(Directive): # TOC output is a ReST file, not a literal. So, we can add line # numbers - rawtext = parser.gen_toc() + startline = self.options.get('start-line', None) + endline = self.options.get('end-line', None) - include_lines = statemachine.string2lines(rawtext, tab_width, - convert_whitespace=True) + relpath = os.path.relpath(path, srctree) - # Append line numbers data + result = ViewList() + for line in parser.gen_toc().split("\n"): + match = RE_LINENO_REF.match(line) + if not match: + result.append(line, path) + continue - startline = self.options.get('start-line', None) + ln, ref = match.groups() + ln = int(ln) - result = ViewList() - if startline and startline > 0: - offset = startline - 1 - else: - offset = 0 + # Filter line range if needed + if startline and (ln < startline): + continue + + if endline and (ln > endline): + continue - for ln, line in enumerate(include_lines, start=offset): - result.append(line, path, ln) + # Sphinx numerates starting with zero, but text editors + # and other tools start from one + realln = ln + 1 + result.append(f"- {ref}: {relpath}#{realln}", path, ln) self.state_machine.insert_input(result, path) @@ -388,6 +403,63 @@ class KernelInclude(Directive): # ============================================================================== reported = set() +DOMAIN_INFO = {} +all_refs = {} + +def fill_domain_info(env): + """ + Get supported reference types for each Sphinx domain and C namespaces + """ + if DOMAIN_INFO: + return + + for domain_name, domain_instance in env.domains.items(): + try: + object_types = list(domain_instance.object_types.keys()) + DOMAIN_INFO[domain_name] = object_types + except AttributeError: + # Ignore domains that we can't retrieve object types, if any + pass + + for domain in DOMAIN_INFO.keys(): + domain_obj = env.get_domain(domain) + for name, dispname, objtype, docname, anchor, priority in domain_obj.get_objects(): + ref_name = name.lower() + + if domain == "c": + if '.' in ref_name: + ref_name = ref_name.split(".")[-1] + + if not ref_name in all_refs: + all_refs[ref_name] = [] + + all_refs[ref_name].append(f"\t{domain}:{objtype}:`{name}` (from {docname})") + +def get_suggestions(app, env, node, + original_target, original_domain, original_reftype): + """Check if target exists in the other domain or with different reftypes.""" + original_target = original_target.lower() + + # Remove namespace if present + if original_domain == "c": + if '.' in original_target: + original_target = original_target.split(".")[-1] + + suggestions = [] + + # If name exists, propose exact name match on different domains + if original_target in all_refs: + return all_refs[original_target] + + # If not found, get a close match, using difflib. + # Such method is based on Ratcliff-Obershelp Algorithm, which seeks + # for a close match within a certain distance. We're using the defaults + # here, e.g. cutoff=0.6, proposing 3 alternatives + matches = get_close_matches(original_target, all_refs.keys()) + for match in matches: + suggestions += all_refs[match] + + return suggestions def check_missing_refs(app, env, node, contnode): """Check broken refs for the files it creates xrefs""" @@ -404,11 +476,13 @@ def check_missing_refs(app, env, node, contnode): if node.source not in xref_files: return None + fill_domain_info(env) + target = node.get('reftarget', '') domain = node.get('refdomain', 'std') reftype = node.get('reftype', '') - msg = f"can't link to: {domain}:{reftype}:: {target}" + msg = f"Invalid xref: {domain}:{reftype}:`{target}`" # Don't duplicate warnings data = (node.source, msg) @@ -416,6 +490,10 @@ def check_missing_refs(app, env, node, contnode): return None reported.add(data) + suggestions = get_suggestions(app, env, node, target, domain, reftype) + if suggestions: + msg += ". Possible alternatives:\n" + '\n'.join(suggestions) + logger.warning(msg, location=node, type='ref', subtype='missing') return None diff --git a/Documentation/sphinx/kerneldoc-preamble.sty b/Documentation/sphinx/kerneldoc-preamble.sty index 5d68395539fe..16d9ff46fdf6 100644 --- a/Documentation/sphinx/kerneldoc-preamble.sty +++ b/Documentation/sphinx/kerneldoc-preamble.sty @@ -220,7 +220,7 @@ If you want them, please install non-variable ``Noto Sans CJK'' font families along with the texlive-xecjk package by following instructions from - \sphinxcode{./scripts/sphinx-pre-install}. + \sphinxcode{./tools/docs/sphinx-pre-install}. Having optional non-variable ``Noto Serif CJK'' font families will improve the looks of those translations. \end{sphinxadmonition}} diff --git a/Documentation/sphinx/kerneldoc.py b/Documentation/sphinx/kerneldoc.py index 2586b4d4e494..d8cdf068ef35 100644 --- a/Documentation/sphinx/kerneldoc.py +++ b/Documentation/sphinx/kerneldoc.py @@ -42,10 +42,10 @@ from sphinx.util import logging from pprint import pformat srctree = os.path.abspath(os.environ["srctree"]) -sys.path.insert(0, os.path.join(srctree, "scripts/lib/kdoc")) +sys.path.insert(0, os.path.join(srctree, "tools/lib/python")) -from kdoc_files import KernelFiles -from kdoc_output import RestFormat +from kdoc.kdoc_files import KernelFiles +from kdoc.kdoc_output import RestFormat __version__ = '1.0' kfiles = None diff --git a/Documentation/sphinx/load_config.py b/Documentation/sphinx/load_config.py deleted file mode 100644 index 1afb0c97f06b..000000000000 --- a/Documentation/sphinx/load_config.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8; mode: python -*- -# SPDX-License-Identifier: GPL-2.0 -# pylint: disable=R0903, C0330, R0914, R0912, E0401 - -import os -import sys -from sphinx.util.osutil import fs_encoding - -# ------------------------------------------------------------------------------ -def loadConfig(namespace): -# ------------------------------------------------------------------------------ - - """Load an additional configuration file into *namespace*. - - The name of the configuration file is taken from the environment - ``SPHINX_CONF``. The external configuration file extends (or overwrites) the - configuration values from the origin ``conf.py``. With this you are able to - maintain *build themes*. """ - - config_file = os.environ.get("SPHINX_CONF", None) - if (config_file is not None - and os.path.normpath(namespace["__file__"]) != os.path.normpath(config_file) ): - config_file = os.path.abspath(config_file) - - # Let's avoid one conf.py file just due to latex_documents - start = config_file.find('Documentation/') - if start >= 0: - start = config_file.find('/', start + 1) - - end = config_file.rfind('/') - if start >= 0 and end > 0: - dir = config_file[start + 1:end] - - print("source directory: %s" % dir) - new_latex_docs = [] - latex_documents = namespace['latex_documents'] - - for l in latex_documents: - if l[0].find(dir + '/') == 0: - has = True - fn = l[0][len(dir) + 1:] - new_latex_docs.append((fn, l[1], l[2], l[3], l[4])) - break - - namespace['latex_documents'] = new_latex_docs - - # If there is an extra conf.py file, load it - if os.path.isfile(config_file): - sys.stdout.write("load additional sphinx-config: %s\n" % config_file) - config = namespace.copy() - config['__file__'] = config_file - with open(config_file, 'rb') as f: - code = compile(f.read(), fs_encoding, 'exec') - exec(code, config) - del config['__file__'] - namespace.update(config) - else: - config = namespace.copy() - config['tags'].add("subproject") - namespace.update(config) diff --git a/Documentation/sphinx/parallel-wrapper.sh b/Documentation/sphinx/parallel-wrapper.sh deleted file mode 100644 index e54c44ce117d..000000000000 --- a/Documentation/sphinx/parallel-wrapper.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0+ -# -# Figure out if we should follow a specific parallelism from the make -# environment (as exported by scripts/jobserver-exec), or fall back to -# the "auto" parallelism when "-jN" is not specified at the top-level -# "make" invocation. - -sphinx="$1" -shift || true - -parallel="$PARALLELISM" -if [ -z "$parallel" ] ; then - # If no parallelism is specified at the top-level make, then - # fall back to the expected "-jauto" mode that the "htmldocs" - # target has had. - auto=$(perl -e 'open IN,"'"$sphinx"' --version 2>&1 |"; - while (<IN>) { - if (m/([\d\.]+)/) { - print "auto" if ($1 >= "1.7") - } - } - close IN') - if [ -n "$auto" ] ; then - parallel="$auto" - fi -fi -# Only if some parallelism has been determined do we add the -jN option. -if [ -n "$parallel" ] ; then - parallel="-j$parallel" -fi - -exec "$sphinx" $parallel "$@" diff --git a/Documentation/tools/rtla/common_appendix.rst b/Documentation/tools/rtla/common_appendix.txt index 53cae7537537..53cae7537537 100644 --- a/Documentation/tools/rtla/common_appendix.rst +++ b/Documentation/tools/rtla/common_appendix.txt diff --git a/Documentation/tools/rtla/common_hist_options.rst b/Documentation/tools/rtla/common_hist_options.txt index df53ff835bfb..df53ff835bfb 100644 --- a/Documentation/tools/rtla/common_hist_options.rst +++ b/Documentation/tools/rtla/common_hist_options.txt diff --git a/Documentation/tools/rtla/common_options.rst b/Documentation/tools/rtla/common_options.txt index 77ef35d3f831..1c4f3e663cf5 100644 --- a/Documentation/tools/rtla/common_options.rst +++ b/Documentation/tools/rtla/common_options.txt @@ -1,11 +1,15 @@ **-c**, **--cpus** *cpu-list* - Set the osnoise tracer to run the sample threads in the cpu-list. + Set the |tool| tracer to run the sample threads in the cpu-list. + + By default, the |tool| tracer runs the sample threads on all CPUs. **-H**, **--house-keeping** *cpu-list* Run rtla control threads only on the given cpu-list. + If omitted, rtla will attempt to auto-migrate its main thread to any CPU that is not running any workload threads. + **-d**, **--duration** *time[s|m|h|d]* Set the duration of the session. @@ -35,17 +39,21 @@ **-P**, **--priority** *o:prio|r:prio|f:prio|d:runtime:period* - Set scheduling parameters to the osnoise tracer threads, the format to set the priority are: + Set scheduling parameters to the |tool| tracer threads, the format to set the priority are: - *o:prio* - use SCHED_OTHER with *prio*; - *r:prio* - use SCHED_RR with *prio*; - *f:prio* - use SCHED_FIFO with *prio*; - *d:runtime[us|ms|s]:period[us|ms|s]* - use SCHED_DEADLINE with *runtime* and *period* in nanoseconds. + If not set, tracer threads keep their default priority. For rtla user threads, it is set to SCHED_FIFO with priority 95. For kernel threads, see *osnoise* and *timerlat* tracer documentation for the running kernel version. + **-C**, **--cgroup**\[*=cgroup*] Set a *cgroup* to the tracer's threads. If the **-C** option is passed without arguments, the tracer's thread will inherit **rtla**'s *cgroup*. Otherwise, the threads will be placed on the *cgroup* passed to the option. + If not set, the behavior differs between workload types. User workloads created by rtla will inherit rtla's cgroup. Kernel workloads are assigned the root cgroup. + **--warm-up** *s* After starting the workload, let it run for *s* seconds before starting collecting the data, allowing the system to warm-up. Statistical data generated during warm-up is discarded. @@ -53,6 +61,8 @@ **--trace-buffer-size** *kB* Set the per-cpu trace buffer size in kB for the tracing output. + If not set, the default tracefs buffer size is used. + **--on-threshold** *action* Defines an action to be executed when tracing is stopped on a latency threshold @@ -67,7 +77,7 @@ - *trace[,file=<filename>]* Saves trace output, optionally taking a filename. Alternative to -t/--trace. - Note that nlike -t/--trace, specifying this multiple times will result in + Note that unlike -t/--trace, specifying this multiple times will result in the trace being saved multiple times. - *signal,num=<sig>,pid=<pid>* diff --git a/Documentation/tools/rtla/common_osnoise_description.rst b/Documentation/tools/rtla/common_osnoise_description.txt index d5d61615b967..d5d61615b967 100644 --- a/Documentation/tools/rtla/common_osnoise_description.rst +++ b/Documentation/tools/rtla/common_osnoise_description.txt diff --git a/Documentation/tools/rtla/common_osnoise_options.rst b/Documentation/tools/rtla/common_osnoise_options.txt index bd3c4f499193..bd3c4f499193 100644 --- a/Documentation/tools/rtla/common_osnoise_options.rst +++ b/Documentation/tools/rtla/common_osnoise_options.txt diff --git a/Documentation/tools/rtla/common_timerlat_aa.rst b/Documentation/tools/rtla/common_timerlat_aa.txt index 077029e6b289..077029e6b289 100644 --- a/Documentation/tools/rtla/common_timerlat_aa.rst +++ b/Documentation/tools/rtla/common_timerlat_aa.txt diff --git a/Documentation/tools/rtla/common_timerlat_description.rst b/Documentation/tools/rtla/common_timerlat_description.txt index 49fcae3ffdec..49fcae3ffdec 100644 --- a/Documentation/tools/rtla/common_timerlat_description.rst +++ b/Documentation/tools/rtla/common_timerlat_description.txt diff --git a/Documentation/tools/rtla/common_timerlat_options.rst b/Documentation/tools/rtla/common_timerlat_options.txt index 1f5d024b53aa..33070b264cae 100644 --- a/Documentation/tools/rtla/common_timerlat_options.rst +++ b/Documentation/tools/rtla/common_timerlat_options.txt @@ -13,7 +13,7 @@ Set the automatic trace mode. This mode sets some commonly used options while debugging the system. It is equivalent to use **-T** *us* **-s** *us* **-t**. By default, *timerlat* tracer uses FIFO:95 for *timerlat* threads, - thus equilavent to **-P** *f:95*. + thus equivalent to **-P** *f:95*. **-p**, **--period** *us* @@ -56,7 +56,7 @@ **-u**, **--user-threads** Set timerlat to run without a workload, and then dispatches user-space workloads - to wait on the timerlat_fd. Once the workload is awakes, it goes to sleep again + to wait on the timerlat_fd. Once the workload is awakened, it goes to sleep again adding so the measurement for the kernel-to-user and user-to-kernel to the tracer output. **--user-threads** will be used unless the user specify **-k**. diff --git a/Documentation/tools/rtla/common_top_options.rst b/Documentation/tools/rtla/common_top_options.txt index f48878938f84..f48878938f84 100644 --- a/Documentation/tools/rtla/common_top_options.rst +++ b/Documentation/tools/rtla/common_top_options.txt diff --git a/Documentation/tools/rtla/rtla-hwnoise.rst b/Documentation/tools/rtla/rtla-hwnoise.rst index 3a7163c02ac8..26512b15fe7b 100644 --- a/Documentation/tools/rtla/rtla-hwnoise.rst +++ b/Documentation/tools/rtla/rtla-hwnoise.rst @@ -29,11 +29,11 @@ collection of the tracer output. OPTIONS ======= -.. include:: common_osnoise_options.rst +.. include:: common_osnoise_options.txt -.. include:: common_top_options.rst +.. include:: common_top_options.txt -.. include:: common_options.rst +.. include:: common_options.txt EXAMPLE ======= @@ -106,4 +106,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-osnoise-hist.rst b/Documentation/tools/rtla/rtla-osnoise-hist.rst index 1fc60ef26106..007521c865d9 100644 --- a/Documentation/tools/rtla/rtla-osnoise-hist.rst +++ b/Documentation/tools/rtla/rtla-osnoise-hist.rst @@ -15,7 +15,7 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_osnoise_description.rst +.. include:: common_osnoise_description.txt The **rtla osnoise hist** tool collects all **osnoise:sample_threshold** occurrence in a histogram, displaying the results in a user-friendly way. @@ -24,11 +24,11 @@ collection of the tracer output. OPTIONS ======= -.. include:: common_osnoise_options.rst +.. include:: common_osnoise_options.txt -.. include:: common_hist_options.rst +.. include:: common_hist_options.txt -.. include:: common_options.rst +.. include:: common_options.txt EXAMPLE ======= @@ -65,4 +65,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-osnoise-top.rst b/Documentation/tools/rtla/rtla-osnoise-top.rst index b1cbd7bcd4ae..6ccadae38945 100644 --- a/Documentation/tools/rtla/rtla-osnoise-top.rst +++ b/Documentation/tools/rtla/rtla-osnoise-top.rst @@ -15,7 +15,7 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_osnoise_description.rst +.. include:: common_osnoise_description.txt **rtla osnoise top** collects the periodic summary from the *osnoise* tracer, including the counters of the occurrence of the interference source, @@ -26,11 +26,11 @@ collection of the tracer output. OPTIONS ======= -.. include:: common_osnoise_options.rst +.. include:: common_osnoise_options.txt -.. include:: common_top_options.rst +.. include:: common_top_options.txt -.. include:: common_options.rst +.. include:: common_options.txt EXAMPLE ======= @@ -60,4 +60,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-osnoise.rst b/Documentation/tools/rtla/rtla-osnoise.rst index c129b206ce34..540d2bf6c152 100644 --- a/Documentation/tools/rtla/rtla-osnoise.rst +++ b/Documentation/tools/rtla/rtla-osnoise.rst @@ -14,7 +14,7 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_osnoise_description.rst +.. include:: common_osnoise_description.txt The *osnoise* tracer outputs information in two ways. It periodically prints a summary of the noise of the operating system, including the counters of @@ -56,4 +56,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-timerlat-hist.rst b/Documentation/tools/rtla/rtla-timerlat-hist.rst index 4923a362129b..f56fe546411b 100644 --- a/Documentation/tools/rtla/rtla-timerlat-hist.rst +++ b/Documentation/tools/rtla/rtla-timerlat-hist.rst @@ -16,7 +16,7 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_timerlat_description.rst +.. include:: common_timerlat_description.txt The **rtla timerlat hist** displays a histogram of each tracer event occurrence. This tool uses the periodic information, and the @@ -25,13 +25,13 @@ occurrence. This tool uses the periodic information, and the OPTIONS ======= -.. include:: common_timerlat_options.rst +.. include:: common_timerlat_options.txt -.. include:: common_hist_options.rst +.. include:: common_hist_options.txt -.. include:: common_options.rst +.. include:: common_options.txt -.. include:: common_timerlat_aa.rst +.. include:: common_timerlat_aa.txt EXAMPLE ======= @@ -110,4 +110,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-timerlat-top.rst b/Documentation/tools/rtla/rtla-timerlat-top.rst index 50968cdd2095..72d85e36c193 100644 --- a/Documentation/tools/rtla/rtla-timerlat-top.rst +++ b/Documentation/tools/rtla/rtla-timerlat-top.rst @@ -16,23 +16,23 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_timerlat_description.rst +.. include:: common_timerlat_description.txt The **rtla timerlat top** displays a summary of the periodic output from the *timerlat* tracer. It also provides information for each operating system noise via the **osnoise:** tracepoints that can be -seem with the option **-T**. +seen with the option **-T**. OPTIONS ======= -.. include:: common_timerlat_options.rst +.. include:: common_timerlat_options.txt -.. include:: common_top_options.rst +.. include:: common_top_options.txt -.. include:: common_options.rst +.. include:: common_options.txt -.. include:: common_timerlat_aa.rst +.. include:: common_timerlat_aa.txt **--aa-only** *us* @@ -133,4 +133,4 @@ AUTHOR ------ Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla-timerlat.rst b/Documentation/tools/rtla/rtla-timerlat.rst index 20e2d259467f..ce9f57e038c3 100644 --- a/Documentation/tools/rtla/rtla-timerlat.rst +++ b/Documentation/tools/rtla/rtla-timerlat.rst @@ -14,7 +14,7 @@ SYNOPSIS DESCRIPTION =========== -.. include:: common_timerlat_description.rst +.. include:: common_timerlat_description.txt The **rtla timerlat top** mode displays a summary of the periodic output from the *timerlat* tracer. The **rtla timerlat hist** mode displays @@ -51,4 +51,4 @@ AUTHOR ====== Written by Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/tools/rtla/rtla.rst b/Documentation/tools/rtla/rtla.rst index fc0d233efcd5..2a5fb7004ad4 100644 --- a/Documentation/tools/rtla/rtla.rst +++ b/Documentation/tools/rtla/rtla.rst @@ -45,4 +45,4 @@ AUTHOR ====== Daniel Bristot de Oliveira <bristot@kernel.org> -.. include:: common_appendix.rst +.. include:: common_appendix.txt diff --git a/Documentation/trace/timerlat-tracer.rst b/Documentation/trace/timerlat-tracer.rst index 53a56823e903..68d429d454a5 100644 --- a/Documentation/trace/timerlat-tracer.rst +++ b/Documentation/trace/timerlat-tracer.rst @@ -43,12 +43,12 @@ It is possible to follow the trace by reading the trace file:: <...>-868 [001] .... 54.030347: #2 context thread timer_latency 4351 ns -The tracer creates a per-cpu kernel thread with real-time priority that -prints two lines at every activation. The first is the *timer latency* -observed at the *hardirq* context before the activation of the thread. -The second is the *timer latency* observed by the thread. The ACTIVATION -ID field serves to relate the *irq* execution to its respective *thread* -execution. +The tracer creates a per-cpu kernel thread with real-time priority +SCHED_FIFO:95 that prints two lines at every activation. The first is +the *timer latency* observed at the *hardirq* context before the activation +of the thread. The second is the *timer latency* observed by the thread. +The ACTIVATION ID field serves to relate the *irq* execution to its +respective *thread* execution. The *irq*/*thread* splitting is important to clarify in which context the unexpected high value is coming from. The *irq* context can be diff --git a/Documentation/translations/it_IT/doc-guide/parse-headers.rst b/Documentation/translations/it_IT/doc-guide/parse-headers.rst index 026a23e49767..b0caa40fe1e9 100644 --- a/Documentation/translations/it_IT/doc-guide/parse-headers.rst +++ b/Documentation/translations/it_IT/doc-guide/parse-headers.rst @@ -13,28 +13,28 @@ dello spazio utente ha ulteriori vantaggi: Sphinx genererà dei messaggi d'avviso se un simbolo non viene trovato nella documentazione. Questo permette di mantenere allineate la documentazione della uAPI (API spazio utente) con le modifiche del kernel. -Il programma :ref:`parse_headers.pl <it_parse_headers>` genera questi riferimenti. +Il programma :ref:`parse_headers.py <it_parse_headers>` genera questi riferimenti. Esso dev'essere invocato attraverso un Makefile, mentre si genera la documentazione. Per avere un esempio su come utilizzarlo all'interno del kernel consultate ``Documentation/userspace-api/media/Makefile``. .. _it_parse_headers: -parse_headers.pl +parse_headers.py ^^^^^^^^^^^^^^^^ NOME **** -parse_headers.pl - analizza i file C al fine di identificare funzioni, +parse_headers.py - analizza i file C al fine di identificare funzioni, strutture, enumerati e definizioni, e creare riferimenti per Sphinx SINTASSI ******** -\ **parse_headers.pl**\ [<options>] <C_FILE> <OUT_FILE> [<EXCEPTIONS_FILE>] +\ **parse_headers.py**\ [<options>] <C_FILE> <OUT_FILE> [<EXCEPTIONS_FILE>] Dove <options> può essere: --debug, --usage o --help. diff --git a/Documentation/translations/it_IT/doc-guide/sphinx.rst b/Documentation/translations/it_IT/doc-guide/sphinx.rst index 1f513bc33618..a5c5d935febf 100644 --- a/Documentation/translations/it_IT/doc-guide/sphinx.rst +++ b/Documentation/translations/it_IT/doc-guide/sphinx.rst @@ -109,7 +109,7 @@ Sphinx. Se lo script riesce a riconoscere la vostra distribuzione, allora sarà in grado di darvi dei suggerimenti su come procedere per completare l'installazione:: - $ ./scripts/sphinx-pre-install + $ ./tools/docs/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are available Warning: better to also install "texlive-luatex85". You should run: @@ -119,7 +119,7 @@ l'installazione:: . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/docs/sphinx-pre-install line 468. L'impostazione predefinita prevede il controllo dei requisiti per la generazione di documenti html e PDF, includendo anche il supporto per le immagini, le diff --git a/Documentation/translations/ja_JP/SubmittingPatches b/Documentation/translations/ja_JP/SubmittingPatches index 5334db471744..b950347b5993 100644 --- a/Documentation/translations/ja_JP/SubmittingPatches +++ b/Documentation/translations/ja_JP/SubmittingPatches @@ -132,6 +132,25 @@ http://savannah.nongnu.org/projects/quilt platform_set_drvdata(), but left the variable "dev" unused, delete it. +特定ã®ã‚³ãƒŸãƒƒãƒˆã§å°Žå…¥ã•れãŸä¸å…·åˆã‚’ä¿®æ£ã™ã‚‹å ´åˆï¼ˆä¾‹ãˆã° ``git bisect`` ã§åŽŸå› ã¨ãªã£ãŸ +コミットを特定ã—ãŸã¨ããªã©ï¼‰ã¯ã€ã‚³ãƒŸãƒƒãƒˆã® SHA-1 ã®å…ˆé 12æ–‡å—ã¨1行ã®è¦ç´„ã‚’æ·»ãˆãŸ +「Fixes:ã€ã‚¿ã‚°ã‚’付ã‘ã¦ãã ã•ã„。ã“ã®è¡Œã¯75æ–‡å—ã‚’è¶…ãˆã¦ã‚‚æ§‹ã„ã¾ã›ã‚“ãŒã€é€”ä¸ã§ +改行ã›ãšã€å¿…ãš1行ã§è¨˜è¿°ã—ã¦ãã ã•ã„。 +例: + Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed") + +以下㮠git ã®è¨å®šã‚’使ã†ã¨ã€git log ã‚„ git show ã§ä¸Šè¨˜å½¢å¼ã‚’出力ã™ã‚‹ãŸã‚ã® +専用ã®å‡ºåЛ形å¼ã‚’è¿½åŠ ã§ãã¾ã™:: + + [core] + abbrev = 12 + [pretty] + fixes = Fixes: %h (\"%s\") + +使用例:: + + $ git log -1 --pretty=fixes 54a4f0239f2e + Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed") 3) パッãƒã®åˆ†å‰² @@ -409,7 +428,7 @@ Acked-by: ãŒå¿…ãšã—もパッãƒå…¨ä½“ã®æ‰¿èªã‚’示ã—ã¦ã„ã‚‹ã‚ã‘ã§ã¯ã ã“ã®ã‚¿ã‚°ã¯ãƒ‘ッãƒã«é–¢å¿ƒãŒã‚ã‚‹ã¨æ€ã‚れる人é”ãŒãã®ãƒ‘ッãƒã®è°è«–ã«å«ã¾ã‚Œã¦ã„ãŸã“㨠を明文化ã—ã¾ã™ã€‚ -14) Reported-by:, Tested-by:, Reviewed-by: ãŠã‚ˆã³ Suggested-by: ã®åˆ©ç”¨ +14) Reported-by:, Tested-by:, Reviewed-by:, Suggested-by: ãŠã‚ˆã³ Fixes: ã®åˆ©ç”¨ ä»–ã®èª°ã‹ã«ã‚ˆã£ã¦å ±å‘Šã•れãŸå•題を修æ£ã™ã‚‹ãƒ‘ッãƒã§ã‚れã°ã€å•é¡Œå ±å‘Šè€…ã¨ã„ã†å¯„与を クレジットã™ã‚‹ãŸã‚ã«ã€Reported-by: ã‚¿ã‚°ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。 @@ -465,6 +484,13 @@ Suggested-by: ã‚¿ã‚°ã¯ã€ãƒ‘ッãƒã®ã‚¢ã‚¤ãƒ‡ã‚¢ãŒãã®äººã‹ã‚‰ã®ææ¡ˆã« クレジットã—ã¦ã„ã‘ã°ã€æœ›ã‚€ã‚‰ãã¯ãã®äººãŸã¡ãŒå°†æ¥åˆ¥ã®æ©Ÿä¼šã«å†åº¦åŠ›ã‚’è²¸ã™æ°—ã« ãªã£ã¦ãれるã‹ã‚‚ã—れã¾ã›ã‚“。 +Fixes: ã‚¿ã‚°ã¯ã€ãã®ãƒ‘ッãƒãŒä»¥å‰ã®ã‚³ãƒŸãƒƒãƒˆã«ã‚ã£ãŸå•題を修æ£ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚ +ã“れã¯ã€ãƒã‚°ãŒã©ã“ã§ç™ºç”Ÿã—ãŸã‹ã‚’特定ã—ã‚„ã™ãã—ã€ãƒã‚°ä¿®æ£ã®ãƒ¬ãƒ“ューã«å½¹ç«‹ã¡ã¾ã™ã€‚ +ã¾ãŸã€ã“ã®ã‚¿ã‚°ã¯stableカーãƒãƒ«ãƒãƒ¼ãƒ ãŒã€ã‚ãªãŸã®ä¿®æ£ã‚’ã©ã®stableカーãƒãƒ« +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«é©ç”¨ã™ã¹ãã‹åˆ¤æ–ã™ã‚‹æ‰‹åŠ©ã‘ã«ã‚‚ãªã‚Šã¾ã™ã€‚パッãƒã«ã‚ˆã£ã¦ä¿®æ£ã•れ㟠+ãƒã‚°ã‚’示ã™ã«ã¯ã€ã“ã®æ–¹æ³•ãŒæŽ¨å¥¨ã•れã¾ã™ã€‚å‰è¿°ã®ã€ã€Œ2) パッãƒã«å¯¾ã™ã‚‹èª¬æ˜Žã€ã® +セクションをå‚ç…§ã—ã¦ãã ã•ã„。 + 15) 標準的ãªãƒ‘ッãƒã®ãƒ•ォーマット 標準的ãªãƒ‘ッãƒã®ã‚µãƒ–ジェクトã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™ã€‚ diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst index 82e628b77efd..7c2ffe7e87c7 100644 --- a/Documentation/translations/zh_CN/admin-guide/README.rst +++ b/Documentation/translations/zh_CN/admin-guide/README.rst @@ -288,4 +288,4 @@ Documentation/translations/zh_CN/admin-guide/bug-hunting.rst 。 更多用GDBè°ƒè¯•å†…æ ¸çš„ä¿¡æ¯ï¼Œè¯·å‚阅: Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst -å’Œ Documentation/dev-tools/kgdb.rst 。 +å’Œ Documentation/process/debugging/kgdb.rst 。 diff --git a/Documentation/translations/zh_CN/block/blk-mq.rst b/Documentation/translations/zh_CN/block/blk-mq.rst new file mode 100644 index 000000000000..ccc08f76ff97 --- /dev/null +++ b/Documentation/translations/zh_CN/block/blk-mq.rst @@ -0,0 +1,130 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/block/blk-mq.rst + +:翻译: + + æŸ¯åæ° kezijie <kezijie@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +================================================ +多队列å—设备 I/O 排队机制 (blk-mq) +================================================ + +多队列å—设备 I/O 排队机制æä¾›äº†ä¸€ç»„ API,使高速å˜å‚¨è®¾å¤‡èƒ½å¤ŸåŒæ—¶åœ¨å¤šä¸ªé˜Ÿåˆ—ä¸ +处ç†å¹¶å‘çš„ I/O 请求并将其æäº¤åˆ°å—设备,从而实现æžé«˜çš„æ¯ç§’è¾“å…¥/输出æ“作次数 +(IOPS)ï¼Œå……åˆ†å‘æŒ¥çް代å˜å‚¨è®¾å¤‡çš„并行能力。 + +ä»‹ç» +==== + +背景 +---- + +ç£ç›˜ä»Ž Linux å†…æ ¸å¼€å‘åˆæœŸå°±å·²æˆä¸ºäº‹å®žä¸Šçš„æ ‡å‡†ã€‚å— I/O åç³»ç»Ÿçš„ç›®æ ‡æ˜¯å°½å¯èƒ½ +为æ¤ç±»è®¾å¤‡æä¾›æœ€ä½³æ€§èƒ½ï¼Œå› ä¸ºå®ƒä»¬åœ¨è¿›è¡Œéšæœºè®¿é—®æ—¶ä»£ä»·æžé«˜ï¼Œæ€§èƒ½ç“¶é¢ˆä¸»è¦åœ¨æœºæ¢° +è¿åŠ¨éƒ¨ä»¶ä¸Šï¼Œå…¶é€Ÿåº¦è¿œä½ŽäºŽå˜å‚¨æ ˆä¸å…¶ä»–任何层。其ä¸ä¸€ä¸ªè½¯ä»¶ä¼˜åŒ–ä¾‹åæ˜¯æ ¹æ®ç¡¬ç›˜ç£ +头当å‰çš„ä½ç½®é‡æ–°æŽ’åºè¯»/写请求。 + +然而,éšç€å›ºæ€ç¡¬ç›˜å’Œéžæ˜“失性å˜å‚¨çš„å‘展,它们没有机械部件,也ä¸å˜åœ¨éšæœºè®¿é—®ä»£ +ç ,并能够进行高速并行访问,å˜å‚¨æ ˆçš„瓶颈从å˜å‚¨è®¾å¤‡è½¬ç§»åˆ°äº†æ“作系统。为了充分 +利用这些设备设计ä¸çš„并行性,引入了多队列机制。 + +原æ¥çš„è®¾è®¡åªæœ‰ä¸€ä¸ªé˜Ÿåˆ—æ¥å˜å‚¨å—设备 I/O 请求,并且åªä½¿ç”¨ä¸€ä¸ªé”。由于缓å˜ä¸çš„ +è„æ•°æ®å’Œå¤šå¤„ç†å™¨å…±äº«å•é”的瓶颈,这ç§è®¾è®¡åœ¨ SMP ç³»ç»Ÿä¸æ‰©å±•性ä¸ä½³ã€‚当ä¸åŒè¿›ç¨‹ +(或åŒä¸€è¿›ç¨‹åœ¨ä¸åŒ CPU ä¸Šï¼‰åŒæ—¶æ‰§è¡Œå—设备 I/O 时,该å•é˜Ÿåˆ—æ¨¡åž‹è¿˜ä¼šå‡ºçŽ°ä¸¥é‡ +的拥塞问题。为了解决这些问题,blk-mq API 引入了多个队列,æ¯ä¸ªé˜Ÿåˆ—在本地 CPU +上拥有独立的入å£ç‚¹ï¼Œä»Žè€Œæ¶ˆé™¤äº†å¯¹å…¨å±€é”的需求。关于其具体工作机制的更深入说明, +请å‚è§ä¸‹ä¸€èŠ‚ï¼ˆ `工作原ç†`_ )。 + +å·¥ä½œåŽŸç† +-------- + +当用户空间执行对å—设备的 I/O(例如读写文件)时,blk-mq 便会介入:它将å˜å‚¨å’Œ +管ç†å‘é€åˆ°å—设备的 I/O 请求,充当用户空间(文件系统,如果å˜åœ¨çš„è¯ï¼‰ä¸Žå—设备驱 +动之间的ä¸é—´å±‚。 + +blk-mq 由两组队列组æˆï¼šè½¯ä»¶æš‚å˜é˜Ÿåˆ—和硬件派å‘队列。当请求到达å—å±‚æ—¶ï¼Œå®ƒä¼šå° +试最çŸè·¯å¾„:直接å‘é€åˆ°ç¡¬ä»¶é˜Ÿåˆ—ã€‚ç„¶è€Œï¼Œæœ‰ä¸¤ç§æƒ…况下å¯èƒ½ä¸ä¼šè¿™æ ·åšï¼šå¦‚果该层有 +IO 调度器或者是希望åˆå¹¶è¯·æ±‚ã€‚åœ¨è¿™ä¸¤ç§æƒ…况下,请求将被å‘é€åˆ°è½¯ä»¶é˜Ÿåˆ—。 + +éšåŽï¼Œåœ¨è½¯ä»¶é˜Ÿåˆ—ä¸çš„请求被处ç†åŽï¼Œè¯·æ±‚会被放置到硬件队列。硬件队列是第二阶段 +的队列,硬件å¯ä»¥ç›´æŽ¥è®¿é—®å¹¶å¤„ç†è¿™äº›è¯·æ±‚ã€‚ç„¶è€Œï¼Œå¦‚æžœç¡¬ä»¶æ²¡æœ‰è¶³å¤Ÿçš„èµ„æºæ¥æŽ¥å—æ›´ +多请求,blk-mq 会将请求放置在临时队列ä¸ï¼Œå¾…硬件资æºå……足时å†å‘é€ã€‚ + +软件暂å˜é˜Ÿåˆ— +~~~~~~~~~~~~ + +在这些请求未直接å‘é€åˆ°é©±åŠ¨æ—¶ï¼Œå—设备 I/O åç³»ç»Ÿä¼šå°†è¯·æ±‚æ·»åŠ åˆ°è½¯ä»¶æš‚å˜é˜Ÿåˆ—ä¸ +(由 struct blk_mq_ctx 表示)。一个请求å¯èƒ½åŒ…å«ä¸€ä¸ªæˆ–多个 BIO。它们通过 struct bio +æ•°æ®ç»“构到达å—层。å—层éšåŽä¼šåŸºäºŽè¿™äº› BIO 构建新的结构体 struct request,用于 +与设备驱动通信。æ¯ä¸ªé˜Ÿåˆ—都有自己的é”,队列数é‡ç”±æ¯ä¸ª CPU å’Œæ¯ä¸ª node 为基础 +æ¥å†³å®šã€‚ + +æš‚å˜é˜Ÿåˆ—å¯ç”¨äºŽåˆå¹¶ç›¸é‚»æ‰‡åŒºçš„请求。例如,对扇区3-6ã€6-7ã€7-9的请求å¯ä»¥åˆå¹¶ +为对扇区3-9的一个请求。å³ä¾¿ SSD 或 NVM çš„éšæœºè®¿é—®å’Œé¡ºåºè®¿é—®å“应时间相åŒï¼Œ +åˆå¹¶é¡ºåºè®¿é—®çš„请求ä»å¯å‡å°‘å•独请求的数é‡ã€‚è¿™ç§åˆå¹¶è¯·æ±‚的技术称为 plugging。 + +æ¤å¤–,I/O 调度器还å¯ä»¥å¯¹è¯·æ±‚è¿›è¡Œé‡æ–°æŽ’åºä»¥ç¡®ä¿ç³»ç»Ÿèµ„æºçš„å…¬å¹³æ€§ï¼ˆä¾‹å¦‚é˜²æ¢æŸ +个应用出现“饥饿â€çŽ°è±¡ï¼‰æˆ–æ˜¯æé«˜ I/O 性能。 + +I/O 调度器 +^^^^^^^^^^ + +å—层实现了多ç§è°ƒåº¦å™¨ï¼Œæ¯ç§è°ƒåº¦å™¨éƒ½éµå¾ªä¸€å®šå¯å‘å¼è§„则以æé«˜ I/O 性能。它们是 +â€œå¯æ’æ‹”â€çš„(plug and play),å¯åœ¨è¿è¡Œæ—¶é€šè¿‡ sysfs é€‰æ‹©ã€‚ä½ å¯ä»¥åœ¨è¿™é‡Œé˜…读更 +多关于 Linux IO 调度器知识 `here +<https://www.kernel.org/doc/html/latest/block/index.html>`_。调度åªå‘ +生在åŒä¸€é˜Ÿåˆ—å†…çš„è¯·æ±‚ä¹‹é—´ï¼Œå› æ¤æ— 法åˆå¹¶ä¸åŒé˜Ÿåˆ—的请求,å¦åˆ™ä¼šé€ æˆç¼“å˜å†²çªå¹¶éœ€ +è¦ä¸ºæ¯ä¸ªé˜Ÿåˆ—åŠ é”。调度åŽï¼Œè¯·æ±‚å³å¯å‘é€åˆ°ç¡¬ä»¶ã€‚å¯èƒ½é€‰æ‹©çš„调度器之一是 NONE è°ƒ +度器,这是最直接的调度器:它åªå°†è¯·æ±‚放到进程所在的软件队列,ä¸è¿›è¡Œé‡æ–°æŽ’åºã€‚ +当设备开始处ç†ç¡¬ä»¶é˜Ÿåˆ—ä¸çš„请求时(è¿è¡Œç¡¬ä»¶é˜Ÿåˆ—ï¼‰ï¼Œæ˜ å°„åˆ°è¯¥ç¡¬ä»¶é˜Ÿåˆ—çš„è½¯ä»¶é˜Ÿåˆ— +ä¼šæŒ‰æ˜ å°„é¡ºåºä¾æ¬¡æ¸…空。 + +硬件派å‘队列 +~~~~~~~~~~~~~ + +硬件队列(由 struct blk_mq_hw_ctx è¡¨ç¤ºï¼‰æ˜¯è®¾å¤‡é©±åŠ¨ç”¨æ¥æ˜ 射设备æäº¤é˜Ÿåˆ— +(或设备 DMA 环缓å˜ï¼‰çš„结构体,它是å—层æäº¤è·¯å¾„在底层设备驱动接管请求之å‰çš„ +最åŽä¸€ä¸ªé˜¶æ®µã€‚è¿è¡Œæ¤é˜Ÿåˆ—时,å—层会从相关软件队列ä¸å–出请求,并å°è¯•æ´¾å‘到硬件。 + +å¦‚æžœè¯·æ±‚æ— æ³•ç›´æŽ¥å‘é€åˆ°ç¡¬ä»¶ï¼Œå®ƒä»¬ä¼šè¢«åŠ å…¥åˆ°è¯·æ±‚çš„é“¾è¡¨(``hctx->dispatch``) ä¸ã€‚ +éšåŽï¼Œå½“å—层下次è¿è¡Œè¯¥é˜Ÿåˆ—时,会优先å‘é€ä½äºŽ ``dispatch`` 链表ä¸çš„请求, +以确ä¿é‚£äº›æœ€æ—©å‡†å¤‡å¥½å‘é€çš„请求能够得到公平调度。硬件队列的数é‡å–å†³äºŽç¡¬ä»¶åŠ +其设备驱动所支æŒçš„硬件上下文数,但ä¸ä¼šè¶…过系统的CPUæ ¸å¿ƒæ•°ã€‚åœ¨è¿™ä¸ªé˜¶æ®µä¸ +会å‘ç”Ÿé‡æ–°æŽ’åºï¼Œæ¯ä¸ªè½¯ä»¶é˜Ÿåˆ—都有一组硬件队列æ¥ç”¨äºŽæäº¤è¯·æ±‚。 + +.. note:: + + å—层和设备å议都ä¸ä¿è¯è¯·æ±‚完æˆé¡ºåºã€‚æ¤é—®é¢˜éœ€ç”±æ›´é«˜å±‚处ç†ï¼Œä¾‹å¦‚文件系统。 + +åŸºäºŽæ ‡è¯†çš„å®Œæˆæœºåˆ¶ +~~~~~~~~~~~~~~~~~~~ + +为了指示哪一个请求已ç»å®Œæˆï¼Œæ¯ä¸ªè¯·æ±‚都会被分é…ä¸€ä¸ªæ•´æ•°æ ‡è¯†ï¼Œè¯¥æ ‡è¯†çš„å–值范围 +是从0到分å‘队列的大å°ã€‚è¿™ä¸ªæ ‡è¯†ç”±å—层生æˆï¼Œå¹¶åœ¨ä¹‹åŽç”±è®¾å¤‡é©±åŠ¨ä½¿ç”¨ï¼Œä»Žè€Œé¿ +å…了为æ¯ä¸ªè¯·æ±‚å†å•ç‹¬åˆ›å»ºå†—ä½™çš„æ ‡è¯†ç¬¦ã€‚å½“è¯·æ±‚åœ¨é©±åŠ¨ä¸å®Œæˆæ—¶ï¼Œé©±åŠ¨ä¼šå°†è¯¥æ ‡è¯†è¿” +回给å—层,以通知该请求已完æˆã€‚è¿™æ ·ï¼Œå—å±‚å°±æ— éœ€å†è¿›è¡Œçº¿æ€§æœç´¢æ¥ç¡®å®šæ˜¯å“ªä¸€ä¸ª +I/O 请求完æˆäº†ã€‚ + +更多阅读 +-------- + +- `Linux å— I/O:多队列 SSD å¹¶å‘访问简介 <http://kernel.dk/blk-mq.pdf>`_ + +- `NOOP 调度器 <https://en.wikipedia.org/wiki/Noop_scheduler>`_ + +- `Null å—è®¾å¤‡é©±åŠ¨ç¨‹åº <https://www.kernel.org/doc/html/latest/block/null_blk.html>`_ + +æºä»£ç +====== + +该APIåœ¨ä»¥ä¸‹å†…æ ¸ä»£ç ä¸: + +include/linux/blk-mq.h + +block/blk-mq.c
\ No newline at end of file diff --git a/Documentation/translations/zh_CN/block/data-integrity.rst b/Documentation/translations/zh_CN/block/data-integrity.rst new file mode 100644 index 000000000000..b31aa9ef8954 --- /dev/null +++ b/Documentation/translations/zh_CN/block/data-integrity.rst @@ -0,0 +1,192 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/block/data-integrity.rst + +:翻译: + + æŸ¯åæ° kezijie <kezijie@leap-io-kernel.com> + +:æ ¡è¯‘: + +========== +æ•°æ®å®Œæ•´æ€§ +========== + +1. 引言 +======= + +现代文件系统对数æ®å’Œå…ƒæ•°æ®éƒ½è¿›è¡Œäº†æ ¡éªŒå’Œä¿æŠ¤ä»¥é˜²æ¢æ•°æ®æŸåã€‚ç„¶è€Œï¼Œè¿™ç§æŸåçš„ +æ£€æµ‹æ˜¯åœ¨è¯»å–æ—¶æ‰è¿›è¡Œï¼Œè¿™å¯èƒ½å‘生在数æ®å†™å…¥æ•°æœˆä¹‹åŽã€‚到那时,应用程åºå°è¯•写入 +的原始数æ®å¾ˆå¯èƒ½å·²ç»ä¸¢å¤±ã€‚ + +解决方案是确ä¿ç£ç›˜å®žé™…å˜å‚¨çš„å†…å®¹å°±æ˜¯åº”ç”¨ç¨‹åºæƒ³å˜å‚¨çš„。SCSI åè®®æ—(如 SBC +æ•°æ®å®Œæ•´æ€§å—段ã€SCC ä¿æŠ¤ææ¡ˆï¼‰ä»¥åŠ SATA/T13ï¼ˆå¤–éƒ¨è·¯å¾„ä¿æŠ¤ï¼‰æœ€è¿‘æ–°å¢žçš„åŠŸèƒ½ï¼Œ +通过在 I/O ä¸é™„åŠ å®Œæ•´æ€§å…ƒæ•°æ®çš„æ–¹å¼ï¼Œè¯•图解决这一问题。完整性元数æ®ï¼ˆåœ¨ +SCSI 术è¯ä¸ç§°ä¸ºä¿æŠ¤ä¿¡æ¯ï¼‰åŒ…括æ¯ä¸ªæ‰‡åŒºçš„æ ¡éªŒå’Œï¼Œä»¥åŠä¸€ä¸ªé€’å¢žè®¡æ•°å™¨ï¼Œç”¨äºŽç¡®ä¿ +儿‰‡åŒºæŒ‰æ£ç¡®é¡ºåºè¢«å†™å…¥ç›˜ã€‚在æŸäº›ä¿æŠ¤æ–¹æ¡ˆä¸ï¼Œè¿˜èƒ½ä¿è¯ I/O 写入ç£ç›˜çš„æ£ç¡®ä½ç½®ã€‚ + +当å‰çš„å˜å‚¨æŽ§åˆ¶å™¨å’Œè®¾å¤‡å®žçŽ°äº†å¤šç§ä¿æŠ¤æŽªæ–½ï¼Œä¾‹å¦‚æ ¡éªŒå’Œå’Œæ•°æ®æ¸…ç†ã€‚但这些技术通 +常åªåœ¨å„自的独立域内工作,或最多仅在 I/O è·¯å¾„çš„ç›¸é‚»èŠ‚ç‚¹ä¹‹é—´å‘æŒ¥ä½œç”¨ã€‚DIF åŠ +其它数æ®å®Œæ•´æ€§æ‹“å±•æœ‰æ„æ€çš„ç‚¹åœ¨äºŽä¿æŠ¤æ ¼å¼å®šä¹‰æ˜Žç¡®ï¼ŒI/O 路径上的æ¯ä¸ªèŠ‚ç‚¹éƒ½å¯ä»¥ +éªŒè¯ I/O 的完整性,如检测到æŸåå¯ç›´æŽ¥æ‹’ç»ã€‚è¿™ä¸ä»…å¯ä»¥é˜²æ¢æ•°æ®æŸå,还能够隔 +离故障点。 + +2. æ•°æ®å®Œæ•´æ€§æ‹“展 +================= + +如上所述,这些å议扩展åªä¿æŠ¤æŽ§åˆ¶å™¨ä¸Žå˜å‚¨è®¾å¤‡ä¹‹é—´çš„路径。然而,许多控制器实际 +上å…许æ“作系统与完整性元数æ®(IMD)交互。我们一直与多家 FC/SAS HBA 厂商åˆä½œï¼Œ +ä½¿ä¿æŠ¤ä¿¡æ¯èƒ½å¤Ÿåœ¨å…¶æŽ§åˆ¶å™¨ä¸Žæ“ä½œç³»ç»Ÿä¹‹é—´ä¼ è¾“ã€‚ + +SCSI æ•°æ®å®Œæ•´æ€§å—段通过在æ¯ä¸ªæ‰‡åŒºåŽé™„åŠ 8å—èŠ‚çš„ä¿æŠ¤ä¿¡æ¯æ¥å®žçŽ°ã€‚æ•°æ® + 完整 +性元数æ®å˜å‚¨åœ¨ç£ç›˜çš„520å—节扇区ä¸ã€‚æ•°æ® + IMD åœ¨æŽ§åˆ¶å™¨ä¸Žç›®æ ‡è®¾å¤‡ä¹‹é—´ä¼ è¾“ +时是交错组åˆåœ¨ä¸€èµ·çš„。T13 ææ¡ˆçš„æ–¹å¼ç±»ä¼¼ã€‚ + +由于æ“作系统处ç†520å—节(甚至 4104 å—节)扇区éžå¸¸ä¸ä¾¿ï¼Œæˆ‘们è”系了多家 HBA +厂商,并鼓励它们分离数æ®ä¸Žå®Œæ•´æ€§å…ƒæ•°æ®çš„ scatter-gather lists。 + +控制器在写入时会将数æ®ç¼“冲区和完整性元数æ®ç¼“冲区的数æ®äº¤é”™åœ¨ä¸€èµ·ï¼Œå¹¶åœ¨è¯»å–æ—¶ +ä¼šæ‹†åˆ†å®ƒä»¬ã€‚è¿™æ ·ï¼ŒLinux 就能直接通过 DMA 将数æ®ç¼“å†²åŒºä¼ è¾“åˆ°ä¸»æœºå†…å˜æˆ–从主机 +内å˜è¯»å–ï¼Œè€Œæ— éœ€ä¿®æ”¹é¡µç¼“å˜ã€‚ + +æ¤å¤–,SCSI 与 SATA è§„èŒƒè¦æ±‚çš„16ä½ CRC æ ¡éªŒåœ¨è½¯ä»¶ä¸è®¡ç®—ä»£ä»·è¾ƒé«˜ã€‚åŸºå‡†æµ‹è¯•å‘ +çŽ°ï¼Œè®¡ç®—æ¤æ ¡éªŒåœ¨é«˜è´Ÿè½½æƒ…形下显著影å“系统性能。一些控制器å…许在æ“作系统接å£å¤„ +使用轻é‡çº§æ ¡éªŒã€‚例如 Emulex æ”¯æŒ TCP/IP æ ¡éªŒã€‚æ“作系统æä¾›çš„ IP æ ¡éªŒåœ¨å†™å…¥ +时会转æ¢ä¸º16ä½ CRCï¼Œè¯»å–æ—¶åˆ™ç›¸å。这å…许 Linux 或应用程åºä»¥æžä½Žçš„å¼€é”€ç”Ÿæˆ +完整性元数æ®ï¼ˆä¸Žè½¯ä»¶ RAID5 相当)。 + +IP æ ¡éªŒåœ¨æ£€æµ‹ä½é”™è¯¯æ–¹é¢æ¯” CRC 弱,但关键在于数æ®ç¼“冲区与完整性元数æ®ç¼“冲区 +çš„åˆ†ç¦»ã€‚åªæœ‰è¿™ä¸¤ä¸ªä¸åŒçš„缓冲区匹é…,I/O æ‰èƒ½å®Œæˆã€‚ + +æ•°æ®ä¸Žå®Œæ•´æ€§å…ƒæ•°æ®ç¼“å†²åŒºçš„åˆ†ç¦»ä»¥åŠæ ¡éªŒé€‰æ‹©è¢«ç§°ä¸ºæ•°æ®å®Œæ•´æ€§æ‰©å±•。由于这些扩展 +超出了å议主体(T10ã€T13)的范围,Oracle åŠå…¶åˆä½œä¼™ä¼´æ£å°è¯•在å˜å‚¨ç½‘络行业å +ä¼šå†…å¯¹å…¶è¿›è¡Œæ ‡å‡†åŒ–ã€‚ + +3. å†…æ ¸å˜æ›´ +=========== + +Linux ä¸çš„æ•°æ®å®Œæ•´æ€§æ¡†æž¶å…è®¸å°†ä¿æŠ¤ä¿¡æ¯å›ºå®šåˆ° I/O 上,并在支æŒè¯¥åŠŸèƒ½çš„æŽ§åˆ¶å™¨ +之间å‘é€å’ŒæŽ¥æ”¶ã€‚ + +SCSI å’Œ SATA ä¸å®Œæ•´æ€§æ‰©å±•çš„ä¼˜åŠ¿åœ¨äºŽï¼Œå®ƒä»¬èƒ½å¤Ÿä¿æŠ¤ä»Žåº”ç”¨ç¨‹åºåˆ°å˜å‚¨è®¾å¤‡çš„æ•´ä¸ª +è·¯å¾„ã€‚ç„¶è€Œï¼Œè¿™åŒæ—¶ä¹Ÿæ˜¯æœ€å¤§çš„劣势。这æ„味ç€ä¿æŠ¤ä¿¡æ¯å¿…须采用ç£ç›˜å¯ä»¥ç†è§£çš„æ ¼å¼ã€‚ + +通常,Linux/POSIX 应用程åºå¹¶ä¸å…³å¿ƒæ‰€è®¿é—®å˜å‚¨è®¾å¤‡çš„具体细节。虚拟文件系统层 +å’Œå—层会让硬件扇区大å°å’Œä¼ 输å议对应用程åºå®Œå…¨é€æ˜Žã€‚ + +然而,在准备å‘é€åˆ°ç£ç›˜çš„ä¿æŠ¤ä¿¡æ¯æ—¶ï¼Œå°±éœ€è¦è¿™ç§ç»†èŠ‚ã€‚å› æ¤ï¼Œç«¯åˆ°ç«¯ä¿æŠ¤æ–¹æ¡ˆçš„æ¦‚ +念实际上è¿å了层次结构。应用程åºå®Œå…¨ä¸åº”该知é“它访问的是 SCSI 还是 SATA ç£ç›˜ã€‚ + +Linux ä¸å®žçŽ°çš„æ•°æ®å®Œæ•´æ€§æ”¯æŒå°è¯•将这些细节对应用程åºéšè—。就应用程åºï¼ˆä»¥åŠåœ¨ +æŸç§ç¨‹åº¦ä¸Šå†…æ ¸ï¼‰è€Œè¨€ï¼Œå®Œæ•´æ€§å…ƒæ•°æ®æ˜¯é™„åŠ åœ¨ I/O 上的ä¸é€æ˜Žä¿¡æ¯ã€‚ + +当å‰å®žçްå…许å—层自动为任何 I/O 生æˆä¿æŠ¤ä¿¡æ¯ã€‚æœ€ç»ˆç›®æ ‡æ˜¯å°†ç”¨æˆ·æ•°æ®çš„完整性元 +æ•°æ®è®¡ç®—ç§»è‡³ç”¨æˆ·ç©ºé—´ã€‚å†…æ ¸ä¸äº§ç”Ÿçš„元数æ®å’Œå…¶ä»– I/O ä»å°†ä½¿ç”¨è‡ªåŠ¨ç”ŸæˆæŽ¥å£ã€‚ + +一些å˜å‚¨è®¾å¤‡å…许为æ¯ä¸ªç¡¬ä»¶æ‰‡åŒºé™„åŠ ä¸€ä¸ª16ä½çš„æ ‡è¯†å€¼ã€‚è¿™ä¸ªæ ‡è¯†ç©ºé—´çš„æ‰€æœ‰è€…æ˜¯ +å—设备的所有者,也就是在多数情况下由文件系统掌控。文件系统å¯ä»¥åˆ©ç”¨è¿™é¢å¤–空间 +æŒ‰éœ€ä¸ºæ‰‡åŒºé™„åŠ æ ‡è¯†ã€‚ç”±äºŽæ ‡è¯†ç©ºé—´æœ‰é™ï¼Œå—接å£å…许通过交错方å¼å¯¹æ›´å¤§çš„æ•°æ®å—æ ‡ +è¯†ã€‚è¿™æ ·ï¼Œ8*16ä½çš„ä¿¡æ¯å¯ä»¥é™„åŠ åˆ°å…¸åž‹çš„ 4KB 文件系统å—上。 + +这也æ„味ç€è¯¸å¦‚ fsck å’Œ mkfs ç‰åº”用程åºéœ€è¦èƒ½å¤Ÿä»Žç”¨æˆ·ç©ºé—´è®¿é—®å¹¶æ“ä½œè¿™äº›æ ‡è®°ã€‚ +为æ¤ï¼Œæ£åœ¨å¼€å‘一个é€ä¼ 接å£ã€‚ + +4. å—层实现细节 +=============== + +4.1 Bio +-------- + +当å¯ç”¨ CONFIG_BLK_DEV_INTEGRITY 时,数æ®å®Œæ•´æ€§è¡¥ä¸ä¼šåœ¨ struct bio 䏿·»åŠ +ä¸€ä¸ªæ–°å—æ®µã€‚调用 bio_integrity(bio) ä¼šè¿”å›žä¸€ä¸ªæŒ‡å‘ struct bip 的指针,该 +结构体包å«äº†è¯¥ bio 的完整性负载。本质上,bip 是一个精简版的 struct bio,其 +ä¸åŒ…å«ä¸€ä¸ª bio_vec,用于ä¿å˜å®Œæ•´æ€§å…ƒæ•°æ®ä»¥åŠæ‰€éœ€çš„维护信æ¯ï¼ˆbvec æ± ã€å‘é‡è®¡ +æ•°ç‰ï¼‰ã€‚ + +å†…æ ¸å系统å¯ä»¥é€šè¿‡è°ƒç”¨ bio_integrity_alloc(bio) æ¥ä¸ºæŸä¸ª bio å¯ç”¨æ•°æ®å®Œæ•´ +æ€§ä¿æŠ¤ã€‚è¯¥å‡½æ•°ä¼šåˆ†é…å¹¶é™„åŠ ä¸€ä¸ª bip 到该 bio 上。 + +éšåŽä½¿ç”¨ bio_integrity_add_page() 将包å«å®Œæ•´æ€§å…ƒæ•°æ®çš„å•独页é¢é™„åŠ åˆ°è¯¥ bio。 + +调用 bio_free() 会自动释放bip。 + +4.2 å—设备 +----------- + +å—设备å¯ä»¥åœ¨ queue_limits 结构ä¸çš„ integrity å结构ä¸è®¾ç½®å®Œæ•´æ€§ä¿¡æ¯ã€‚ + +对于分层å—设备,需è¦é€‰æ‹©ä¸€ä¸ªé€‚用于所有å设备的完整性é…置文件。å¯ä»¥ä½¿ç”¨ +queue_limits_stack_integrity() æ¥å助完æˆè¯¥æ“作。目å‰ï¼ŒDM å’Œ MD linear〠+RAID0 å’Œ RAID1 已嗿”¯æŒã€‚而RAID4/5/6å› æ¶‰åŠåº”ç”¨æ ‡ç¾ä»éœ€é¢å¤–的开å‘工作。 + +5.0 å—层完整性API +================== + +5.1 普通文件系统 +----------------- + + 普通文件系统并ä¸çŸ¥é“其下层å—设备具备å‘逿ˆ–接收完整性元数æ®çš„能力。 + 在执行写æ“作时,å—层会在调用 submit_bio() 时自动生æˆå®Œæ•´æ€§å…ƒæ•°æ®ã€‚ + 在执行读æ“作时,I/O 完æˆåŽä¼šè§¦å‘完整性验è¯ã€‚ + + IMD 的生æˆä¸ŽéªŒè¯è¡Œä¸ºå¯ä»¥é€šè¿‡ä»¥ä¸‹å¼€å…³æŽ§åˆ¶:: + + /sys/block/<bdev>/integrity/write_generate + + and:: + + /sys/block/<bdev>/integrity/read_verify + + flags. + +5.2 具备完整性感知的文件系统 +---------------------------- + + 具备完整性感知能力的文件系统å¯ä»¥åœ¨å‡†å¤‡ I/O æ—¶é™„åŠ å®Œæ•´æ€§å…ƒæ•°æ®ï¼Œ + 并且如果底层å—设备支æŒåº”ç”¨æ ‡ç¾ç©ºé—´ï¼Œä¹Ÿå¯ä»¥åŠ ä»¥åˆ©ç”¨ã€‚ + + + `bool bio_integrity_prep(bio);` + + è¦ä¸ºå†™æ“作生æˆå®Œæ•´æ€§å…ƒæ•°æ®æˆ–为读æ“作设置缓冲区,文件系统必须调用 + bio_integrity_prep(bio)。 + + 在调用æ¤å‡½æ•°ä¹‹å‰ï¼Œå¿…须先设置好 bio çš„æ•°æ®æ–¹å‘和起始扇区,并确 + ä¿è¯¥ bio å·²ç»æ·»åŠ å®Œæ‰€æœ‰çš„æ•°æ®é¡µã€‚调用者需è¦è‡ªè¡Œä¿è¯ï¼Œåœ¨ I/O 进行 + 期间 bio ä¸ä¼šè¢«ä¿®æ”¹ã€‚如果由于æŸç§åŽŸå› å‡†å¤‡å¤±è´¥ï¼Œåˆ™åº”å½“ä»¥é”™è¯¯çŠ¶æ€ + 完æˆè¯¥ bio。 + +5.3 ä¼ é€’å·²æœ‰çš„å®Œæ•´æ€§å…ƒæ•°æ® +-------------------------- + + 能够自行生æˆå®Œæ•´æ€§å…ƒæ•°æ®æˆ–å¯ä»¥ä»Žç”¨æˆ·ç©ºé—´ä¼ 输完整性元数æ®çš„æ–‡ä»¶ç³»ç»Ÿï¼Œ + å¯ä»¥ä½¿ç”¨å¦‚下接å£ï¼š + + + `struct bip * bio_integrity_alloc(bio, gfp_mask, nr_pages);` + + 为 bio 分é…完整性负载并挂载到 bio 上。nr_pages 表示需è¦åœ¨ + integrity bio_vec list ä¸å˜å‚¨å¤šå°‘é¡µä¿æŠ¤æ•°æ®ï¼ˆç±»ä¼¼ bio_alloc)。 + + 完整性负载将在 bio_free() 被调用时释放。 + + + `int bio_integrity_add_page(bio, page, len, offset);` + + 将包å«å®Œæ•´æ€§å…ƒæ•°æ®çš„ä¸€é¡µé™„åŠ åˆ°å·²æœ‰çš„ bio 上。该 bio 必须已有 bip, + å³å¿…须先调用 bio_integrity_alloc()。对于写æ“作,页ä¸çš„完整 + 性元数æ®å¿…é¡»é‡‡ç”¨ç›®æ ‡è®¾å¤‡å¯è¯†åˆ«çš„æ ¼å¼ï¼Œä½†æœ‰ä¸€ä¸ªä¾‹å¤–,当请求在 I/O æ ˆ + ä¸ä¼ 递时,扇区å·ä¼šè¢«é‡æ–°æ˜ 射。这æ„味ç€é€šè¿‡æ¤æŽ¥å£æ·»åŠ çš„é¡µåœ¨ I/O 过程 + ä¸å¯èƒ½ä¼šè¢«ä¿®æ”¹ï¼å®Œæ•´æ€§å…ƒæ•°æ®ä¸çš„ç¬¬ä¸€ä¸ªå¼•ç”¨æ ‡ç¾å¿…é¡»ç‰äºŽ bip->bip_sector。 + + åªè¦ bip bio_vec array(nr_pages)有空间,就å¯ä»¥ç»§ç»é€šè¿‡ + bio_integrity_add_page()æ·»åŠ é¡µã€‚ + + 当读æ“作完æˆåŽï¼Œé™„åŠ çš„é¡µå°†åŒ…å«ä»Žå˜å‚¨è®¾å¤‡æŽ¥æ”¶åˆ°çš„完整性元数æ®ã€‚ + 接收方需è¦å¤„ç†è¿™äº›å…ƒæ•°æ®ï¼Œå¹¶åœ¨æ“ä½œå®Œæˆæ—¶éªŒè¯æ•°æ®å®Œæ•´æ€§ + + +---------------------------------------------------------------------- + +2007-12-24 Martin K. Petersen <martin.petersen@oracle.com>
\ No newline at end of file diff --git a/Documentation/translations/zh_CN/block/index.rst b/Documentation/translations/zh_CN/block/index.rst new file mode 100644 index 000000000000..f2ae5096ed68 --- /dev/null +++ b/Documentation/translations/zh_CN/block/index.rst @@ -0,0 +1,35 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/block/index.rst + +:翻译: + + æŸ¯åæ° ke zijie <kezijie@leap-io-kernel.com> + +:æ ¡è¯‘: + +===== +Block +===== + +.. toctree:: + :maxdepth: 1 + + blk-mq + data-integrity + +TODOList: +* bfq-iosched +* biovecs +* cmdline-partition +* deadline-iosched +* inline-encryption +* ioprio +* kyber-iosched +* null_blk +* pr +* stat +* switching-sched +* writeback_cache_control +* ublk diff --git a/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst b/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst index 282aacd33442..0b382a32b3fe 100644 --- a/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst +++ b/Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst @@ -2,7 +2,7 @@ .. include:: ../disclaimer-zh_CN.rst -:Original: Documentation/dev-tools/gdb-kernel-debugging.rst +:Original: Documentation/process/debugging/gdb-kernel-debugging.rst :Translator: 高超 gao chao <gaochao49@huawei.com> 通过gdbè°ƒè¯•å†…æ ¸å’Œæ¨¡å— diff --git a/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst b/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst index d20b4ce66b9f..dbfd65398077 100644 --- a/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst +++ b/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst @@ -28,15 +28,15 @@ :: - ./scripts/checktransupdate.py --help + tools/docs/checktransupdate.py --help 具体用法请å‚è€ƒå‚æ•°è§£æžå™¨çš„输出 示例 -- ``./scripts/checktransupdate.py -l zh_CN`` +- ``tools/docs/checktransupdate.py -l zh_CN`` è¿™å°†æ‰“å° zh_CN è¯è¨€ä¸éœ€è¦æ›´æ–°çš„æ‰€æœ‰æ–‡ä»¶ã€‚ -- ``./scripts/checktransupdate.py Documentation/translations/zh_CN/dev-tools/testing-overview.rst`` +- ``tools/docs/checktransupdate.py Documentation/translations/zh_CN/dev-tools/testing-overview.rst`` è¿™å°†åªæ‰“å°æŒ‡å®šæ–‡ä»¶çš„状æ€ã€‚ ç„¶åŽè¾“出类似如下的内容: diff --git a/Documentation/translations/zh_CN/doc-guide/contributing.rst b/Documentation/translations/zh_CN/doc-guide/contributing.rst index 394a13b438b0..b0c8ba782b16 100644 --- a/Documentation/translations/zh_CN/doc-guide/contributing.rst +++ b/Documentation/translations/zh_CN/doc-guide/contributing.rst @@ -124,7 +124,7 @@ C代ç 编译器å‘出的è¦å‘Šå¸¸å¸¸ä¼šè¢«è§†ä¸ºè¯¯æŠ¥ï¼Œä»Žè€Œå¯¼è‡´å‡ºçŽ°äº†æ è¿™ä½¿å¾—è¿™äº›ä¿¡æ¯æ›´é𾿉¾åˆ°ï¼Œä¾‹å¦‚使Sphinxæ— æ³•ç”ŸæˆæŒ‡å‘该文档的链接。将 ``kernel-doc`` æŒ‡ä»¤æ·»åŠ åˆ°æ–‡æ¡£ä¸ä»¥å¼•入这些注释å¯ä»¥å¸®åŠ©ç¤¾åŒºèŽ·å¾—ä¸ºç¼–å†™æ³¨é‡Šæ‰€åšå·¥ä½œçš„全部价值。 -``scripts/find-unused-docs.sh`` 工具å¯ä»¥ç”¨æ¥æ‰¾åˆ°è¿™äº›è¢«å¿½ç•¥çš„评论。 +``tools/docs/find-unused-docs.sh`` 工具å¯ä»¥ç”¨æ¥æ‰¾åˆ°è¿™äº›è¢«å¿½ç•¥çš„评论。 请注æ„,将导出的函数和数æ®ç»“构引入文档是最有价值的。许多å系统还具有供内部 使用的kernel-doc注释;除éžè¿™äº›æ³¨é‡Šæ”¾åœ¨ä¸“门针对相关å系统开å‘人员的文档ä¸ï¼Œ diff --git a/Documentation/translations/zh_CN/doc-guide/parse-headers.rst b/Documentation/translations/zh_CN/doc-guide/parse-headers.rst index a08819e904ed..65d9dc5143ff 100644 --- a/Documentation/translations/zh_CN/doc-guide/parse-headers.rst +++ b/Documentation/translations/zh_CN/doc-guide/parse-headers.rst @@ -13,20 +13,20 @@ 有时,为了æè¿°ç”¨æˆ·ç©ºé—´API并在代ç 和文档之间生æˆäº¤å‰å¼•用,需è¦åŒ…å«å¤´æ–‡ä»¶å’Œç¤ºä¾‹ C代ç 。为用户空间APIæ–‡ä»¶æ·»åŠ äº¤å‰å¼•ç”¨è¿˜æœ‰ä¸€ä¸ªå¥½å¤„ï¼šå¦‚æžœåœ¨æ–‡æ¡£ä¸æ‰¾ä¸åˆ°ç›¸åº”符å·ï¼Œ Sphinx将生æˆè¦å‘Šã€‚è¿™æœ‰åŠ©äºŽä¿æŒç”¨æˆ·ç©ºé—´APIæ–‡æ¡£ä¸Žå†…æ ¸æ›´æ”¹åŒæ¥ã€‚ -:ref:`parse_headers.pl <parse_headers_zh>` æä¾›äº†ç”Ÿæˆæ¤ç±»äº¤å‰å¼•ç”¨çš„ä¸€ç§æ–¹æ³•。 +:ref:`parse_headers.py <parse_headers_zh>` æä¾›äº†ç”Ÿæˆæ¤ç±»äº¤å‰å¼•ç”¨çš„ä¸€ç§æ–¹æ³•。 在构建文档时,必须通过Makefileè°ƒç”¨å®ƒã€‚æœ‰å…³å¦‚ä½•åœ¨å†…æ ¸æ ‘ä¸ä½¿ç”¨å®ƒçš„示例,请å‚阅 ``Documentation/userspace-api/media/Makefile`` 。 .. _parse_headers_zh: -parse_headers.pl +parse_headers.py ---------------- 脚本åç§° ~~~~~~~~ -parse_headers.pl——解æžä¸€ä¸ªC文件,识别函数ã€ç»“æž„ä½“ã€æžšä¸¾ã€å®šä¹‰å¹¶å¯¹Sphinx文档 +parse_headers.py——解æžä¸€ä¸ªC文件,识别函数ã€ç»“æž„ä½“ã€æžšä¸¾ã€å®šä¹‰å¹¶å¯¹Sphinx文档 创建交å‰å¼•用。 @@ -34,7 +34,7 @@ parse_headers.pl——解æžä¸€ä¸ªC文件,识别函数ã€ç»“æž„ä½“ã€æžšä¸¾ã€ ~~~~~~~~ -\ **parse_headers.pl**\ [<选项>] <C文件> <输出文件> [<例外文件>] +\ **parse_headers.py**\ [<选项>] <C文件> <输出文件> [<例外文件>] <选项> å¯ä»¥æ˜¯ï¼š --debug, --help 或 --usage 。 diff --git a/Documentation/translations/zh_CN/doc-guide/sphinx.rst b/Documentation/translations/zh_CN/doc-guide/sphinx.rst index 23eac67fbc30..3375c6f3a811 100644 --- a/Documentation/translations/zh_CN/doc-guide/sphinx.rst +++ b/Documentation/translations/zh_CN/doc-guide/sphinx.rst @@ -84,7 +84,7 @@ PDFå’ŒLaTeX构建 这有一个脚本å¯ä»¥è‡ªåŠ¨æ£€æŸ¥Sphinxä¾èµ–项。如果它认得您的å‘行版,还会æç¤ºæ‚¨æ‰€ç”¨å‘行 版的安装命令:: - $ ./scripts/sphinx-pre-install + $ ./tools/docs/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are available Warning: better to also install "texlive-luatex85". You should run: @@ -94,7 +94,7 @@ PDFå’ŒLaTeX构建 . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/docs/sphinx-pre-install line 468. 默认情况下,它会检查htmlå’ŒPDF的所有ä¾èµ–项,包括图åƒã€æ•°å¦è¡¨è¾¾å¼å’ŒLaTeX构建的 需求,并å‡è®¾å°†ä½¿ç”¨è™šæ‹ŸPython环境。html构建所需的ä¾èµ–é¡¹è¢«è®¤ä¸ºæ˜¯å¿…éœ€çš„ï¼Œå…¶ä»–ä¾ diff --git a/Documentation/translations/zh_CN/filesystems/dnotify.rst b/Documentation/translations/zh_CN/filesystems/dnotify.rst new file mode 100644 index 000000000000..5ab109b9424c --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/dnotify.rst @@ -0,0 +1,67 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/dnotify.rst + +:翻译: + + çŽ‹é¾™æ° Wang Longjie <wang.longjie1@zte.com.cn> + +============== +Linux 目录通知 +============== + + Stephen Rothwell <sfr@canb.auug.org.au> + +目录通知的目的是使用户应用程åºèƒ½å¤Ÿåœ¨ç›®å½•或目录ä¸çš„任何文件å‘ç”Ÿå˜æ›´æ—¶æ”¶åˆ°é€šçŸ¥ã€‚åŸºæœ¬æœºåˆ¶åŒ…æ‹¬åº”ç”¨ç¨‹åº +通过 fcntl(2) 调用在目录上注册通知,通知本身则通过信å·ä¼ 递。 + +应用程åºå¯ä»¥å†³å®šå¸Œæœ›æ”¶åˆ°å“ªäº› “事件†的通知。当å‰å·²å®šä¹‰çš„事件如下: + + ========= ===================================== + DN_ACCESS 目录ä¸çš„æ–‡ä»¶è¢«è®¿é—®ï¼ˆread) + DN_MODIFY 目录ä¸çš„æ–‡ä»¶è¢«ä¿®æ”¹ï¼ˆwrite,truncate) + DN_CREATE 目录ä¸åˆ›å»ºäº†æ–‡ä»¶ + DN_DELETE 目录ä¸çš„æ–‡ä»¶è¢«å–消链接 + DN_RENAME 目录ä¸çš„æ–‡ä»¶è¢«é‡å‘½å + DN_ATTRIB 目录ä¸çš„æ–‡ä»¶å±žæ€§è¢«æ›´æ”¹ï¼ˆchmod,chown) + ========= ===================================== + +通常,应用程åºå¿…é¡»åœ¨æ¯æ¬¡é€šçŸ¥åŽé‡æ–°æ³¨å†Œï¼Œä½†å¦‚果将 DN_MULTISHOT 与事件掩ç 进行或è¿ç®—,则注册 +å°†ä¸€ç›´ä¿æŒæœ‰æ•ˆï¼Œç›´åˆ°è¢«æ˜¾å¼ç§»é™¤ï¼ˆé€šè¿‡æ³¨å†Œä¸ºä¸æŽ¥æ”¶ä»»ä½•事件)。 + +默认情况下,SIGIO ä¿¡å·å°†è¢«ä¼ 递给进程,且ä¸é™„带其他有用的信æ¯ã€‚但是,如果使用 F_SETSIG fcntl(2) +è°ƒç”¨è®©å†…æ ¸çŸ¥é“è¦ä¼ 递哪个信å·ï¼Œä¸€ä¸ª siginfo ç»“æž„ä½“å°†è¢«ä¼ é€’ç»™ä¿¡å·å¤„ç†ç¨‹åºï¼Œè¯¥ç»“构体的 si_fd æˆå‘˜å°† +包å«ä¸Žå‘生事件的目录相关è”的文件æè¿°ç¬¦ã€‚ + +åº”ç”¨ç¨‹åºæœ€å¥½é€‰æ‹©ä¸€ä¸ªå®žæ—¶ä¿¡å·ï¼ˆSIGRTMIN + <n>),以便通知å¯ä»¥è¢«æŽ’队。如果指定了 DN_MULTISHOT, +这一点尤为é‡è¦ã€‚注æ„,SIGRTMIN é€šå¸¸æ˜¯è¢«é˜»å¡žçš„ï¼Œå› æ¤æœ€å¥½ä½¿ç”¨ï¼ˆè‡³å°‘)SIGRTMIN + 1。 + +实现预期(特性与缺陷 :-)) +-------------------------- + +对于文件的任何本地访问,通知都应能æ£å¸¸å·¥ä½œï¼Œå³ä½¿å®žé™…文件系统ä½äºŽè¿œç¨‹æœåŠ¡å™¨ä¸Šã€‚è¿™æ„味ç€ï¼Œå¯¹æœ¬åœ°ç”¨æˆ· +æ¨¡å¼æœåС噍æä¾›çš„æ–‡ä»¶çš„远程访问应能触å‘é€šçŸ¥ã€‚åŒæ ·çš„ï¼Œå¯¹æœ¬åœ°å†…æ ¸ NFS æœåС噍æä¾›çš„æ–‡ä»¶çš„远程访问 +也应能触å‘通知。 + +为了尽å¯èƒ½å‡å°å¯¹æ–‡ä»¶ç³»ç»Ÿä»£ç 的影å“ï¼Œæ–‡ä»¶ç¡¬é“¾æŽ¥çš„é—®é¢˜å·²è¢«å¿½ç•¥ã€‚å› æ¤ï¼Œå¦‚果一个文件(x)å˜åœ¨äºŽä¸¤ä¸ª +目录(a å’Œ b)ä¸ï¼Œé€šè¿‡åç§°â€a/xâ€å¯¹è¯¥æ–‡ä»¶è¿›è¡Œçš„æ›´æ”¹åº”通知给期望接收目录“aâ€é€šçŸ¥çš„程åºï¼Œä½†ä¸ä¼š +通知给期望接收目录“bâ€é€šçŸ¥çš„程åºã€‚ + +æ¤å¤–ï¼Œå–æ¶ˆé“¾æŽ¥çš„æ–‡ä»¶ä»ä¼šåœ¨å®ƒä»¬é“¾æŽ¥åˆ°çš„æœ€åŽä¸€ä¸ªç›®å½•ä¸è§¦å‘通知。 + +é…ç½® +---- + +Dnotify ç”± CONFIG_DNOTIFY é…置选项控制。ç¦ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œfcntl(fd, F_NOTIFY, ...) 将返 +回 -EINVAL。 + +示例 +---- +具体示例å¯å‚è§ tools/testing/selftests/filesystems/dnotify_test.c。 + +æ³¨æ„ +---- +从 Linux 2.6.13 开始,dnotify 已被 inotify å–代。有关 inotify 的更多信æ¯ï¼Œè¯·å‚è§ +Documentation/filesystems/inotify.rst。 diff --git a/Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst b/Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst new file mode 100644 index 000000000000..abfd2f2f94e9 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/gfs2-glocks.rst @@ -0,0 +1,211 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/gfs2-glocks.rst + +:翻译: + + 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> + +:æ ¡è¯‘: + + æ¨æ¶› yang tao <yang.tao172@zte.com.cn> + +================== +Glock å†…éƒ¨åŠ é”规则 +================== + +本文档é˜è¿° glock çŠ¶æ€æœºå†…部è¿ä½œçš„基本原ç†ã€‚æ¯ä¸ª glockï¼ˆå³ +fs/gfs2/incore.h ä¸çš„ struct gfs2_glock)包å«ä¸¤æŠŠä¸»è¦çš„内部é”: + + 1. 自旋é”(gl_lockref.lockï¼‰ï¼šç”¨äºŽä¿æŠ¤å†…éƒ¨çŠ¶æ€ï¼ˆå¦‚ + gl_stateã€gl_targetï¼‰å’ŒæŒæœ‰è€…列表(gl_holders) + 2. éžé˜»å¡žçš„ä½é”(GLF_LOCK):用于防æ¢å…¶ä»–çº¿ç¨‹åŒæ—¶è°ƒç”¨ + DLM ç‰æ“作。若æŸçº¿ç¨‹èŽ·å–æ¤é”,则在释放时必须调用 + run_queueï¼ˆé€šå¸¸é€šè¿‡å·¥ä½œé˜Ÿåˆ—ï¼‰ï¼Œä»¥ç¡®ä¿æ‰€æœ‰å¾…处ç†ä»»åŠ¡ + 得以完æˆã€‚ + +gl_holders 列表包å«ä¸Žè¯¥ glock å…³è”的所有排队é”è¯·æ±‚ï¼ˆä¸ +ä»…æ˜¯æŒæœ‰è€…)。若å˜åœ¨å·²æŒæœ‰çš„é”,它们将ä½äºŽåˆ—表开头的连 +ç»æ¡ç›®ä¸ã€‚é”çš„æŽˆäºˆä¸¥æ ¼éµå¾ªæŽ’队顺åºã€‚ + +glock 层用户å¯è¯·æ±‚三ç§é”状æ€ï¼šå…±äº«ï¼ˆSH)ã€å»¶è¿Ÿï¼ˆDF)和 +排他(EX)。它们对应以下 DLM 锿¨¡å¼ï¼š + +========== ====== ===================================================== +Glock æ¨¡å¼ DLM 锿¨¡å¼ +========== ====== ===================================================== + UN IV/NL æœªåŠ é”ï¼ˆæ— å…³è”çš„ DLM é”)或 NL + SH PR å—ä¿æŠ¤è¯»ï¼ˆProtected read) + DF CW å¹¶å‘写(Concurrent write) + EX EX 排他(Exclusive) +========== ====== ===================================================== + +å› æ¤ï¼ŒDF 本质上是一ç§ä¸Žâ€œå¸¸è§„â€å…±äº«é”模å¼ï¼ˆSH)互斥的共 +享模å¼ã€‚在 GFS2 ä¸ï¼ŒDF 模å¼ä¸“用于直接 I/O æ“作。Glock +本质上是é”åŠ ç¼“å˜ç®¡ç†ä¾‹ç¨‹çš„组åˆï¼Œå…¶ç¼“å˜è§„则如下: + +========== ============== ========== ========== ============== +Glock æ¨¡å¼ ç¼“å˜å…ƒæ•°æ® ç¼“å˜æ•°æ® è„æ•°æ® è„å…ƒæ•°æ® +========== ============== ========== ========== ============== + UN å¦ å¦ å¦ å¦ + DF 是 å¦ å¦ å¦ + SH 是 是 å¦ å¦ + EX 是 是 是 是 +========== ============== ========== ========== ============== + +这些规则通过为æ¯ç§ glock 定义的æ“ä½œå‡½æ•°å®žçŽ°ã€‚å¹¶éžæ‰€æœ‰ +glock 类型都使用全部的模å¼ï¼Œä¾‹å¦‚ä»… inode glock 使用 DF 模 +å¼ã€‚ + +glock æ“作函数åŠç±»åž‹å¸¸é‡è¯´æ˜Žè¡¨ï¼š + +============== ======================================================== +å—æ®µ 用途 +============== ======================================================== +go_sync 远程状æ€å˜æ›´å‰è°ƒç”¨ï¼ˆå¦‚åŒæ¥è„æ•°æ®ï¼‰ +go_xmote_bh 远程状æ€å˜æ›´åŽè°ƒç”¨ï¼ˆå¦‚刷新缓å˜ï¼‰ +go_inval 远程状æ€å˜æ›´éœ€ä½¿ç¼“å˜å¤±æ•ˆæ—¶è°ƒç”¨ +go_instantiate èŽ·å– glock 时调用 +go_held æ¯æ¬¡èŽ·å– glock æŒæœ‰è€…时调用 +go_dump 为 debugfs 文件打å°å¯¹è±¡å†…容,或出错时将 glock 转储至日志 +go_callback è‹¥ DLM å‘é€å›žè°ƒä»¥é‡Šæ”¾æ¤é”时调用 +go_unlocked 当 glock è§£é”æ—¶è°ƒç”¨ï¼ˆdlm_unlock()) +go_type glock 类型,``LM_TYPE_*`` +go_flags è‹¥ glock å…³è”地å€ç©ºé—´ï¼Œåˆ™è®¾ç½®GLOF_ASPACE æ ‡å¿— +============== ======================================================== + +æ¯ç§é”çš„æœ€çŸæŒæœ‰æ—¶é—´æ˜¯æŒ‡åœ¨è¿œç¨‹é”授予åŽå¿½ç•¥è¿œç¨‹é™çº§è¯·æ±‚ +的时间段。æ¤ä¸¾æ—¨åœ¨é˜²æ¢é”在集群节点间æŒç»å¼¹è·³è€Œæ— 实质进 +展的情况,æ¤çŽ°è±¡å¸¸è§äºŽå¤šèŠ‚ç‚¹å†™å…¥çš„å…±äº«å†…å˜æ˜ 射文件。通 +过延迟å“应远程回调的é™çº§æ“作,为用户空间程åºäº‰å–页é¢å– +æ¶ˆæ˜ å°„å‰çš„å¤„ç†æ—¶é—´ã€‚ + +未æ¥è®¡åˆ’å°† glock çš„ "EX" 模å¼è®¾ä¸ºæœ¬åœ°å…±äº«ï¼Œä½¿æœ¬åœ°é”通 +过 i_mutex å®žçŽ°è€Œéž glock。 + +glock æ“ä½œå‡½æ•°çš„åŠ é”规则: + +============== ====================== ============================= +æ“作 GLF_LOCK ä½é”æŒæœ‰ gl_lockref.lock è‡ªæ—‹é”æŒæœ‰ +============== ====================== ============================= +go_sync 是 å¦ +go_xmote_bh 是 å¦ +go_inval 是 å¦ +go_instantiate å¦ å¦ +go_held å¦ å¦ +go_dump 有时 是 +go_callback 有时(N/A) 是 +go_unlocked 是 å¦ +============== ====================== ============================= + +.. Note:: + + 若入å£å¤„æŒæœ‰é”则æ“作期间ä¸å¾—释放ä½é”或自旋é”。 + go_dump å’Œ do_demote_ok 严ç¦é˜»å¡žã€‚ + 仅当 glock çŠ¶æ€æŒ‡ç¤ºå…¶ç¼“å˜æœ€æ–°æ•°æ®æ—¶æ‰ä¼šè°ƒç”¨ go_dump。 + +GFS2 内部的 glock åŠ é”顺åºï¼š + + 1. i_rwsem(如需è¦ï¼‰ + 2. é‡å‘½å glock(仅用于é‡å‘½å) + 3. Inode glock + (父级优先于å级,åŒçº§ inode 按é”ç¼–å·æŽ’åºï¼‰ + 4. Rgrp glock(用于(åï¼‰åˆ†é…æ“作) + 5. 事务 glock(通过 gfs2_trans_begin,éžè¯»æ“作) + 6. i_rw_mutex(如需è¦ï¼‰ + 7. 页é”(始终最åŽï¼Œè‡³å…³é‡è¦ï¼ï¼‰ + +æ¯ä¸ª inode 对应两把 glockï¼šä¸€æŠŠç®¡ç† inode æœ¬èº«ï¼ˆåŠ é”顺 +åºå¦‚上),å¦ä¸€æŠŠï¼ˆç§°ä¸º iopen glockï¼‰ç»“åˆ inode çš„ +i_nlink å—æ®µå†³å®š inode 生命周期。inode åŠ é”基于å•个 +inode,rgrp åŠ é”基于å•个 rgrpã€‚é€šå¸¸ä¼˜å…ˆèŽ·å–æœ¬åœ°é”å†èŽ· +å–集群é”。 + +Glock 统计 +---------- + +统计分为两类:超级å—相关统计和å•个 glock 相关统计。超级 +å—ç»Ÿè®¡æŒ‰æ¯ CPU 执行以å‡å°‘æ”¶é›†å¼€é”€ï¼Œå¹¶è¿›ä¸€æ¥æŒ‰ glock ç±» +型细分。所有时间å•ä½ä¸ºçº³ç§’。 + +超级å—å’Œ glock 统计收集相åŒä¿¡æ¯ã€‚è¶…çº§å—æ—¶åºç»Ÿè®¡ä¸º glock +æ—¶åºç»Ÿè®¡æä¾›é»˜è®¤å€¼ï¼Œä½¿æ–°å»º glock 具有åˆç†çš„åˆå§‹å€¼ã€‚æ¯ä¸ª +glock 的计数器在创建时åˆå§‹åŒ–为零,当 glock 从内å˜ç§»é™¤æ—¶ +统计丢失。 + +统计包å«ä¸‰ç»„å‡å€¼/方差对åŠä¸¤ä¸ªè®¡æ•°å™¨ã€‚å‡å€¼/方差对为平滑 +指数估计,算法与网络代ç ä¸çš„往返时间计算类似(å‚è§ã€Š +TCP/IP详解 å·1》第21.3节åŠã€Šå·2》第25.10节)。与 TCP/IP +案例ä¸åŒï¼Œæ¤å¤„å‡å€¼/方差未缩放且å•ä½ä¸ºæ•´æ•°çº³ç§’。 + +三组å‡å€¼/方差对测é‡ä»¥ä¸‹å†…容: + + 1. DLM 锿—¶é—´ï¼ˆéžé˜»å¡žè¯·æ±‚) + 2. DLM 锿—¶é—´ï¼ˆé˜»å¡žè¯·æ±‚) + 3. è¯·æ±‚é—´éš”æ—¶é—´ï¼ˆæŒ‡å‘ DLM) + +éžé˜»å¡žè¯·æ±‚æŒ‡æ— è®ºç›®æ ‡ DLM é”处于何ç§çжæ€å‡èƒ½ç«‹å³å®Œæˆçš„请求。 +当剿»¡è¶³æ¡ä»¶çš„请求包括:(a)é”当å‰çжæ€ä¸ºäº’斥(如é”é™çº§ï¼‰ã€ +(b)请求状æ€ä¸ºç©ºç½®æˆ–è§£é”ï¼ˆåŒæ ·å¦‚é”é™çº§ï¼‰ã€æˆ–(c)设置"try lock" +æ ‡å¿—çš„è¯·æ±‚ã€‚å…¶ä½™é”请求å‡å±žé˜»å¡žè¯·æ±‚。 + +两个计数器分别统计: + 1. é”请求总数(决定å‡å€¼/方差计算的数æ®é‡ï¼‰ + 2. glock 代ç é¡¶å±‚çš„æŒæœ‰è€…排队数(通常远大于 DLM é”请求数) + +为什么收集这些统计数æ®ï¼Ÿæˆ‘ä»¬éœ€æ·±å…¥åˆ†æžæ—¶åºå‚æ•°çš„åŠ¨å› å¦‚ä¸‹ï¼š + +1. 更精准设置 glock "æœ€çŸæŒæœ‰æ—¶é—´" +2. 快速识别性能问题 +3. 改进资æºç»„分é…算法(基于é”ç‰å¾…时间而éžç›²ç›® "try lock") + +å› å¹³æ»‘æ›´æ–°çš„ç‰¹æ€§ï¼Œé‡‡æ ·é‡çš„阶跃å˜åŒ–éœ€ç» 8 æ¬¡é‡‡æ ·ï¼ˆæ–¹å·®éœ€ +4 次)æ‰èƒ½å®Œå…¨ä½“现,解æžç»“果时需审慎考虑。 + +通过é”è¯·æ±‚å®Œæˆæ—¶é—´å’Œ glock å¹³å‡é”请求间隔时间,å¯è®¡ç®—节 +点使用 glock æ—¶é•¿ä¸Žé›†ç¾¤å…±äº«æ—¶é•¿çš„å æ¯”ï¼Œå¯¹è®¾ç½®é”æœ€çŸæŒæœ‰ +时间至关é‡è¦ã€‚ + +我们已采å–严谨措施,力求精准测é‡ç›®æ ‡é‡å€¼ã€‚任何测é‡ç³»ç»Ÿå‡ +å˜åœ¨è¯¯å·®ï¼Œä½†æˆ‘æœŸæœ›å½“å‰æ–¹æ¡ˆå·²è¾¾åˆ°åˆç†ç²¾åº¦æžé™ã€‚ + +超级å—状æ€ç»Ÿè®¡è·¯å¾„:: + + /sys/kernel/debug/gfs2/<fsname>/sbstats + +Glock 状æ€ç»Ÿè®¡è·¯å¾„:: + + /sys/kernel/debug/gfs2/<fsname>/glstats + +(å‡è®¾ debugfs 挂载于 /sys/kernel/debug,且 <fsname> 替 +æ¢ä¸ºå¯¹åº” GFS2 文件系统å) + +输出缩写说明: + +========= ============================================ +srtt éžé˜»å¡ž DLM 请求的平滑往返时间 +srttvar srtt 的方差估计 +srttb (潜在)阻塞 DLM 请求的平滑往返时间 +srttvarb srttb 的方差估计 +sirt DLM 请求的平滑请求间隔时间 +sirtvar sirt 的方差估计 +dlm DLM 请求数(glstats 文件ä¸çš„ dcnt) +queue 排队的 glock 请求数(glstats 文件ä¸çš„ qcnt) +========= ============================================ + +sbstats文件按glock类型(æ¯ç§ç±»åž‹8行)和CPUæ ¸å¿ƒï¼ˆæ¯CPU一列) +记录统计数æ®é›†ã€‚glstats文件则为æ¯ä¸ªglockæä¾›ç»Ÿè®¡é›†ï¼Œå…¶æ ¼å¼ +与glocks文件类似,但所有时åºç»Ÿè®¡é‡å‡é‡‡ç”¨å‡å€¼/æ–¹å·®æ ¼å¼å˜å‚¨ã€‚ + +gfs2_glock_lock_time è·Ÿè¸ªç‚¹å®žæ—¶è¾“å‡ºç›®æ ‡ glock 的当å‰ç»Ÿè®¡ +å€¼ï¼Œå¹¶é™„å¸¦æ¯æ¬¡æŽ¥æ”¶åˆ°çš„dlmå“åº”é™„åŠ ä¿¡æ¯ï¼š + +====== ============ +status DLM è¯·æ±‚çŠ¶æ€ +flags DLM è¯·æ±‚æ ‡å¿— +tdiff 该请求的耗时 +====== ============ + +ï¼ˆå…¶ä½™å—æ®µåŒä¸Šè¡¨ï¼‰ diff --git a/Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst b/Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst new file mode 100644 index 000000000000..3975c4544118 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/gfs2-uevents.rst @@ -0,0 +1,97 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/gfs2-uevents.rst + +:翻译: + + 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> + +:æ ¡è¯‘: + + æ¨æ¶› yang tao <yang.tao172@zte.com.cn> + +=============== +uevents 与 GFS2 +=============== + +在 GFS2 文件系统的挂载生命周期内,会生æˆå¤šä¸ª uevent。 +本文档解释了这些事件的å«ä¹‰åŠå…¶ç”¨é€”(被 gfs2-utils ä¸çš„ gfs_controld 使用)。 + +GFS2 uevents 列表 +================= + +1. ADD +------ + +ADD 事件å‘生在挂载时。它始终是新建文件系统生æˆçš„第一个 ueventã€‚å¦‚æžœæŒ‚è½½æˆ +功,éšåŽä¼šç”Ÿæˆ ONLINE uevent。如果挂载失败,则éšåŽä¼šç”Ÿæˆ REMOVE uevent。 + +ADD uevent 包å«ä¸¤ä¸ªçŽ¯å¢ƒå˜é‡ï¼šSPECTATOR=[0|1] å’Œ RDONLY=[0|1],分别用 +于指定文件系统的观察者状æ€ï¼ˆä¸€ç§æœªåˆ†é…日志的åªè¯»æŒ‚载)和åªè¯»çжæ€ï¼ˆå·²åˆ†é…日志)。 + +2. ONLINE +--------- + +ONLINE uevent 在æˆåŠŸæŒ‚è½½æˆ–é‡æ–°æŒ‚è½½åŽç”Ÿæˆã€‚它具有与 ADD uevent 相åŒçš„环 +境å˜é‡ã€‚ONLINE uevent åŠå…¶ç”¨äºŽæ ‡è¯†è§‚察者和 RDONLY 状æ€çš„两个环境å˜é‡æ˜¯è¾ƒ +æ–°ç‰ˆæœ¬å†…æ ¸å¼•å…¥çš„åŠŸèƒ½ï¼ˆ2.6.32-rc+ åŠä»¥ä¸Šï¼‰ï¼Œæ—§ç‰ˆæœ¬å†…æ ¸ä¸ä¼šç”Ÿæˆæ¤äº‹ä»¶ã€‚ + +3. CHANGE +--------- + +CHANGE uevent 在两ç§åœºæ™¯ä¸‹ä½¿ç”¨ã€‚一是报告第一个节点æˆåŠŸæŒ‚è½½æ–‡ä»¶ç³»ç»Ÿæ—¶ +(FIRSTMOUNT=Done)。这作为信å·å‘ŠçŸ¥ gfs_controldï¼Œæ¤æ—¶é›†ç¾¤ä¸å…¶ä»–节点å¯ä»¥ +安全挂载该文件系统。 + +å¦ä¸€ä¸ª CHANGE uevent 用于通知文件系统æŸä¸ªæ—¥å¿—的日志æ¢å¤å·²å®Œæˆã€‚它包å«ä¸¤ä¸ª +环境å˜é‡ï¼šJID= 指定刚æ¢å¤çš„æ—¥å¿— ID,RECOVERY=[Done|Failed] 表示æ“ä½œæˆ +功与å¦ã€‚这些 uevent ä¼šåœ¨æ¯æ¬¡æ—¥å¿—æ¢å¤æ—¶ç”Ÿæˆï¼Œæ— 论是在åˆå§‹æŒ‚载过程ä¸ï¼Œè¿˜æ˜¯ +gfs_controld 通过 /sys/fs/gfs2/<fsname>/lock_module/recovery 文件 +请求特定日志æ¢å¤çš„结果。 + +由于早期版本的 gfs_controld 使用 CHANGE uevent 时未检查环境å˜é‡ä»¥ç¡®å®šçж +æ€ï¼Œè‹¥ä¸ºå…¶æ·»åŠ æ–°åŠŸèƒ½ï¼Œå˜åœ¨ç”¨æˆ·å·¥å…·ç‰ˆæœ¬è¿‡æ—§å¯¼è‡´é›†ç¾¤æ•…éšœçš„é£Žé™©ã€‚å› æ¤ï¼Œåœ¨æ–°å¢žç”¨ +äºŽæ ‡è¯†æˆåŠŸæŒ‚è½½æˆ–é‡æ–°æŒ‚载的 uevent 时,选择了使用 ONLINE uevent。 + +4. OFFLINE +---------- + +OFFLINE uevent 仅在文件系统å‘生错误时生æˆï¼Œæ˜¯ "withdraw" 机制的一部分。 +当å‰è¯¥äº‹ä»¶æœªæä¾›å…·ä½“错误信æ¯ï¼Œæ¤é—®é¢˜æœ‰å¾…ä¿®å¤ã€‚ + +5. REMOVE +--------- + +REMOVE uevent åœ¨æŒ‚è½½å¤±è´¥ç»“æŸæˆ–å¸è½½æ–‡ä»¶ç³»ç»Ÿæ—¶ç”Ÿæˆã€‚所有 REMOVE uevent +之å‰éƒ½è‡³å°‘å˜åœ¨åŒä¸€æ–‡ä»¶ç³»ç»Ÿçš„ ADD uevent。与其他 uevent ä¸åŒï¼Œå®ƒç”±å†…æ ¸çš„ +kobject å系统自动生æˆã€‚ + + +所有 GFS2 uevents 的通用信æ¯ï¼ˆuevent 环境å˜é‡ï¼‰ +=============================================== + +1. LOCKTABLE= +-------------- + +LOCKTABLE 是一个å—ç¬¦ä¸²ï¼Œå…¶å€¼æ¥æºäºŽæŒ‚载命令行(locktable=)或 fstab 文件。 +å®ƒç”¨ä½œæ–‡ä»¶ç³»ç»Ÿæ ‡ç¾ï¼Œå¹¶ä¸º lock_dlm 类型的挂载æä¾›åŠ å…¥é›†ç¾¤æ‰€éœ€çš„ä¿¡æ¯ã€‚ + +2. LOCKPROTO= +------------- + +LOCKPROTO 是一个å—符串,其值å–决于挂载命令行或 fstab ä¸çš„设置。其值将是 +lock_nolock 或 lock_dlm。未æ¥å¯èƒ½æ”¯æŒå…¶ä»–é”管ç†å™¨ã€‚ + +3. JOURNALID= +------------- + +如果文件系统æ£åœ¨ä½¿ç”¨æ—¥å¿—(观察者挂载ä¸åˆ†é…日志),则所有 GFS2 uevent ä¸éƒ½ +ä¼šåŒ…å«æ¤å˜é‡ï¼Œå…¶å€¼ä¸ºæ•°å—å½¢å¼çš„æ—¥å¿— ID。 + +4. UUID= +-------- + +在较新版本的 gfs2-utils ä¸ï¼Œmkfs.gfs2 ä¼šå‘æ–‡ä»¶ç³»ç»Ÿè¶…级å—写入 UUIDã€‚è‹¥å˜ +在 UUID,所有与该文件系统相关的 uevent ä¸å‡ä¼šåŒ…嫿¤ä¿¡æ¯ã€‚ diff --git a/Documentation/translations/zh_CN/filesystems/gfs2.rst b/Documentation/translations/zh_CN/filesystems/gfs2.rst new file mode 100644 index 000000000000..ffa62b12b019 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/gfs2.rst @@ -0,0 +1,57 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/gfs2.rst + +:翻译: + + 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> + +:æ ¡è¯‘: + + æ¨æ¶› yang tao <yang.tao172@zte.com.cn> + +===================================== +全局文件系统 2 (Global File System 2) +===================================== + +GFS2 是一个集群文件系统。它å…è®¸ä¸€ç»„è®¡ç®—æœºåŒæ—¶ä½¿ç”¨åœ¨å®ƒä»¬ä¹‹é—´å…±äº«çš„å—设备(通 +过 FCã€iSCSIã€NBD ç‰ï¼‰ã€‚GFS2 åƒæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸€æ ·è¯»å†™å—è®¾å¤‡ï¼Œä½†ä¹Ÿä½¿ç”¨ä¸€ä¸ªé” +æ¨¡å—æ¥è®©è®¡ç®—机å调它们的 I/O æ“作,从而维护文件系统的一致性。GFS2 的出色特 +æ€§ä¹‹ä¸€æ˜¯å®Œç¾Žä¸€è‡´æ€§â€”â€”åœ¨ä¸€å°æœºå™¨ä¸Šå¯¹æ–‡ä»¶ç³»ç»Ÿæ‰€åšçš„æ›´æ”¹ä¼šç«‹å³æ˜¾ç¤ºåœ¨é›†ç¾¤ä¸çš„æ‰€ +有其他机器上。 + +GFS2 使用å¯äº’æ¢çš„节点间é”å®šæœºåˆ¶ï¼Œå½“å‰æ”¯æŒçš„æœºåˆ¶æœ‰ï¼š + + lock_nolock + - å…许将 GFS2 用作本地文件系统 + + lock_dlm + - 使用分布å¼é”管ç†å™¨ (dlm) 进行节点间é”定。 + 该 dlm ä½äºŽ linux/fs/dlm/ + +lock_dlm ä¾èµ–于在上述 URL 䏿‰¾åˆ°çš„用户空间集群管ç†ç³»ç»Ÿã€‚ + +è‹¥è¦å°† GFS2 用作本地文件系统,则ä¸éœ€è¦å¤–部集群系统,åªéœ€ï¼š: + + $ mkfs -t gfs2 -p lock_nolock -j 1 /dev/block_device + $ mount -t gfs2 /dev/block_device /dir + +在所有集群节点上都需è¦å®‰è£… gfs2-utils 软件包;对于 lock_dlmï¼Œæ‚¨è¿˜éœ€è¦æŒ‰ +照文档é…ç½® dlm å’Œ corosync 用户空间工具。 + +gfs2-utils å¯åœ¨ https://pagure.io/gfs2-utils 找到。 + +GFS2 在ç£ç›˜æ ¼å¼ä¸Šä¸Žæ—©æœŸç‰ˆæœ¬çš„ GFS ä¸å…¼å®¹ï¼Œä½†å®ƒå·²ç›¸å½“接近。 + +以下手册页 (man pages) å¯åœ¨ gfs2-utils 䏿‰¾åˆ°ï¼š + + ============ ============================================= + fsck.gfs2 ç”¨äºŽä¿®å¤æ–‡ä»¶ç³»ç»Ÿ + gfs2_grow 用于在线扩展文件系统 + gfs2_jadd ç”¨äºŽåœ¨çº¿å‘æ–‡ä»¶ç³»ç»Ÿæ·»åŠ æ—¥å¿— + tunegfs2 用于æ“ä½œã€æ£€æŸ¥å’Œè°ƒä¼˜æ–‡ä»¶ç³»ç»Ÿ + gfs2_convert 用于将 gfs 文件系统原地转æ¢ä¸º GFS2 + mkfs.gfs2 用于创建文件系统 + ============ ============================================= diff --git a/Documentation/translations/zh_CN/filesystems/index.rst b/Documentation/translations/zh_CN/filesystems/index.rst index 9f2a8b003778..fcc79ff9fdad 100644 --- a/Documentation/translations/zh_CN/filesystems/index.rst +++ b/Documentation/translations/zh_CN/filesystems/index.rst @@ -15,6 +15,16 @@ Linux Kernelä¸çš„æ–‡ä»¶ç³»ç»Ÿ 文件系统(VFS)层以åŠåŸºäºŽå…¶ä¸Šçš„å„ç§æ–‡ä»¶ç³»ç»Ÿå¦‚何工作呈现给大家。当å‰\ å¯ä»¥çœ‹åˆ°ä¸‹é¢çš„内容。 +æ ¸å¿ƒ VFS 文档 +============= + +有关 VFS 层本身以åŠå…¶ç®—法工作方å¼çš„æ–‡æ¡£ï¼Œè¯·å‚阅这些手册。 + +.. toctree:: + :maxdepth: 1 + + dnotify + 文件系统 ======== @@ -26,4 +36,9 @@ Linux Kernelä¸çš„æ–‡ä»¶ç³»ç»Ÿ virtiofs debugfs tmpfs - + ubifs + ubifs-authentication + gfs2 + gfs2-uevents + gfs2-glocks + inotify diff --git a/Documentation/translations/zh_CN/filesystems/inotify.rst b/Documentation/translations/zh_CN/filesystems/inotify.rst new file mode 100644 index 000000000000..b4d740aca946 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/inotify.rst @@ -0,0 +1,80 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/inotify.rst + +:翻译: + + çŽ‹é¾™æ° Wang Longjie <wang.longjie1@zte.com.cn> + +========================================== +Inotify - 一个强大且简å•çš„æ–‡ä»¶å˜æ›´é€šçŸ¥ç³»ç»Ÿ +========================================== + + + +文档由 Robert Love <rml@novell.com> 于 2005 å¹´ 3 月 15 日开始撰写 + +文档由 Zhang Zhen <zhenzhang.zhang@huawei.com> 于 2015 å¹´ 1 月 4 日更新 + + - åˆ é™¤äº†å·²åºŸå¼ƒçš„æŽ¥å£ï¼Œå…³äºŽç”¨æˆ·æŽ¥å£è¯·å‚考手册页。 + +(i) åŸºæœ¬åŽŸç† + +问: + ä¸å°†ç›‘控项与被监控对象打开的文件æè¿°ç¬¦ï¼ˆfd)绑定,这背åŽçš„è®¾è®¡å†³ç–æ˜¯ä»€ä¹ˆï¼Ÿ + +ç”: + 监控项会与打开的 inotify 设备相关è”,而éžä¸Žæ‰“开的文件相关è”。这解决了 dnotify 的主è¦é—®é¢˜ï¼š + ä¿æŒæ–‡ä»¶æ‰“开会é”定文件,更糟的是,还会é”å®šæŒ‚è½½ç‚¹ã€‚å› æ¤ï¼Œdnotify 在带有å¯ç§»åŠ¨ä»‹è´¨çš„æ¡Œé¢ç³»ç»Ÿ + ä¸Šéš¾ä»¥ä½¿ç”¨ï¼Œå› ä¸ºä»‹è´¨å°†æ— æ³•è¢«å¸è½½ã€‚监控文件ä¸åº”è¦æ±‚文件处于打开状æ€ã€‚ + +问: + 与æ¯ä¸ªç›‘控项一个文件æè¿°ç¬¦çš„æ–¹å¼ç›¸æ¯”,采用æ¯ä¸ªå®žä¾‹ä¸€ä¸ªæ–‡ä»¶æè¿°ç¬¦çš„è®¾è®¡å†³ç–æ˜¯å‡ºäºŽä»€ä¹ˆ + 考虑? + +ç”: + æ¯ä¸ªç›‘控项一个文件æè¿°ç¬¦ä¼šå¾ˆå¿«çš„æ¶ˆè€—掉超出å…许数é‡çš„æ–‡ä»¶æè¿°ç¬¦ï¼Œå…¶æ•°é‡ä¼šè¶…出实际å¯ç®¡ç†çš„范 + 围,也会超出 select() 能高效处ç†çš„范围。诚然,root 用户å¯ä»¥æé«˜æ¯ä¸ªè¿›ç¨‹çš„æ–‡ä»¶æè¿°ç¬¦é™åˆ¶ï¼Œ + 用户也å¯ä»¥ä½¿ç”¨ epollï¼Œä½†åŒæ—¶è¦æ±‚这两者是ä¸åˆç†ä¸”å¤šä½™çš„ã€‚ä¸€ä¸ªç›‘æŽ§é¡¹æ‰€æ¶ˆè€—çš„å†…å˜æ¯”一个打开的文 + ä»¶è¦å°‘ï¼Œå› æ¤å°†è¿™ä¸¤ä¸ªæ•°é‡ç©ºé—´åˆ†å¼€æ˜¯åˆç†çš„。当å‰çš„è®¾è®¡æ£æ˜¯ç”¨æˆ·ç©ºé—´å¼€å‘者所期望的:用户åªéœ€åˆå§‹ + 化一次 inotifyï¼Œç„¶åŽæ·»åŠ n 个监控项,而这åªéœ€è¦ä¸€ä¸ªæ–‡ä»¶æè¿°ç¬¦ï¼Œæ— 需调整文件æè¿°ç¬¦é™åˆ¶ã€‚åˆ + 始化 inotify 实例åˆå§‹åŒ–ä¸¤åƒæ¬¡æ˜¯å¾ˆè’谬的。如果我们能够简æ´åœ°å®žçŽ°ç”¨æˆ·ç©ºé—´çš„å好——而且我们 + 确实å¯ä»¥ï¼Œidr 层让这类事情å˜å¾—轻而易举——那么我们就应该这么åšã€‚ + + 还有其他åˆç†çš„ç†ç”±ã€‚å¦‚æžœåªæœ‰ä¸€ä¸ªæ–‡ä»¶æè¿°ç¬¦ï¼Œé‚£å°±åªéœ€è¦åœ¨è¯¥æè¿°ç¬¦ä¸Šé˜»å¡žï¼Œå®ƒå¯¹åº”ç€ä¸€ä¸ªäº‹ä»¶é˜Ÿåˆ—。 + 这个å•一文件æè¿°ç¬¦ä¼šè¿”回所有的监控事件以åŠä»»ä½•å¯èƒ½çš„带外数æ®ã€‚而如果æ¯ä¸ªæ–‡ä»¶æè¿°ç¬¦éƒ½æ˜¯ä¸€ä¸ªç‹¬ + 立的监控项, + + - å°†æ— æ³•çŸ¥æ™“äº‹ä»¶çš„é¡ºåºã€‚文件 foo 和文件 bar 上的事件会触å‘两个文件æè¿°ç¬¦ä¸Šçš„ poll(), + ä½†æ— æ³•åˆ¤æ–哪个事件先å‘生。而用å•个队列就å¯ä»¥å¾ˆå®¹æ˜“çš„æä¾›äº‹ä»¶çš„顺åºã€‚è¿™ç§é¡ºåºå¯¹çŽ°æœ‰çš„åº”ç”¨ç¨‹ + åºï¼ˆå¦‚ Beagle)至关é‡è¦ã€‚想象一下,如果“mv a b ; mv b aâ€è¿™æ ·çš„事件没有顺åºä¼šæ˜¯ä»€ä¹ˆ + 情况。 + + - 我们将ä¸å¾—ä¸ç»´æŠ¤ n 个文件æè¿°ç¬¦å’Œ n 个带有状æ€çš„å†…éƒ¨é˜Ÿåˆ—ï¼Œè€Œä¸æ˜¯ä»…仅一个。这在 kernel ä¸ + 会混乱得多。å•个线性队列是åˆç†çš„æ•°æ®ç»“构。 + + - 用户空间开å‘者更é’ç当å‰çš„ API。例如,Beagle 的开å‘者们就很喜欢它。相信我,我问过他们。 + 这并ä¸å¥‡æ€ªï¼šè°ä¼šæƒ³é€šè¿‡ select æ¥ç®¡ç†ä»¥åŠé˜»å¡žåœ¨ 1000 个文件æè¿°ç¬¦ä¸Šå‘¢ï¼Ÿ + + - æ— æ³•èŽ·å–带外数æ®ã€‚ + + - 1024 这个数é‡ä»ç„¶å¤ªå°‘。 ;-) + + 当è¦è®¾è®¡ä¸€ä¸ªå¯æ‰©å±•到数åƒä¸ªç›®å½•çš„æ–‡ä»¶å˜æ›´é€šçŸ¥ç³»ç»Ÿæ—¶ï¼Œå¤„ç†æ•°åƒä¸ªæ–‡ä»¶æè¿°ç¬¦ä¼¼ä¹Žå¹¶ä¸æ˜¯åˆé€‚的接å£ã€‚ + 这太ç¹ç了。 + + æ¤å¤–,创建多个实例ã€å¤„ç†å¤šä¸ªé˜Ÿåˆ—以åŠç›¸åº”的多个文件æè¿°ç¬¦æ˜¯å¯è¡Œçš„。ä¸å¿…是æ¯ä¸ªè¿›ç¨‹å¯¹åº”一个文件æ + 述符;而是æ¯ä¸ªé˜Ÿåˆ—对应一个文件æè¿°ç¬¦ï¼Œä¸€ä¸ªè¿›ç¨‹å®Œå…¨å¯èƒ½éœ€è¦å¤šä¸ªé˜Ÿåˆ—。 + +问: + 为什么采用系统调用的方å¼ï¼Ÿ + +ç”: + ç³Ÿç³•çš„ç”¨æˆ·ç©ºé—´æŽ¥å£æ˜¯ dnotify 的第二大问题。信å·å¯¹äºŽæ–‡ä»¶é€šçŸ¥æ¥è¯´æ˜¯ä¸€ç§éžå¸¸ç³Ÿç³•的接å£ã€‚其实对 + 于其他任何事情,信å·ä¹Ÿéƒ½ä¸æ˜¯å¥½çš„æŽ¥å£ã€‚从å„个角度æ¥çœ‹ï¼Œç†æƒ³çš„解决方案是基于文件æè¿°ç¬¦çš„,它å…许 + 基本的文件 I/O æ“ä½œä»¥åŠ poll/select æ“ä½œã€‚èŽ·å–æ–‡ä»¶æè¿°ç¬¦å’Œç®¡ç†ç›‘控项既å¯ä»¥é€šè¿‡è®¾å¤‡æ–‡ä»¶æ¥ + 实现,也å¯ä»¥é€šè¿‡ä¸€ç³»åˆ—新的系统调用æ¥å®žçŽ°ã€‚æˆ‘ä»¬å†³å®šé‡‡ç”¨ä¸€ç³»åˆ—ç³»ç»Ÿè°ƒç”¨ï¼Œå› ä¸ºè¿™æ˜¯æä¾›æ–°çš„å†…æ ¸æŽ¥å£ + 的首选方法。两者之间唯一真æ£çš„区别在于,我们是想使用 open(2) å’Œ ioctl(2)ï¼Œè¿˜æ˜¯æƒ³ä½¿ç”¨å‡ + 个新的系统调用。系统调用比 ioctl 更有优势。 diff --git a/Documentation/translations/zh_CN/filesystems/ubifs-authentication.rst b/Documentation/translations/zh_CN/filesystems/ubifs-authentication.rst new file mode 100644 index 000000000000..0e7cf7707e26 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/ubifs-authentication.rst @@ -0,0 +1,354 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/ubifs-authentication.rst + +:翻译: + + 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> + +:æ ¡è¯‘: + + æ¨æ¶› yang tao <yang.tao172@zte.com.cn> + +============= +UBIFSè®¤è¯æ”¯æŒ +============= + +引言 +==== +UBIFS 利用 fscrypt æ¡†æž¶ä¸ºæ–‡ä»¶å†…å®¹åŠæ–‡ä»¶åæä¾›ä¿å¯†æ€§ã€‚è¿™èƒ½é˜²æ¢æ”»å‡»è€…在å•一 +æ—¶é—´ç‚¹è¯»å–æ–‡ä»¶ç³»ç»Ÿå†…容的攻击行为。典型案例是智能手机丢失时,攻击者若没有文件 +ç³»ç»Ÿè§£å¯†å¯†é’¥åˆ™æ— æ³•è¯»å–设备上的个人数æ®ã€‚ + +在现阶段,UBIFS åŠ å¯†å°šä¸èƒ½é˜²æ¢æ”»å‡»è€…篡改文件系统内容åŽç”¨æˆ·ç»§ç»ä½¿ç”¨è®¾å¤‡çš„æ”» +å‡»åœºæ™¯ã€‚è¿™ç§æƒ…况下,攻击者å¯ä»»æ„修改文件系统内容而ä¸è¢«ç”¨æˆ·å¯Ÿè§‰ã€‚例如修改二 +è¿›åˆ¶æ–‡ä»¶ä½¿å…¶æ‰§è¡Œæ—¶è§¦å‘æ¶æ„行为 [DMC-CBC-ATTACK]。由于 UBIFS 大部分文件 +系统元数æ®ä»¥æ˜Žæ–‡å˜å‚¨ï¼Œä½¿å¾—文件替æ¢å’Œå†…容篡改å˜å¾—相当容易。 + +å…¶ä»–å…¨ç›˜åŠ å¯†ç³»ç»Ÿï¼ˆå¦‚ dm-crypt)å¯ä»¥è¦†ç›–所有文件系统元数æ®ï¼Œè¿™ç±»ç³»ç»Ÿè™½ç„¶èƒ½ +å¢žåŠ è¿™ç§æ”»å‡»çš„难度,但特别是当攻击者能多次访问设备时,也有å¯èƒ½å®žçŽ°æ”»å‡»ã€‚å¯¹äºŽ +基于 Linux å— IO 层的 dm-crypt ç‰æ–‡ä»¶ç³»ç»Ÿï¼Œå¯é€šè¿‡ dm-integrity 或 +dm-verity å系统[DM-INTEGRITY, DM-VERITY]在å—层实现完整数æ®è®¤è¯ï¼Œè¿™äº› +功能也å¯ä¸Ž dm-crypt 结åˆä½¿ç”¨[CRYPTSETUP2]。 + +本文æè¿°ä¸€ç§ä¸º UBIFS 实现文件内容认è¯å’Œå®Œæ•´å…ƒæ•°æ®è®¤è¯çš„æ–¹æ³•。由于 UBIFS +使用 fscrypt 进行文件内容和文件ååŠ å¯†ï¼Œè®¤è¯ç³»ç»Ÿå¯ä¸Ž fscrypt 集æˆä»¥åˆ©ç”¨å¯† +钥派生ç‰çŽ°æœ‰åŠŸèƒ½ã€‚ä½†ç³»ç»ŸåŒæ—¶ä¹Ÿåº”支æŒåœ¨ä¸å¯ç”¨åŠ å¯†çš„æƒ…å†µä¸‹ä½¿ç”¨ UBIFS 认è¯ã€‚ + + +MTD, UBI & UBIFS +---------------- +在 Linux ä¸ï¼ŒMTDï¼ˆå†…å˜æŠ€æœ¯è®¾å¤‡ï¼‰å系统æä¾›è®¿é—®è£¸é—ªå˜è®¾å¤‡çš„统一接å£ã€‚è¿è¡ŒäºŽ +MTD 之上的é‡è¦å系统是 UBIï¼ˆæ— åºå—æ˜ åƒï¼‰ï¼Œå®ƒä¸ºé—ªå˜è®¾å¤‡æä¾›å·ç®¡ç†åŠŸèƒ½ï¼Œç±»ä¼¼ +于å—设备的 LVM。æ¤å¤–,UBI 还处ç†é—ªå˜ç‰¹æœ‰çš„磨æŸå‡è¡¡å’Œé€æ˜Ž I/O 错误处ç†ã€‚ +UBI å‘上层æä¾›é€»è¾‘擦除å—(LEB)ï¼Œå¹¶é€æ˜Žåœ°æ˜ 射到闪å˜çš„ç‰©ç†æ“¦é™¤å—(PEB)。 + +UBIFS 是è¿è¡ŒäºŽ UBI ä¹‹ä¸Šçš„è£¸é—ªå˜æ–‡ä»¶ç³»ç»Ÿã€‚å› æ¤ UBI 处ç†ç£¨æŸå‡è¡¡å’Œéƒ¨åˆ†é—ªå˜ +特性,而 UBIFSä¸“æ³¨äºŽå¯æ‰©å±•æ€§ã€æ€§èƒ½å’Œå¯æ¢å¤æ€§ã€‚ + +:: + + +------------+ +*******+ +-----------+ +-----+ + | | * UBIFS * | UBI-BLOCK | | ... | + | JFFS/JFFS2 | +*******+ +-----------+ +-----+ + | | +-----------------------------+ +-----------+ +-----+ + | | | UBI | | MTD-BLOCK | | ... | + +------------+ +-----------------------------+ +-----------+ +-----+ + +------------------------------------------------------------------+ + | MEMORY TECHNOLOGY DEVICES (MTD) | + +------------------------------------------------------------------+ + +-----------------------------+ +--------------------------+ +-----+ + | NAND DRIVERS | | NOR DRIVERS | | ... | + +-----------------------------+ +--------------------------+ +-----+ + + 图1:处ç†è£¸é—ªå˜çš„ Linux å†…æ ¸å系统 + + + +UBIFS 内部维护多个æŒä¹…化在闪å˜ä¸Šçš„æ•°æ®ç»“构: + +- *索引*:å˜å‚¨åœ¨é—ªå˜ä¸Šçš„ B+ æ ‘ï¼Œå¶èŠ‚ç‚¹åŒ…å«æ–‡ä»¶ç³»ç»Ÿæ•°æ® +- *日志*:在更新闪å˜ç´¢å¼•剿”¶é›†æ–‡ä»¶ç³»ç»Ÿå˜æ›´çš„辅助数æ®ç»“构,å¯å‡å°‘é—ªå˜ç£¨æŸ +- *æ ‘èŠ‚ç‚¹ç¼“å˜(TNC)*ï¼šåæ˜ 当剿–‡ä»¶ç³»ç»Ÿçжæ€çš„å†…å˜ B+ æ ‘ï¼Œé¿å…频ç¹è¯»å–é—ªå˜ã€‚ + 本质上是索引的内å˜è¡¨ç¤ºï¼Œä½†åŒ…å«é¢å¤–属性 +- *LEBå±žæ€§æ ‘(LPT)*:用于统计æ¯ä¸ª UBI LEB 空闲空间的闪å˜B+æ ‘ + +本节åŽç»å°†è¯¦ç»†è®¨è®ºUBIFSçš„é—ªå˜æ•°æ®ç»“æž„ã€‚å› ä¸º TNC ä¸ç›´æŽ¥æŒä¹…化到闪å˜ï¼Œå…¶åœ¨æ¤ +处的é‡è¦æ€§è¾ƒä½Žã€‚更多 UBIFS 细节详è§[UBIFS-WP]。 + + +UBIFS ç´¢å¼•ä¸Žæ ‘èŠ‚ç‚¹ç¼“å˜ +~~~~~~~~~~~~~~~~~~~~~~ + +UBIFS 在闪å˜ä¸Šçš„基础实体称为 *节点* ,包å«å¤šç§ç±»åž‹ã€‚如å˜å‚¨æ–‡ä»¶å†…容å—çš„æ•°æ® +节点 +( ``struct ubifs_data_node`` ),或表示 VFS 索引节点的 inode 节点 +( ``struct ubifs_ino_node`` )ã€‚å‡ ä¹Žæ‰€æœ‰èŠ‚ç‚¹å…±äº«åŒ…å«èŠ‚ç‚¹ç±»åž‹ã€é•¿åº¦ã€åºåˆ— +å·ç‰åŸºç¡€ä¿¡æ¯çš„通用头 +( ``ubifs_ch`` )(è§å†…æ ¸æºç ``fs/ubifs/ubifs-media.h`` )。LPTæ¡ç›® +和填充节点(用于填充 LEB +尾部ä¸å¯ç”¨ç©ºé—´ï¼‰ç‰æ¬¡è¦èŠ‚ç‚¹ç±»åž‹é™¤å¤–ã€‚ + +为é¿å…æ¯æ¬¡å˜æ›´é‡å†™æ•´ä¸ª B+ æ ‘ï¼ŒUBIFS 采用 *wandering tree* 实现:仅é‡å†™ +å˜æ›´èŠ‚ç‚¹ï¼Œæ—§ç‰ˆæœ¬è¢«æ ‡è®°åºŸå¼ƒè€Œéžç«‹å³æ“¦é™¤ã€‚å› æ¤ç´¢å¼•ä¸å›ºå®šå˜å‚¨äºŽé—ªå˜æŸå¤„,而是在 +é—ªå˜ä¸Š *wanders* ,在 LEB 被 UBIFS é‡ç”¨å‰ï¼Œé—ªå˜ä¸Šä¼šå˜åœ¨åºŸå¼ƒéƒ¨åˆ†ã€‚ä¸ºå®šä½ +最新索引,UBIFS 在 UBI LEB 1 å˜å‚¨ç§°ä¸º *主节点* çš„ç‰¹æ®ŠèŠ‚ç‚¹ï¼Œå§‹ç»ˆæŒ‡å‘æœ€æ–° +UBIFS ç´¢å¼•æ ¹èŠ‚ç‚¹ã€‚ä¸ºå¢žå¼ºå¯æ¢å¤æ€§ï¼Œä¸»èŠ‚ç‚¹è¿˜å¤‡ä»½åˆ° LEB 2ã€‚å› æ¤æŒ‚è½½ UBIFS åª +éœ€è¯»å– LEB 1 å’Œ 2 获å–当å‰ä¸»èŠ‚ç‚¹ï¼Œè¿›è€Œå®šä½æœ€æ–°é—ªå˜ç´¢å¼•。 + +TNC 是闪å˜ç´¢å¼•的内å˜è¡¨ç¤ºï¼ŒåŒ…嫿œªæŒä¹…化的è¿è¡Œæ—¶å±žæ€§ï¼ˆå¦‚è„æ ‡è®°ï¼‰ã€‚TNC 作为回 +写å¼ç¼“å˜ï¼Œæ‰€æœ‰é—ªå˜ç´¢å¼•修改都通过 TNC 完æˆã€‚与其他缓å˜ç±»ä¼¼ï¼ŒTNC æ— éœ€å°†å®Œæ•´ +ç´¢å¼•å…¨éƒ¨åŠ è½½åˆ°å†…å˜ä¸ï¼Œéœ€è¦æ—¶ä»Žé—ªå˜è¯»å–部分内容。 *æäº¤* æ˜¯æ›´æ–°é—ªå˜æ–‡ä»¶ç³»ç»Ÿ +结构(如索引)的 UBIFS æ“ä½œã€‚æ¯æ¬¡æäº¤æ—¶ï¼Œæ ‡è®°ä¸ºè„çš„ TNC 节点被写入闪å˜ä»¥æ›´ +æ–°æŒä¹…化索引。 + + +日志 +~~~~ + +为é¿å…é—ªå˜ç£¨æŸï¼Œç´¢å¼•仅在满足特定æ¡ä»¶ï¼ˆå¦‚ ``fsync(2)`` ï¼‰æ—¶æ‰æŒä¹…化(æäº¤ï¼‰ã€‚ +日志用于记录索引æäº¤ä¹‹é—´çš„æ‰€æœ‰å˜æ›´ï¼ˆä»¥ inode èŠ‚ç‚¹ã€æ•°æ®èŠ‚ç‚¹ç‰å½¢å¼ï¼‰ã€‚挂载时 +从闪å˜è¯»å–æ—¥å¿—å¹¶é‡æ”¾åˆ° TNCï¼ˆæ¤æ—¶ TNC 按需从闪å˜ç´¢å¼•创建)。 + +UBIFS ä¿ç•™ä¸€ç»„专用于日志的 LEB(称为 *日志区* )。日志区 LEB æ•°é‡åœ¨æ–‡ä»¶ç³» +统创建时é…置(使用 ``mkfs.ubifs`` )并å˜å‚¨äºŽè¶…级å—节点。日志区仅å«ä¸¤ç±»èŠ‚ +点: *引用节点* å’Œ *æäº¤èµ·å§‹èŠ‚ç‚¹* 。执行索引æäº¤æ—¶å†™å…¥æäº¤èµ·å§‹èŠ‚ç‚¹ï¼Œæ¯æ¬¡æ—¥ +志更新时写入引用节点。æ¯ä¸ªå¼•ç”¨èŠ‚ç‚¹æŒ‡å‘æž„æˆæ—¥å¿—æ¡ç›®çš„其他节点( inode 节点〠+æ•°æ®èŠ‚ç‚¹ç‰ï¼‰åœ¨é—ªå˜ä¸Šçš„ä½ç½®ï¼Œè¿™äº›èŠ‚ç‚¹ç§°ä¸º *bud* ,æè¿°åŒ…嫿•°æ®çš„实际文件系 +ç»Ÿå˜æ›´ã€‚ + +æ—¥å¿—åŒºä»¥çŽ¯å½¢ç¼“å†²åŒºç»´æŠ¤ã€‚å½“æ—¥å¿—å°†æ»¡æ—¶è§¦å‘æäº¤æ“ä½œï¼ŒåŒæ—¶å†™å…¥æäº¤èµ·å§‹èŠ‚ç‚¹ã€‚å› æ¤ +挂载时 UBIFS 查找最新æäº¤èµ·å§‹èŠ‚ç‚¹ï¼Œä»…é‡æ”¾å…¶åŽçš„引用节点。æäº¤èµ·å§‹èŠ‚ç‚¹å‰çš„引 +ç”¨èŠ‚ç‚¹å°†è¢«å¿½ç•¥ï¼ˆå› å…¶å·²å±žäºŽé—ªå˜ç´¢å¼•)。 + +写入日志æ¡ç›®æ—¶ï¼ŒUBIFS é¦–å…ˆç¡®ä¿æœ‰è¶³å¤Ÿç©ºé—´å†™å…¥å¼•用节点和该æ¡ç›®çš„ bud。然åŽå…ˆ +写引用节点,å†å†™æè¿°æ–‡ä»¶å˜æ›´çš„ budã€‚åœ¨æ—¥å¿—é‡æ”¾é˜¶æ®µï¼ŒUBIFS 会记录æ¯ä¸ªå‚考节 +点,并检查其引用的 LEBä½ç½®ä»¥å®šä½ budsã€‚è‹¥è¿™äº›æ•°æ®æŸå或丢失,UBIFS 会å°è¯• +é€šè¿‡é‡æ–°è¯»å– LEB æ¥æ¢å¤ï¼Œä½†ä»…é’ˆå¯¹æ—¥å¿—ä¸æœ€åŽå¼•用的 LEBï¼Œå› ä¸ºåªæœ‰å®ƒå¯èƒ½å› æ– +电而æŸå。若æ¢å¤å¤±è´¥ï¼ŒUBIFS å°†æ‹’ç»æŒ‚载。对于其他 LEB 的错误,UBIFS 会直接 +ç»ˆæ¢æŒ‚è½½æ“作。 + +:: + + | ---- LOG AREA ---- | ---------- MAIN AREA ------------ | + + -----+------+-----+--------+---- ------+-----+-----+--------------- + \ | | | | / / | | | \ + / CS | REF | REF | | \ \ DENT | INO | INO | / + \ | | | | / / | | | \ + ----+------+-----+--------+--- -------+-----+-----+---------------- + | | ^ ^ + | | | | + +------------------------+ | + | | + +-------------------------------+ + + + 图2ï¼šåŒ…å«æäº¤èµ·å§‹èŠ‚ç‚¹(CS)和引用节点(REF)的日志区闪å˜å¸ƒå±€ï¼Œå¼•用节点指å‘å« + bud 的主区 + + +LEBå±žæ€§æ ‘/表 +~~~~~~~~~~~~ + +LEB å±žæ€§æ ‘ç”¨äºŽå˜å‚¨æ¯ä¸ª LEB 的信æ¯ï¼ŒåŒ…括 LEB 类型ã€LEB 上的空闲空间和 +*è„空间* (旧空间,废弃内容) [1]_ 的数é‡ã€‚å› ä¸º UBIFS 从ä¸åœ¨å•个 LEB æ·· +åˆå˜å‚¨ç´¢å¼•节点和数æ®èŠ‚ç‚¹ï¼Œæ‰€ä»¥ LEB 的类型至关é‡è¦ï¼Œæ¯ä¸ª LEB 都有特定用途, +这对空闲空间计算éžå¸¸æœ‰å¸®åŠ©ã€‚è¯¦è§[UBIFS-WP]。 + +LEB å±žæ€§æ ‘ä¹Ÿæ˜¯ B+ æ ‘ï¼Œä½†è¿œå°äºŽç´¢å¼•ã€‚å› ä¸ºå…¶ä½“ç§¯å°ï¼Œæ‰€ä»¥æ¯æ¬¡æäº¤æ—¶éƒ½æ•´å—写入, +ä¿å˜ LPT æ˜¯åŽŸåæ“ä½œã€‚ + + +.. [1] 由于LEBåªèƒ½è¿½åР写入ä¸èƒ½è¦†ç›–ï¼Œç©ºé—²ç©ºé—´ï¼ˆå³ LEB 剩余å¯å†™ç©ºé—´ï¼‰ä¸ŽåºŸå¼ƒ + 内容(先å‰å†™å…¥ä½†æœªæ“¦é™¤å‰ä¸èƒ½è¦†ç›–)å˜åœ¨åŒºåˆ«ã€‚ + + +UBIFSè®¤è¯ +========= + +æœ¬ç« ä»‹ç»UBIFS认è¯ï¼Œä½¿UBIFS能验è¯é—ªå˜ä¸Šå…ƒæ•°æ®å’Œæ–‡ä»¶å†…容的真实性与完整性。 + + +å¨èƒæ¨¡åž‹ +-------- + +UBIFS 认è¯å¯æ£€æµ‹ç¦»çº¿æ•°æ®ç¯¡æ”¹ã€‚虽然ä¸èƒ½é˜²æ¢ç¯¡æ”¹ï¼Œä½†æ˜¯èƒ½è®©ï¼ˆå¯ä¿¡ï¼‰ä»£ç 检查闪 +å˜æ–‡ä»¶å†…容和文件系统元数æ®çš„完整性与真实性,也能检查文件内容被替æ¢çš„æ”»å‡»ã€‚ + +UBIFS 认è¯ä¸é˜²æŠ¤å…¨é—ªå˜å†…容回滚(攻击者å¯è½¬å‚¨é—ªå˜å†…å®¹å¹¶åœ¨åŽæœŸè¿˜åŽŸï¼‰ã€‚ä¹Ÿä¸é˜²æŠ¤ +å•个索引æäº¤çš„éƒ¨åˆ†å›žæ»šï¼ˆæ”»å‡»è€…èƒ½éƒ¨åˆ†æ’¤é”€å˜æ›´ï¼‰ã€‚è¿™æ˜¯å› ä¸º UBIFS ä¸ç«‹å³è¦†ç›–ç´¢ +å¼•æ ‘æˆ–æ—¥å¿—çš„æ—§ç‰ˆæœ¬ï¼Œè€Œæ˜¯æ ‡è®°ä¸ºåºŸå¼ƒï¼Œç¨åŽç”±åžƒåœ¾å›žæ”¶æ“¦é™¤ã€‚æ”»å‡»è€…å¯æ“¦é™¤å½“剿 ‘部 +分内容并还原闪å˜ä¸Šå°šæœªæ“¦é™¤çš„æ—§ç‰ˆæœ¬ã€‚å› æ¯æ¬¡æäº¤æ€»ä¼šå†™å…¥ç´¢å¼•æ ¹èŠ‚ç‚¹å’Œä¸»èŠ‚ç‚¹çš„æ–° +版本而ä¸è¦†ç›–旧版本,UBI 的磨æŸå‡è¡¡æ“ä½œï¼ˆå°†å†…å®¹ä»Žç‰©ç†æ“¦é™¤å—å¤åˆ¶åˆ°å¦ä¸€æ“¦é™¤å— +且éžåŽŸåæ“¦é™¤åŽŸå—)进一æ¥åŠ©é•¿æ¤é—®é¢˜ã€‚ + +UBIFS 认è¯ä¸è¦†ç›–认è¯å¯†é’¥æä¾›åŽæ”»å‡»è€…在设备执行代ç 的攻击,需结åˆå®‰å…¨å¯åŠ¨å’Œ +å¯ä¿¡å¯åŠ¨ç‰æŽªæ–½ç¡®ä¿è®¾å¤‡ä»…执行å¯ä¿¡ä»£ç 。 + + +è®¤è¯ +---- + +为完全信任从闪å˜è¯»å–的数æ®ï¼Œæ‰€æœ‰å˜å‚¨åœ¨é—ªå˜çš„ UBIFS æ•°æ®ç»“æž„å‡éœ€è®¤è¯ï¼š +- åŒ…å«æ–‡ä»¶å†…å®¹ã€æ‰©å±•å±žæ€§ã€æ–‡ä»¶é•¿åº¦ç‰å…ƒæ•°æ®çš„索引 +- é€šè¿‡è®°å½•æ–‡ä»¶ç³»ç»Ÿå˜æ›´æ¥åŒ…嫿–‡ä»¶å†…容和元数æ®çš„æ—¥å¿— +- å˜å‚¨ UBIFS 用于空闲空间统计的 UBI LEB 元数æ®çš„ LPT + + +ç´¢å¼•è®¤è¯ +~~~~~~~~ + +借助 *wandering tree* 概念,UBIFS ä»…æ›´æ–°å’ŒæŒä¹…化从å¶èŠ‚ç‚¹åˆ°æ ¹èŠ‚ç‚¹çš„å˜æ›´ +部分。这å…许用åèŠ‚ç‚¹å“ˆå¸Œå¢žå¼ºç´¢å¼•æ ‘èŠ‚ç‚¹ã€‚æœ€ç»ˆç´¢å¼•åŸºæœ¬æˆä¸º Merkle æ ‘ï¼šå› ç´¢å¼• +å¶èŠ‚ç‚¹å«å®žé™…文件系统数æ®ï¼Œå…¶çˆ¶ç´¢å¼•节点的哈希覆盖所有文件内容和元数æ®ã€‚文件 +å˜æ›´æ—¶ï¼ŒUBIFS 索引从å¶èŠ‚ç‚¹åˆ°æ ¹èŠ‚ç‚¹ï¼ˆå«ä¸»èŠ‚ç‚¹ï¼‰ç›¸åº”æ›´æ–°ï¼Œæ¤è¿‡ç¨‹å¯æŒ‚é’©ä»¥åŒæ¥ +釿–°è®¡ç®—å„å˜æ›´èŠ‚ç‚¹çš„å“ˆå¸Œã€‚è¯»å–æ–‡ä»¶æ—¶ï¼ŒUBIFS å¯ä»Žå¶èŠ‚ç‚¹åˆ°æ ¹èŠ‚ç‚¹é€çº§éªŒè¯å“ˆå¸Œ +ç¡®ä¿èŠ‚ç‚¹å®Œæ•´æ€§ã€‚ + +ä¸ºç¡®ä¿æ•´ä¸ªç´¢å¼•真实性,UBIFS 主节点å˜å‚¨åŸºäºŽå¯†é’¥çš„哈希(HMAC)ï¼Œè¦†ç›–è‡ªèº«å†…å®¹åŠ +ç´¢å¼•æ ‘æ ¹èŠ‚ç‚¹å“ˆå¸Œã€‚å¦‚å‰æ‰€è¿°ï¼Œä¸»èŠ‚ç‚¹åœ¨ç´¢å¼•æŒä¹…化时(å³ç´¢å¼•æäº¤æ—¶ï¼‰æ€»ä¼šå†™å…¥é—ªå˜ã€‚ + +æ¤æ–¹æ³•仅修改 UBIFS 索引节点和主节点以包å«å“ˆå¸Œï¼Œå…¶ä»–ç±»åž‹èŠ‚ç‚¹ä¿æŒä¸å˜ï¼Œå‡å°‘了 +对 UBIFS 用户(如嵌入å¼è®¾å¤‡ï¼‰å®è´µçš„å˜å‚¨å¼€é”€ã€‚ + +:: + + +---------------+ + | Master Node | + | (hash) | + +---------------+ + | + v + +-------------------+ + | Index Node #1 | + | | + | branch0 branchn | + | (hash) (hash) | + +-------------------+ + | ... | (fanout: 8) + | | + +-------+ +------+ + | | + v v + +-------------------+ +-------------------+ + | Index Node #2 | | Index Node #3 | + | | | | + | branch0 branchn | | branch0 branchn | + | (hash) (hash) | | (hash) (hash) | + +-------------------+ +-------------------+ + | ... | ... | + v v v + +-----------+ +----------+ +-----------+ + | Data Node | | INO Node | | DENT Node | + +-----------+ +----------+ +-----------+ + + + 图3:索引节点哈希与主节点 HMAC 的覆盖范围 + + + +å¥å£®æ€§æ€§å’Œæ–ç”µå®‰å…¨æ€§çš„å…³é”®åœ¨äºŽä»¥åŽŸåæ“ä½œæŒä¹…化哈希值与文件内容。UBIFS 现有 +çš„å˜æ›´èŠ‚ç‚¹æŒä¹…化机制专为æ¤è®¾è®¡ï¼Œèƒ½å¤Ÿç¡®ä¿æ–电时安全æ¢å¤ã€‚ä¸ºç´¢å¼•èŠ‚ç‚¹æ·»åŠ å“ˆå¸Œå€¼ +ä¸ä¼šæ”¹å˜è¯¥æœºåˆ¶ï¼Œå› 为æ¯ä¸ªå“ˆå¸Œå€¼éƒ½ä¸Žå…¶å¯¹åº”èŠ‚ç‚¹ä»¥åŽŸåæ“ä½œåŒæ¥æŒä¹…化。 + + +æ—¥å¿—è®¤è¯ +~~~~~~~~ + +日志也需è¦è®¤è¯ã€‚å› ä¸ºæ—¥å¿—æŒç»å†™å…¥ï¼Œå¿…须频ç¹åœ°æ·»åŠ è®¤è¯ä¿¡æ¯ä»¥ç¡®ä¿æ–ç”µæ—¶æœªè®¤è¯æ•° +æ®é‡å¯æŽ§ã€‚方法是从æäº¤èµ·å§‹èŠ‚ç‚¹å¼€å§‹ï¼Œå¯¹å…ˆå‰å¼•用节点ã€å½“å‰å¼•用节点和 bud 节点 +创建连ç»å“ˆå¸Œé“¾ã€‚适时地在bud节点间æ’入认è¯èŠ‚ç‚¹ï¼Œè¿™ç§æ–°èŠ‚ç‚¹ç±»åž‹åŒ…å«å“ˆå¸Œé“¾å½“å‰ +状æ€çš„ HMACã€‚å› æ¤æ—¥å¿—å¯è®¤è¯è‡³æœ€åŽä¸€ä¸ªè®¤è¯èŠ‚ç‚¹ã€‚æ—¥å¿—å°¾éƒ¨æ— è®¤è¯èŠ‚ç‚¹çš„éƒ¨åˆ†æ— æ³• +认è¯ï¼Œåœ¨æ—¥å¿—釿”¾æ—¶è·³è¿‡ã€‚ + +日志认è¯ç¤ºæ„图如下:: + + ,,,,,,,, + ,......,........................................... + ,. CS , hash1.----. hash2.----. + ,. | , . |hmac . |hmac + ,. v , . v . v + ,.REF#0,-> bud -> bud -> bud.-> auth -> bud -> bud.-> auth ... + ,..|...,........................................... + , | , + , | ,,,,,,,,,,,,,,, + . | hash3,----. + , | , |hmac + , v , v + , REF#1 -> bud -> bud,-> auth ... + ,,,|,,,,,,,,,,,,,,,,,, + v + REF#2 -> ... + | + V + ... + +å› ä¸ºå“ˆå¸Œå€¼åŒ…å«å¼•ç”¨èŠ‚ç‚¹ï¼Œæ”»å‡»è€…æ— æ³•é‡æŽ’æˆ–è·³è¿‡æ—¥å¿—å¤´é‡æ”¾ï¼Œä»…能移除日志尾部的 +bud 节点或引用节点,最大é™åº¦å°†æ–‡ä»¶ç³»ç»Ÿå›žé€€è‡³ä¸Šæ¬¡æäº¤ã€‚ + +日志区ä½ç½®å˜å‚¨äºŽä¸»èŠ‚ç‚¹ã€‚å› ä¸ºä¸»èŠ‚ç‚¹é€šè¿‡ HMAC 认è¯ï¼Œæ‰€ä»¥æœªç»æ£€æµ‹æ— 法篡改。日 +志区大å°åœ¨æ–‡ä»¶ç³»ç»Ÿåˆ›å»ºæ—¶ç”± `mkfs.ubifs` 指定并å˜å‚¨äºŽè¶…级å—节点。为é¿å…篡 +改æ¤å€¼åŠå…¶ä»–傿•°ï¼Œè¶…级å—ç»“æž„æ·»åŠ HMAC。超级å—节点å˜å‚¨åœ¨ LEB 0ï¼Œä»…åœ¨åŠŸèƒ½æ ‡ +å¿—ç‰å˜æ›´æ—¶ä¿®æ”¹ï¼Œæ–‡ä»¶å˜æ›´æ—¶ä¸ä¿®æ”¹ã€‚ + + +LPTè®¤è¯ +~~~~~~~ + +LPT æ ¹èŠ‚ç‚¹åœ¨é—ªå˜ä¸Šçš„ä½ç½®å˜å‚¨äºŽ UBIFS ä¸»èŠ‚ç‚¹ã€‚å› ä¸º LPT æ¯æ¬¡æäº¤æ—¶éƒ½ä»¥åŽŸå +æ“作写入和读å–ï¼Œæ— éœ€å•ç‹¬è®¤è¯æ ‘节点。通过主节点å˜å‚¨çš„简å•å“ˆå¸Œä¿æŠ¤å®Œæ•´ LPT +å³å¯ã€‚å› ä¸ºä¸»èŠ‚ç‚¹è‡ªèº«å·²è®¤è¯ï¼Œé€šè¿‡éªŒè¯ä¸»èŠ‚ç‚¹çœŸå®žæ€§å¹¶æ¯”å¯¹å˜å‚¨çš„ LTP 哈希与读 +å–çš„é—ªå˜ LPT 计算哈希值,å³å¯éªŒè¯ LPT 真实性。 + + +å¯†é’¥ç®¡ç† +-------- + +为了简化实现,UBIFS 认è¯ä½¿ç”¨å•一密钥计算超级å—ã€ä¸»èŠ‚ç‚¹ã€æäº¤èµ·å§‹èŠ‚ç‚¹å’Œå¼•ç”¨ +节点的 HMAC。创建文件系统(`mkfs.ubifs`) 时需æä¾›æ¤å¯†é’¥ä»¥è®¤è¯è¶…级å—节点。 +挂载文件系统时也需æ¤å¯†é’¥éªŒè¯è®¤è¯èŠ‚ç‚¹å¹¶ä¸ºå˜æ›´ç”Ÿæˆæ–° HMAC。 + +UBIFS è®¤è¯æ—¨åœ¨ä¸Ž UBIFS åŠ å¯†(fscrypt)ååŒå·¥ä½œä»¥æä¾›ä¿å¯†æ€§å’ŒçœŸå®žæ€§ã€‚å› ä¸º +UBIFS åŠ å¯†é‡‡ç”¨åŸºäºŽç›®å½•çš„å·®å¼‚åŒ–åŠ å¯†ç–略,å¯èƒ½å˜åœ¨å¤šä¸ª fscrypt 主密钥甚至未 +åŠ å¯†ç›®å½•ã€‚è€Œ UBIFS 认è¯é‡‡ç”¨å…¨æœ‰æˆ–å…¨æ— æ–¹å¼ï¼Œè¦ä¹ˆè®¤è¯æ•´ä¸ªæ–‡ä»¶ç³»ç»Ÿè¦ä¹ˆå®Œå…¨ä¸ +认è¯ã€‚基于æ¤ç‰¹æ€§ï¼Œä¸”为确ä¿è®¤è¯æœºåˆ¶å¯ç‹¬ç«‹äºŽåŠ å¯†åŠŸèƒ½ä½¿ç”¨ï¼ŒUBIFS 认è¯ä¸ä¸Ž +fscrypt 共享主密钥,而是维护独立的认è¯ä¸“用密钥。 + +æä¾›è®¤è¯å¯†é’¥çš„API尚未定义,但å¯é€šè¿‡ç±»ä¼¼ fscrypt 的用户空间密钥环æä¾›ã€‚需注 +æ„å½“å‰ fscrypt 方案å˜åœ¨ç¼ºé™·ï¼Œç”¨æˆ·ç©ºé—´ API ç»ˆå°†å˜æ›´[FSCRYPT-POLICY2]。 + +用户ä»å¯é€šè¿‡ç”¨æˆ·ç©ºé—´æä¾›å•一å£ä»¤æˆ–密钥覆盖 UBIFS 认è¯ä¸ŽåŠ å¯†ã€‚ç›¸åº”ç”¨æˆ·ç©ºé—´å·¥ +å…·å¯è§£å†³æ¤é—®é¢˜ï¼šé™¤æ´¾ç”Ÿçš„ fscrypt åŠ å¯†ä¸»å¯†é’¥å¤–ï¼Œé¢å¤–派生认è¯å¯†é’¥ã€‚ + +为检查挂载时密钥å¯ç”¨æ€§ï¼ŒUBIFS 超级å—节点将é¢å¤–å˜å‚¨è®¤è¯å¯†é’¥çš„å“ˆå¸Œã€‚æ¤æ–¹æ³•ç±» +ä¼¼ fscrypt åŠ å¯†ç–ç•¥ v2 æå‡ºçš„æ–¹æ³•[FSCRYPT-POLICY2]。 + + +æœªæ¥æ‰©å±• +======== + +特定场景下,若供应商需è¦å‘客户æä¾›è®¤è¯æ–‡ä»¶ç³»ç»Ÿé•œåƒï¼Œåº”该能在ä¸å…±äº« UBIFS 认 +è¯å¯†é’¥çš„å‰æä¸‹å®žçŽ°ã€‚æ–¹æ³•æ˜¯åœ¨æ¯ä¸ª HMAC 外é¢å¤–å˜å‚¨æ•°å—ç¾åï¼Œä¾›åº”å•†éšæ–‡ä»¶ç³»ç»Ÿ +镜åƒåˆ†å‘公钥。若该文件系统åŽç»éœ€è¦ä¿®æ”¹ï¼Œè‹¥åŽç»éœ€ä¿®æ”¹è¯¥æ–‡ä»¶ç³»ç»Ÿï¼ŒUBIFS å¯åœ¨ +首次挂载时将全部数å—ç¾å替æ¢ä¸º HMAC,其处ç†é€»è¾‘与 IMA/EVM å系统应对æ¤ç±»æƒ… +况的方å¼ç±»ä¼¼ã€‚æ¤æ—¶ï¼ŒHMAC 密钥需按常规方å¼é¢„å…ˆæä¾›ã€‚ + + +å‚考 +==== + +[CRYPTSETUP2] https://www.saout.de/pipermail/dm-crypt/2017-November/005745.html + +[DMC-CBC-ATTACK] https://www.jakoblell.com/blog/2013/12/22/practical-malleability-attack-against-cbc-en +crypted-luks-partitions/ + +[DM-INTEGRITY] https://www.kernel.org/doc/Documentation/device-mapper/dm-integrity.rst + +[DM-VERITY] https://www.kernel.org/doc/Documentation/device-mapper/verity.rst + +[FSCRYPT-POLICY2] https://www.spinics.net/lists/linux-ext4/msg58710.html + +[UBIFS-WP] http://www.linux-mtd.infradead.org/doc/ubifs_whitepaper.pdf diff --git a/Documentation/translations/zh_CN/filesystems/ubifs.rst b/Documentation/translations/zh_CN/filesystems/ubifs.rst new file mode 100644 index 000000000000..d1873fc6a67c --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/ubifs.rst @@ -0,0 +1,114 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/filesystems/ubifs.rst + +:翻译: + + 邵明寅 Shao Mingyin <shao.mingyin@zte.com.cn> + +:æ ¡è¯‘: + + æ¨æ¶› yang tao <yang.tao172@zte.com.cn> + +============ +UBI 文件系统 +============ + +简介 +==== + +UBIFS 文件系统全称为 UBI 文件系统(UBI File System)。UBI ä»£è¡¨æ— åºå—镜 +åƒï¼ˆUnsorted Block Images)。UBIFS 是一ç§é—ªå˜æ–‡ä»¶ç³»ç»Ÿï¼Œè¿™æ„味ç€å®ƒä¸“为闪 +å˜è®¾å¤‡è®¾è®¡ã€‚需è¦ç†è§£çš„æ˜¯ï¼ŒUBIFS与 Linux ä¸ä»»ä½•ä¼ ç»Ÿæ–‡ä»¶ç³»ç»Ÿï¼ˆå¦‚ Ext2〠+XFSã€JFS ç‰ï¼‰å®Œå…¨ä¸åŒã€‚UBIFS 代表一类特殊的文件系统,它们工作在 MTD 设备 +而éžå—设备上。该类别的å¦ä¸€ä¸ª Linux 文件系统是 JFFS2。 + +为更清晰说明,以下是 MTD 设备与å—è®¾å¤‡çš„ç®€è¦æ¯”较: + +1. MTD 设备代表闪å˜è®¾å¤‡ï¼Œç”±è¾ƒå¤§å°ºå¯¸çš„æ“¦é™¤å—组æˆï¼Œé€šå¸¸çº¦ 128KiB。å—设备由 + å°å—组æˆï¼Œé€šå¸¸ 512 å—节。 +2. MTD è®¾å¤‡æ”¯æŒ 3 ç§ä¸»è¦æ“作:在擦除å—内åç§»ä½ç½®è¯»å–ã€åœ¨æ“¦é™¤å—内åç§»ä½ç½®å†™ + å…¥ã€ä»¥åŠæ“¦é™¤æ•´ä¸ªæ“¦é™¤å—。å—è®¾å¤‡æ”¯æŒ 2 ç§ä¸»è¦æ“ä½œï¼šè¯»å–æ•´ä¸ªå—和写入整个å—。 +3. 整个擦除å—必须先擦除æ‰èƒ½é‡å†™å†…容。å—å¯ç›´æŽ¥é‡å†™ã€‚ +4. 擦除å—在ç»åŽ†ä¸€å®šæ¬¡æ•°çš„æ“¦å†™å‘¨æœŸåŽä¼šç£¨æŸï¼Œé€šå¸¸ SLC NAND å’Œ NOR é—ªå˜ä¸º + 100K-1G 次,MLC NAND é—ªå˜ä¸º 1K-10K 次。å—设备ä¸å…·å¤‡ç£¨æŸç‰¹æ€§ã€‚ +5. 擦除å—å¯èƒ½æŸåï¼ˆä»…é™ NAND é—ªå˜ï¼‰ï¼Œè½¯ä»¶éœ€å¤„ç†æ¤é—®é¢˜ã€‚硬盘上的å—通常ä¸ä¼šæŸ + åï¼Œå› ä¸ºç¡¬ä»¶æœ‰åå—æ›¿æ¢æœºåˆ¶ï¼ˆè‡³å°‘现代 LBA 硬盘如æ¤ï¼‰ã€‚ + +这充分说明了 UBIFS ä¸Žä¼ ç»Ÿæ–‡ä»¶ç³»ç»Ÿçš„æœ¬è´¨å·®å¼‚ã€‚ + +UBIFS 工作在 UBI 层之上。UBI 是一个独立的软件层(ä½äºŽ drivers/mtd/ubi), +本质上是å·ç®¡ç†å’Œç£¨æŸå‡è¡¡å±‚。它æä¾›ç§°ä¸º UBI å·çš„高级抽象,比 MTD 设备更上层。 +UBI 设备的编程模型与 MTD 设备éžå¸¸ç›¸ä¼¼ï¼Œä»ç”±å¤§å®¹é‡æ“¦é™¤å—组æˆï¼Œæ”¯æŒè¯»/写/擦 +除æ“作,但 UBI 设备消除了磨æŸå’Œåå—é™åˆ¶ï¼ˆä¸Šè¿°åˆ—表的第 4 和第 5 项)。 + +æŸç§æ„义上,UBIFS 是 JFFS2 文件系统的下一代产å“,但它与 JFFS2 差异巨大且 +ä¸å…¼å®¹ã€‚主è¦åŒºåˆ«å¦‚下: + +* JFFS2 工作在 MTD 设备之上,UBIFS ä¾èµ–于 UBI 并工作在 UBI å·ä¹‹ä¸Šã€‚ +* JFFS2 æ²¡æœ‰ä»‹è´¨ç´¢å¼•ï¼Œéœ€åœ¨æŒ‚è½½æ—¶æž„å»ºç´¢å¼•ï¼Œè¿™è¦æ±‚全介质扫æã€‚UBIFS åœ¨é—ªå˜ + 介质上维护文件系统索引信æ¯ï¼Œæ— 需全介质扫æï¼Œå› æ¤æŒ‚载速度远快于 JFFS2。 +* JFFS2 是直写(write-through)文件系统,而 UBIFS 支æŒå›žå†™ + (write-back),这使得 UBIFS 写入速度快得多。 + +与 JFFS2 类似,UBIFS 支æŒå®žæ—¶åŽ‹ç¼©ï¼Œå¯å°†å¤§é‡æ•°æ®å˜å…¥é—ªå˜ã€‚ + +与 JFFS2 类似,UBIFS 能容å¿å¼‚常é‡å¯å’Œæ–电。它ä¸éœ€è¦ç±»ä¼¼ fsck.ext2 的工 +具。UBIFS ä¼šè‡ªåŠ¨é‡æ”¾æ—¥å¿—å¹¶ä»Žå´©æºƒä¸æ¢å¤ï¼Œç¡®ä¿é—ªå˜æ•°æ®ç»“构的一致性。 + +UBIFS 具有对数级扩展性(其使用的数æ®ç»“æž„å¤šä¸ºæ ‘å½¢ï¼‰ï¼Œå› æ¤æŒ‚è½½æ—¶é—´å’Œå†…å˜æ¶ˆè€—ä¸ +åƒ JFFS2 é‚£æ ·çº¿æ€§ä¾èµ–于闪å˜å®¹é‡ã€‚è¿™æ˜¯å› ä¸º UBIFS 在闪å˜ä»‹è´¨ä¸Šç»´æŠ¤æ–‡ä»¶ç³»ç»Ÿ +索引。但 UBIFS ä¾èµ–于线性扩展的 UBI å±‚ï¼Œå› æ¤æ•´ä½“ UBI/UBIFS æ ˆä»æ˜¯çº¿æ€§æ‰© +展。尽管如æ¤ï¼ŒUBIFS/UBI çš„æ‰©å±•æ€§ä»æ˜¾è‘—优于 JFFS2。 + +UBIFS å¼€å‘者认为,未æ¥å¯å¼€å‘åŒæ ·å…·å¤‡å¯¹æ•°çº§æ‰©å±•性的 UBI2。UBI2 将支æŒä¸Ž +UBI 相åŒçš„ API,但二进制ä¸å…¼å®¹ã€‚å› æ¤ UBIFS æ— éœ€ä¿®æ”¹å³å¯ä½¿ç”¨ UBI2。 + +挂载选项 +======== + +(*) 表示默认选项。 + +==================== ======================================================= +bulk_read 批é‡è¯»å–以利用闪å˜ä»‹è´¨çš„顺åºè¯»å–åŠ é€Ÿç‰¹æ€§ +no_bulk_read (*) ç¦ç”¨æ‰¹é‡è¯»å– +no_chk_data_crc (*) 跳过数æ®èŠ‚ç‚¹çš„ CRC æ ¡éªŒä»¥æé«˜è¯»å–性能。 ä»…åœ¨é—ªå˜ + 介质高度å¯é 时使用æ¤é€‰é¡¹ã€‚ æ¤é€‰é¡¹å¯èƒ½å¯¼è‡´æ–‡ä»¶å†…容æŸåæ— æ³•è¢« + 察觉。 +chk_data_crc å¼ºåˆ¶æ ¡éªŒæ•°æ®èŠ‚ç‚¹çš„ CRC +compr=none 覆盖默认压缩器,设置为"none" +compr=lzo 覆盖默认压缩器,设置为"LZO" +compr=zlib 覆盖默认压缩器,设置为"zlib" +auth_key= 指定用于文件系统身份验è¯çš„密钥。 + 使用æ¤é€‰é¡¹å°†å¼ºåˆ¶å¯ç”¨èº«ä»½éªŒè¯ã€‚ + ä¼ å…¥çš„å¯†é’¥å¿…é¡»å˜åœ¨äºŽå†…æ ¸å¯†é’¥çŽ¯ä¸ï¼Œ 且类型必须是'logon' +auth_hash_name= 用于身份验è¯çš„å“ˆå¸Œç®—æ³•ã€‚åŒæ—¶ç”¨äºŽå“ˆå¸Œè®¡ç®—å’Œ HMAC + 生æˆã€‚典型值包括"sha256"或"sha512" +==================== ======================================================= + +å¿«é€Ÿä½¿ç”¨æŒ‡å— +============ + +挂载的 UBI å·é€šè¿‡ "ubiX_Y" 或 "ubiX:NAME" è¯æ³•æŒ‡å®šï¼Œå…¶ä¸ "X" 是 UBI +设备编å·ï¼Œ"Y" 是 UBI å·ç¼–å·ï¼Œ"NAME" 是 UBI å·å称。 + +å°† UBI 设备 0 çš„å· 0 挂载到 /mnt/ubifs:: + + $ mount -t ubifs ubi0_0 /mnt/ubifs + +å°† UBI 设备 0 çš„ "rootfs" å·æŒ‚载到 /mnt/ubifs("rootfs" 是å·å):: + + $ mount -t ubifs ubi0:rootfs /mnt/ubifs + +ä»¥ä¸‹æ˜¯å†…æ ¸å¯åЍ傿•°çš„示例,用于将 mtd0 é™„åŠ åˆ° UBI 并挂载 "rootfs" å·ï¼š +ubi.mtd=0 root=ubi0:rootfs rootfstype=ubifs + +å‚考资料 +======== + +UBIFS 文档åŠå¸¸è§é—®é¢˜è§£ç”/æ“作指å—请访问 MTD 官网: + +- http://www.linux-mtd.infradead.org/doc/ubifs.html +- http://www.linux-mtd.infradead.org/faq/ubifs.html diff --git a/Documentation/translations/zh_CN/how-to.rst b/Documentation/translations/zh_CN/how-to.rst index ddd99c0f9b4d..7ae5d8765888 100644 --- a/Documentation/translations/zh_CN/how-to.rst +++ b/Documentation/translations/zh_CN/how-to.rst @@ -64,7 +64,7 @@ Linux å‘行版和简å•地使用 Linux 命令行,那么å¯ä»¥è¿…速开始了ã :: cd linux - ./scripts/sphinx-pre-install + ./tools/docs/sphinx-pre-install 以 Fedora ä¸ºä¾‹ï¼Œå®ƒçš„è¾“å‡ºæ˜¯è¿™æ ·çš„:: @@ -437,7 +437,7 @@ git email 默认会抄é€ç»™æ‚¨ä¸€ä»½ï¼Œæ‰€ä»¥æ‚¨å¯ä»¥åˆ‡æ¢ä¸ºå®¡é˜…者的角è 对于首次å‚与 Linux å†…æ ¸ä¸æ–‡æ–‡æ¡£ç¿»è¯‘的新手,建议您在 linux 目录ä¸è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š :: - ./script/checktransupdate.py -l zh_CN`` + tools/docs/checktransupdate.py -l zh_CN`` 该命令会列出需è¦ç¿»è¯‘æˆ–æ›´æ–°çš„è‹±æ–‡æ–‡æ¡£ï¼Œç»“æžœåŒæ—¶ä¿å˜åœ¨ checktransupdate.log ä¸ã€‚ diff --git a/Documentation/translations/zh_CN/kbuild/kbuild.rst b/Documentation/translations/zh_CN/kbuild/kbuild.rst index e5e2aebe1ebc..57f5cf5b2cdd 100644 --- a/Documentation/translations/zh_CN/kbuild/kbuild.rst +++ b/Documentation/translations/zh_CN/kbuild/kbuild.rst @@ -93,6 +93,16 @@ HOSTRUSTFLAGS ------------- åœ¨æž„å»ºä¸»æœºç¨‹åºæ—¶ä¼ 递给 $(HOSTRUSTC) çš„é¢å¤–æ ‡å¿—ã€‚ +PROCMACROLDFLAGS +---------------- +用于链接 Rust 过程å®çš„æ ‡å¿—ã€‚ç”±äºŽè¿‡ç¨‹å®æ˜¯ç”± rustc åœ¨æž„å»ºæ—¶åŠ è½½çš„ï¼Œ +å› æ¤å¿…须以与当å‰ä½¿ç”¨çš„ rustc 工具链兼容的方å¼è¿›è¡Œé“¾æŽ¥ã€‚ + +例如,当 rustc 使用的 C 库与用户希望用于主机程åºçš„ C 库ä¸åŒæ—¶ï¼Œ +æ¤è®¾ç½®ä¼šéžå¸¸æœ‰ç”¨ã€‚ + +å¦‚æžœæœªè®¾ç½®ï¼Œåˆ™é»˜è®¤ä½¿ç”¨é“¾æŽ¥ä¸»æœºç¨‹åºæ—¶ä¼ é€’çš„æ ‡å¿—ã€‚ + HOSTLDFLAGS ----------- é“¾æŽ¥ä¸»æœºç¨‹åºæ—¶ä¼ 递的é¢å¤–选项。 @@ -135,12 +145,18 @@ KBUILD_OUTPUT æŒ‡å®šå†…æ ¸æž„å»ºçš„è¾“å‡ºç›®å½•ã€‚ 在å•独的构建目录ä¸ä¸ºé¢„æž„å»ºå†…æ ¸æž„å»ºå¤–éƒ¨æ¨¡å—æ—¶ï¼Œè¿™ä¸ªå˜é‡ä¹Ÿå¯ä»¥æŒ‡å‘å†…æ ¸è¾“å‡ºç›®å½•ã€‚è¯·æ³¨æ„, -è¿™å¹¶ä¸æŒ‡å®šå¤–éƒ¨æ¨¡å—æœ¬èº«çš„输出目录。 +è¿™å¹¶ä¸æŒ‡å®šå¤–éƒ¨æ¨¡å—æœ¬èº«çš„输出目录(使用 KBUILD_EXTMOD_OUTPUT æ¥è¾¾åˆ°è¿™ä¸ªç›®çš„)。 输出目录也å¯ä»¥ä½¿ç”¨ "O=..." 指定。 设置 "O=..." 优先于 KBUILD_OUTPUT。 +KBUILD_EXTMOD_OUTPUT +-------------------- +指定外部模å—的输出目录 + +设置 "MO=..." 优先于 KBUILD_EXTMOD_OUTPUT. + KBUILD_EXTRA_WARN ----------------- 指定é¢å¤–的构建检查。也å¯ä»¥é€šè¿‡åœ¨å‘½ä»¤è¡Œä¼ 递 "W=..." æ¥è®¾ç½®ç›¸åŒçš„值。 @@ -290,8 +306,13 @@ IGNORE_DIRS KBUILD_BUILD_TIMESTAMP ---------------------- 将该环境å˜é‡è®¾ç½®ä¸ºæ—¥æœŸå—符串,å¯ä»¥è¦†ç›–在 UTS_VERSION 定义ä¸ä½¿ç”¨çš„æ—¶é—´æˆ³ -(è¿è¡Œå†…æ ¸æ—¶çš„ uname -v)。该值必须是一个å¯ä»¥ä¼ 递给 date -d çš„å—符串。默认值是 -å†…æ ¸æž„å»ºæŸä¸ªæ—¶åˆ»çš„ date 命令输出。 +(è¿è¡Œå†…æ ¸æ—¶çš„ uname -v) 。该值必须是一个å¯ä»¥ä¼ 递给 date -d çš„å—符串。例如:: + + $ KBUILD_BUILD_TIMESTAMP="Mon Oct 13 00:00:00 UTC 2025" make + +é»˜è®¤å€¼æ˜¯å†…æ ¸æž„å»ºæŸä¸ªæ—¶åˆ»çš„ date 命令输出。如果æä¾›è¯¥æ—¶æˆ³ï¼Œå®ƒè¿˜ç”¨äºŽä»»ä½• initramfs å½’ +档文件ä¸çš„ mtime å—æ®µã€‚ Initramfs mtimes 是 32 ä½çš„ï¼Œå› æ¤æ—©äºŽ Unix 纪元 1970 年,或 +晚于å调世界时 (UTC) 2106 å¹´ 2 月 7 æ—¥ 6 æ—¶ 28 分 15 ç§’çš„æ—¥æœŸæ˜¯æ— æ•ˆçš„ã€‚ KBUILD_BUILD_USER, KBUILD_BUILD_HOST ------------------------------------ diff --git a/Documentation/translations/zh_CN/mm/active_mm.rst b/Documentation/translations/zh_CN/mm/active_mm.rst index b3352668c4c8..9496a0bb7d07 100644 --- a/Documentation/translations/zh_CN/mm/active_mm.rst +++ b/Documentation/translations/zh_CN/mm/active_mm.rst @@ -87,4 +87,4 @@ Active MM 最丑陋的之一--ä¸åƒå…¶ä»–架构的MM和寄å˜å™¨çŠ¶æ€æ˜¯åˆ†å¼€çš„,alphaçš„PALcode将两者 连接起æ¥ï¼Œä½ 需è¦åŒæ—¶åˆ‡æ¢ä¸¤è€…)。 - (æ–‡æ¡£æ¥æº http://marc.info/?l=linux-kernel&m=93337278602211&w=2) + (æ–‡æ¡£æ¥æº https://lore.kernel.org/lkml/Pine.LNX.4.10.9907301410280.752-100000@penguin.transmeta.com/) diff --git a/Documentation/translations/zh_CN/networking/generic-hdlc.rst b/Documentation/translations/zh_CN/networking/generic-hdlc.rst new file mode 100644 index 000000000000..9e493dc9721e --- /dev/null +++ b/Documentation/translations/zh_CN/networking/generic-hdlc.rst @@ -0,0 +1,176 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/networking/generic-hdlc.rst + +:翻译: + + 噿¸”å–œ Sun yuxi <sun.yuxi@zte.com.cn> + +========== +通用HDLC层 +========== + +Krzysztof Halasa <khc@pm.waw.pl> + + +通用HDLC层当剿”¯æŒä»¥ä¸‹åè®®: + +1. 帧ä¸ç»§ï¼ˆæ”¯æŒANSIã€CCITTã€CiscoåŠæ— LMI模å¼ï¼‰ + + - 常规(路由)接å£å’Œä»¥å¤ªç½‘æ¡¥æŽ¥ï¼ˆä»¥å¤ªç½‘è®¾å¤‡ä»¿çœŸï¼‰æŽ¥å£ + å¯å…±äº«åŒä¸€æ¡PVC。 + - 支æŒARPï¼ˆå†…æ ¸æš‚ä¸æ”¯æŒInARP,但å¯é€šè¿‡å®žéªŒæ€§ç”¨æˆ·ç©ºé—´å®ˆæŠ¤ç¨‹åºå®žçŽ°ï¼Œ + 下载地å€ï¼šhttp://www.kernel.org/pub/linux/utils/net/hdlc/)。 + +2. 原始HDLC —— 支æŒIP(IPv4ï¼‰æŽ¥å£æˆ–以太网设备仿真 +3. Cisco HDLC +4. PPP +5. X.25(使用X.25åè®®æ ˆï¼‰ + +通用HDLC仅作为å议驱动 - å¿…é¡»é…åˆå…·ä½“硬件的底层驱动 +æ‰èƒ½è¿è¡Œã€‚ + +以太网设备仿真(使用HDLC或帧ä¸ç»§PVC)兼容IEEE 802.1Q(VLAN)和 +802.1D(以太网桥接)。 + + +请确ä¿å·²åŠ è½½ hdlc.o 和硬件驱动程åºã€‚系统将为æ¯ä¸ªWAN端å£åˆ›å»ºä¸€ä¸ª +"hdlc"网络设备(如hdlc0ç‰ï¼‰ã€‚您需è¦ä½¿ç”¨"sethdlc"工具,å¯ä»Žä»¥ä¸‹ +地å€èŽ·å–: + + http://www.kernel.org/pub/linux/utils/net/hdlc/ + +编译 sethdlc.c 工具:: + + gcc -O2 -Wall -o sethdlc sethdlc.c + +请确ä¿ä½¿ç”¨ä¸Žæ‚¨å†…æ ¸ç‰ˆæœ¬åŒ¹é…çš„ sethdlc 工具。 + +使用 sethdlc å·¥å…·è®¾ç½®ç‰©ç†æŽ¥å£ã€æ—¶é’Ÿé¢‘率ã€HDLC 模å¼ï¼Œ +若使用帧ä¸ç»§è¿˜éœ€æ·»åŠ æ‰€éœ€çš„ PVC。 +é€šå¸¸æ‚¨éœ€è¦æ‰§è¡Œç±»ä¼¼ä»¥ä¸‹å‘½ä»¤:: + + sethdlc hdlc0 clock int rate 128000 + sethdlc hdlc0 cisco interval 10 timeout 25 + +或:: + + sethdlc hdlc0 rs232 clock ext + sethdlc hdlc0 fr lmi ansi + sethdlc hdlc0 create 99 + ifconfig hdlc0 up + ifconfig pvc0 localIP pointopoint remoteIP + +在帧ä¸ç»§æ¨¡å¼ä¸‹ï¼Œè¯·å…ˆå¯ç”¨ä¸»hdlc设备(ä¸åˆ†é…IP地å€ï¼‰ï¼Œå† +使用pvc设备。 + + +接å£è®¾ç½®é€‰é¡¹ï¼š + +* v35 | rs232 | x21 | t1 | e1 + - å½“ç½‘å¡æ”¯æŒè½¯ä»¶å¯é€‰æŽ¥å£æ—¶ï¼Œå¯ä¸ºæŒ‡å®šç«¯å£è®¾ç½®ç‰©ç†æŽ¥å£ + loopback + - å¯ç”¨ç¡¬ä»¶çŽ¯å›žï¼ˆä»…ç”¨äºŽæµ‹è¯•ï¼‰ +* clock ext + - RX与TXæ—¶é’Ÿå‡ä½¿ç”¨å¤–éƒ¨æ—¶é’Ÿæº +* clock int + - RX与TXæ—¶é’Ÿå‡ä½¿ç”¨å†…éƒ¨æ—¶é’Ÿæº +* clock txint + - RX时钟使用外部时钟æºï¼ŒTXæ—¶é’Ÿä½¿ç”¨å†…éƒ¨æ—¶é’Ÿæº +* clock txfromrx + - RX时钟使用外部时钟æºï¼ŒTX时钟从RX时钟派生 +* rate + - 设置时钟速率(仅适用于"int"或"txint"时钟模å¼ï¼‰ + + +设置å议选项: + +* hdlc - 设置原始HDLC模å¼ï¼ˆä»…支æŒIPå议) + + nrz / nrzi / fm-mark / fm-space / manchester - ä¼ è¾“ç¼–ç 选项 + + no-parity / crc16 / crc16-pr0 (预设零值的CRC16) / crc32-itu + + crc16-itu (使用ITU-T多项å¼çš„CRC16) / crc16-itu-pr0 - æ ¡éªŒæ–¹å¼é€‰é¡¹ + +* hdlc-eth - 使用HDLC进行以太网设备仿真. æ ¡éªŒå’Œç¼–ç æ–¹å¼åŒä¸Š + as above. + +* cisco - 设置Cisco HDLC模å¼ï¼ˆæ”¯æŒIPã€IPv6å’ŒIPXå议) + + interval - ä¿æ´»æ•°æ®åŒ…å‘é€é—´éš”(秒) + + timeout - æœªæ”¶åˆ°ä¿æ´»æ•°æ®åŒ…çš„è¶…æ—¶æ—¶é—´ï¼ˆç§’ï¼‰ï¼Œè¶…è¿‡æ¤æ—¶é•¿å°†åˆ¤å®š + 链路æ–å¼€ + +* ppp - è®¾ç½®åŒæ¥PPPæ¨¡å¼ + +* x25 - 设置X.25æ¨¡å¼ + +* fr - 帧ä¸ç»§æ¨¡å¼ + + lmi ansi / ccitt / cisco / none - LMI(链路管ç†)类型 + + dce - 将帧ä¸ç»§è®¾ç½®ä¸ºDCE(网络侧)LMI模å¼ï¼ˆé»˜è®¤ä¸ºDTE用户侧)。 + + æ¤è®¾ç½®ä¸Žæ—¶é’Ÿæ— å…³ï¼ + + - t391 - 链路完整性验è¯è½®è¯¢å®šæ—¶å™¨ï¼ˆç§’)- 用户侧 + - t392 - 轮询验è¯å®šæ—¶å™¨ï¼ˆç§’)- 网络侧 + - n391 - 全状æ€è½®è¯¢è®¡æ•°å™¨ - 用户侧 + - n392 - 错误阈值 - 用户侧和网络侧共用 + - n393 - 监控事件计数 - 用户侧和网络侧共用 + +帧ä¸ç»§ä¸“用命令: + +* create n | delete n - æ·»åŠ /åˆ é™¤DLCIç¼–å·ä¸ºnçš„PVC接å£ã€‚ + 新创建的接å£å°†å‘½å为pvc0ã€pvc1ç‰ã€‚ + +* create ether n | delete ether n - æ·»åŠ /åˆ é™¤ç”¨äºŽä»¥å¤ªç½‘ + 桥接帧的设备设备将命å为pvceth0ã€pvceth1ç‰ã€‚ + + + + +æ¿å¡ç‰¹å®šé—®é¢˜ +------------ + +n2.o å’Œ c101.o 驱动模å—需è¦å‚æ•°æ‰èƒ½å·¥ä½œ:: + + insmod n2 hw=io,irq,ram,ports[:io,irq,...] + +示例:: + + insmod n2 hw=0x300,10,0xD0000,01 + +或:: + + insmod c101 hw=irq,ram[:irq,...] + +示例:: + + insmod c101 hw=9,0xdc000 + +è‹¥ç›´æŽ¥ç¼–è¯‘è¿›å†…æ ¸ï¼Œè¿™äº›é©±åŠ¨éœ€è¦é€šè¿‡å†…æ ¸(命令行)傿•°é…ç½®:: + + n2.hw=io,irq,ram,ports:... + +或:: + + c101.hw=irq,ram:... + + + +若您的N2ã€C101或PLX200SYNæ¿å¡å‡ºçŽ°é—®é¢˜ï¼Œå¯é€šè¿‡"private" +å‘½ä»¤æŸ¥çœ‹ç«¯å£æ•°æ®åŒ…æè¿°ç¬¦çŽ¯ï¼ˆæ˜¾ç¤ºåœ¨å†…æ ¸æ—¥å¿—ä¸ï¼‰ + + sethdlc hdlc0 private + +硬件驱动需使用#define DEBUG_RINGS编译选项构建。 +在æäº¤é”™è¯¯æŠ¥å‘Šæ—¶é™„上这些信æ¯å°†å¾ˆæœ‰å¸®åŠ©ã€‚å¦‚åœ¨ä½¿ç”¨è¿‡ç¨‹ä¸é‡ +åˆ°ä»»ä½•é—®é¢˜ï¼Œè¯·éšæ—¶å‘ŠçŸ¥ã€‚ + +获å–è¡¥ä¸å’Œå…¶ä»–ä¿¡æ¯ï¼Œè¯·è®¿é—®ï¼š +<http://www.kernel.org/pub/linux/utils/net/hdlc/>.
\ No newline at end of file diff --git a/Documentation/translations/zh_CN/networking/index.rst b/Documentation/translations/zh_CN/networking/index.rst index bb0edcffd144..c276c0993c51 100644 --- a/Documentation/translations/zh_CN/networking/index.rst +++ b/Documentation/translations/zh_CN/networking/index.rst @@ -27,6 +27,9 @@ xfrm_proc netmem alias + mptcp-sysctl + generic-hdlc + timestamping Todolist: @@ -76,7 +79,6 @@ Todolist: * eql * fib_trie * filter -* generic-hdlc * generic_netlink * netlink_spec/index * gen_stats @@ -96,7 +98,6 @@ Todolist: * mctp * mpls-sysctl * mptcp -* mptcp-sysctl * multiqueue * multi-pf-netdev * net_cachelines/index @@ -126,7 +127,6 @@ Todolist: * sctp * secid * seg6-sysctl -* skbuff * smc-sysctl * sriov * statistics @@ -138,7 +138,6 @@ Todolist: * tcp_ao * tcp-thin * team -* timestamping * tipc * tproxy * tuntap diff --git a/Documentation/translations/zh_CN/networking/mptcp-sysctl.rst b/Documentation/translations/zh_CN/networking/mptcp-sysctl.rst new file mode 100644 index 000000000000..0b1b9ed7c647 --- /dev/null +++ b/Documentation/translations/zh_CN/networking/mptcp-sysctl.rst @@ -0,0 +1,139 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/networking/mptcp-sysctl.rst + +:翻译: + + 噿¸”å–œ Sun yuxi <sun.yuxi@zte.com.cn> + +================ +MPTCP Sysfs å˜é‡ +================ + +/proc/sys/net/mptcp/* Variables +=============================== + +add_addr_timeout - INTEGER (ç§’) + 设置ADD_ADDR控制消æ¯çš„é‡ä¼ 超时时间。当MPTCP对端未确认 + å…ˆå‰çš„ADD_ADDRæ¶ˆæ¯æ—¶ï¼Œå°†åœ¨è¯¥è¶…æ—¶æ—¶é—´åŽé‡æ–°å‘é€ã€‚ + + 默认值与TCP_RTO_MAX相åŒã€‚æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:120 + +allow_join_initial_addr_port - BOOLEAN + 控制是å¦å…许对端å‘åˆå§‹åæµä½¿ç”¨çš„IP地å€å’Œç«¯å£å·å‘é€åŠ å…¥ + 请求(1表示å…许)。æ¤å‚数会设置连接时å‘é€ç»™å¯¹ç«¯çš„æ ‡å¿—ä½ï¼Œ + å¹¶å†³å®šæ˜¯å¦æŽ¥å—æ¤ç±»åŠ å…¥è¯·æ±‚ã€‚ + + 通过ADD_ADDR通告的地å€ä¸å—æ¤å‚æ•°å½±å“。 + + æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:1 + +available_path_managers - STRING + 显示已注册的å¯ç”¨è·¯å¾„管ç†å™¨é€‰é¡¹ã€‚å¯èƒ½æœ‰æ›´å¤šè·¯å¾„管ç†å™¨å¯ç”¨ + ä½†å°šæœªåŠ è½½ã€‚ + +available_schedulers - STRING + 显示已注册的å¯ç”¨è°ƒåº¦å™¨é€‰é¡¹ã€‚å¯èƒ½æœ‰æ›´å¤šæ•°æ®åŒ…调度器å¯ç”¨ + ä½†å°šæœªåŠ è½½ã€‚ + +blackhole_timeout - INTEGER (ç§’) + 当å‘生MPTCP防ç«å¢™é»‘洞问题时,åˆå§‹ç¦ç”¨æ´»è·ƒMPTCP套接å—上MPTCP + åŠŸèƒ½çš„æ—¶é—´ï¼ˆç§’ï¼‰ã€‚å¦‚æžœåœ¨é‡æ–°å¯ç”¨MPTCPåŽç«‹å³æ£€æµ‹åˆ°æ›´å¤šé»‘洞问题, + æ¤æ—¶é—´æ®µå°†å‘ˆæŒ‡æ•°å¢žé•¿ï¼›å½“黑洞问题消失时,将é‡ç½®ä¸ºåˆå§‹å€¼ã€‚ + + 设置为0å¯ç¦ç”¨é»‘洞检测功能。æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:3600 + +checksum_enabled - BOOLEAN + 控制是å¦å¯ç”¨DSSæ ¡éªŒå’ŒåŠŸèƒ½ã€‚ + + 当值为éžé›¶æ—¶å¯å¯ç”¨DSSæ ¡éªŒå’Œã€‚æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:0 + +close_timeout - INTEGER (seconds) + 设置"å…ˆæ–åŽè¿ž"超时时间:在未调用close或shutdown系统调用时, + MPTCP套接å—将在最åŽä¸€ä¸ªåæµç§»é™¤åŽä¿æŒå½“å‰çжæ€è¾¾åˆ°è¯¥æ—¶é•¿ï¼Œæ‰ + 会转为TCP_CLOSE状æ€ã€‚ + + 默认值与TCP_TIMEWAIT_LEN相åŒã€‚æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:60 + +enabled - BOOLEAN + 控制是å¦å…许创建MPTCP套接å—。 + + 当值为1æ—¶å…许创建MPTCP套接å—。æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:1(å¯ç”¨ï¼‰ + +path_manager - STRING + 设置用于æ¯ä¸ªæ–°MPTCP套接å—的默认路径管ç†å™¨åç§°ã€‚å†…æ ¸è·¯å¾„ç®¡ç†å°† + æ ¹æ®é€šè¿‡MPTCP netlink APIé…置的æ¯ä¸ªå‘½åç©ºé—´å€¼æ¥æŽ§åˆ¶åæµè¿žæŽ¥ + 和地å€é€šå‘Šã€‚用户空间路径管ç†å°†æ¯ä¸ªMPTCPè¿žæŽ¥çš„åæµè¿žæŽ¥å†³ç–和地 + å€é€šå‘Šäº¤ç”±ç‰¹æƒç”¨æˆ·ç©ºé—´ç¨‹åºæŽ§åˆ¶ï¼Œä»£ä»·æ˜¯éœ€è¦æ›´å¤šnetlinkæµé‡æ¥ + ä¼ æ’æ‰€æœ‰ç›¸å…³äº‹ä»¶å’Œå‘½ä»¤ã€‚ + + æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + * "kernel" - å†…æ ¸è·¯å¾„ç®¡ç†å™¨ + * "userspace" - 用户空间路径管ç†å™¨ + + 默认值:"kernel" + +pm_type - INTEGER + 设置用于æ¯ä¸ªæ–°MPTCP套接å—的默认路径管ç†å™¨ç±»åž‹ã€‚å†…æ ¸è·¯å¾„ç®¡ç†å°† + æ ¹æ®é€šè¿‡MPTCP netlink APIé…置的æ¯ä¸ªå‘½åç©ºé—´å€¼æ¥æŽ§åˆ¶åæµè¿žæŽ¥ + 和地å€é€šå‘Šã€‚用户空间路径管ç†å°†æ¯ä¸ªMPTCPè¿žæŽ¥çš„åæµè¿žæŽ¥å†³ç–和地 + å€é€šå‘Šäº¤ç”±ç‰¹æƒç”¨æˆ·ç©ºé—´ç¨‹åºæŽ§åˆ¶ï¼Œä»£ä»·æ˜¯éœ€è¦æ›´å¤šnetlinkæµé‡æ¥ + ä¼ æ’æ‰€æœ‰ç›¸å…³äº‹ä»¶å’Œå‘½ä»¤ã€‚ + + æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 自v6.15起已弃用,请改用path_manager傿•°ã€‚ + + * 0 - å†…æ ¸è·¯å¾„ç®¡ç†å™¨ + * 1 - 用户空间路径管ç†å™¨ + + 默认值:0 + +scheduler - STRING + 选择所需的调度器类型。 + + 支æŒé€‰æ‹©ä¸åŒçš„æ•°æ®åŒ…调度器。æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:"default" + +stale_loss_cnt - INTEGER + ç”¨äºŽåˆ¤å®šåæµå¤±æ•ˆï¼ˆstale)的MPTCP层é‡ä¼ 间隔次数阈值。当指定 + åæµåœ¨è¿žç»å¤šä¸ªé‡ä¼ é—´éš”å†…æ—¢æ— æ•°æ®ä¼ è¾“åˆæœ‰å¾…å¤„ç†æ•°æ®æ—¶ï¼Œå°†è¢«æ ‡ + 记为失效状æ€ã€‚å¤±æ•ˆåæµå°†è¢«æ•°æ®åŒ…调度器忽略。 + 设置较低的stale_loss_cnt值å¯å®žçŽ°å¿«é€Ÿä¸»å¤‡åˆ‡æ¢ï¼Œè¾ƒé«˜çš„值则能 + 最大化边缘场景(如高误ç çŽ‡é“¾è·¯æˆ–å¯¹ç«¯æš‚åœæ•°æ®å¤„ç†ç‰å¼‚常情况) + 的链路利用率。 + + æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:4 + +syn_retrans_before_tcp_fallback - INTEGER + 在回退到 TCP(å³ä¸¢å¼ƒ MPTCP 选项)之å‰ï¼ŒSYN + MP_CAPABLE + 报文的é‡ä¼ 次数。æ¢å¥è¯è¯´ï¼Œå¦‚æžœæ‰€æœ‰æŠ¥æ–‡åœ¨ä¼ è¾“è¿‡ç¨‹ä¸éƒ½è¢«ä¸¢å¼ƒï¼Œ + 那么将会: + + * 首次SYNæºå¸¦MPTCP支æŒé€‰é¡¹ + * æŒ‰æœ¬å‚æ•°å€¼é‡ä¼ æºå¸¦MPTCP选项的SYN包 + * åŽç»é‡ä¼ å°†ä¸å†æºå¸¦MPTCP支æŒé€‰é¡¹ + + 0 表示首次é‡ä¼ å³ä¸¢å¼ƒMPTCP选项。 + >=128 表示所有SYNé‡ä¼ å‡ä¿ç•™MPTCP选项设置过低的值å¯èƒ½å¢žåŠ + MPTCPé»‘æ´žè¯¯åˆ¤å‡ çŽ‡ã€‚æ¤ä¸ºæ¯ä¸ªå‘½å空间的sysctl傿•°ã€‚ + + 默认值:2 diff --git a/Documentation/translations/zh_CN/networking/timestamping.rst b/Documentation/translations/zh_CN/networking/timestamping.rst new file mode 100644 index 000000000000..4593f53ad09a --- /dev/null +++ b/Documentation/translations/zh_CN/networking/timestamping.rst @@ -0,0 +1,674 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/networking/timestamping.rst + +:翻译: + + 王亚鑫 Wang Yaxin <wang.yaxin@zte.com.cn> + +====== +时间戳 +====== + + +1. æŽ§åˆ¶æŽ¥å£ +=========== + +接收网络数æ®åŒ…时间戳的接å£åŒ…括: + +SO_TIMESTAMP + 为æ¯ä¸ªä¼ 入数æ®åŒ…生æˆï¼ˆä¸ä¸€å®šæ˜¯å•调的)系统时间时间戳。通过 recvmsg() + 在控制消æ¯ä¸ä»¥å¾®ç§’分辨率报告时间戳。 + SO_TIMESTAMP æ ¹æ®æž¶æž„类型和 libc çš„ lib ä¸çš„ time_t 表示方å¼å®šä¹‰ä¸º + SO_TIMESTAMP_NEW 或 SO_TIMESTAMP_OLD。 + SO_TIMESTAMP_OLD å’Œ SO_TIMESTAMP_NEW çš„æŽ§åˆ¶æ¶ˆæ¯æ ¼å¼åˆ†åˆ«ä¸º + struct __kernel_old_timeval å’Œ struct __kernel_sock_timeval。 + +SO_TIMESTAMPNS + 与 SO_TIMESTAMP 相åŒçš„æ—¶é—´æˆ³æœºåˆ¶ï¼Œä½†ä»¥ struct timespec æ ¼å¼æŠ¥å‘Šæ—¶é—´æˆ³ï¼Œ + 纳秒分辨率。 + SO_TIMESTAMPNS æ ¹æ®æž¶æž„类型和 libc çš„ time_t 表示方å¼å®šä¹‰ä¸º + SO_TIMESTAMPNS_NEW 或 SO_TIMESTAMPNS_OLD。 + æŽ§åˆ¶æ¶ˆæ¯æ ¼å¼å¯¹äºŽ SO_TIMESTAMPNS_OLD 为 struct timespec, + 对于 SO_TIMESTAMPNS_NEW 为 struct __kernel_timespec。 + +IP_MULTICAST_LOOP + SO_TIMESTAMP[NS] + 仅用于多æ’:通过读å–回环数æ®åŒ…æŽ¥æ”¶æ—¶é—´æˆ³ï¼ŒèŽ·å¾—è¿‘ä¼¼çš„ä¼ è¾“æ—¶é—´æˆ³ã€‚ + +SO_TIMESTAMPING + 在接收ã€ä¼ è¾“æˆ–ä¸¤è€…æ—¶ç”Ÿæˆæ—¶é—´æˆ³ã€‚支æŒå¤šä¸ªæ—¶é—´æˆ³æºï¼ŒåŒ…括硬件。 + 支æŒä¸ºæµå¥—接å—ç”Ÿæˆæ—¶é—´æˆ³ã€‚ + + +1.1 SO_TIMESTAMP(也包括 SO_TIMESTAMP_OLD å’Œ SO_TIMESTAMP_NEW) +--------------------------------------------------------------- + +æ¤å¥—接å—选项在接收路径上å¯ç”¨æ•°æ®æŠ¥çš„æ—¶é—´æˆ³ã€‚ç”±äºŽç›®æ ‡å¥—æŽ¥å—(如果有) +åœ¨ç½‘ç»œæ ˆæ—©æœŸæœªçŸ¥ï¼Œå› æ¤å¿…须为所有数æ®åŒ…å¯ç”¨æ¤åŠŸèƒ½ã€‚æ‰€æœ‰æ—©æœŸæŽ¥æ”¶çš„æ—¶é—´ +戳选项也是如æ¤ã€‚ + +有关接å£è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 `man 7 socket`。 + +始终使用 SO_TIMESTAMP_NEW 时间戳以获得 struct __kernel_sock_timeval +æ ¼å¼çš„æ—¶é—´æˆ³ã€‚ + +如果时间在 2038 å¹´åŽï¼ŒSO_TIMESTAMP_OLD 在 32 使œºå™¨ä¸Šå°†è¿”回错误的时间戳。 + +1.2 SO_TIMESTAMPNS(也包括 SO_TIMESTAMPNS_OLD å’Œ SO_TIMESTAMPNS_NEW) +--------------------------------------------------------------------- + +æ¤é€‰é¡¹ä¸Ž SO_TIMESTAMP 相åŒï¼Œä½†è¿”回数æ®ç±»åž‹æœ‰æ‰€ä¸åŒã€‚å…¶ struct timespec +能达到比 SO_TIMESTAMP çš„ timeval(毫秒)更高的分辨率(纳秒)时间戳。 + +始终使用 SO_TIMESTAMPNS_NEW 时间戳获得 struct __kernel_timespec æ ¼å¼ +的时间戳。 + +如果时间在 2038 å¹´åŽï¼ŒSO_TIMESTAMPNS_OLD 在 32 使œºå™¨ä¸Šå°†è¿”回错误的时间戳。 + +1.3 SO_TIMESTAMPING(也包括 SO_TIMESTAMPING_OLD å’Œ SO_TIMESTAMPING_NEW) +------------------------------------------------------------------------ + +支æŒå¤šç§ç±»åž‹çš„æ—¶é—´æˆ³è¯·æ±‚ã€‚å› æ¤ï¼Œæ¤å¥—接å—é€‰é¡¹æŽ¥å—æ ‡å¿—ä½å›¾ï¼Œè€Œä¸æ˜¯å¸ƒå°”值。在:: + + err = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val)); + +val 是一个整数,设置了以下任何ä½ã€‚设置其他ä½å°†è¿”回 EINVAL 䏔䏿›´æ”¹å½“å‰çжæ€ã€‚ + +这个套接å—选项é…ç½®ä»¥ä¸‹å‡ ä¸ªæ–¹é¢çš„æ—¶é—´æˆ³ç”Ÿæˆï¼š +为å•个 sk_buff ç»“æž„ä½“ç”Ÿæˆæ—¶é—´æˆ³ï¼ˆ1.3.1); +将时间戳报告到套接å—的错误队列(1.3.2); +é…置相关选项(1.3.3); +也å¯ä»¥é€šè¿‡ cmsg 为å•个 sendmsg 调用å¯ç”¨æ—¶é—´æˆ³ç”Ÿæˆï¼ˆ1.3.4)。 + +1.3.1 æ—¶é—´æˆ³ç”Ÿæˆ +^^^^^^^^^^^^^^^^ + +æŸäº›ä½æ˜¯å‘åè®®æ ˆè¯·æ±‚å°è¯•ç”Ÿæˆæ—¶é—´æˆ³ã€‚它们的任何组åˆéƒ½æ˜¯æœ‰æ•ˆçš„。对这些ä½çš„æ›´æ”¹é€‚ +用于新创建的数æ®åŒ…ï¼Œè€Œä¸æ˜¯å·²ç»åœ¨åè®®æ ˆä¸çš„æ•°æ®åŒ…ã€‚å› æ¤ï¼Œå¯ä»¥é€šè¿‡åœ¨ä¸¤ä¸ª setsockopt +调用之间嵌入 send() 调用æ¥é€‰æ‹©æ€§åœ°ä¸ºæ•°æ®åŒ…åé›†è¯·æ±‚æ—¶é—´æˆ³ï¼ˆä¾‹å¦‚ï¼Œç”¨äºŽé‡‡æ ·ï¼‰ï¼Œ +一个用于å¯ç”¨æ—¶é—´æˆ³ç”Ÿæˆï¼Œä¸€ä¸ªç”¨äºŽç¦ç”¨å®ƒã€‚时间戳也å¯èƒ½ç”±äºŽç‰¹å®šå¥—接å—请求之外的原 +å› è€Œç”Ÿæˆï¼Œä¾‹å¦‚在当系统范围内å¯ç”¨æŽ¥æ”¶æ—¶é—´æˆ³æ—¶ï¼Œå¦‚剿‰€è¿°ã€‚ + +SOF_TIMESTAMPING_RX_HARDWARE: + 请求由网络适é…器生æˆçš„æŽ¥æ”¶æ—¶é—´æˆ³ã€‚ + +SOF_TIMESTAMPING_RX_SOFTWARE: + 当数æ®è¿›å…¥å†…æ ¸æ—¶è¯·æ±‚æŽ¥æ”¶æ—¶é—´æˆ³ã€‚è¿™äº›æ—¶é—´æˆ³åœ¨è®¾å¤‡é©±åŠ¨ç¨‹åºå°†æ•°æ®åŒ…äº¤ç»™å†…æ ¸æŽ¥æ”¶ + åè®®æ ˆåŽç”Ÿæˆã€‚ + +SOF_TIMESTAMPING_TX_HARDWARE: + 请求由网络适é…器生æˆçš„ä¼ è¾“æ—¶é—´æˆ³ã€‚æ¤æ ‡å¿—å¯ä»¥é€šè¿‡å¥—接å—选项和控制消æ¯å¯ç”¨ã€‚ + +SOF_TIMESTAMPING_TX_SOFTWARE: + 当数æ®ç¦»å¼€å†…æ ¸æ—¶è¯·æ±‚ä¼ è¾“ï¼ˆTX)时间戳。这些时间戳由设备驱动程åºç”Ÿæˆï¼Œå¹¶ä¸”å°½ + å¯èƒ½è´´è¿‘网络接å£å‘é€ç‚¹ï¼Œä½†å§‹ç»ˆåœ¨å†…æ ¸å°†æ•°æ®åŒ…ä¼ é€’ç»™ç½‘ç»œæŽ¥å£ä¹‹å‰ç”Ÿæˆã€‚å› æ¤ï¼Œ + 它们需è¦é©±åŠ¨ç¨‹åºæ”¯æŒï¼Œä¸”å¯èƒ½å¹¶éžæ‰€æœ‰è®¾å¤‡éƒ½å¯ç”¨ã€‚æ¤æ ‡å¿—å¯é€šè¿‡å¥—接å—选项和 + 控制消æ¯ä¸¤ç§æ–¹å¼å¯ç”¨ã€‚ + +SOF_TIMESTAMPING_TX_SCHED: + 在进入数æ®åŒ…调度器之å‰è¯·æ±‚ä¼ è¾“æ—¶é—´æˆ³ã€‚å†…æ ¸ä¼ è¾“å»¶è¿Ÿï¼ˆå¦‚æžœå¾ˆé•¿ï¼‰é€šå¸¸ç”±æŽ’é˜Ÿ + å»¶è¿Ÿä¸»å¯¼ã€‚æ¤æ—¶é—´æˆ³ä¸Žåœ¨ SOF_TIMESTAMPING_TX_SOFTWARE 处获å–的时间戳之 + 间的差异将暴露æ¤å»¶è¿Ÿï¼Œå¹¶ä¸”与åè®®å¤„ç†æ— 关。å议处ç†ä¸äº§ç”Ÿçš„延迟(如果有) + å¯ä»¥é€šè¿‡ä»Ž send() 之å‰ç«‹å³èŽ·å–的用户空间时间戳ä¸å‡åŽ»æ¤æ—¶é—´æˆ³æ¥è®¡ç®—。在 + å…·æœ‰è™šæ‹Ÿè®¾å¤‡çš„æœºå™¨ä¸Šï¼Œä¼ è¾“çš„æ•°æ®åŒ…通过多个设备和多个数æ®åŒ…调度器,在æ¯å±‚ + ç”Ÿæˆæ—¶é—´æˆ³ã€‚è¿™å…许对排队延迟进行细粒度测é‡ã€‚æ¤æ ‡å¿—å¯ä»¥é€šè¿‡å¥—接å—选项和控 + 制消æ¯å¯ç”¨ã€‚ + +SOF_TIMESTAMPING_TX_ACK: + 请求在å‘é€ç¼“冲区ä¸çš„æ‰€æœ‰æ•°æ®éƒ½å·²å¾—到确认时生æˆä¼ 输(TX)时间戳。æ¤é€‰é¡¹ + 仅适用于å¯é å议,目å‰ä»…在TCPåè®®ä¸å®žçŽ°ã€‚å¯¹äºŽè¯¥å议,它å¯èƒ½ä¼šè¿‡åº¦æŠ¥å‘Š + 测é‡ç»“æžœï¼Œå› ä¸ºæ—¶é—´æˆ³æ˜¯åœ¨send()调用时缓冲区ä¸çš„æ‰€æœ‰æ•°æ®ï¼ˆåŒ…括该缓冲区) + 都被确认时生æˆçš„,å³ç´¯ç§¯ç¡®è®¤ã€‚该机制会忽略选择确认(SACK)和å‰å‘确认 + (FACKï¼‰ã€‚æ¤æ ‡å¿—å¯é€šè¿‡å¥—接å—选项和控制消æ¯ä¸¤ç§æ–¹å¼å¯ç”¨ã€‚ + +SOF_TIMESTAMPING_TX_COMPLETION: + 在数æ®åŒ…ä¼ è¾“å®Œæˆæ—¶è¯·æ±‚ä¼ è¾“æ—¶é—´æˆ³ã€‚å®Œæˆæ—¶é—´æˆ³ç”±å†…æ ¸åœ¨ä»Žç¡¬ä»¶æŽ¥æ”¶æ•°æ®åŒ…å®Œæˆ + 报告时生æˆã€‚硬件å¯èƒ½ä¸€æ¬¡æŠ¥å‘Šå¤šä¸ªæ•°æ®åŒ…ï¼Œå®Œæˆæ—¶é—´æˆ³åæ˜ æŠ¥å‘Šçš„æ—¶åºè€Œä¸æ˜¯å®ž + é™…ä¼ è¾“æ—¶é—´ã€‚æ¤æ ‡å¿—å¯ä»¥é€šè¿‡å¥—接å—选项和控制消æ¯å¯ç”¨ã€‚ + + +1.3.2 时间戳报告 +^^^^^^^^^^^^^^^^ + +å…¶ä»–ä¸‰ä¸ªä½æŽ§åˆ¶å°†åœ¨ç”Ÿæˆçš„æŽ§åˆ¶æ¶ˆæ¯ä¸æŠ¥å‘Šå“ªäº›æ—¶é—´æˆ³ã€‚对这些ä½çš„æ›´æ”¹åœ¨åè®®æ ˆä¸ +的时间戳报告ä½ç½®ç«‹å³ç”Ÿæ•ˆã€‚仅当数æ®åŒ…设置了相关的时间戳生æˆè¯·æ±‚时,æ‰ä¼šæŠ¥å‘Š +其时间戳。 + +SOF_TIMESTAMPING_SOFTWARE: + 在å¯ç”¨æ—¶æŠ¥å‘Šä»»ä½•软件时间戳。 + +SOF_TIMESTAMPING_SYS_HARDWARE: + æ¤é€‰é¡¹å·²è¢«å¼ƒç”¨å’Œå¿½ç•¥ã€‚ + +SOF_TIMESTAMPING_RAW_HARDWARE: + 在å¯ç”¨æ—¶æŠ¥å‘Šç”± SOF_TIMESTAMPING_TX_HARDWARE 或 SOF_TIMESTAMPING_RX_HARDWARE + 生æˆçš„硬件时间戳。 + + +1.3.3 时间戳选项 +^^^^^^^^^^^^^^^^ + +æŽ¥å£æ”¯æŒä»¥ä¸‹é€‰é¡¹ + +SOF_TIMESTAMPING_OPT_ID: + æ¯ä¸ªæ•°æ®åŒ…生æˆä¸€ä¸ªå”¯ä¸€æ ‡è¯†ç¬¦ã€‚一个进程å¯ä»¥åŒæ—¶å˜åœ¨å¤šä¸ªæœªå®Œæˆçš„æ—¶é—´æˆ³è¯·æ±‚。 + æ•°æ®åŒ…åœ¨ä¼ è¾“è·¯å¾„ä¸å¯èƒ½ä¼šå‘ç”Ÿé‡æŽ’åºï¼ˆä¾‹å¦‚在数æ®åŒ…调度器ä¸ï¼‰ã€‚åœ¨è¿™ç§æƒ…况下, + 时间戳会以与原始send()调用ä¸åŒçš„é¡ºåºæŽ’é˜Ÿåˆ°é”™è¯¯é˜Ÿåˆ—ä¸ã€‚如æ¤ä¸€æ¥ï¼Œä»…æ ¹æ® + æ—¶é—´æˆ³é¡ºåºæˆ– payload(有效载è·ï¼‰æ£€æŸ¥ï¼Œå¹¶ä¸æ€»èƒ½å°†æ—¶é—´æˆ³ä¸ŽåŽŸå§‹send()调用 + 唯一匹é…。 + + æ¤é€‰é¡¹åœ¨ send() æ—¶å°†æ¯ä¸ªæ•°æ®åŒ…ä¸Žå”¯ä¸€æ ‡è¯†ç¬¦å…³è”,并与时间戳一起返回。 + æ ‡è¯†ç¬¦æºè‡ªæ¯ä¸ªå¥—接å—çš„ u32 è®¡æ•°å™¨ï¼ˆä¼šå›žç»•ï¼‰ã€‚å¯¹äºŽæ•°æ®æŠ¥å¥—æŽ¥å—,计数器 + éšæ¯ä¸ªå‘é€çš„æ•°æ®åŒ…递增。对于æµå¥—接å—ï¼Œå®ƒéšæ¯ä¸ªå—节递增。对于æµå¥—接å—, + 还è¦è®¾ç½® SOF_TIMESTAMPING_OPT_ID_TCP,请å‚阅下é¢çš„部分。 + + 计数器从零开始。在首次å¯ç”¨å¥—接å—选项时åˆå§‹åŒ–。在ç¦ç”¨åŽå†é‡æ–°å¯ç”¨é€‰é¡¹æ—¶ + é‡ç½®ã€‚é‡ç½®è®¡æ•°å™¨ä¸ä¼šæ›´æ”¹ç³»ç»Ÿä¸çŽ°æœ‰æ•°æ®åŒ…çš„æ ‡è¯†ç¬¦ã€‚ + + æ¤é€‰é¡¹ä»…é’ˆå¯¹ä¼ è¾“æ—¶é—´æˆ³å®žçŽ°ã€‚åœ¨è¿™ç§æƒ…况下,时间戳总是与sock_extended_err + 结构体一起回环。该选项会修改ee_dataå—æ®µï¼Œä»¥ä¼ é€’ä¸€ä¸ªåœ¨è¯¥å¥—æŽ¥å—æ‰€æœ‰åŒæ—¶ + å˜åœ¨çš„æœªå®Œæˆæ—¶é—´æˆ³è¯·æ±‚ä¸å”¯ä¸€çš„ ID。 + + 进程å¯ä»¥é€šè¿‡æŽ§åˆ¶æ¶ˆæ¯SCM_TS_OPT_ID(TCP 套接å—䏿”¯æŒï¼‰ä¼ 递特定 ID, + 从而选择性地覆盖默认生æˆçš„ ID,示例如下:: + + struct msghdr *msg; + ... + cmsg = CMSG_FIRSTHDR(msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_TS_OPT_ID; + cmsg->cmsg_len = CMSG_LEN(sizeof(__u32)); + *((__u32 *) CMSG_DATA(cmsg)) = opt_id; + err = sendmsg(fd, msg, 0); + + +SOF_TIMESTAMPING_OPT_ID_TCP: + 与 SOF_TIMESTAMPING_OPT_ID ä¸€èµ·ä¼ é€’ç»™æ–°çš„ TCP 时间戳应用程åºã€‚ + SOF_TIMESTAMPING_OPT_ID 定义了æµå¥—接å—计数器的增é‡ï¼Œä½†å…¶èµ·å§‹ç‚¹ + å¹¶ä¸å®Œå…¨æ˜¾è€Œæ˜“è§ã€‚æ¤é€‰é¡¹ä¿®å¤äº†è¿™ä¸€ç‚¹ã€‚ + + 对于æµå¥—接å—,如果设置了 SOF_TIMESTAMPING_OPT_ID,则æ¤é€‰é¡¹åº”始终 + è®¾ç½®ã€‚åœ¨æ•°æ®æŠ¥å¥—æŽ¥å—上,选项没有效果。 + + 一个åˆç†çš„æœŸæœ›æ˜¯ç³»ç»Ÿè°ƒç”¨åŽè®¡æ•°å™¨é‡ç½®ä¸ºé›¶ï¼Œå› æ¤åŽç»å†™å…¥ N å—èŠ‚å°†ç”Ÿæˆ + 计数器为 N-1 的时间戳。SOF_TIMESTAMPING_OPT_ID_TCP 在所有æ¡ä»¶ä¸‹ + 都实现了æ¤è¡Œä¸ºã€‚ + + SOF_TIMESTAMPING_OPT_ID ä¸å¸¦ä¿®é¥°ç¬¦æ—¶é€šå¸¸æŠ¥å‘Šç›¸åŒï¼Œç‰¹åˆ«æ˜¯åœ¨å¥—接å—选项 + åœ¨æ— æ•°æ®ä¼ 输时设置时。如果æ£åœ¨ä¼ 输数æ®ï¼Œå®ƒå¯èƒ½ä¸Žè¾“出队列的长度(SIOCOUTQ) + å差。 + + 差异是由于基于 snd_una 与 write_seq 的。snd_una 是 peer 确认的 stream + çš„åç§»é‡ã€‚è¿™å–å†³äºŽå¤–éƒ¨å› ç´ ï¼Œä¾‹å¦‚ç½‘ç»œ RTT。write_seq 是进程写入的最åŽä¸€ä¸ª + å—节。æ¤åç§»é‡ä¸å—外部输入影å“。 + + 差异细微,在套接å—选项åˆå§‹åŒ–æ—¶é…ç½®æ—¶ä¸æ˜“察觉,但 SOF_TIMESTAMPING_OPT_ID_TCP + 行为在任何时候都更稳å¥ã€‚ + +SOF_TIMESTAMPING_OPT_CMSG: + æ”¯æŒæ‰€æœ‰æ—¶é—´æˆ³æ•°æ®åŒ…çš„ recv() cmsg。控制消æ¯å·²æ— æ¡ä»¶åœ°åœ¨æ‰€æœ‰æŽ¥æ”¶æ—¶é—´æˆ³æ•°æ®åŒ… + å’Œ IPv6 æ•°æ®åŒ…上支æŒï¼Œä»¥åŠåœ¨å‘逿—¶é—´æˆ³æ•°æ®åŒ…çš„ IPv4 æ•°æ®åŒ…上支æŒã€‚æ¤é€‰é¡¹æ‰©å±• + 了它们以在å‘逿—¶é—´æˆ³æ•°æ®åŒ…çš„ IPv4 æ•°æ®åŒ…上支æŒã€‚一个用例是å¯ç”¨ socket 选项 + IP_PKTINFO ä»¥å…³è”æ•°æ®åŒ…与其出å£è®¾å¤‡ï¼Œé€šè¿‡å¯ç”¨ socket 选项 IP_PKTINFO åŒæ—¶ã€‚ + + +SOF_TIMESTAMPING_OPT_TSONLY: + ä»…é€‚ç”¨äºŽä¼ è¾“æ—¶é—´æˆ³ã€‚ä½¿å†…æ ¸è¿”å›žä¸€ä¸ª cmsg 与一个空数æ®åŒ…ä¸€èµ·ï¼Œè€Œä¸æ˜¯ä¸ŽåŽŸ + å§‹æ•°æ®åŒ…一起。这å‡å°‘äº†å¥—æŽ¥å—æŽ¥æ”¶é¢„ç®—ï¼ˆSO_RCVBUFï¼‰ä¸æ”¶å–的内å˜é‡ï¼Œå¹¶å³ä½¿ + 在 sysctl net.core.tstamp_allow_data 为 0 时也æä¾›æ—¶é—´æˆ³ã€‚æ¤é€‰é¡¹ç¦ç”¨ + SOF_TIMESTAMPING_OPT_CMSG。 + +SOF_TIMESTAMPING_OPT_STATS: + ä¸Žä¼ è¾“æ—¶é—´æˆ³ä¸€èµ·èŽ·å–的选项性统计信æ¯ã€‚它必须与 SOF_TIMESTAMPING_OPT_TSONLY + ä¸€èµ·ä½¿ç”¨ã€‚å½“ä¼ è¾“æ—¶é—´æˆ³å¯ç”¨æ—¶ï¼Œç»Ÿè®¡ä¿¡æ¯å¯åœ¨ç±»åž‹ä¸º SCM_TIMESTAMPING_OPT_STATS + çš„å•独控制消æ¯ä¸èŽ·å–,作为 TLV(struct nlattr)类型的列表。这些统计信æ¯å…许应 + 用程åºå°†å„ç§ä¼ 输层统计信æ¯ä¸Žä¼ 输时间戳关è”,例如æŸä¸ªæ•°æ®å—被 peer 的接收窗å£é™ + 制了多长时间。 + +SOF_TIMESTAMPING_OPT_PKTINFO: + å¯ç”¨ SCM_TIMESTAMPING_PKTINFO 控制消æ¯ä»¥æŽ¥æ”¶å¸¦æœ‰ç¡¬ä»¶æ—¶é—´æˆ³çš„æ•°æ®åŒ…。 + 消æ¯åŒ…å« struct scm_ts_pktinfo,它æä¾›æŽ¥æ”¶æ•°æ®åŒ…的实际接å£ç´¢å¼•和层 2 长度。 + åªæœ‰åœ¨ CONFIG_NET_RX_BUSY_POLL å¯ç”¨ä¸”驱动程åºä½¿ç”¨ NAPI 时,æ‰ä¼šè¿”回éžé›¶çš„ + 有效接å£ç´¢å¼•。该结构还包å«å¦å¤–ä¸¤ä¸ªå—æ®µï¼Œä½†å®ƒä»¬æ˜¯ä¿ç•™å—段且未定义。 + +SOF_TIMESTAMPING_OPT_TX_SWHW: + 请求在 SOF_TIMESTAMPING_TX_HARDWARE å’Œ SOF_TIMESTAMPING_TX_SOFTWARE + åŒæ—¶å¯ç”¨æ—¶ï¼Œä¸ºä¼ 出数æ®åŒ…生æˆç¡¬ä»¶å’Œè½¯ä»¶æ—¶é—´æˆ³ã€‚å¦‚æžœåŒæ—¶ç”Ÿæˆä¸¤ä¸ªæ—¶é—´æˆ³ï¼Œä¸¤ä¸ªå• + 独的消æ¯å°†å›žçŽ¯åˆ°å¥—æŽ¥å—的错误队列,æ¯ä¸ªæ¶ˆæ¯ä»…包å«ä¸€ä¸ªæ—¶é—´æˆ³ã€‚ + +SOF_TIMESTAMPING_OPT_RX_FILTER: + è¿‡æ»¤æŽ‰è™šå‡æŽ¥æ”¶æ—¶é—´æˆ³ï¼šä»…å½“åŒ¹é…çš„æ—¶é—´æˆ³ç”Ÿæˆæ ‡å¿—å·²å¯ç”¨æ—¶æ‰æŠ¥å‘ŠæŽ¥æ”¶æ—¶é—´æˆ³ã€‚ + + 接收时间戳在入å£è·¯å¾„ä¸ç”Ÿæˆè¾ƒæ—©ï¼Œåœ¨æ•°æ®åŒ…的目的套接å—确定之å‰ã€‚如果任何套接 + å—å¯ç”¨æŽ¥æ”¶æ—¶é—´æˆ³ï¼Œæ‰€æœ‰å¥—接å—的数æ®åŒ…将接收时间戳数æ®åŒ…。包括那些请求时间戳 + 报告与 SOF_TIMESTAMPING_SOFTWARE å’Œ/或 SOF_TIMESTAMPING_RAW_HARDWARE, + 但未请求接收时间戳生æˆã€‚è¿™å¯èƒ½å‘生在仅请求å‘逿—¶é—´æˆ³æ—¶ã€‚ + + æŽ¥æ”¶è™šå‡æ—¶é—´æˆ³é€šå¸¸æ˜¯æ— 害的。进程å¯ä»¥å¿½ç•¥æ„外的éžé›¶å€¼ã€‚但它使行为在其他套接 + å—上微妙地ä¾èµ–ã€‚æ¤æ ‡å¿—隔离套接å—以获得更确定的行为。 + +新应用程åºé¼“åŠ±ä¼ é€’ SOF_TIMESTAMPING_OPT_ID ä»¥åŒºåˆ†æ—¶é—´æˆ³å¹¶ä¼ é€’ +SOF_TIMESTAMPING_OPT_TSONLY 以æ“作,而ä¸ç®¡ sysctl net.core.tstamp_allow_data +的设置。 + +例外情况是当进程需è¦é¢å¤–çš„ cmsg æ•°æ®æ—¶ï¼Œä¾‹å¦‚ SOL_IP/IP_PKTINFO 以检测出 +å£ç½‘络接å£ã€‚ç„¶åŽä¼ 递选项 SOF_TIMESTAMPING_OPT_CMSG。æ¤é€‰é¡¹ä¾èµ–于访问原 +å§‹æ•°æ®åŒ…çš„å†…å®¹ï¼Œå› æ¤ä¸èƒ½ä¸Ž SOF_TIMESTAMPING_OPT_TSONLY 组åˆã€‚ + + +1.3.4. 通过控制消æ¯å¯ç”¨æ—¶é—´æˆ³ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +除了套接å—选项外,时间戳生æˆè¿˜å¯ä»¥é€šè¿‡ cmsg 按写入请求,仅适用于 +SOF_TIMESTAMPING_TX_*(è§ç¬¬ 1.3.1 节)。使用æ¤åŠŸèƒ½ï¼Œåº”ç”¨ç¨‹åºå¯ä»¥æ— 需å¯ç”¨å’Œ +ç¦ç”¨æ—¶é—´æˆ³å³å¯é‡‡æ ·æ¯ä¸ª sendmsg() 的时间戳:: + + struct msghdr *msg; + ... + cmsg = CMSG_FIRSTHDR(msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SO_TIMESTAMPING; + cmsg->cmsg_len = CMSG_LEN(sizeof(__u32)); + *((__u32 *) CMSG_DATA(cmsg)) = SOF_TIMESTAMPING_TX_SCHED | + SOF_TIMESTAMPING_TX_SOFTWARE | + SOF_TIMESTAMPING_TX_ACK; + err = sendmsg(fd, msg, 0); + +通过 cmsg 设置的 SOF_TIMESTAMPING_TX_* æ ‡å¿—å°†è¦†ç›–é€šè¿‡ setsockopt 设置的 +SOF_TIMESTAMPING_TX_* æ ‡å¿—ã€‚ + +æ¤å¤–,应用程åºä»ç„¶éœ€è¦é€šè¿‡ setsockopt å¯ç”¨æ—¶é—´æˆ³æŠ¥å‘Šä»¥æŽ¥æ”¶æ—¶é—´æˆ³:: + + __u32 val = SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_OPT_ID /* æˆ–ä»»ä½•å…¶ä»–æ ‡å¿— */; + err = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val)); + + +1.4 å—èŠ‚æµæ—¶é—´æˆ³ +---------------- + +SO_TIMESTAMPING æŽ¥å£æ”¯æŒå—节æµçš„æ—¶é—´æˆ³ã€‚æ¯ä¸ªè¯·æ±‚解释为请求当整个缓冲区内容 +通过时间戳点时。也就是说,对于æµé€‰é¡¹ SOF_TIMESTAMPING_TX_SOFTWARE 将记录 +当所有å—èŠ‚éƒ½åˆ°è¾¾è®¾å¤‡é©±åŠ¨ç¨‹åºæ—¶ï¼Œæ— 论数æ®è¢«è½¬æ¢æˆå¤šå°‘个数æ®åŒ…。 + +一般æ¥è¯´ï¼Œå—èŠ‚æµæ²¡æœ‰è‡ªç„¶åˆ†éš”ç¬¦ï¼Œå› æ¤å°†æ—¶é—´æˆ³ä¸Žæ•°æ®ç›¸å…³è”是éžå¹³å‡¡çš„。å—节范围 +å¯èƒ½è·¨æ®µï¼Œä»»ä½•段å¯èƒ½åˆå¹¶ï¼ˆå¯èƒ½åˆå¹¶å…ˆå‰åˆ†æ®µç¼“冲区关è”的独立 send() 调用)。段 +å¯ä»¥é‡æ–°æŽ’åºï¼ŒåŒä¸€å—节范围å¯ä»¥åœ¨å¤šä¸ªæ®µä¸å¹¶å˜ï¼Œå¯¹äºŽå®žçްé‡ä¼ çš„å议。 + +所有时间戳必须实现相åŒçš„è¯ä¹‰ï¼Œå¦åˆ™å®ƒä»¬æ˜¯ä¸å¯æ¯”较的。以ä¸åŒäºŽç®€å•情况(缓冲区 +到 skb çš„ 1:1 æ˜ å°„ï¼‰çš„æ–¹å¼å¤„ç†â€œç½•è§â€è§’è½æƒ…况是ä¸å¤Ÿçš„ï¼Œå› ä¸ºæ€§èƒ½è°ƒè¯•é€šå¸¸éœ€è¦ +关注这些异常。 + +在实践ä¸ï¼Œæ—¶é—´æˆ³å¯ä»¥ä¸Žå—èŠ‚æµæ®µä¸€è‡´åœ°å…³è”,如果时间戳è¯ä¹‰å’Œæµ‹é‡æ—¶åºçš„选择æ£ç¡®ã€‚ +æ¤æŒ‘战与决定 IP 分片ç–略没有ä¸åŒã€‚在那里,定义是仅对第一个分片进行时间戳。对 +于å—节æµï¼Œæˆ‘们选择仅在所有å—节通过æŸä¸ªç‚¹æ—¶ç”Ÿæˆæ—¶é—´æˆ³ã€‚SOF_TIMESTAMPING_TX_ACK +å®šä¹‰çš„å®žçŽ°å’ŒæŽ¨ç†æ˜¯å®¹æ˜“的。一个需è¦è€ƒè™‘ SACK çš„å®žçŽ°ä¼šæ›´å¤æ‚ï¼Œå› ä¸ºå¯èƒ½å˜åœ¨ä¼ 输 +空洞和乱åºåˆ°è¾¾ã€‚ + +在主机上,TCP 也å¯ä»¥é€šè¿‡ Nagleã€corkã€autocorkã€åˆ†æ®µå’Œ GSO æ‰“ç ´ç®€å•çš„ 1:1 +缓冲区到 skbuff æ˜ å°„ã€‚å®žçŽ°ç¡®ä¿åœ¨æ‰€æœ‰æƒ…况下都æ£ç¡®ï¼Œé€šè¿‡è·Ÿè¸ªæ¯ä¸ª send() ä¼ é€’ +ç»™send() 的最åŽä¸€ä¸ªå—节,å³ä½¿å®ƒåœ¨ skbuff 扩展或åˆå¹¶æ“作åŽä¸å†æ˜¯æœ€åŽä¸€ä¸ªå— +节。它å˜å‚¨ç›¸å…³çš„åºåˆ—å·åœ¨ skb_shinfo(skb)->tskeyã€‚å› ä¸ºä¸€ä¸ª skbuff åªæœ‰ä¸€ +ä¸ªè¿™æ ·çš„å—æ®µï¼Œæ‰€ä»¥åªèƒ½ç”Ÿæˆä¸€ä¸ªæ—¶é—´æˆ³ã€‚ + +åœ¨ç½•è§æƒ…况下,如果两个请求折å 到åŒä¸€ä¸ª skb,则时间戳请求å¯èƒ½ä¼šè¢«é”™è¿‡ã€‚è¿›ç¨‹å¯ +以通过始终在请求之间刷新 TCP æ ˆæ¥æ£€æµ‹æ¤æƒ…况,例如å¯ç”¨ TCP_NODELAY å’Œç¦ç”¨ +TCP_CORKå’Œ autocork。在 linux-4.7 之åŽï¼Œæ›´å¥½çš„预防åˆå¹¶æ–¹æ³•是使用 MSG_EOR +æ ‡å¿—åœ¨sendmsg()时。 + +è¿™äº›é¢„é˜²æŽªæ–½ç¡®ä¿æ—¶é—´æˆ³ä»…在所有å—节通过时间戳点时生æˆï¼Œå‡è®¾ç½‘ç»œæ ˆæœ¬èº«ä¸ä¼šé‡æ–° +æŽ’åºæ®µã€‚æ ˆç¡®å®žè¯•å›¾é¿å…釿–°æŽ’åºã€‚唯一的例外是管ç†å‘˜æŽ§åˆ¶ï¼šå¯ä»¥æž„é€ ä¸€ä¸ªæ•°æ®åŒ…è°ƒ +度器é…置,将æ¥è‡ªåŒä¸€æµçš„ä¸åŒæ®µå»¶è¿Ÿä¸åŒã€‚è¿™ç§è®¾ç½®é€šå¸¸ä¸å¸¸è§ã€‚ + + +2 æ•°æ®æŽ¥å£ +========== + +时间戳通过 recvmsg() 的辅助数æ®åŠŸèƒ½è¯»å–。请å‚阅 `man 3 cmsg` äº†è§£æ¤æŽ¥å£çš„ +详细信æ¯ã€‚å¥—æŽ¥å—æ‰‹å†Œé¡µé¢ (`man 7 socket`) æè¿°äº†å¦‚何检索SO_TIMESTAMP å’Œ +SO_TIMESTAMPNS 生æˆçš„æ•°æ®åŒ…时间戳。 + + +2.1 SCM_TIMESTAMPING 记录 +------------------------- + +这些时间戳在 cmsg_level SOL_SOCKETã€cmsg_type SCM_TIMESTAMPING 和类型为 + +对于 SO_TIMESTAMPING_OLD:: + + struct scm_timestamping { + struct timespec ts[3]; + }; + +对于 SO_TIMESTAMPING_NEW:: + + struct scm_timestamping64 { + struct __kernel_timespec ts[3]; + +始终使用 SO_TIMESTAMPING_NEW 时间戳以始终获得 struct scm_timestamping64 +æ ¼å¼çš„æ—¶é—´æˆ³ã€‚ + +SO_TIMESTAMPING_OLD 在 32 使œºå™¨ä¸Š 2038 å¹´åŽè¿”回错误的时间戳。 + +该结构å¯ä»¥è¿”回最多三个时间戳。这是一个é—ç•™åŠŸèƒ½ã€‚ä»»ä½•æ—¶å€™è‡³å°‘æœ‰ä¸€ä¸ªå— +段ä¸ä¸ºé›¶ã€‚大多数时间戳都通过 ts[0] ä¼ é€’ã€‚ç¡¬ä»¶æ—¶é—´æˆ³é€šè¿‡ ts[2] ä¼ é€’ã€‚ + +ts[1] 以å‰ç”¨äºŽå˜å‚¨ç¡¬ä»¶æ—¶é—´æˆ³è½¬æ¢ä¸ºç³»ç»Ÿæ—¶é—´ã€‚相å,将硬件时钟设备直接 +暴露为HW PTPæ—¶é’Ÿæºï¼Œä»¥å…许用户空间进行时间转æ¢ï¼Œå¹¶å¯é€‰åœ°ä¸Žç”¨æˆ·ç©ºé—´ +PTP å †æ ˆï¼ˆå¦‚linuxptpï¼‰åŒæ¥ç³»ç»Ÿæ—¶é—´ã€‚对于 PTP æ—¶é’Ÿ API,请å‚阅 +Documentation/driver-api/ptp.rst。 + +注æ„ï¼Œå¦‚æžœåŒæ—¶å¯ç”¨äº† SO_TIMESTAMP 或 SO_TIMESTAMPNS 与 +SO_TIMESTAMPING 使用 SOF_TIMESTAMPING_SOFTWARE,在 recvmsg() +调用时会生æˆä¸€ä¸ªè™šå‡çš„è½¯ä»¶æ—¶é—´æˆ³ï¼Œå¹¶ä¼ é€’ç»™ ts[0] 当真实软件时间戳缺 +失时。这也å‘ç”Ÿåœ¨ç¡¬ä»¶ä¼ è¾“æ—¶é—´æˆ³ä¸Šã€‚ + +2.1.1 ä¼ è¾“æ—¶é—´æˆ³ä¸Ž MSG_ERRQUEUE +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +å¯¹äºŽä¼ è¾“æ—¶é—´æˆ³ï¼Œä¼ å‡ºæ•°æ®åŒ…回环到套接å—çš„é”™è¯¯é˜Ÿåˆ—ï¼Œå¹¶é™„åŠ å‘逿—¶é—´æˆ³ï¼ˆs)。 +进程通过调用带有 MSG_ERRQUEUE æ ‡å¿—çš„ recvmsg() æŽ¥æ”¶æ—¶é—´æˆ³ï¼Œå¹¶ä¼ é€’ +一个足够大的 msg_control缓冲区以接收相关的元数æ®ç»“构。recvmsg 调用 +è¿”å›žåŽŸå§‹ä¼ å‡ºæ•°æ®åŒ…ï¼Œå¹¶é™„åŠ ä¸¤ä¸ªè¾…åŠ©æ¶ˆæ¯ã€‚ + +一个 cm_level SOL_IP(V6) å’Œ cm_type IP(V6)_RECVERR 嵌入一个 +struct sock_extended_err这定义了错误类型。对于时间戳,ee_errno +å—æ®µæ˜¯ ENOMSG。å¦ä¸€ä¸ªè¾…助消æ¯å°†å…·æœ‰ cm_level SOL_SOCKET å’Œ cm_type +SCM_TIMESTAMPING。这嵌入了 struct scm_timestamping。 + + +2.1.1.2 时间戳类型 +~~~~~~~~~~~~~~~~~~ + +三个 struct timespec çš„è¯ä¹‰ç”± struct sock_extended_err ä¸çš„ +ee_info å—æ®µå®šä¹‰ã€‚它包å«ä¸€ä¸ªç±»åž‹ SCM_TSTAMP_* æ¥å®šä¹‰å®žé™…ä¼ é€’ç»™ +scm_timestamping 的时间戳。 + +SCM_TSTAMP_* 类型与之å‰è®¨è®ºçš„ SOF_TIMESTAMPING_* æŽ§åˆ¶å—æ®µå®Œå…¨ +匹é…ï¼Œåªæœ‰ä¸€ä¸ªä¾‹å¤–对于é—ç•™åŽŸå› ï¼ŒSCM_TSTAMP_SND ç‰äºŽé›¶ï¼Œå¯ä»¥è®¾ç½®ä¸º +SOF_TIMESTAMPING_TX_HARDWARE å’Œ SOF_TIMESTAMPING_TX_SOFTWARE。 +它是第一个,如果 ts[2] ä¸ä¸ºé›¶ï¼Œå¦åˆ™æ˜¯ç¬¬äºŒä¸ªï¼Œåœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œæ—¶é—´æˆ³å˜ +储在ts[0] ä¸ã€‚ + + +2.1.1.3 分片 +~~~~~~~~~~~~ + +ä¼ å‡ºæ•°æ®æŠ¥åˆ†ç‰‡å¾ˆå°‘è§ï¼Œä½†å¯èƒ½å‘生,例如通过显å¼ç¦ç”¨ PMTU å‘现。如果 +ä¼ å‡ºæ•°æ®åŒ…被分片,则仅对第一个分片进行时间戳,并返回给å‘é€å¥—接å—。 + + +2.1.1.4 æ•°æ®åŒ…è´Ÿè½½ +~~~~~~~~~~~~~~~~~~ + +调用应用程åºé€šå¸¸ä¸å…³å¿ƒæŽ¥æ”¶å®ƒä¼ é€’ç»™å †æ ˆçš„æ•´ä¸ªæ•°æ®åŒ…负载:套接å—错误队 +列机制仅是一ç§å°†æ—¶é—´æˆ³é™„åŠ åˆ°å…¶ä¸Šçš„æ–¹æ³•ã€‚åœ¨è¿™ç§æƒ…况下,应用程åºå¯ä»¥é€‰ +择读å–较å°çš„æ•°æ®æŠ¥ï¼Œç”šè‡³é•¿åº¦ä¸º 0。负载相应地被截æ–。直到进程调用 +recvmsg() 到错误队列,然而,整个数æ®åŒ…ä»åœ¨é˜Ÿåˆ—ä¸ï¼Œå 用 SO_RCVBUF 预算。 + + +2.1.1.5 é˜»å¡žè¯»å– +~~~~~~~~~~~~~~~~ + +从错误队列读å–始终是éžé˜»å¡žæ“作。è¦é˜»å¡žç‰å¾…时间戳,请使用 poll 或 +select。poll() 将在 pollfd.revents ä¸è¿”回 POLLERR,如果错误队列 +䏿œ‰æ•°æ®ã€‚没有必è¦åœ¨ pollfd.eventsä¸ä¼ é€’æ¤æ ‡å¿—ã€‚æ¤æ ‡å¿—在请求时被忽 +略。å¦è¯·å‚阅 `man 2 poll`。 + + +2.1.2 接收时间戳 +^^^^^^^^^^^^^^^^ + +在接收时,没有ç†ç”±ä»Žå¥—接å—错误队列读å–。SCM_TIMESTAMPING 辅助数æ®ä¸Ž +æ•°æ®åŒ…æ•°æ®ä¸€èµ·é€šè¿‡æ£å¸¸ recvmsg() å‘é€ã€‚ç”±äºŽè¿™ä¸æ˜¯å¥—接å—错误,它ä¸ä¼´ +éšæ¶ˆæ¯ SOL_IP(V6)/IP(V6)_RECVERRORã€‚åœ¨è¿™ç§æƒ…况下,struct +scm_timestamping ä¸çš„ä¸‰ä¸ªå—æ®µå«ä¹‰éšå¼å®šä¹‰ã€‚ts[0] 在设置时包å«è½¯ä»¶ +时间戳,ts[1] 冿¬¡è¢«å¼ƒç”¨ï¼Œts[2] 在设置时包å«ç¡¬ä»¶æ—¶é—´æˆ³ã€‚ + + +3. 硬件时间戳é…置:ETHTOOL_MSG_TSCONFIG_SET/GET +=============================================== + +硬件时间戳也必须为æ¯ä¸ªè®¾å¤‡é©±åŠ¨ç¨‹åºåˆå§‹åŒ–,该驱动程åºé¢„期执行硬件时间戳。 +傿•°åœ¨ include/uapi/linux/net_tstamp.h ä¸å®šä¹‰ä¸º:: + + struct hwtstamp_config { + int flags; /* ç›®å‰æ²¡æœ‰å®šä¹‰çš„æ ‡å¿—,必须为零 */ + int tx_type; /* HWTSTAMP_TX_* */ + int rx_filter; /* HWTSTAMP_FILTER_* */ + }; + +期望的行为通过 tsconfig netlink å¥—æŽ¥å— ``ETHTOOL_MSG_TSCONFIG_SET`` +ä¼ é€’åˆ°å†…æ ¸ï¼Œå¹¶é€šè¿‡ ``ETHTOOL_A_TSCONFIG_TX_TYPES``〠+``ETHTOOL_A_TSCONFIG_RX_FILTERS`` å’Œ ``ETHTOOL_A_TSCONFIG_HWTSTAMP_FLAGS`` +netlink 属性设置 struct hwtstamp_config 相应地。 + +``ETHTOOL_A_TSCONFIG_HWTSTAMP_PROVIDER`` netlink 嵌套属性用于选择 +ç¡¬ä»¶æ—¶é—´æˆ³çš„æ¥æºã€‚它由设备æºçš„索引和时间戳类型é™å®šç¬¦ç»„æˆã€‚ + +驱动程åºå¯ä»¥è‡ªç”±ä½¿ç”¨æ¯”请求更宽æ¾çš„é…置。预期驱动程åºåº”仅实现å¯ä»¥ç›´æŽ¥æ”¯æŒçš„ +最通用模å¼ã€‚例如,如果硬件å¯ä»¥æ”¯æŒ HWTSTAMP_FILTER_PTP_V2_EVENT,则它 +通常应始终å‡çº§HWTSTAMP_FILTER_PTP_V2_L2_SYNCï¼Œä¾æ¤ç±»æŽ¨ï¼Œå› 为 +HWTSTAMP_FILTER_PTP_V2_EVENT 更通用(更实用)。 + +支æŒç¡¬ä»¶æ—¶é—´æˆ³çš„驱动程åºåº”æ›´æ–° struct,并å¯èƒ½è¿”回更宽æ¾çš„实际é…置。如果 +请求的数æ®åŒ…æ— æ³•è¿›è¡Œæ—¶é—´æˆ³ï¼Œåˆ™ä¸åº”更改任何内容,并返回 ERANGE(与 EINVAL +相å,这表明 SIOCSHWTSTAMP æ ¹æœ¬ä¸æ”¯æŒï¼‰ã€‚ + +åªæœ‰å…·æœ‰ç®¡ç†æƒé™çš„进程æ‰èƒ½æ›´æ”¹é…置。用户空间负责确ä¿å¤šä¸ªè¿›ç¨‹ä¸ä¼šç›¸äº’干扰, +å¹¶ç¡®ä¿è®¾ç½®è¢«é‡ç½®ã€‚ + +任何进程都å¯ä»¥é€šè¿‡è¯·æ±‚ tsconfig netlink å¥—æŽ¥å— ``ETHTOOL_MSG_TSCONFIG_GET`` +读å–实际é…置。 + +é—ç•™é…置是使用 ioctl(SIOCSHWTSTAMP) ä¸ŽæŒ‡å‘ struct ifreq 的指针,其 +ifr_dataæŒ‡å‘ struct hwtstamp_config。tx_type å’Œ rx_filter 是驱动 +ç¨‹åºæœŸæœ›æ‰§è¡Œçš„æç¤ºã€‚å¦‚æžœè¯·æ±‚çš„ç»†ç²’åº¦è¿‡æ»¤å¯¹ä¼ å…¥æ•°æ®åŒ…䏿”¯æŒï¼Œé©±åŠ¨ç¨‹åºå¯èƒ½ +会对请求的数æ®åŒ…进行时间戳。ioctl(SIOCGHWTSTAMP) 以与 +ioctl(SIOCSHWTSTAMP) 相åŒçš„æ–¹å¼ä½¿ç”¨ã€‚然而,å¹¶éžæ‰€æœ‰é©±åŠ¨ç¨‹åºéƒ½å®žçŽ°äº†è¿™ä¸€ç‚¹ã€‚ + +:: + + /* å¯èƒ½çš„ hwtstamp_config->tx_type 值 */ + enum { + /* + * ä¸ä¼šéœ€è¦ç¡¬ä»¶æ—¶é—´æˆ³çš„ä¼ å‡ºæ•°æ®åŒ…ï¼› + * 如果数æ®åŒ…到达并请求它,则ä¸ä¼šè¿›è¡Œç¡¬ä»¶æ—¶é—´æˆ³ + */ + HWTSTAMP_TX_OFF, + + /* + * å¯ç”¨ä¼ 出数æ®åŒ…的硬件时间戳; + * æ•°æ®åŒ…çš„å‘é€è€…决定哪些数æ®åŒ…éœ€è¦æ—¶é—´æˆ³ï¼Œ + * 在å‘逿•°æ®åŒ…之å‰è®¾ç½® SOF_TIMESTAMPING_TX_SOFTWARE + */ + HWTSTAMP_TX_ON, + }; + + /* å¯èƒ½çš„ hwtstamp_config->rx_filter 值 */ + enum { + /* 时间戳ä¸ä¼ 入任何数æ®åŒ… */ + HWTSTAMP_FILTER_NONE, + + /* æ—¶é—´æˆ³ä»»ä½•ä¼ å…¥æ•°æ®åŒ… */ + HWTSTAMP_FILTER_ALL, + + /* 返回值:时间戳所有请求的数æ®åŒ…åŠ ä¸Šä¸€äº›å…¶ä»–æ•°æ®åŒ… */ + HWTSTAMP_FILTER_SOME, + + /* PTP v1,UDP,任何事件数æ®åŒ… */ + HWTSTAMP_FILTER_PTP_V1_L4_EVENT, + + /* 有关完整值列表,请检查 + * 文件 include/uapi/linux/net_tstamp.h + */ + }; + +3.1 ç¡¬ä»¶æ—¶é—´æˆ³å®žçŽ°ï¼šè®¾å¤‡é©±åŠ¨ç¨‹åº +-------------------------------- + +支æŒç¡¬ä»¶æ—¶é—´æˆ³çš„驱动程åºå¿…é¡»æ”¯æŒ ndo_hwtstamp_set NDO 或é—ç•™ SIOCSHWTSTAMP +ioctl å¹¶æ›´æ–°æä¾›çš„ struct hwtstamp_config 与实际值,如 SIOCSHWTSTAMP 部分 +æ‰€è¿°ã€‚å®ƒè¿˜åº”æ”¯æŒ ndo_hwtstamp_get 或é—ç•™ SIOCGHWTSTAMP。 + +接收数æ®åŒ…的时间戳必须å˜å‚¨åœ¨ skb ä¸ã€‚è¦èŽ·å– skb 的共享时间戳结构,请调用 +skb_hwtstamps()。然åŽè®¾ç½®ç»“æž„ä¸çš„æ—¶é—´æˆ³:: + + struct skb_shared_hwtstamps { + /* 硬件时间戳转æ¢ä¸ºè‡ªä»»æ„时间点的æŒç»æ—¶é—´ + * 自定义点 + */ + ktime_t hwtstamp; + }; + +ä¼ å‡ºæ•°æ®åŒ…的时间戳应按如下方å¼ç”Ÿæˆï¼š + +- 在 hard_start_xmit() ä¸ï¼Œæ£€æŸ¥ (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) + 是å¦ä¸ä¸ºé›¶ã€‚å¦‚æžœæ˜¯ï¼Œåˆ™é©±åŠ¨ç¨‹åºæœŸæœ›æ‰§è¡Œç¡¬ä»¶æ—¶é—´æˆ³ã€‚ +- å¦‚æžœæ¤ skb 和请求都å¯èƒ½ï¼Œåˆ™å£°æ˜Žé©±åŠ¨ç¨‹åºæ£åœ¨æ‰§è¡Œæ—¶é—´æˆ³ï¼Œé€šè¿‡è®¾ç½® skb_shinfo(skb)->tx_flags + ä¸çš„æ ‡å¿—SKBTX_IN_PROGRESS,例如:: + + skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; + + 您å¯èƒ½å¸Œæœ›ä¿ç•™ä¸Ž skb å…³è”çš„æŒ‡é’ˆï¼Œè€Œä¸æ˜¯é‡Šæ”¾ skbã€‚ä¸æ”¯æŒç¡¬ä»¶æ—¶é—´æˆ³çš„驱 + 动程åºä¸ä¼šè¿™æ ·åšã€‚驱动程åºç»ä¸èƒ½è§¦åŠ sk_buff::tstampï¼å®ƒç”¨äºŽå˜å‚¨ç½‘络 + å系统生æˆçš„软件时间戳。 +- 驱动程åºåº”在尽å¯èƒ½æŽ¥è¿‘å°† sk_buff ä¼ é€’ç»™ç¡¬ä»¶æ—¶è°ƒç”¨ skb_tx_timestamp()。 + skb_tx_timestamp()æä¾›è½¯ä»¶æ—¶é—´æˆ³ï¼ˆå¦‚果请求),并且硬件时间戳ä¸å¯ç”¨ + (SKBTX_IN_PROGRESS 未设置)。 +- 一旦驱动程åºå‘逿•°æ®åŒ…å¹¶/或获å–硬件时间戳,它就会通过 skb_tstamp_tx() + ä¼ é€’æ—¶é—´æˆ³ï¼ŒåŽŸå§‹ skb,原始硬件时间戳。skb_tstamp_tx() 克隆原始 skb å¹¶ + æ·»åŠ æ—¶é—´æˆ³ï¼Œå› æ¤åŽŸå§‹ skb 现在必须释放。如果获å–ç¡¬ä»¶æ—¶é—´æˆ³å¤±è´¥ï¼Œåˆ™é©±åŠ¨ç¨‹åº + ä¸åº”回退到软件时间戳。ç†ç”±æ˜¯ï¼Œè¿™ä¼šåœ¨å¤„ç†ç®¡é“ä¸çš„ç¨åŽæ—¶é—´å‘ç”Ÿï¼Œè€Œä¸æ˜¯å…¶ä»–软 + ä»¶æ—¶é—´æˆ³ï¼Œå› æ¤å¯èƒ½å¯¼è‡´æ—¶é—´æˆ³ä¹‹é—´çš„差异。 + +3.2 å †å PTP 硬件时钟的特殊考虑 +------------------------------- + +在数æ®åŒ…的路径ä¸å¯èƒ½å˜åœ¨å¤šä¸ª PHC(PTP ç¡¬ä»¶æ—¶é’Ÿï¼‰ã€‚å†…æ ¸æ²¡æœ‰æ˜Žç¡®çš„æœºåˆ¶å…许用 +户选择用于时间戳以太网帧的 PHC。相å,å‡è®¾æœ€å¤–层的 PHC 始终是最优的,并且 +å†…æ ¸é©±åŠ¨ç¨‹åºåä½œä»¥å®žçŽ°è¿™ä¸€ç›®æ ‡ã€‚ç›®å‰æœ‰ 3 ç§å †å PHC 的情况,如下所示: + +3.2.1 DSA(分布å¼äº¤æ¢æž¶æž„ï¼‰äº¤æ¢æœº +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +这些是具有一个端å£è¿žæŽ¥åˆ°ï¼ˆå®Œå…¨ä¸çŸ¥æƒ…的)主机以太网接å£çš„ä»¥å¤ªç½‘äº¤æ¢æœºï¼Œå¹¶ä¸” +执行端å£å¤šè·¯å¤ç”¨æˆ–å¯é€‰è½¬å‘åŠ é€ŸåŠŸèƒ½ã€‚æ¯ä¸ª DSA äº¤æ¢æœºç«¯å£åœ¨ç”¨æˆ·çœ‹æ¥éƒ½æ˜¯ç‹¬ç«‹çš„ +(虚拟)网络接å£ï¼Œå…¶ç½‘络 I/O 在底层通过主机接å£ï¼ˆåœ¨ TX 上é‡å®šå‘到主机端å£ï¼Œ +在 RX 上拦截帧)执行。 + +当 DSA äº¤æ¢æœºè¿žæŽ¥åˆ°ä¸»æœºç«¯å£æ—¶ï¼ŒPTP åŒæ¥å¿…é¡»å—到é™åˆ¶ï¼Œå› ä¸ºäº¤æ¢æœºçš„å¯å˜æŽ’队 +延迟引入了主机端å£ä¸Žå…¶ PTP ä¼™ä¼´ä¹‹é—´çš„è·¯å¾„å»¶è¿ŸæŠ–åŠ¨ã€‚å› æ¤ï¼Œä¸€äº› DSA äº¤æ¢æœº +包å«è‡ªå·±çš„æ—¶é—´æˆ³æ—¶é’Ÿï¼Œå¹¶å…·æœ‰åœ¨è‡ªèº« MACä¸Šæ‰§è¡Œç½‘ç»œæ—¶é—´æˆ³çš„èƒ½åŠ›ï¼Œå› æ¤è·¯å¾„延迟 +仅测é‡çº¿ç¼†å’Œ PHY ä¼ æ’å»¶è¿Ÿã€‚æ”¯æŒ Linux çš„ DSA äº¤æ¢æœºæš´éœ²äº†ä¸Žä»»ä½•其他网络 +接å£ç›¸åŒçš„ ABI(除了 DSA 接å£åœ¨ç½‘络 I/O æ–¹é¢å®žé™…上是虚拟的,它们确实有自 +己的PHCï¼‰ã€‚å…¸åž‹åœ°ï¼Œä½†ä¸æ˜¯å¼ºåˆ¶æ€§åœ°ï¼Œæ‰€æœ‰DSA äº¤æ¢æœºæŽ¥å£å…±äº«ç›¸åŒçš„ PHC。 + +通过设计,DSA äº¤æ¢æœºå¯¹è¿žæŽ¥åˆ°å…¶ä¸»æœºç«¯å£çš„ PTP 时间戳ä¸éœ€è¦ä»»ä½•特殊的驱动程 +åºå¤„ç†ã€‚然而,当主机端å£ä¹Ÿæ”¯æŒ PTP 时间戳时,DSA 将负责拦截 +``.ndo_eth_ioctl`` 调用,并阻æ¢å°è¯•在主机端å£ä¸Šå¯ç”¨ç¡¬ä»¶æ—¶é—´æˆ³ã€‚è¿™æ˜¯å› ä¸º +SO_TIMESTAMPING API ä¸å…许为åŒä¸€æ•°æ®åŒ…ä¼ é€’å¤šä¸ªç¡¬ä»¶æ—¶é—´æˆ³ï¼Œå› æ¤é™¤äº† DSA +äº¤æ¢æœºç«¯å£ä¹‹å¤–的任何人都ä¸åº”阻æ¢è¿™æ ·åšã€‚ + +在通用层,DSA æä¾›äº†ä»¥ä¸‹åŸºç¡€è®¾æ–½ç”¨äºŽ PTP 时间戳: + +- ``.port_txtstamp()``:在用户空间从用户空间请求带有硬件 TX 时间戳请求 + 的数æ®åŒ…之å‰è°ƒç”¨çš„é’©åã€‚è¿™æ˜¯å¿…éœ€çš„ï¼Œå› ä¸ºç¡¬ä»¶æ—¶é—´æˆ³åœ¨å®žé™… MAC ä¼ è¾“åŽæ‰å¯ + ç”¨ï¼Œå› æ¤é©±åŠ¨ç¨‹åºå¿…须准备将时间戳与原始数æ®åŒ…相关è”,以便它å¯ä»¥é‡æ–°å…¥é˜Ÿæ•° + æ®åŒ…到套接å—的错误队列。为了ä¿å˜å¯èƒ½åœ¨æ—¶é—´æˆ³å¯ç”¨æ—¶éœ€è¦çš„æ•°æ®åŒ…ï¼Œé©±åŠ¨ç¨‹åº + å¯ä»¥è°ƒç”¨ ``skb_clone_sk``,在 skb->cb ä¸ä¿å˜å…‹éš†æŒ‡é’ˆï¼Œå¹¶å…¥é˜Ÿä¸€ä¸ª tx + skb é˜Ÿåˆ—ã€‚é€šå¸¸ï¼Œäº¤æ¢æœºä¼šæœ‰ä¸€ä¸ªPTP TX 时间戳寄å˜å™¨ï¼ˆæˆ–有时是一个 FIFO), + 其䏿—¶é—´æˆ³å¯ç”¨ã€‚在 FIFO 的情况下,硬件å¯èƒ½ä¼šå˜å‚¨PTP åºåˆ— ID/消æ¯ç±»åž‹/ + 域å·å’Œå®žé™…时间戳的键值对。为了在ç‰å¾…时间戳的数æ®åŒ…é˜Ÿåˆ—å’Œå®žé™…æ—¶é—´æˆ³ä¹‹é—´æ£ + 确关è”,驱动程åºå¯ä»¥ä½¿ç”¨ BPF 分类器(``ptp_classify_raw``) æ¥è¯†åˆ« PTP + ä¼ è¾“ç±»åž‹ï¼Œå¹¶ä½¿ç”¨ ``ptp_parse_header`` 解释 PTP 头嗿®µã€‚å¯èƒ½å˜åœ¨ä¸€ä¸ª IRQ, + å½“æ¤æ—¶é—´æˆ³å¯ç”¨æ—¶è§¦å‘,或者驱动程åºå¯èƒ½éœ€è¦è½®è¯¢ï¼Œåœ¨è°ƒç”¨ ``dev_queue_xmit()`` + 到主机接å£ä¹‹åŽã€‚啿¥ TX 时间戳ä¸éœ€è¦æ•°æ®åŒ…å…‹éš†ï¼Œå› ä¸º PTP åè®®ä¸éœ€è¦åŽç»æ¶ˆ + æ¯ï¼ˆå› 为TX 时间戳已嵌入到数æ®åŒ…ä¸ï¼‰ï¼Œå› æ¤ç”¨æˆ·ç©ºé—´ä¸æœŸæœ›æ•°æ®åŒ…带有 TX 时间戳 + è¢«é‡æ–°å…¥é˜Ÿåˆ°å…¶å¥—接å—的错误队列。 + +- ``.port_rxtstamp()``:在 RX 上,DSA è¿è¡Œ BPF 分类器以识别 PTP äº‹ä»¶æ¶ˆæ¯ + (任何其他数æ®åŒ…,包括 PTP 通用消æ¯ï¼Œä¸è¿›è¡Œæ—¶é—´æˆ³ï¼‰ã€‚é©±åŠ¨ç¨‹åºæä¾›åŽŸå§‹ï¼ˆä¹Ÿæ˜¯å”¯ä¸€ï¼‰ + 时间戳数æ®åŒ…,以便它å¯ä»¥æ ‡è®°å®ƒï¼Œå¦‚果它是立å³å¯ç”¨çš„,或者延迟。在接收时,时间 + 戳å¯èƒ½è¦ä¹ˆåœ¨é¢‘带内(通过DSA 头ä¸çš„元数æ®ï¼Œæˆ–以其他方å¼é™„åŠ åˆ°æ•°æ®åŒ…),è¦ä¹ˆåœ¨é¢‘ + 带外(通过å¦ä¸€ä¸ª RX 时间戳FIFO)。在 RX 上延迟通常是必è¦çš„ï¼Œå½“æ£€ç´¢æ—¶é—´æˆ³éœ€è¦ + å¯ç¡çœ ä¸Šä¸‹æ–‡æ—¶ã€‚åœ¨è¿™ç§æƒ…况下,DSAé©±åŠ¨ç¨‹åºæœ‰è´£ä»»è°ƒç”¨ ``netif_rx()`` 在新鲜时 + 间戳的 skb 上。 + +3.2.2 以太网 PHYs +^^^^^^^^^^^^^^^^^ + +è¿™äº›æ˜¯é€šå¸¸åœ¨ç½‘ç»œæ ˆä¸å±¥è¡Œç¬¬ 1 å±‚è§’è‰²çš„è®¾å¤‡ï¼Œå› æ¤å®ƒä»¬åœ¨ DSA äº¤æ¢æœºä¸æ²¡æœ‰ç½‘络接 +å£çš„表示。然而,PHYå¯èƒ½èƒ½å¤Ÿæ£€æµ‹å’Œæ—¶é—´æˆ³ PTP æ•°æ®åŒ…ï¼Œå‡ºäºŽæ€§èƒ½åŽŸå› ï¼šåœ¨å°½å¯èƒ½æŽ¥ +近导线的地方获å–çš„æ—¶é—´æˆ³å…·æœ‰æ›´ç¨³å®šçš„åŒæ¥æ€§å’Œæ›´ç²¾ç¡®çš„精度。 + +æ”¯æŒ PTP 时间戳的 PHY 驱动程åºå¿…须创建 ``struct mii_timestamper`` å¹¶æ·»åŠ +指å‘它的指针在 ``phydev->mii_ts`` ä¸ã€‚ ``phydev->mii_ts`` çš„å˜åœ¨å°†ç”±ç½‘络 +å †æ ˆæ£€æŸ¥ã€‚ + +由于 PHY 没有网络接å£è¡¨ç¤ºï¼ŒPHY 的时间戳和 ethtool ioctl æ“作需è¦é€šè¿‡å…¶å„自 +çš„ MAC驱动程åºè¿›è¡Œä¸ä»‹ã€‚å› æ¤ï¼Œä¸Ž DSA äº¤æ¢æœºä¸åŒï¼Œéœ€è¦å¯¹æ¯ä¸ªå•独的 MAC 驱动 +程åºè¿›è¡Œ PHY时间戳支æŒçš„修改。这包括: + +- 在 ``.ndo_eth_ioctl`` 䏿£€æŸ¥ï¼Œæ˜¯å¦ ``phy_has_hwtstamp(netdev->phydev)`` + 为真或å‡ã€‚如果是,则 MAC 驱动程åºä¸åº”å¤„ç†æ¤è¯·æ±‚ï¼Œè€Œåº”å°†å…¶ä¼ é€’ç»™ PHY 使用 + ``phy_mii_ioctl()``。 + +- 在 RX 上,特殊干预å¯èƒ½æˆ–å¯èƒ½ä¸éœ€è¦ï¼Œå…·ä½“å–决于将 skb ä¼ é€’åˆ°ç½‘ç»œå †æ ˆçš„å‡½æ•°ã€‚ + 在 plain ``netif_rx()`` 和类似情况下,MAC 驱动程åºå¿…é¡»æ£€æŸ¥æ˜¯å¦ + ``skb_defer_rx_timestamp(skb)`` 是必è¦çš„,如果是,则ä¸è°ƒç”¨ ``netif_rx()``。 + 如果 ``CONFIG_NETWORK_PHY_TIMESTAMPING`` å¯ç”¨ï¼Œå¹¶ä¸” + ``skb->dev->phydev->mii_ts`` å˜åœ¨ï¼Œå®ƒçš„ ``.rxtstamp()`` é’©å现在将被调 + 用,以使用与 DSA 类似的逻辑确定 RX 时间戳延迟是å¦å¿…è¦ã€‚åŒæ ·åƒ DSA,它æˆä¸º + PHY 驱动程åºçš„责任,在时间戳å¯ç”¨æ—¶å‘逿•°æ®åŒ…åˆ°å †æ ˆã€‚ + + 对于其他 skb 接收函数,例如 ``napi_gro_receive`` å’Œ ``netif_receive_skb``, + å †æ ˆä¼šè‡ªåŠ¨æ£€æŸ¥æ˜¯å¦ ``skb_defer_rx_timestamp()`` 是必è¦çš„ï¼Œå› æ¤æ¤æ£€æŸ¥ä¸ + 需è¦åœ¨é©±åŠ¨ç¨‹åºå†…部。 + +- 在 TX ä¸Šï¼ŒåŒæ ·ï¼Œç‰¹æ®Šå¹²é¢„å¯èƒ½æˆ–å¯èƒ½ä¸éœ€è¦ã€‚调用 ``mii_ts->txtstamp()``é’© + å的函数å为``skb_clone_tx_timestamp()``。æ¤å‡½æ•°å¯ä»¥ç›´æŽ¥è°ƒç”¨ï¼ˆåœ¨è¿™ç§æƒ… + å†µä¸‹ï¼Œç¡®å®žéœ€è¦æ˜¾å¼ MAC é©±åŠ¨ç¨‹åºæ”¯æŒï¼‰ï¼Œä½†å‡½æ•°ä¹Ÿ piggybacks 从 + ``skb_tx_timestamp()`` 调用,许多 MAC 驱动程åºå·²ç»ä¸ºè½¯ä»¶æ—¶é—´æˆ³ç›®çš„æ‰§è¡Œã€‚ + å› æ¤ï¼Œå¦‚æžœ MAC 支æŒè½¯ä»¶æ—¶é—´æˆ³ï¼Œåˆ™å®ƒä¸éœ€è¦åœ¨æ¤é˜¶æ®µæ‰§è¡Œä»»ä½•å…¶ä»–æ“作。 + +3.2.3 MII 总线嗅探设备 +^^^^^^^^^^^^^^^^^^^^^^ + +这些执行与时间戳以太网 PHY 相åŒçš„è§’è‰²ï¼Œé™¤äº†å®ƒä»¬æ˜¯ç¦»æ•£è®¾å¤‡ï¼Œå› æ¤å¯ä»¥ä¸Žä»»ä½• PHY +组åˆï¼Œå³ä½¿å®ƒä¸æ”¯æŒæ—¶é—´æˆ³ã€‚在 Linux ä¸ï¼Œå®ƒä»¬æ˜¯å¯å‘现的,å¯ä»¥é€šè¿‡ Device Tree +é™„åŠ åˆ° ``struct phy_device``,对于其余部分,它们使用与那些相åŒçš„ mii_ts 基 +础设施。请å‚阅 Documentation/devicetree/bindings/ptp/timestamper.txt 了 +解更多详细信æ¯ã€‚ + +3.2.4 MAC 驱动程åºçš„其他注æ„事项 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +å †å PHC å¯èƒ½ä¼šæš´éœ² MAC 驱动程åºçš„é”™è¯¯ï¼Œè¿™äº›é”™è¯¯åœ¨æœªå †å PHC æ—¶æ— æ³•è§¦å‘。一个 +例忶‰åŠæ¤è¡Œä»£ç ,已ç»åœ¨å‰é¢çš„部分ä¸ä»‹ç»è¿‡:: + + skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; + +任何 TX æ—¶é—´æˆ³é€»è¾‘ï¼Œæ— è®ºæ˜¯æ™®é€šçš„ MAC 驱动程åºã€DSA äº¤æ¢æœºé©±åŠ¨ç¨‹åºã€PHY 驱动程 +åºè¿˜æ˜¯ MII 总线嗅探设备驱动程åºï¼Œéƒ½åº”è¯¥è®¾ç½®æ¤æ ‡å¿—。但一个未æ„识到 PHC å †å çš„ +MAC 驱动程åºå¯èƒ½ä¼šè¢«å…¶ä»–䏿˜¯å®ƒè‡ªå·±çš„å®žä½“è®¾ç½®æ¤æ ‡å¿—ï¼Œå¹¶ä¼ é€’ä¸€ä¸ªé‡å¤çš„æ—¶é—´æˆ³ã€‚例 +如,典型的 TX 时间戳逻辑å¯èƒ½æ˜¯å°†ä¼ 输部分分为 2 个部分: + +1. "TX":检查是å¦é€šè¿‡ ``.ndo_eth_ioctl``("``priv->hwtstamp_tx_enabled + == true``"ï¼‰å’Œå½“å‰ skb 是å¦éœ€è¦ TX 时间戳("``skb_shinfo(skb)->tx_flags + & SKBTX_HW_TSTAMP``")。如果为真,则设置 "``skb_shinfo(skb)->tx_flags + |= SKBTX_IN_PROGRESS``" æ ‡å¿—ã€‚æ³¨æ„ï¼šå¦‚ä¸Šæ‰€è¿°ï¼Œåœ¨å †å PHC 系统ä¸ï¼Œæ¤æ¡ä»¶ + ä¸åº”触å‘ï¼Œå› ä¸ºæ¤ MAC è‚¯å®šä¸æ˜¯æœ€å¤–层的 PHCã€‚ä½†è¿™æ˜¯å…¸åž‹çš„é”™è¯¯æ‰€åœ¨ã€‚ä¼ è¾“ç»§ç» + ä½¿ç”¨æ¤æ•°æ®åŒ…。 + +2. "TX 确认"ï¼šä¼ è¾“å®Œæˆã€‚é©±åŠ¨ç¨‹åºæ£€æŸ¥æ˜¯å¦éœ€è¦æ”¶é›†ä»»ä½• TX 时间戳。这里通常是典 + 型的错误所在:驱动程åºé‡‡å–æ·å¾„ï¼Œåªæ£€æŸ¥ "``skb_shinfo(skb)->tx_flags & + SKBTX_IN_PROGRESS``" 是å¦è®¾ç½®ã€‚åœ¨å †å PHC 系统ä¸ï¼Œè¿™æ˜¯é”™è¯¯çš„ï¼Œå› ä¸ºæ¤ MAC + 驱动程åºä¸æ˜¯å”¯ä¸€åœ¨ TX æ•°æ®è·¯å¾„ä¸å¯ç”¨ SKBTX_IN_PROGRESS 的实体。 + +æ¤é—®é¢˜çš„æ£ç¡®è§£å†³æ–¹æ¡ˆæ˜¯ MAC 驱动程åºåœ¨å…¶ "TX 确认" éƒ¨åˆ†ä¸æœ‰ä¸€ä¸ªå¤åˆæ£€æŸ¥ï¼Œä¸ä»… +针对 "``skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS``",还针对 +"``priv->hwtstamp_tx_enabled == true``"ã€‚å› ä¸ºç³»ç»Ÿç¡®ä¿ PTP 时间戳仅对最 +外层 PHC å¯ç”¨ï¼Œæ¤å¢žå¼ºæ£€æŸ¥å°†é¿å…å‘ç”¨æˆ·ç©ºé—´ä¼ é€’é‡å¤çš„ TX 时间戳。 diff --git a/Documentation/translations/zh_CN/rust/general-information.rst b/Documentation/translations/zh_CN/rust/general-information.rst index 251f6ee2bb44..9b5e37e13f38 100644 --- a/Documentation/translations/zh_CN/rust/general-information.rst +++ b/Documentation/translations/zh_CN/rust/general-information.rst @@ -13,6 +13,7 @@ 本文档包å«äº†åœ¨å†…æ ¸ä¸ä½¿ç”¨Rustæ”¯æŒæ—¶éœ€è¦äº†è§£çš„æœ‰ç”¨ä¿¡æ¯ã€‚ +.. _rust_code_documentation_zh_cn: ä»£ç æ–‡æ¡£ -------- diff --git a/Documentation/translations/zh_CN/rust/index.rst b/Documentation/translations/zh_CN/rust/index.rst index b01f887e7167..5347d4729588 100644 --- a/Documentation/translations/zh_CN/rust/index.rst +++ b/Documentation/translations/zh_CN/rust/index.rst @@ -10,7 +10,35 @@ Rust ==== -ä¸Žå†…æ ¸ä¸çš„Rust有关的文档。若è¦å¼€å§‹åœ¨å†…æ ¸ä¸ä½¿ç”¨Rust,请阅读quick-start.rst指å—。 +ä¸Žå†…æ ¸ä¸çš„Rust有关的文档。若è¦å¼€å§‹åœ¨å†…æ ¸ä¸ä½¿ç”¨Rust,请阅读 quick-start.rst 指å—。 + +Rust 实验 +--------- +Rust 支æŒåœ¨ v6.1 版本ä¸åˆå¹¶åˆ°ä¸»çº¿ï¼Œä»¥å¸®åŠ©ç¡®å®š Rust 作为一ç§è¯è¨€æ˜¯å¦é€‚åˆå†…æ ¸ï¼Œ +峿˜¯å¦å€¼å¾—进行æƒè¡¡ã€‚ + +ç›®å‰ï¼ŒRust 支æŒä¸»è¦é¢å‘对 Rust æ”¯æŒæ„Ÿå…´è¶£çš„å†…æ ¸å¼€å‘人员和维护者, +以便他们å¯ä»¥å¼€å§‹å¤„ç†æŠ½è±¡å’Œé©±åŠ¨ç¨‹åºï¼Œå¹¶å¸®åЩ开å‘基础设施和工具。 + +如果您是终端用户,请注æ„ï¼Œç›®å‰æ²¡æœ‰é€‚åˆæˆ–æ—¨åœ¨ç”Ÿäº§ä½¿ç”¨çš„å†…ç½®é©±åŠ¨ç¨‹åºæˆ–模å—, +并且 Rust 支æŒä»å¤„于开å‘/å®žéªŒé˜¶æ®µï¼Œå°¤å…¶æ˜¯å¯¹äºŽç‰¹å®šå†…æ ¸é…置。 + +ä»£ç æ–‡æ¡£ +-------- + +ç»™å®šä¸€ä¸ªå†…æ ¸é…ç½®ï¼Œå†…æ ¸å¯èƒ½ä¼šç”Ÿæˆ Rust ä»£ç æ–‡æ¡£ï¼Œå³ç”± ``rustdoc`` 工具呈现的 HTML。 + +.. only:: rustdoc and html + + è¯¥å†…æ ¸æ–‡æ¡£ä½¿ç”¨ `Rust ä»£ç æ–‡æ¡£ <rustdoc/kernel/index.html>`_ 构建。 + +.. only:: not rustdoc and html + + è¯¥å†…æ ¸æ–‡æ¡£ä¸ä½¿ç”¨ Rust ä»£ç æ–‡æ¡£æž„建。 + +预生æˆç‰ˆæœ¬æä¾›åœ¨ï¼šhttps://rust.docs.kernel.org。 + +请å‚阅 :ref:`ä»£ç æ–‡æ¡£ <rust_code_documentation_zh_cn>` éƒ¨åˆ†ä»¥èŽ·å–æ›´å¤šè¯¦ç»†ä¿¡æ¯ã€‚ .. toctree:: :maxdepth: 1 @@ -19,6 +47,9 @@ Rust general-information coding-guidelines arch-support + testing + +ä½ è¿˜å¯ä»¥åœ¨ :doc:`../../../process/kernel-docs` 䏿‰¾åˆ° Rust çš„å¦ä¹ ææ–™ã€‚ .. only:: subproject and html diff --git a/Documentation/translations/zh_CN/rust/testing.rst b/Documentation/translations/zh_CN/rust/testing.rst new file mode 100644 index 000000000000..ca81f1cef6eb --- /dev/null +++ b/Documentation/translations/zh_CN/rust/testing.rst @@ -0,0 +1,215 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/rust/testing.rst + +:翻译: + + éƒæ° Ben Guo <benx.guo@gmail.com> + +测试 +==== + +本文介ç»äº†å¦‚ä½•åœ¨å†…æ ¸ä¸æµ‹è¯• Rust 代ç 。 + +æœ‰ä¸‰ç§æµ‹è¯•类型: + +- KUnit 测试 +- ``#[test]`` 测试 +- Kselftests + +KUnit 测试 +---------- + +这些测试æ¥è‡ª Rust 文档ä¸çš„示例。它们会被转æ¢ä¸º KUnit 测试。 + +使用 +**** + +这些测试å¯ä»¥é€šè¿‡ KUnit è¿è¡Œã€‚例如,在命令行ä¸ä½¿ç”¨ ``kunit_tool`` ( ``kunit.py`` ):: + + ./tools/testing/kunit/kunit.py run --make_options LLVM=1 --arch x86_64 --kconfig_add CONFIG_RUST=y + +或者,KUnit 也å¯ä»¥åœ¨å†…æ ¸å¯åŠ¨æ—¶ä»¥å†…ç½®æ–¹å¼è¿è¡Œã€‚èŽ·å–æ›´å¤š KUnit ä¿¡æ¯ï¼Œè¯·å‚阅 +Documentation/dev-tools/kunit/index.rst。 +å…³äºŽå†…æ ¸å†…ç½®ä¸Žå‘½ä»¤è¡Œæµ‹è¯•çš„è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 Documentation/dev-tools/kunit/architecture.rst。 + +è¦ä½¿ç”¨è¿™äº› KUnit 文档测试,需è¦åœ¨å†…æ ¸é…ç½®ä¸å¯ç”¨ä»¥ä¸‹é€‰é¡¹:: + + CONFIG_KUNIT + Kernel hacking -> Kernel Testing and Coverage -> KUnit - Enable support for unit tests + CONFIG_RUST_KERNEL_DOCTESTS + Kernel hacking -> Rust hacking -> Doctests for the `kernel` crate + +KUnit æµ‹è¯•å³æ–‡æ¡£æµ‹è¯• +******************** + +文档测试( *doctests* )一般用于展示函数ã€ç»“构体或模å—ç‰çš„使用方法。 + +它们éžå¸¸æ–¹ä¾¿ï¼Œå› 为它们就写在文档æ—边。例如: + +.. code-block:: rust + + /// 求和两个数å—。 + /// + /// ``` + /// assert_eq!(mymod::f(10, 20), 30); + /// ``` + pub fn f(a: i32, b: i32) -> i32 { + a + b + } + +在用户空间ä¸ï¼Œè¿™äº›æµ‹è¯•ç”± ``rustdoc`` 负责收集并è¿è¡Œã€‚å•独使用这个工具已ç»å¾ˆæœ‰ä»·å€¼ï¼Œ +å› ä¸ºå®ƒå¯ä»¥éªŒè¯ç¤ºä¾‹èƒ½å¦æˆåŠŸç¼–è¯‘ï¼ˆç¡®ä¿å’Œä»£ç ä¿æŒåŒæ¥ï¼‰ï¼Œ +åŒæ—¶è¿˜å¯ä»¥è¿è¡Œé‚£äº›ä¸ä¾èµ–å†…æ ¸ API 的示例。 + +ç„¶è€Œï¼Œåœ¨å†…æ ¸ä¸ï¼Œè¿™äº›æµ‹è¯•ä¼šè½¬æ¢æˆ KUnit 测试套件。 +è¿™æ„å‘³ç€æ–‡æ¡£æµ‹è¯•ä¼šè¢«ç¼–è¯‘æˆ Rust å†…æ ¸å¯¹è±¡ï¼Œä»Žè€Œå¯ä»¥åœ¨æž„å»ºçš„å†…æ ¸çŽ¯å¢ƒä¸è¿è¡Œã€‚ + +通过与 KUnit 集æˆï¼ŒRust 的文档测试å¯ä»¥å¤ç”¨å†…æ ¸çŽ°æœ‰çš„æµ‹è¯•è®¾æ–½ã€‚ +ä¾‹å¦‚ï¼Œå†…æ ¸æ—¥å¿—ä¼šæ˜¾ç¤º:: + + KTAP version 1 + 1..1 + KTAP version 1 + # Subtest: rust_doctests_kernel + 1..59 + # rust_doctest_kernel_build_assert_rs_0.location: rust/kernel/build_assert.rs:13 + ok 1 rust_doctest_kernel_build_assert_rs_0 + # rust_doctest_kernel_build_assert_rs_1.location: rust/kernel/build_assert.rs:56 + ok 2 rust_doctest_kernel_build_assert_rs_1 + # rust_doctest_kernel_init_rs_0.location: rust/kernel/init.rs:122 + ok 3 rust_doctest_kernel_init_rs_0 + ... + # rust_doctest_kernel_types_rs_2.location: rust/kernel/types.rs:150 + ok 59 rust_doctest_kernel_types_rs_2 + # rust_doctests_kernel: pass:59 fail:0 skip:0 total:59 + # Totals: pass:59 fail:0 skip:0 total:59 + ok 1 rust_doctests_kernel + +文档测试ä¸ï¼Œä¹Ÿå¯ä»¥æ£å¸¸ä½¿ç”¨ `? <https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator>`_ è¿ç®—符,例如: + +.. code-block:: rust + + /// ``` + /// # use kernel::{spawn_work_item, workqueue}; + /// spawn_work_item!(workqueue::system(), || pr_info!("x\n"))?; + /// # Ok::<(), Error>(()) + /// ``` + +这些测试和普通代ç ä¸€æ ·ï¼Œä¹Ÿå¯ä»¥åœ¨ ``CLIPPY=1`` æ¡ä»¶ä¸‹é€šè¿‡ Clippy 进行编译, +å› æ¤å¯ä»¥ä»Žé¢å¤–çš„ lint 检查ä¸èŽ·ç›Šã€‚ + +为了便于开å‘è€…å®šä½æ–‡æ¡£æµ‹è¯•出错的具体行å·ï¼Œæ—¥å¿—ä¼šè¾“å‡ºä¸€æ¡ KTAP 诊æ–ä¿¡æ¯ã€‚ +其䏿 ‡æ˜Žäº†åŽŸå§‹æµ‹è¯•çš„æ–‡ä»¶å’Œè¡Œå·ï¼ˆä¸æ˜¯ ``rustdoc`` 生æˆçš„临时 Rust 文件ä½ç½®ï¼‰:: + + # rust_doctest_kernel_types_rs_2.location: rust/kernel/types.rs:150 + +Rust 测试ä¸å¸¸ç”¨çš„æ–è¨€å®æ˜¯æ¥è‡ª Rust æ ‡å‡†åº“ï¼ˆ ``core`` )ä¸çš„ ``assert!`` å’Œ ``assert_eq!`` å®ã€‚ +å†…æ ¸æä¾›äº†ä¸€ä¸ªå®šåˆ¶ç‰ˆæœ¬ï¼Œè¿™äº›å®çš„调用会被转å‘到 KUnit。 +å’Œ KUnit 测试ä¸åŒçš„æ˜¯ï¼Œè¿™äº›å®ä¸éœ€è¦ä¼ é€’ä¸Šä¸‹æ–‡å‚æ•°ï¼ˆ ``struct kunit *`` )。 +è¿™ä½¿å¾—å®ƒä»¬æ›´æ˜“äºŽä½¿ç”¨ï¼ŒåŒæ—¶æ–‡æ¡£çš„è¯»è€…æ— éœ€å…³å¿ƒåº•å±‚ç”¨çš„æ˜¯ä»€ä¹ˆæµ‹è¯•æ¡†æž¶ã€‚ +æ¤å¤–ï¼Œè¿™ç§æ–¹å¼æœªæ¥ä¹Ÿè®¸å¯ä»¥è®©æˆ‘们更容易测试第三方代ç 。 + +当剿œ‰ä¸€ä¸ªé™åˆ¶ï¼šKUnit 䏿”¯æŒåœ¨å…¶ä»–ä»»åŠ¡ä¸æ‰§è¡Œæ–言。 +å› æ¤ï¼Œå¦‚æžœæ–è¨€çœŸçš„å¤±è´¥äº†ï¼Œæˆ‘ä»¬åªæ˜¯ç®€å•地把错误打å°åˆ°å†…æ ¸æ—¥å¿—é‡Œã€‚ +å¦å¤–,文档测试ä¸é€‚用于éžå…¬å¼€çš„函数。 + +作为文档ä¸çš„æµ‹è¯•ç¤ºä¾‹ï¼Œåº”å½“åƒ â€œå®žé™…ä»£ç â€ ä¸€æ ·ç¼–å†™ã€‚ +例如:ä¸è¦ä½¿ç”¨ ``unwrap()`` 或 ``expect()``,请使用 `? <https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator>`_ è¿ç®—符。 +更多背景信æ¯ï¼Œè¯·å‚阅: + + https://rust.docs.kernel.org/kernel/error/type.Result.html#error-codes-in-c-and-rust + +``#[test]`` 测试 +---------------- + +æ¤å¤–,还有 ``#[test]`` 测试。与文档测试类似,这些测试与用户空间ä¸çš„æµ‹è¯•æ–¹å¼ä¹Ÿéžå¸¸ç›¸è¿‘ï¼Œå¹¶ä¸”åŒæ ·ä¼šæ˜ 射到 KUnit。 + +这些测试通过 ``kunit_tests`` 过程å®å¼•入,该å®å°†æµ‹è¯•套件的åç§°ä½œä¸ºå‚æ•°ã€‚ + +例如,å‡è®¾æƒ³è¦æµ‹è¯•å‰é¢æ–‡æ¡£æµ‹è¯•示例ä¸çš„函数 ``f``,我们å¯ä»¥åœ¨å®šä¹‰è¯¥å‡½æ•°çš„åŒä¸€æ–‡ä»¶ä¸ç¼–写: + +.. code-block:: rust + + #[kunit_tests(rust_kernel_mymod)] + mod tests { + use super::*; + + #[test] + fn test_f() { + assert_eq!(f(10, 20), 30); + } + } + +如果我们执行这段代ç ï¼Œå†…æ ¸æ—¥å¿—ä¼šæ˜¾ç¤º:: + + KTAP version 1 + # Subtest: rust_kernel_mymod + # speed: normal + 1..1 + # test_f.speed: normal + ok 1 test_f + ok 1 rust_kernel_mymod + +与文档测试类似, ``assert!`` å’Œ ``assert_eq!`` å®è¢«æ˜ 射回 KUnit 并且ä¸ä¼šå‘生 panic。 +åŒæ ·ï¼Œæ”¯æŒ `? <https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator>`_ è¿ç®—符, +测试函数å¯ä»¥ä»€ä¹ˆéƒ½ä¸è¿”回(å•元类型 ``()``)或 ``Result`` (任何 ``Result<T, E>``)。例如: + +.. code-block:: rust + + #[kunit_tests(rust_kernel_mymod)] + mod tests { + use super::*; + + #[test] + fn test_g() -> Result { + let x = g()?; + assert_eq!(x, 30); + Ok(()) + } + } + +如果我们è¿è¡Œæµ‹è¯•并且调用 ``g`` å¤±è´¥ï¼Œé‚£ä¹ˆå†…æ ¸æ—¥å¿—ä¼šæ˜¾ç¤º:: + + KTAP version 1 + # Subtest: rust_kernel_mymod + # speed: normal + 1..1 + # test_g: ASSERTION FAILED at rust/kernel/lib.rs:335 + Expected is_test_result_ok(test_g()) to be true, but is false + # test_g.speed: normal + not ok 1 test_g + not ok 1 rust_kernel_mymod + +如果 ``#[test]`` 测试å¯ä»¥å¯¹ç”¨æˆ·èµ·åˆ°ç¤ºä¾‹ä½œç”¨ï¼Œé‚£å°±åº”该改用文档测试。 +å³ä½¿æ˜¯ API 的边界情况,例如错误或边界问题,放在示例ä¸å±•ç¤ºä¹ŸåŒæ ·æœ‰ä»·å€¼ã€‚ + +``rusttest`` 宿主机测试 +----------------------- + +这类测试è¿è¡Œåœ¨ç”¨æˆ·ç©ºé—´ï¼Œå¯ä»¥é€šè¿‡ ``rusttest`` ç›®æ ‡åœ¨æž„å»ºå†…æ ¸çš„å®¿ä¸»æœºä¸ç¼–译并è¿è¡Œ:: + + make LLVM=1 rusttest + +当剿“作需è¦å†…æ ¸ ``.config``。 + +ç›®å‰ï¼Œå®ƒä»¬ä¸»è¦ç”¨äºŽæµ‹è¯• ``macros`` crate 的示例。 + +Kselftests +---------- + +Kselftests å¯ä»¥åœ¨ ``tools/testing/selftests/rust`` æ–‡ä»¶å¤¹ä¸æ‰¾åˆ°ã€‚ + +æµ‹è¯•æ‰€éœ€çš„å†…æ ¸é…置选项列在 ``tools/testing/selftests/rust/config`` 文件ä¸ï¼Œ +å¯ä»¥å€ŸåŠ© ``merge_config.sh`` 脚本åˆå¹¶åˆ°çŽ°æœ‰é…ç½®ä¸:: + + ./scripts/kconfig/merge_config.sh .config tools/testing/selftests/rust/config + +Kselftests ä¼šåœ¨å†…æ ¸æºç æ ‘ä¸æž„建,以便在è¿è¡Œç›¸åŒç‰ˆæœ¬å†…æ ¸çš„ç³»ç»Ÿä¸Šæ‰§è¡Œæµ‹è¯•ã€‚ + +一旦安装并å¯åŠ¨äº†ä¸Žæºç æ ‘åŒ¹é…çš„å†…æ ¸ï¼Œæµ‹è¯•å³å¯é€šè¿‡ä»¥ä¸‹å‘½ä»¤ç¼–译并执行:: + + make TARGETS="rust" kselftest + +请å‚阅 Documentation/dev-tools/kselftest.rst æ–‡æ¡£ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚ diff --git a/Documentation/translations/zh_CN/scsi/index.rst b/Documentation/translations/zh_CN/scsi/index.rst new file mode 100644 index 000000000000..5f1803e2706c --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/index.rst @@ -0,0 +1,92 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/index.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +========== +SCSIå系统 +========== + +.. toctree:: + :maxdepth: 1 + +简介 +==== + +.. toctree:: + :maxdepth: 1 + + scsi + +SCSIé©±åŠ¨æŽ¥å£ +============ + +.. toctree:: + :maxdepth: 1 + + scsi_mid_low_api + scsi_eh + +SCSIé©±åŠ¨å‚æ•° +============ + +.. toctree:: + :maxdepth: 1 + + scsi-parameters + link_power_management_policy + +SCSI主机适é…器驱动 +================== + +.. toctree:: + :maxdepth: 1 + + libsas + sd-parameters + wd719x + +Todolist: + +* 53c700 +* aacraid +* advansys +* aha152x +* aic79xx +* aic7xxx +* arcmsr_spec +* bfa +* bnx2fc +* BusLogic +* cxgb3i +* dc395x +* dpti +* FlashPoint +* g_NCR5380 +* hpsa +* hptiop +* lpfc +* megaraid +* ncr53c8xx +* NinjaSCSI +* ppa +* qlogicfas +* scsi-changer +* scsi_fc_transport +* scsi-generic +* smartpqi +* st +* sym53c500_cs +* sym53c8xx_2 +* tcm_qla2xxx +* ufs + +* scsi_transport_srp/figures diff --git a/Documentation/translations/zh_CN/scsi/libsas.rst b/Documentation/translations/zh_CN/scsi/libsas.rst new file mode 100644 index 000000000000..15fa71cdd821 --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/libsas.rst @@ -0,0 +1,425 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/libsas.rst + +:翻译: + + å¼ é’°æ° Yujie Zhang <yjzhang@leap-io-kernel.com> + +:æ ¡è¯‘: + +====== +SAS 层 +====== + +SAS 层是一个管ç†åŸºç¡€æž¶æž„ï¼Œç”¨äºŽç®¡ç† SAS LLDD。它ä½äºŽ SCSI Core +与 SAS LLDD 之间。 体系结构如下: SCSI Core 关注的是 SAM/SPC 相 +关的问题;SAS LLDD åŠå…¶åºåˆ—控制器负责 PHY 层ã€OOB ä¿¡å·ä»¥åŠé“¾è·¯ +管ç†ï¼›è€Œ SAS 层则负责以下任务:: + + * SAS Phyã€Port 和主机适é…器(HA)事件管ç†ï¼ˆäº‹ä»¶ç”± LLDD + 生æˆï¼Œç”± SAS 层处ç†ï¼‰ï¼› + * SAS 端å£çš„管ç†ï¼ˆåˆ›å»ºä¸Žé”€æ¯ï¼‰ï¼› + * SAS 域的å‘çŽ°ä¸Žé‡æ–°éªŒè¯ï¼› + * SAS 域内设备的管ç†ï¼› + * SCSI 主机的注册与注销; + * 将设备注册到 SCSI Core(SAS 设备)或 libata(SATA 设备); + * 扩展器的管ç†ï¼Œå¹¶å‘用户空间导出扩展器控制接å£ã€‚ + +SAS LLDD æ˜¯ä¸€ç§ PCI 设备驱动程åºã€‚它负责 PHY 层和 OOB(带外) +ä¿¡å·çš„管ç†ã€åŽ‚å•†ç‰¹å®šçš„ä»»åŠ¡ï¼Œå¹¶å‘ SAS 层上报事件。 + +SAS 层实现了 SAS 1.1 规范ä¸å®šä¹‰çš„大部分 SAS 功能。 + +sas_ha_struct ç»“æž„ä½“ç”¨äºŽå‘ SAS 层æè¿°ä¸€ä¸ª SAS LLDD。该结构的 +å¤§éƒ¨åˆ†å—æ®µç”± SAS 层使用,但其ä¸å°‘æ•°å—æ®µéœ€è¦ç”± LLDD 进行åˆå§‹åŒ–。 + +在完æˆç¡¬ä»¶åˆå§‹åŒ–之åŽï¼Œåº”当在驱动的 probe() 函数ä¸è°ƒç”¨ +sas_register_ha()。该函数会将 LLDD 注册到 SCSI å系统ä¸ï¼Œåˆ› +建一个对应的 SCSI ä¸»æœºï¼Œå¹¶å°†ä½ çš„ SAS é©±åŠ¨ç¨‹åºæ³¨å†Œåˆ°å…¶åœ¨ sysfs +下创建的 SAS è®¾å¤‡æ ‘ä¸ã€‚éšåŽè¯¥å‡½æ•°å°†è¿”回。接ç€ï¼Œä½ 需è¦ä½¿èƒ½ PHY, +以å¯åŠ¨å®žé™…çš„ OOBï¼ˆå¸¦å¤–ï¼‰è¿‡ç¨‹ï¼›æ¤æ—¶é©±åŠ¨å°†å¼€å§‹è°ƒç”¨ notify_* ç³» +列事件回调函数。 + +结构体说明 +========== + +``struct sas_phy`` +------------------ + +é€šå¸¸æƒ…å†µä¸‹ï¼Œè¯¥ç»“æž„ä½“ä¼šè¢«é™æ€åœ°åµŒå…¥åˆ°é©±åŠ¨è‡ªèº«å®šä¹‰çš„ PHY 结构体ä¸, +例如:: + + struct my_phy { + blah; + struct sas_phy sas_phy; + bleh; + } + +éšåŽï¼Œåœ¨ä¸»æœºé€‚é…器(HA)的结构体ä¸ï¼Œæ‰€æœ‰çš„ PHY 通常以 my_phy +数组的形å¼å˜åœ¨ï¼ˆå¦‚下文所示)。 + +在åˆå§‹åŒ–å„个 PHY 时,除了åˆå§‹åŒ–驱动自定义的 PHY 结构体外,还 +需è¦åŒæ—¶åˆå§‹åŒ–å…¶ä¸çš„ sas_phy 结构体。 + +一般æ¥è¯´ï¼ŒPHY 的管ç†ç”± LLDD 负责,而端å£ï¼ˆport)的管ç†ç”± SAS +å±‚è´Ÿè´£ã€‚å› æ¤ï¼ŒPHY çš„åˆå§‹åŒ–与更新由 LLDD 完æˆï¼Œè€Œç«¯å£çš„åˆå§‹åŒ–与 +更新则由 SAS 层完æˆã€‚系统设计ä¸è§„定,æŸäº›å—段å¯ç”± LLDD 进行读 +写,而 SAS 层åªèƒ½è¯»å–è¿™äº›å—æ®µï¼›å之亦然。其设计目的是为了é¿å…ä¸ +å¿…è¦çš„锿“作。 + +在该设计ä¸ï¼ŒæŸäº›å—段å¯ç”± LLDD 进行读写(RW),而 SAS 层仅å¯è¯» +å–è¿™äº›å—æ®µï¼›åä¹‹äº¦ç„¶ã€‚è¿™æ ·è®¾è®¡çš„ç›®çš„åœ¨äºŽé¿å…ä¸å¿…è¦çš„锿“作。 + +enabled + - 必须设置(0/1) + +id + - 必须设置[0,MAX_PHYS)] + +class, proto, type, role, oob_mode, linkrate + - 必须设置。 + +oob_mode + - 当 OOB(带外信å·ï¼‰å®ŒæˆåŽï¼Œè®¾ç½®æ¤å—段,然åŽé€šçŸ¥ SAS 层。 + +sas_addr + - 通常指å‘一个ä¿å˜è¯¥ PHY çš„ SAS 地å€çš„æ•°ç»„,该数组å¯èƒ½ä½äºŽ + 驱动自定义的 my_phy 结构体ä¸ã€‚ + +attached_sas_addr + - 当 LLDD 接收到 IDENTIFY 帧或 FIS 帧时,应在通知 SAS 层 + 之å‰è®¾ç½®è¯¥å—段。其设计æ„图在于:有时 LLDD å¯èƒ½éœ€è¦ä¼ªé€ 或 + æä¾›ä¸€ä¸ªä¸Žå®žé™…ä¸åŒçš„ SAS 地å€ç”¨äºŽè¯¥ PHY/端å£ï¼Œè€Œè¯¥æœºåˆ¶å…许 + LLDD è¿™æ ·åšã€‚ç†æƒ³æƒ…况下,应将 SAS 地å€ä»Ž IDENTIFY å¸§ä¸ + å¤åˆ¶è¿‡æ¥ï¼›å¯¹äºŽç›´æŽ¥è¿žæŽ¥çš„ SATA 设备,也å¯ä»¥ç”± LLDD 生æˆä¸€ + 个 SAS 地å€ã€‚åŽç»çš„å‘现过程å¯èƒ½ä¼šä¿®æ”¹æ¤å—段。 + +frame_rcvd + - 当接收到 IDENTIFY 或 FIS 帧时,将该帧å¤åˆ¶åˆ°æ¤å¤„。æ£ç¡®çš„ + æ“作æµç¨‹æ˜¯èŽ·å–é” â†’ å¤åˆ¶æ•°æ® → 设置 frame_rcvd_size → 释 + æ”¾é” â†’ è°ƒç”¨äº‹ä»¶é€šçŸ¥ã€‚è¯¥å—æ®µæ˜¯ä¸€ä¸ªæŒ‡é’ˆï¼Œå› ä¸ºé©±åŠ¨æ— æ³•ç²¾ç¡®ç¡® + 定硬件帧的大å°ï¼›å› æ¤ï¼Œå®žé™…çš„å¸§æ•°æ®æ•°ç»„应定义在驱动自定义的 + PHY 结构体ä¸ï¼Œç„¶åŽè®©æ¤æŒ‡é’ˆæŒ‡å‘该数组。在æŒé”状æ€ä¸‹ï¼Œå°†å¸§ä»Ž + DMA å¯è®¿é—®å†…å˜åŒºåŸŸå¤åˆ¶åˆ°è¯¥æ•°ç»„ä¸ã€‚ + +sas_prim + - ç”¨äºŽå˜æ”¾æŽ¥æ”¶åˆ°çš„原è¯ï¼ˆprimitive)。å‚è§ sas.h。æ“作æµç¨‹åŒ + æ ·æ˜¯ï¼šèŽ·å–é” â†’ 设置 primitive → é‡Šæ”¾é” â†’ 通知事件。 + +port + - 如果该 PHY 属于æŸä¸ªç«¯å£ï¼ˆport),æ¤å—段指å‘对应的 sas_port + 结构体。LLDD ä»…å¯è¯»å–æ¤å—段。它由 SAS 层设置,用于指å‘å½“å‰ + PHY 所属的 sas_port。 + +ha + - å¯ä»¥ç”± LLDD è®¾ç½®ï¼›ä½†æ— è®ºæ˜¯å¦è®¾ç½®ï¼ŒSAS å±‚éƒ½ä¼šå†æ¬¡å¯¹å…¶è¿›è¡Œèµ‹å€¼ã€‚ + +lldd_phy + - LLDD 应将æ¤å—段设置为指å‘自身定义的 PHY ç»“æž„ä½“ï¼Œè¿™æ ·å½“ SAS + 层调用æŸä¸ªå›žè°ƒå¹¶ä¼ å…¥ sas_phy 时,驱动å¯ä»¥å¿«é€Ÿå®šä½è‡ªèº«çš„ PHY + 结构体。如果 sas_phy æ˜¯åµŒå…¥å¼æˆå‘˜ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨ container_of() + å®è¿›è¡Œè®¿é—®â€”â€”ä¸¤ç§æ–¹å¼å‡å¯ã€‚ + +``struct sas_port`` +------------------- + +LLDD ä¸åº”修改该结构体ä¸çš„任何嗿®µâ€”—它åªèƒ½è¯»å–è¿™äº›å—æ®µã€‚è¿™äº›å—æ®µçš„ +å«ä¹‰åº”当是ä¸è¨€è‡ªæ˜Žçš„。 + +phy_mask 为 32 ä½ï¼Œç›®å‰è¿™ä¸€é•¿åº¦å·²è¶³å¤Ÿä½¿ç”¨ï¼Œå› 为尚未å¬è¯´æœ‰ä¸»æœºé€‚é… +器拥有超过8 个 PHY。 + +lldd_port + - ç›®å‰å°šæ— 明确用途。ä¸è¿‡ï¼Œå¯¹äºŽé‚£äº›å¸Œæœ›åœ¨ LLDD 内部维护自身端 + å£è¡¨ç¤ºçš„驱动,实现时å¯ä»¥åˆ©ç”¨è¯¥å—段。 + +``struct sas_ha_struct`` +------------------------ + +å®ƒé€šå¸¸é™æ€å£°æ˜Žåœ¨ä½ 自己的 LLDD 结构ä¸ï¼Œç”¨äºŽæè¿°æ‚¨çš„适é…器:: + + struct my_sas_ha { + blah; + struct sas_ha_struct sas_ha; + struct my_phy phys[MAX_PHYS]; + struct sas_port sas_ports[MAX_PHYS]; /* (1) */ + bleh; + }; + + (1) å¦‚æžœä½ çš„ LLDD 没有自己的端å£è¡¨ç¤º + +需è¦åˆå§‹åŒ–(示例函数如下所示)。 + +pcidev +^^^^^^ + +sas_addr + - 由于 SAS 层䏿ƒ³å¼„乱内å˜åˆ†é…ç‰, å› æ¤è¿™æŒ‡å‘陿€åˆ†é…的数 + 组ä¸çš„æŸä¸ªä½ç½®ï¼ˆä¾‹å¦‚,在您的主机适é…器结构ä¸ï¼‰ï¼Œå¹¶ä¿å˜æ‚¨æˆ– + åˆ¶é€ å•†ç‰ç»™å‡ºçš„主机适é…器的 SAS 地å€ã€‚ + +sas_port +^^^^^^^^ + +sas_phy + - 指å‘结构体的指针数组(å‚è§ä¸Šæ–‡å…³äºŽ sas_addr 的说明)。 + 这些指针必须设置。更多细节è§ä¸‹æ–‡è¯´æ˜Žã€‚ + +num_phys + - 表示 sas_phy æ•°ç»„ä¸ PHY 的数é‡ï¼ŒåŒæ—¶ä¹Ÿè¡¨ç¤º sas_port + 数组ä¸çš„ç«¯å£æ•°é‡ã€‚ä¸€ä¸ªç«¯å£æœ€å¤šå¯¹åº”一个 PHYï¼Œå› æ¤æœ€å¤§ç«¯å£æ•° + ç‰äºŽ num_physã€‚å› æ¤ï¼Œç»“æž„ä¸ä¸å†å•独使用 num_ports å—æ®µï¼Œ + 而仅使用 num_phys。 + +事件接å£:: + + /* LLDD 调用以下函数æ¥é€šçŸ¥ SAS 类层å‘生事件 */ + void sas_notify_port_event(struct sas_phy *, enum port_event, gfp_t); + void sas_notify_phy_event(struct sas_phy *, enum phy_event, gfp_t); + +端å£äº‹ä»¶é€šçŸ¥:: + + /* SAS 类层调用以下回调æ¥é€šçŸ¥ LLDD 端å£äº‹ä»¶ */ + void (*lldd_port_formed)(struct sas_phy *); + void (*lldd_port_deformed)(struct sas_phy *); + +如果 LLDD 希望在端å£å½¢æˆæˆ–解散时接收通知,则应将上述回调指针设 +置为符åˆå‡½æ•°ç±»åž‹å®šä¹‰çš„处ç†å‡½æ•°ã€‚ + +SAS LLDD 还应至少实现 SCSI åè®®ä¸å®šä¹‰çš„一ç§ä»»åŠ¡ç®¡ç†å‡½æ•°ï¼ˆTMFs):: + + /* 任务管ç†å‡½æ•°. 必须在进程上下文ä¸è°ƒç”¨ */ + int (*lldd_abort_task)(struct sas_task *); + int (*lldd_abort_task_set)(struct domain_device *, u8 *lun); + int (*lldd_clear_task_set)(struct domain_device *, u8 *lun); + int (*lldd_I_T_nexus_reset)(struct domain_device *); + int (*lldd_lu_reset)(struct domain_device *, u8 *lun); + int (*lldd_query_task)(struct sas_task *); + +如需更多信æ¯ï¼Œè¯·å‚考 T10.org。 + +端å£ä¸Žé€‚é…器管ç†:: + + /* 端å£ä¸Žé€‚é…å™¨ç®¡ç† */ + int (*lldd_clear_nexus_port)(struct sas_port *); + int (*lldd_clear_nexus_ha)(struct sas_ha_struct *); + +SAS LLDD 至少应实现上述函数ä¸çš„一个。 + +PHY 管ç†:: + + /* PHY ç®¡ç† */ + int (*lldd_control_phy)(struct sas_phy *, enum phy_func); + +lldd_ha + - 应设置为指å‘驱动的主机适é…器(HA)结构体的指针。如果 sas_ha_struct + 被嵌入到更大的结构体ä¸ï¼Œä¹Ÿå¯ä»¥é€šè¿‡ container_of() 宿¥èŽ·å–。 + +一个示例的åˆå§‹åŒ–与注册函数å¯ä»¥å¦‚下所示:(该函数应在 probe() +函数的最åŽè°ƒç”¨ï¼‰ä½†å¿…须在使能 PHY 执行 OOB 之å‰è°ƒç”¨:: + + static int register_sas_ha(struct my_sas_ha *my_ha) + { + int i; + static struct sas_phy *sas_phys[MAX_PHYS]; + static struct sas_port *sas_ports[MAX_PHYS]; + + my_ha->sas_ha.sas_addr = &my_ha->sas_addr[0]; + + for (i = 0; i < MAX_PHYS; i++) { + sas_phys[i] = &my_ha->phys[i].sas_phy; + sas_ports[i] = &my_ha->sas_ports[i]; + } + + my_ha->sas_ha.sas_phy = sas_phys; + my_ha->sas_ha.sas_port = sas_ports; + my_ha->sas_ha.num_phys = MAX_PHYS; + + my_ha->sas_ha.lldd_port_formed = my_port_formed; + + my_ha->sas_ha.lldd_dev_found = my_dev_found; + my_ha->sas_ha.lldd_dev_gone = my_dev_gone; + + my_ha->sas_ha.lldd_execute_task = my_execute_task; + + my_ha->sas_ha.lldd_abort_task = my_abort_task; + my_ha->sas_ha.lldd_abort_task_set = my_abort_task_set; + my_ha->sas_ha.lldd_clear_task_set = my_clear_task_set; + my_ha->sas_ha.lldd_I_T_nexus_reset= NULL; (2) + my_ha->sas_ha.lldd_lu_reset = my_lu_reset; + my_ha->sas_ha.lldd_query_task = my_query_task; + + my_ha->sas_ha.lldd_clear_nexus_port = my_clear_nexus_port; + my_ha->sas_ha.lldd_clear_nexus_ha = my_clear_nexus_ha; + + my_ha->sas_ha.lldd_control_phy = my_control_phy; + + return sas_register_ha(&my_ha->sas_ha); + } + +(2) SAS 1.1 未定义 I_T Nexus Reset TMF(任务管ç†åŠŸèƒ½ï¼‰ã€‚ + +事件 +==== + +事件是 SAS LLDD 唯一的通知 SAS 层å‘生任何情况的方å¼ã€‚ +LLDD 没有其他方法å¯ä»¥å‘ŠçŸ¥ SAS 层其内部或 SAS 域ä¸å‘生的事件。 + +Phy 事件:: + + PHYE_LOSS_OF_SIGNAL, (C) + PHYE_OOB_DONE, + PHYE_OOB_ERROR, (C) + PHYE_SPINUP_HOLD. + +端å£äº‹ä»¶ï¼Œé€šè¿‡ _phy_ ä¼ é€’:: + + PORTE_BYTES_DMAED, (M) + PORTE_BROADCAST_RCVD, (E) + PORTE_LINK_RESET_ERR, (C) + PORTE_TIMER_EVENT, (C) + PORTE_HARD_RESET. + +主机适é…器事件: + HAE_RESET + +SAS LLDD 应能够生æˆä»¥ä¸‹äº‹ä»¶:: + + - æ¥è‡ª C 组的至少一个事件(å¯é€‰ï¼‰ï¼Œ + - æ ‡è®°ä¸º M(必需)的事件为必需事件(至少一ç§ï¼‰ï¼› + - 若希望 SAS 层处ç†åŸŸé‡æ–°éªŒè¯ï¼ˆdomain revalidation),则 + åº”ç”Ÿæˆæ ‡è®°ä¸º E(扩展器)的事件(仅需一ç§ï¼‰ï¼› + - æœªæ ‡è®°çš„äº‹ä»¶ä¸ºå¯é€‰äº‹ä»¶ã€‚ + +å«ä¹‰ + +HAE_RESET + - 当 HA å‘生内部错误并被å¤ä½æ—¶ã€‚ + +PORTE_BYTES_DMAED + - 在接收到 IDENTIFY/FIS 帧时。 + +PORTE_BROADCAST_RCVD + - åœ¨æŽ¥æ”¶åˆ°ä¸€ä¸ªåŽŸè¯æ—¶ã€‚ + +PORTE_LINK_RESET_ERR + - 定时器超时ã€ä¿¡å·ä¸¢å¤±ã€ä¸¢å¤± DWS ç‰æƒ…况。 [1]_ + +PORTE_TIMER_EVENT + - DWS å¤ä½è¶…时定时器到期时。[1]_ + +PORTE_HARD_RESET + - 收到 Hard Reset 原è¯ã€‚ + +PHYE_LOSS_OF_SIGNAL + - 设备已æ–开连接。 [1]_ + +PHYE_OOB_DONE + - OOB 过程æˆåŠŸå®Œæˆï¼Œoob_mode 有效。 + +PHYE_OOB_ERROR + - 执行 OOB 过程ä¸å‡ºçŽ°é”™è¯¯ï¼Œè®¾å¤‡å¯èƒ½å·²æ–开。 [1]_ + +PHYE_SPINUP_HOLD + - 检测到 SATA 设备,但未å‘é€ COMWAKE ä¿¡å·ã€‚ + +.. [1] 应设置或清除 phy ä¸ç›¸åº”çš„å—æ®µï¼Œæˆ–者从 tasklet ä¸è°ƒç”¨ + 内è”函数 sas_phy_disconnected()ï¼Œè¯¥å‡½æ•°åªæ˜¯ä¸€ä¸ªè¾…助函数。 + +执行命令 SCSI RPC:: + + int (*lldd_execute_task)(struct sas_task *, gfp_t gfp_flags); + +用于将任务排队æäº¤ç»™ SAS LLDD,@task ä¸ºè¦æ‰§è¡Œçš„任务,@gfp_mask +为定义调用者上下文的 gfp 掩ç 。 + +æ¤å‡½æ•°åº”实现 执行 SCSI RPC 命令。 + +也就是说,当调用 lldd_execute_task() 时,命令应当立å³åœ¨ä¼ 输 +层å‘出。SAS LLDD ä¸åœ¨ä»»ä½•层级上都ä¸åº”å†è¿›è¡Œé˜Ÿåˆ—排放。 + +返回值:: + + * 返回 -SAS_QUEUE_FULL 或 -ENOMEM 表示未排入队列; + * 返回 0 表示任务已æˆåŠŸæŽ’å…¥é˜Ÿåˆ—ã€‚ + +:: + + struct sas_task { + dev —— æ¤ä»»åŠ¡ç›®æ ‡è®¾å¤‡ï¼› + task_proto —— å议类型,为 enum sas_proto ä¸çš„一ç§ï¼› + scatter —— æŒ‡å‘æ•£å¸ƒ/èšé›†ï¼ˆSG)列表数组的指针; + num_scatter —— SG åˆ—è¡¨å…ƒç´ æ•°é‡ï¼› + total_xfer_len —— é¢„è®¡ä¼ è¾“çš„æ€»å—节数; + data_dir —— æ•°æ®ä¼ 输方å‘(PCI_DMA_*)ï¼› + task_done —— ä»»åŠ¡æ‰§è¡Œå®Œæˆæ—¶çš„回调函数。 + }; + +å‘现 +==== + +sysfs æ ‘æœ‰ä»¥ä¸‹ç”¨é€”:: + + a) å®ƒæ˜¾ç¤ºå½“å‰æ—¶åˆ» SAS 域的物ç†å¸ƒå±€ï¼Œå³å±•示当å‰ç‰©ç†ä¸–ç•Œä¸ + 域的实际结构。 + b) 显示æŸäº›è®¾å¤‡çš„傿•°ã€‚ _at_discovery_time_. + +䏋颿˜¯ä¸€ä¸ªæŒ‡å‘ tree(1) 程åºçš„链接,该工具在查看 SAS 域时éžå¸¸ +有用: +ftp://mama.indstate.edu/linux/tree/ + +æˆ‘æœŸæœ›ç”¨æˆ·ç©ºé—´çš„åº”ç”¨ç¨‹åºæœ€ç»ˆèƒ½å¤Ÿä¸ºæ¤åˆ›å»ºä¸€ä¸ªå›¾å½¢ç•Œé¢ã€‚ + +也就是说,sysfs åŸŸæ ‘ä¸ä¼šæ˜¾ç¤ºæˆ–ä¿å˜æŸäº›çжæ€å˜åŒ–ï¼Œä¾‹å¦‚ï¼Œå¦‚æžœä½ æ›´ +改了 READY LED å«ä¹‰çš„设置,sysfs æ ‘ä¸ä¼šåæ˜ è¿™ç§çжæ€å˜åŒ–;但它 +确实会显示域设备的当å‰è¿žæŽ¥çжæ€ã€‚ + +维护内部设备状æ€å˜åŒ–çš„èŒè´£ç”±ä¸Šå±‚(命令集驱动)和用户空间负责。 + +当æŸä¸ªè®¾å¤‡æˆ–å¤šä¸ªè®¾å¤‡ä»ŽåŸŸä¸æ‹”出时,这一å˜åŒ–会立å³åæ˜ åœ¨ sysfs +æ ‘ä¸ï¼Œå¹¶ä¸”这些设备会从系统ä¸ç§»é™¤ã€‚ + +结构体 domain_device æè¿°äº† SAS 域ä¸çš„ä»»æ„设备。它完全由 SAS +层管ç†ã€‚ä¸€ä¸ªä»»åŠ¡ä¼šæŒ‡å‘æŸä¸ªåŸŸè®¾å¤‡ï¼ŒSAS LLDD å°±æ˜¯é€šè¿‡è¿™ç§æ–¹å¼çŸ¥ +é“任务应å‘é€åˆ°ä½•处。SAS LLDD åªè¯»å– domain_device 结构的内容, +但ä¸ä¼šåˆ›å»ºæˆ–销æ¯å®ƒã€‚ + +用户空间ä¸çš„æ‰©å±•å™¨ç®¡ç† +====================== + +在 sysfs ä¸çš„æ¯ä¸ªæ‰©å±•å™¨ç›®å½•ä¸‹ï¼Œéƒ½æœ‰ä¸€ä¸ªå为 "smp_portal" çš„ +文件。这是一个二进制的 sysfs 属性文件,它实现了一个 SMP å…¥å£ +(注æ„ï¼šè¿™å¹¶ä¸æ˜¯ä¸€ä¸ª SMP 端å£ï¼‰ï¼Œç”¨æˆ·ç©ºé—´ç¨‹åºå¯ä»¥é€šè¿‡å®ƒå‘é€ +SMP 请求并接收 SMP å“应。 + +该功能的实现方å¼çœ‹èµ·æ¥éžå¸¸ç®€å•: + +1. 构建è¦å‘é€çš„ SMP å¸§ã€‚å…¶æ ¼å¼å’Œå¸ƒå±€åœ¨ SAS è§„èŒƒä¸æœ‰è¯´æ˜Žã€‚ä¿æŒ + CRC å—æ®µä¸º 0。 + +open(2) + +2. ä»¥è¯»å†™æ¨¡å¼æ‰“开该扩展器的 SMP portal sysfs 文件。 + +write(2) + +3. 将第 1 æ¥ä¸æž„建的帧写入文件。 + +read(2) + +4. 读å–与所构建帧预期返回长度相åŒçš„æ•°æ®é‡ã€‚如果读å–的数æ®é‡ä¸Ž + 预期ä¸ç¬¦ï¼Œåˆ™è¡¨ç¤ºå‘生了æŸç§é”™è¯¯ã€‚ + +close(2) + +整个过程在 "expander_conf.c" 文件ä¸çš„函数 do_smp_func() +åŠå…¶è°ƒç”¨è€…䏿œ‰è¯¦ç»†å±•示。 + +å¯¹åº”çš„å†…æ ¸å®žçŽ°ä½äºŽ "sas_expander.c" 文件ä¸ã€‚ + +ç¨‹åº "expander_conf.c" å®žçŽ°äº†ä¸Šè¿°é€»è¾‘ã€‚å®ƒæŽ¥æ”¶ä¸€ä¸ªå‚æ•°â€”—扩展器 +SMP portal çš„ sysfs 文件å,并输出扩展器的信æ¯ï¼ŒåŒ…括路由表内容。 + +SMP portal èµ‹äºˆäº†ä½ å¯¹æ‰©å±•å™¨çš„å®Œå…¨æŽ§åˆ¶æƒï¼Œå› æ¤è¯·è°¨æ…Žæ“作。 diff --git a/Documentation/translations/zh_CN/scsi/link_power_management_policy.rst b/Documentation/translations/zh_CN/scsi/link_power_management_policy.rst new file mode 100644 index 000000000000..f2ab8fdf4aa8 --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/link_power_management_policy.rst @@ -0,0 +1,32 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/link_power_management_policy.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +================ +链路电æºç®¡ç†ç–ç•¥ +================ + +è¯¥å‚æ•°å…许用户设置链路(接å£ï¼‰çš„电æºç®¡ç†æ¨¡å¼ã€‚ +共计三类å¯é€‰é¡¹ï¼š + +===================== ===================================================== +选项 作用 +===================== ===================================================== +min_power 指示控制器在å¯èƒ½çš„æƒ…况下尽é‡ä½¿é“¾è·¯å¤„于最低功耗。 + è¿™å¯èƒ½ä¼šç‰ºç‰²ä¸€å®šçš„æ€§èƒ½ï¼Œå› ä¸ºä»Žä½ŽåŠŸè€—çŠ¶æ€æ¢å¤æ—¶ä¼šå¢žåŠ å»¶è¿Ÿã€‚ + +max_performance 通常,这æ„味ç€ä¸è¿›è¡Œç”µæºç®¡ç†ã€‚指示 + 控制器优先考虑性能而éžç”µæºç®¡ç†ã€‚ + +medium_power 指示控制器在å¯èƒ½çš„æƒ…况下进入较低功耗状æ€ï¼Œ + è€Œéžæœ€ä½ŽåŠŸè€—çŠ¶æ€ï¼Œä»Žè€Œæ”¹å–„min_power模å¼ä¸‹çš„延迟。 +===================== ===================================================== diff --git a/Documentation/translations/zh_CN/scsi/scsi-parameters.rst b/Documentation/translations/zh_CN/scsi/scsi-parameters.rst new file mode 100644 index 000000000000..ace777e070ea --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/scsi-parameters.rst @@ -0,0 +1,118 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/scsi-parameters.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +============ +SCSIå†…æ ¸å‚æ•° +============ + +请查阅Documentation/admin-guide/kernel-parameters.rstä»¥èŽ·å– +指定模å—傿•°ç›¸å…³çš„通用信æ¯ã€‚ + +当剿–‡æ¡£å¯èƒ½ä¸å®Œå…¨æ˜¯æœ€æ–°å’Œå…¨é¢çš„。命令 ``modinfo -p ${modulename}`` +显示了å¯åŠ è½½æ¨¡å—çš„å‚æ•°åˆ—表。å¯åŠ è½½æ¨¡å—è¢«åŠ è½½åˆ°å†…æ ¸ä¸åŽï¼Œä¹Ÿä¼šåœ¨ +/sys/module/${modulename}/parameters/ ç›®å½•ä¸‹æ˜¾ç¤ºå…¶å‚æ•°ã€‚å…¶ +䏿Ÿäº›å‚æ•°å¯ä»¥é€šè¿‡å‘½ä»¤ +``echo -n ${value} > /sys/module/${modulename}/parameters/${parm}`` +在è¿è¡Œæ—¶ä¿®æ”¹ã€‚ + +:: + + advansys= [HW,SCSI] + 请查阅 drivers/scsi/advansys.c 文件头部。 + + aha152x= [HW,SCSI] + 请查阅 Documentation/scsi/aha152x.rst。 + + aha1542= [HW,SCSI] + æ ¼å¼ï¼š<portbase>[,<buson>,<busoff>[,<dmaspeed>]] + + aic7xxx= [HW,SCSI] + 请查阅 Documentation/scsi/aic7xxx.rst。 + + aic79xx= [HW,SCSI] + 请查阅 Documentation/scsi/aic79xx.rst。 + + atascsi= [HW,SCSI] + 请查阅 drivers/scsi/atari_scsi.c。 + + BusLogic= [HW,SCSI] + 请查阅 drivers/scsi/BusLogic.c æ–‡ä»¶ä¸ + BusLogic_ParseDriverOptions()函数å‰çš„æ³¨é‡Šã€‚ + + gvp11= [HW,SCSI] + + ips= [HW,SCSI] Adaptec / IBM ServeRAID 控制器 + 请查阅 drivers/scsi/ips.c 文件头部。 + + mac5380= [HW,SCSI] + 请查阅 drivers/scsi/mac_scsi.c。 + + scsi_mod.max_luns= + [SCSI] æœ€å¤§å¯æŽ¢æµ‹LUN数。 + å–值范围为 1 到 2^32-1。 + + scsi_mod.max_report_luns= + [SCSI] 接收到的最大LUN数。 + å–值范围为 1 到 16384。 + + NCR_D700= [HW,SCSI] + 请查阅 drivers/scsi/NCR_D700.c 文件头部。 + + ncr5380= [HW,SCSI] + 请查阅 Documentation/scsi/g_NCR5380.rst。 + + ncr53c400= [HW,SCSI] + 请查阅 Documentation/scsi/g_NCR5380.rst。 + + ncr53c400a= [HW,SCSI] + 请查阅 Documentation/scsi/g_NCR5380.rst。 + + ncr53c8xx= [HW,SCSI] + + osst= [HW,SCSI] SCSIç£å¸¦é©±åЍ + æ ¼å¼ï¼š<buffer_size>,<write_threshold> + å¦è¯·æŸ¥é˜… Documentation/scsi/st.rst。 + + scsi_debug_*= [SCSI] + 请查阅 drivers/scsi/scsi_debug.c。 + + scsi_mod.default_dev_flags= + [SCSI] SCSIé»˜è®¤è®¾å¤‡æ ‡å¿— + æ ¼å¼ï¼š<integer> + + scsi_mod.dev_flags= + [SCSI] 厂商和型å·çš„黑/白å啿¡ç›® + æ ¼å¼ï¼š<vendor>:<model>:<flags> + (flags 为整数值) + + scsi_mod.scsi_logging_level= + [SCSI] æ—¥å¿—çº§åˆ«çš„ä½æŽ©ç + ä½çš„定义请查阅 drivers/scsi/scsi_logging.h。 + æ¤å‚数也å¯ä»¥é€šè¿‡sysctl对dev.scsi.logging_level + 进行设置(/proc/sys/dev/scsi/logging_level)。 + æ¤å¤–,S390-tools软件包æä¾›äº†ä¸€ä¸ªä¾¿æ·çš„ + ‘scsi_logging_level’ 脚本,å¯ä»¥ä»Žä»¥ä¸‹åœ°å€ä¸‹è½½ï¼š + https://github.com/ibm-s390-linux/s390-tools/blob/master/scripts/scsi_logging_level + + scsi_mod.scan= [SCSI] sync(默认)在å‘现SCSIæ€»çº¿è¿‡ç¨‹ä¸ + åŒæ¥æ‰«æã€‚asyncåœ¨å†…æ ¸çº¿ç¨‹ä¸å¼‚æ¥æ‰«æï¼Œå…è®¸ç³»ç»Ÿç»§ç» + å¯åЍæµç¨‹ã€‚none忽略扫æï¼Œé¢„æœŸç”±ç”¨æˆ·ç©ºé—´å®Œæˆæ‰«æã€‚ + + sim710= [SCSI,HW] + 请查阅 drivers/scsi/sim710.c 文件头部。 + + st= [HW,SCSI] SCSIç£å¸¦å‚数(缓冲区大å°ç‰ï¼‰ + 请查阅 Documentation/scsi/st.rst。 + + wd33c93= [HW,SCSI] + 请查阅 drivers/scsi/wd33c93.c 文件头部。 diff --git a/Documentation/translations/zh_CN/scsi/scsi.rst b/Documentation/translations/zh_CN/scsi/scsi.rst new file mode 100644 index 000000000000..5d6e39c7cbb5 --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/scsi.rst @@ -0,0 +1,48 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/scsi.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +============== +SCSIå系统文档 +============== + +Linux文档项目(LDP)维护了一份æè¿°Linuxå†…æ ¸ï¼ˆlk) 2.4ä¸SCSI +å系统的文档。请å‚考: +https://www.tldp.org/HOWTO/SCSI-2.4-HOWTO 。LDPæä¾›å•页和 +多页的HTML版本,以åŠPostScript与PDFæ ¼å¼çš„æ–‡æ¡£ã€‚ + +在SCSIå系统ä¸ä½¿ç”¨æ¨¡å—的注æ„事项 +================================ +Linuxå†…æ ¸ä¸çš„SCSI支æŒå¯ä»¥æ ¹æ®ç»ˆç«¯ç”¨æˆ·çš„需求以ä¸åŒçš„æ–¹å¼æ¨¡å— +化。为了ç†è§£ä½ 的选择,我们首先需è¦å®šä¹‰ä¸€äº›æœ¯è¯ã€‚ + +scsi-core(也被称为“ä¸é—´å±‚â€ï¼‰åŒ…å«SCSI支æŒçš„æ ¸å¿ƒã€‚æ²¡æœ‰ä»–ä½ å°† +æ— æ³•ä½¿ç”¨ä»»ä½•å…¶ä»–SCSI驱动程åºã€‚SCSIæ ¸å¿ƒæ”¯æŒå¯ä»¥æ˜¯ä¸€ä¸ªæ¨¡å—( +scsi_mod.o),也å¯ä»¥ç¼–è¯‘è¿›å†…æ ¸ã€‚å¦‚æžœSCSIæ ¸å¿ƒæ˜¯ä¸€ä¸ªæ¨¡å—,那么 +ä»–å¿…é¡»æ˜¯ç¬¬ä¸€ä¸ªè¢«åŠ è½½çš„SCSI模å—ï¼Œå¦‚æžœä½ å°†å¸è½½è¯¥æ¨¡å—,那么他必 +须是最åŽä¸€ä¸ªè¢«å¸è½½çš„æ¨¡å—。实际上,modprobeå’Œrmmodå‘½ä»¤å°†ç¡®ä¿ +SCSIåç³»ç»Ÿä¸æ¨¡å—åŠ è½½ä¸Žå¸è½½çš„æ£ç¡®é¡ºåºã€‚ + +一旦SCSIæ ¸å¿ƒå˜åœ¨äºŽå†…æ ¸ä¸ï¼ˆæ— è®ºæ˜¯ç¼–è¯‘è¿›å†…æ ¸è¿˜æ˜¯ä½œä¸ºæ¨¡å—åŠ è½½ï¼‰ï¼Œ +独立的上层驱动和底层驱动å¯ä»¥æŒ‰ç…§ä»»æ„顺åºåŠ è½½ã€‚ç£ç›˜é©±åŠ¨ç¨‹åº +(sd_mod.o)ã€å…‰ç›˜é©±åŠ¨ç¨‹åºï¼ˆsr_mod.o)ã€ç£å¸¦é©±åŠ¨ç¨‹åº [1]_ +(st.o)以åŠSCSI通用驱动程åºï¼ˆsg.o)代表了上层驱动,用于控制 +相应的å„ç§è®¾å¤‡ã€‚ä¾‹å¦‚ï¼Œä½ å¯ä»¥åŠ è½½ç£å¸¦é©±åŠ¨ç¨‹åºæ¥ä½¿ç”¨ç£å¸¦é©±åŠ¨å™¨ï¼Œ +ç„¶åŽåœ¨ä¸éœ€è¦è¯¥é©±åŠ¨ç¨‹åºæ—¶å¸è½½ä»–(并释放相关内å˜ï¼‰ã€‚ + +底层驱动程åºç”¨äºŽæ”¯æŒæ‚¨æ‰€è¿è¡Œç¡¬ä»¶å¹³å°æ”¯æŒçš„ä¸åŒä¸»æœºå¡ã€‚这些ä¸åŒ +的主机å¡é€šå¸¸è¢«ç§°ä¸ºä¸»æœºæ€»çº¿é€‚é…器(HBAs)。例如,aic7xxx.o驱动 +程åºè¢«ç”¨äºŽæŽ§åˆ¶Adaptec所属的所有最新的SCSIæŽ§åˆ¶å™¨ã€‚å‡ ä¹Žæ‰€æœ‰çš„åº• +层驱动都å¯ä»¥è¢«ç¼–è¯‘ä¸ºæ¨¡å—æˆ–ç›´æŽ¥ç¼–è¯‘è¿›å†…æ ¸ã€‚ + +.. [1] ç£å¸¦é©±åŠ¨ç¨‹åºæœ‰ä¸€ä¸ªå˜ç§ç”¨äºŽæŽ§åˆ¶OnStreamç£å¸¦è®¾å¤‡ã€‚å…¶æ¨¡å— + å称为osst.o 。 diff --git a/Documentation/translations/zh_CN/scsi/scsi_eh.rst b/Documentation/translations/zh_CN/scsi/scsi_eh.rst new file mode 100644 index 000000000000..26e0f30f0949 --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/scsi_eh.rst @@ -0,0 +1,482 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/scsi_eh.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + +=================== +SCSI ä¸é—´å±‚é”™è¯¯å¤„ç† +=================== + +本文档æè¿°äº†SCSIä¸é—´å±‚(mid layer)的错误处ç†åŸºç¡€æž¶æž„。 +关于SCSIä¸é—´å±‚的更多信æ¯ï¼Œè¯·å‚阅: +Documentation/scsi/scsi_mid_low_api.rst。 + +.. 目录 + + [1] SCSI 命令如何通过ä¸é—´å±‚ä¼ é€’å¹¶è¿›å…¥é”™è¯¯å¤„ç†ï¼ˆEH) + [1-1] scsi_cmnd(SCSI命令)结构体 + [1-2] scmd(SCSI 命令)是如何完æˆçš„? + [1-2-1] 通过scsi_done完æˆscmd + [1-2-2] 通过超时机制完æˆscmd + [1-3] é”™è¯¯å¤„ç†æ¨¡å—如何接管æµç¨‹ + [2] SCSIé”™è¯¯å¤„ç†æœºåˆ¶å·¥ä½œåŽŸç† + [2-1] åŸºäºŽç»†ç²’åº¦å›žè°ƒçš„é”™è¯¯å¤„ç† + [2-1-1] 概览 + [2-1-2] scmdåœ¨é”™è¯¯å¤„ç†æµç¨‹ä¸çš„ä¼ é€’è·¯å¾„ + [2-1-3] 控制æµåˆ†æž + [2-2] 通过transportt->eh_strategy_handler()å®žçŽ°çš„é”™è¯¯å¤„ç† + [2-2-1] transportt->eh_strategy_handler()调用å‰çš„ä¸é—´å±‚çŠ¶æ€ + [2-2-2] transportt->eh_strategy_handler()调用åŽçš„ä¸é—´å±‚çŠ¶æ€ + [2-2-3] 注æ„事项 + + +1. SCSI命令在ä¸é—´å±‚åŠé”™è¯¯å¤„ç†ä¸çš„ä¼ é€’æµç¨‹ +========================================= + +1.1 scsi_cmnd结构体 +------------------- + +æ¯ä¸ªSCSI命令都由struct scsi_cmnd(简称scmd)结构体 +表示。scmd包å«ä¸¤ä¸ªlist_head类型的链表节点:scmd->list +与scmd->eh_entry。其ä¸scmd->list是用于空闲链表或设备 +专属的scmd分é…链表,与错误处ç†è®¨è®ºå…³è”ä¸å¤§ã€‚而 +scmd->eh_entry则是专用于命令完æˆå’Œé”™è¯¯å¤„ç†é“¾è¡¨ï¼Œé™¤éž +ç‰¹åˆ«è¯´æ˜Žï¼Œæœ¬æ–‡è®¨è®ºä¸æ‰€æœ‰scmd的链表æ“作å‡é€šè¿‡ +scmd->eh_entry实现。 + + +1.2 scmd是如何完æˆçš„? +---------------------- + +底层设备驱动(LLDD)在获å–SCSI命令(scmd)åŽï¼Œå˜åœ¨ä¸¤ç§ +完æˆè·¯å¾„:底层驱动å¯é€šè¿‡è°ƒç”¨hostt->queuecommand()时从 +ä¸é—´å±‚ä¼ é€’çš„scsi_done回调函数主动完æˆå‘½ä»¤ï¼Œæˆ–者当命令未 +åŠæ—¶å®Œæˆæ—¶ç”±å—层(block layer)触å‘è¶…æ—¶å¤„ç†æœºåˆ¶ã€‚ + + +1.2.1 通过scsi_done回调完æˆSCSI命令 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +对于所有éžé”™è¯¯å¤„ç†ï¼ˆEH)命令,scsi_done()是其完æˆå›žè°ƒ +函数。它åªè°ƒç”¨blk_mq_complete_request()æ¥åˆ 除å—层的 +定时器并触å‘å—è®¾å¤‡è½¯ä¸æ–(BLOCK_SOFTIRQ)。 + +BLOCK_SOFTIRQ会间接调用scsi_complete(),进而调用 +scsi_decide_disposition()æ¥å†³å®šå¦‚何处ç†è¯¥å‘½ä»¤ã€‚ +scsi_decide_disposition()会查看scmd->result值和感 +åº”ç æ•°æ®æ¥å†³å®šå¦‚何处ç†å‘½ä»¤ã€‚ + + - SUCCESS + + 调用scsi_finish_command()æ¥å¤„ç†è¯¥å‘½ä»¤ã€‚该函数会 + 执行一些维护æ“作,然åŽè°ƒç”¨scsi_io_completion()æ¥ + 完æˆI/Oæ“作。scsi_io_completion()会通过调用 + blk_end_requeståŠå…¶ç›¸å…³å‡½æ•°æ¥é€šçŸ¥å—层该请求已完æˆï¼Œ + 如果å‘生错误,还会判æ–如何处ç†å‰©ä½™çš„æ•°æ®ã€‚ + + - NEEDS_RETRY + + - ADD_TO_MLQUEUE + + scmdè¢«é‡æ–°åŠ å…¥åˆ°å—设备队列ä¸ã€‚ + + - otherwise + + 调用scsi_eh_scmd_add(scmd)æ¥å¤„ç†è¯¥å‘½ä»¤ã€‚ + 关于æ¤å‡½æ•°çš„详细信æ¯ï¼Œè¯·å‚è§ [1-3]。 + + +1.2.2 scmdè¶…æ—¶å®Œæˆæœºåˆ¶ +^^^^^^^^^^^^^^^^^^^^^^ + +SCSIå‘½ä»¤è¶…æ—¶å¤„ç†æœºåˆ¶ç”±scsi_timeout()函数实现。 +当å‘生超时事件时,该函数 + + 1. 首先调用å¯é€‰çš„hostt->eh_timed_out()回调函数。 + 返回值å¯èƒ½æ˜¯ä»¥ä¸‹3ç§æƒ…况之一: + + - ``SCSI_EH_RESET_TIMER`` + 表示需è¦å»¶é•¿å‘½ä»¤æ‰§è¡Œæ—¶é—´å¹¶é‡å¯è®¡æ—¶å™¨ã€‚ + + - ``SCSI_EH_NOT_HANDLED`` + 表示eh_timed_out()未处ç†è¯¥å‘½ä»¤ã€‚ + æ¤æ—¶å°†æ‰§è¡Œç¬¬2æ¥çš„å¤„ç†æµç¨‹ã€‚ + + - ``SCSI_EH_DONE`` + 表示eh_timed_out()已完æˆè¯¥å‘½ä»¤ã€‚ + + 2. 若未通过回调函数解决,系统将调用 + scsi_abort_command()å‘起异æ¥ä¸æ¢æ“作,该æ“作最多 + 坿‰§è¡Œscmd->allowed + 1次。但å˜åœ¨ä¸‰ç§ä¾‹å¤–情况会跳 + 过异æ¥ä¸æ¢è€Œç›´æŽ¥è¿›å…¥ç¬¬3æ¥å¤„ç†ï¼šå½“检测到 + SCSI_EH_ABORT_SCHEDULEDæ ‡å¿—ä½å·²ç½®ä½ï¼ˆè¡¨æ˜Žè¯¥å‘½ä»¤å…ˆ + å‰å·²è¢«ä¸æ¢è¿‡ä¸€æ¬¡ä¸”当å‰é‡è¯•ä»å¤±è´¥ï¼‰ã€å½“é‡è¯•次数已达上 + é™ã€æˆ–å½“é”™è¯¯å¤„ç†æ—¶é™å·²åˆ°æœŸæ—¶ã€‚在这些情况下,系统将跳 + 过异æ¥ä¸æ¢æµç¨‹è€Œç›´æŽ¥æ‰§è¡Œç¬¬3æ¥å¤„ç†æ–¹æ¡ˆã€‚ + + 3. 最终未解决的命令会通过scsi_eh_scmd_add(scmd)移交给 + 错误处ç†å系统,具体æµç¨‹è¯¦è§[1-4]ç« èŠ‚è¯´æ˜Žã€‚ + +1.3 异æ¥å‘½ä»¤ä¸æ¢æœºåˆ¶ +-------------------- + +当命令超时触å‘åŽï¼Œç³»ç»Ÿä¼šé€šè¿‡scsi_abort_command()调度异 +æ¥ä¸æ¢æ“ä½œã€‚è‹¥ä¸æ¢æ“作执行æˆåŠŸï¼Œåˆ™æ ¹æ®é‡è¯•次数决定åŽç»å¤„ +ç†ï¼šè‹¥æœªè¾¾æœ€å¤§é‡è¯•é™åˆ¶ï¼Œå‘½ä»¤å°†é‡æ–°ä¸‹å‘执行;若é‡è¯•次数已 +耗尽,则命令最终以DID_TIME_OUT状æ€ç»ˆæ¢ã€‚当䏿¢æ“作失败 +时,系统会调用scsi_eh_scmd_add()将该命令移交错误处ç†å +ç³»ç»Ÿï¼Œå…·ä½“å¤„ç†æµç¨‹è¯¦è§[1-4]。 + +1.4 错误处ç†(EH)接管机制 +------------------------ + +SCSI命令通过scsi_eh_scmd_add()å‡½æ•°è¿›å…¥é”™è¯¯å¤„ç†æµç¨‹ï¼Œè¯¥å‡½ +数执行以下æ“作: + + 1. å°†scmd->eh_entry链接到shost->eh_cmd_q + + 2. 在shost->shost_stateä¸è®¾ç½®SHOST_RECOVERY状æ€ä½ + + 3. 递增shost->host_failed失败计数器 + + 4. 当检测到shost->host_busy == shost->host_failed + æ—¶ï¼ˆå³æ‰€æœ‰è¿›è¡Œä¸å‘½ä»¤å‡å·²å¤±è´¥ï¼‰ç«‹å³å”¤é†’SCSIé”™è¯¯å¤„ç† + 线程。 + +如上所述,当任一scmdè¢«åŠ å…¥åˆ°shost->eh_cmd_q队列时,系统 +会立å³ç½®ä½shost_stateä¸çš„SHOST_RECOVERYçŠ¶æ€æ ‡å¿—ä½ï¼Œè¯¥æ“ +作将阻æ¢å—层å‘对应主机控制器下å‘任何新的SCSI命令。在æ¤çж +æ€ä¸‹ï¼Œä¸»æœºæŽ§åˆ¶å™¨ä¸Šæ‰€æœ‰æ£åœ¨å¤„ç†çš„scmd最终会进入以下三ç§çж +æ€ä¹‹ä¸€ï¼šæ£å¸¸å®Œæˆã€å¤±è´¥åŽè¢«ç§»å…¥åˆ°eh_cmd_qé˜Ÿåˆ—ã€æˆ–å› è¶…æ—¶è¢« +æ·»åŠ åˆ°shost->eh_cmd_q队列。 + +如果所有的SCSI命令都已ç»å®Œæˆæˆ–å¤±è´¥ï¼Œç³»ç»Ÿä¸æ£åœ¨æ‰§è¡Œçš„命令 +æ•°é‡ä¸Žå¤±è´¥å‘½ä»¤æ•°é‡ç›¸ç‰ï¼ˆ +å³shost->host_busy == shost->host_failedï¼‰ï¼Œæ¤æ—¶å°†å”¤ +醒SCSI错误处ç†çº¿ç¨‹ã€‚SCSI错误处ç†çº¿ç¨‹ä¸€æ—¦è¢«å”¤é†’,就å¯ä»¥ç¡® +ä¿æ‰€æœ‰æœªå®Œæˆå‘½ä»¤å‡å·²æ ‡è®°ä¸ºå¤±è´¥çжæ€ï¼Œå¹¶ä¸”å·²ç»è¢«é“¾æŽ¥åˆ° +shost->eh_cmd_q队列ä¸ã€‚ + +需è¦ç‰¹åˆ«è¯´æ˜Žçš„æ˜¯ï¼Œè¿™å¹¶ä¸æ„味ç€åº•å±‚å¤„ç†æµç¨‹å®Œå…¨é™æ¢ã€‚当底层 +驱动以错误状æ€å®ŒæˆæŸä¸ªscmd时,底层驱动åŠå…¶ä¸‹å±‚ç»„ä»¶ä¼šç«‹åˆ»é— +忘该命令的所有关è”状æ€ã€‚ä½†å¯¹äºŽè¶…æ—¶å‘½ä»¤ï¼Œé™¤éž +hostt->eh_timed_out()å›žè°ƒå‡½æ•°å·²ç»æ˜Žç¡®é€šçŸ¥åº•层驱动丢弃该 +å‘½ä»¤ï¼ˆå½“å‰æ‰€æœ‰åº•å±‚é©±åŠ¨å‡æœªå®žçްæ¤åŠŸèƒ½ï¼‰ï¼Œå¦åˆ™ä»Žåº•层驱动视角 +看该命令ä»å¤„于活跃状æ€ï¼Œç†è®ºä¸Šä»å¯èƒ½åœ¨æŸæ—¶åˆ»å®Œæˆã€‚当然,由 +于超时计时器早已触å‘,所有æ¤ç±»å»¶è¿Ÿå®Œæˆéƒ½å°†è¢«ç³»ç»Ÿç›´æŽ¥å¿½ç•¥ã€‚ + +我们将在åŽç»ç« 节详细讨论关于SCSI错误处ç†å¦‚ä½•æ‰§è¡Œä¸æ¢æ“作( +å³å¼ºåˆ¶åº•层驱动丢弃已超时SCSI命令)。 + + +2. SCSIé”™è¯¯å¤„ç†æœºåˆ¶è¯¦è§£ +======================= + +SCSI底层驱动å¯ä»¥é€šè¿‡ä»¥ä¸‹ä¸¤ç§æ–¹å¼ä¹‹ä¸€æ¥å®žçްSCSI错误处ç†ã€‚ + + - 细粒度的错误处ç†å›žè°ƒæœºåˆ¶ + 底层驱动å¯é€‰æ‹©å®žçŽ°ç»†ç²’åº¦çš„é”™è¯¯å¤„ç†å›žè°ƒå‡½æ•°ï¼Œç”±SCSIä¸é—´å±‚ + 主导错误æ¢å¤æµç¨‹å¹¶è‡ªåŠ¨è°ƒç”¨å¯¹åº”çš„å›žè°ƒå‡½æ•°ã€‚æ¤å®žçŽ°æ¨¡å¼çš„详 + 细设计规范在[2-1]节ä¸å±•开讨论。 + + - eh_strategy_handler()回调函数 + 该回调函数作为统一的错误处ç†å…¥å£ï¼Œéœ€è¦å®Œæ•´å®žçŽ°æ‰€æœ‰çš„æ¢å¤ + æ“作。具体而言,它必须涵盖SCSIä¸é—´å±‚在常规æ¢å¤è¿‡ç¨‹ä¸æ‰§è¡Œ + çš„å…¨éƒ¨å¤„ç†æµç¨‹ï¼Œç›¸å…³å®žçŽ°å°†åœ¨[2-2]节ä¸è¯¦ç»†æè¿°ã€‚ + +当错误æ¢å¤æµç¨‹å®ŒæˆåŽï¼ŒSCSI错误处ç†ç³»ç»Ÿé€šè¿‡è°ƒç”¨ +scsi_restart_operations()函数æ¢å¤æ£å¸¸è¿è¡Œï¼Œè¯¥å‡½æ•°æŒ‰é¡ºåºæ‰§è¡Œ +以下æ“作: + + 1. éªŒè¯æ˜¯å¦éœ€è¦æ‰§è¡Œé©±åЍ噍安免闍é”定机制 + + 2. 清除shost_stateä¸çš„SHOST_RECOVERYçŠ¶æ€æ ‡å¿—ä½ + + 3. 唤醒所有在shost->host_wait上ç‰å¾…的任务。如果有人调用了 + scsi_block_when_processing_errors()则会å‘ç”Ÿè¿™ç§æƒ…况。 + ï¼ˆç–‘é—®ï¼šç”±äºŽé”™è¯¯å¤„ç†æœŸé—´å—层队列已被阻塞,为何ä»éœ€æ˜¾å¼ + 唤醒?) + + 4. 强制激活该主机控制器下所有设备的I/O队列 + + +2.1 åŸºäºŽç»†ç²’åº¦å›žè°ƒçš„é”™è¯¯å¤„ç†æœºåˆ¶ +-------------------------------- + +2.1.1 概述 +^^^^^^^^^^^ + +如果ä¸å˜åœ¨eh_strategy_handler(),SCSIä¸é—´å±‚将负责驱动的 +错误处ç†ã€‚错误处ç†ï¼ˆEHï¼‰çš„ç›®æ ‡æœ‰ä¸¤ä¸ªï¼šä¸€æ˜¯è®©åº•å±‚é©±åŠ¨ç¨‹åºã€ +主机和设备ä¸å†ç»´æŠ¤å·²è¶…æ—¶çš„SCSI命令(scmd);二是使他们准备 +好接收新命令。当一个SCSI命令(scmd)被底层é—忘且底层已准备 +好冿¬¡å¤„ç†æˆ–æ‹’ç»è¯¥å‘½ä»¤æ—¶ï¼Œå³å¯è®¤ä¸ºè¯¥scmdå·²æ¢å¤ã€‚ + +ä¸ºå®žçŽ°è¿™äº›ç›®æ ‡ï¼Œé”™è¯¯å¤„ç†ï¼ˆEHï¼‰ä¼šé€æ¥æ‰§è¡Œä¸¥é‡æ€§é€’增的æ¢å¤ +æ“作。部分æ“作通过下å‘SCSI命令完æˆï¼Œè€Œå…¶ä»–æ“作则通过调用 +以下细粒度的错误处ç†å›žè°ƒå‡½æ•°å®žçŽ°ã€‚è¿™äº›å›žè°ƒå‡½æ•°å¯ä»¥çœç•¥ï¼Œ +若被çœç•¥åˆ™é»˜è®¤å§‹ç»ˆè§†ä¸ºæ‰§è¡Œå¤±è´¥ã€‚ + +:: + + int (* eh_abort_handler)(struct scsi_cmnd *); + int (* eh_device_reset_handler)(struct scsi_cmnd *); + int (* eh_bus_reset_handler)(struct scsi_cmnd *); + int (* eh_host_reset_handler)(struct scsi_cmnd *); + +åªæœ‰åœ¨ä½Žçº§åˆ«çš„错误æ¢å¤æ“ä½œæ— æ³•æ¢å¤éƒ¨åˆ†å¤±è´¥çš„SCSI命令 +(scmd)时,æ‰ä¼šé‡‡å–更高级别的æ¢å¤æ“作。如果最高级别的错误 +处ç†å¤±è´¥ï¼Œå°±æ„å‘³ç€æ•´ä¸ªé”™è¯¯æ¢å¤ï¼ˆEH)过程失败,所有未能æ¢å¤ +的设备被强制下线。 + +在æ¢å¤è¿‡ç¨‹ä¸ï¼Œéœ€éµå¾ªä»¥ä¸‹è§„则: + + - 错误æ¢å¤æ“作针对待处ç†åˆ—表eh_work_qä¸çš„失败的scmds执 + 行。如果æŸä¸ªæ¢å¤æ“作æˆåŠŸæ¢å¤äº†ä¸€ä¸ªscmd,那么该scmd会 + 从eh_work_q链表ä¸ç§»é™¤ã€‚ + + éœ€è¦æ³¨æ„的是,对æŸä¸ªscmd执行的å•个æ¢å¤æ“作å¯èƒ½ä¼šæ¢å¤ + 多个scmd。例如,对æŸä¸ªè®¾å¤‡æ‰§è¡Œå¤ä½æ“作å¯èƒ½ä¼šæ¢å¤è¯¥è®¾ + 备上所有失败的scmd。 + + - 仅当低级别的æ¢å¤æ“作完æˆä¸”eh_work_qä»ç„¶éžç©ºæ—¶ï¼Œæ‰ä¼š + è§¦å‘æ›´é«˜çº§åˆ«çš„æ“ä½œ + + - SCSI错误æ¢å¤æœºåˆ¶ä¼šé‡ç”¨å¤±è´¥çš„scmdæ¥å‘逿¢å¤å‘½ä»¤ã€‚对于 + è¶…æ—¶çš„scmd,SCSIé”™è¯¯å¤„ç†æœºåˆ¶ä¼šç¡®ä¿åº•层驱动在é‡ç”¨scmd + å‰å·²ä¸å†ç»´æŠ¤è¯¥å‘½ä»¤ã€‚ + +当一个SCSI命令(scmd)被æˆåŠŸæ¢å¤åŽï¼Œé”™è¯¯å¤„ç†é€»è¾‘会通过 +scsi_eh_finish_cmd()将其从待处ç†é˜Ÿåˆ—(eh_work_q)移 +至错误处ç†çš„æœ¬åœ°å®Œæˆé˜Ÿåˆ—(eh_done_q)。当所有scmd凿¢ +å¤å®Œæˆï¼ˆå³eh_work_q为空时),错误处ç†é€»è¾‘会调用 +scsi_eh_flush_done_q()对这些已æ¢å¤çš„scmd进行处ç†ï¼Œå³ +釿–°å°è¯•或错误总终æ¢ï¼ˆå‘上层通知失败)。 + +SCSI命令仅在满足以下全部æ¡ä»¶æ—¶æ‰ä¼šè¢«é‡è¯•:对应的SCSI设 +备ä»å¤„于在线状æ€ï¼Œæœªè®¾ç½®REQ_FAILFASTæ ‡å¿—æˆ–é€’å¢žåŽçš„ +scmd->retries值ä»å°äºŽscmd->allowed。 + +2.1.2 SCSI命令在错误处ç†è¿‡ç¨‹ä¸çš„æµè½¬è·¯å¾„ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + 1. 错误完æˆ/è¶…æ—¶ + + :处ç†: 调用scsi_eh_scmd_add()处ç†scmd + + - å°†scmdæ·»åŠ åˆ°shost->eh_cmd_q + - 设置SHOST_RECOVERYæ ‡è®°ä½ + - shost->host_failed++ + + :é”è¦æ±‚: shost->host_lock + + 2. å¯åŠ¨é”™è¯¯å¤„ç†ï¼ˆEH) + + :æ“作: 将所有scmd移动到EH本地eh_work_q队列,并 + 清空 shost->eh_cmd_q。 + + :é”è¦æ±‚: shost->host_lock(éžä¸¥æ ¼å¿…éœ€ï¼Œä»…ä¸ºä¿æŒä¸€è‡´æ€§ï¼‰ + + 3. scmdæ¢å¤ + + :æ“作: 调用scsi_eh_finish_cmd()完æˆscmdçš„EH + + - å°†scmd从本地eh_work_q队列移至本地eh_done_q队列 + + :é”è¦æ±‚: æ— + + :å¹¶å‘æŽ§åˆ¶: æ¯ä¸ªç‹¬ç«‹çš„eh_work_qè‡³å¤šä¸€ä¸ªçº¿ç¨‹ï¼Œç¡®ä¿æ— é” + 队列的访问 + + 4. EHå®Œæˆ + + :æ“作: 调用scsi_eh_flush_done_q()é‡è¯•scmdæˆ–é€šçŸ¥ä¸Šå±‚å¤„ç† + 失败。æ¤å‡½æ•°å¯ä»¥è¢«å¹¶å‘调用,但æ¯ä¸ªç‹¬ç«‹çš„eh_work_q队 + åˆ—è‡³å¤šä¸€ä¸ªçº¿ç¨‹ï¼Œä»¥ç¡®ä¿æ— é”队列的访问。 + + - 从eh_done_q队列ä¸ç§»é™¤scmd,清除scmd->eh_entry + - 如果需è¦é‡è¯•,调用scsi_queue_insert()釿–°å…¥é˜Ÿscmd + - å¦åˆ™ï¼Œè°ƒç”¨scsi_finish_command()完æˆscmd + - å°†shost->host_failed置为零 + + :é”è¦æ±‚: 队列或完æˆå‡½æ•°ä¼šæ‰§è¡Œé€‚å½“çš„åŠ é”æ“作 + + +2.1.3 æŽ§åˆ¶æµ +^^^^^^^^^^^^ + + 通过细粒度回调机制执行的SCSI错误处ç†ï¼ˆEH)是从 + scsi_unjam_host()函数开始的 + +``scsi_unjam_host`` + + 1. æŒæœ‰shost->host_locké”,将shost->eh_cmd_qä¸çš„命令移动 + 到本地的eh_work_q队里ä¸ï¼Œå¹¶é‡Šæ”¾host_locké”。注æ„ï¼Œè¿™ä¸€æ¥ + 会清空shost->eh_cmd_q。 + + 2. 调用scsi_eh_get_sense函数。 + + ``scsi_eh_get_sense`` + + 该æ“作针对没有有效感知数æ®çš„错误完æˆå‘½ä»¤ã€‚大部分SCSIä¼ è¾“åè®® + æˆ–åº•å±‚é©±åŠ¨åœ¨å‘½ä»¤å¤±è´¥æ—¶ä¼šè‡ªåŠ¨èŽ·å–æ„ŸçŸ¥æ•°æ®ï¼ˆè‡ªåŠ¨æ„ŸçŸ¥ï¼‰ã€‚å‡ºäºŽæ€§ + èƒ½åŽŸå› ï¼Œå»ºè®®ä½¿ç”¨è‡ªåŠ¨æ„ŸçŸ¥ï¼ŒæŽ¨èä½¿ç”¨è‡ªåŠ¨æ„ŸçŸ¥æœºåˆ¶ï¼Œå› ä¸ºå®ƒä¸ä»…有 + 助于æå‡æ€§èƒ½ï¼Œè¿˜èƒ½é¿å…从å‘生CHECK CONDITION到执行本æ“作之间, + 感知信æ¯å‡ºçްä¸åŒæ¥çš„问题。 + + 注æ„ï¼Œå¦‚æžœä¸æ”¯æŒè‡ªåŠ¨æ„ŸçŸ¥ï¼Œé‚£ä¹ˆåœ¨ä½¿ç”¨scsi_done()以错误状æ€å®Œæˆ + scmd 时,scmd->sense_bufferå°†åŒ…å«æ— 效感知数æ®ã€‚åœ¨è¿™ç§æƒ…况下, + scsi_decide_disposition()总是返回FAILED从而触å‘SCSIé”™è¯¯å¤„ç† + (EH)。当该scmdæ‰§è¡Œåˆ°è¿™é‡Œæ—¶ï¼Œä¼šé‡æ–°èŽ·å–æ„ŸçŸ¥æ•°æ®ï¼Œå¹¶å†æ¬¡è°ƒç”¨ + scsi_decide_disposition()进行处ç†ã€‚ + + 1. 调用scsi_request_sense()å‘é€REQUEST_SENSE命令。如果失败, + 则ä¸é‡‡å–任何æ“作。请注æ„,ä¸é‡‡å–任何æ“作会导致对该scmd执行 + 更高级别的æ¢å¤æ“作。 + + 2. 调用scsi_decide_disposition()处ç†scmd + + - SUCCESS + scmd->retries被设置为scmd->allowedä»¥é˜²æ¢ + scsi_eh_flush_done_q()é‡è¯•该scmd,并调用 + scsi_eh_finish_cmd()。 + + - NEEDS_RETRY + 调用scsi_eh_finish_cmd() + + - 其他情况 + æ— æ“作。 + + 4. 如果!list_empty(&eh_work_q),则调用scsi_eh_ready_devs()。 + + ``scsi_eh_ready_devs`` + + 该函数采å–å››ç§é€æ¥å¢žå¼ºçš„æŽªæ–½ï¼Œä½¿å¤±è´¥çš„è®¾å¤‡å‡†å¤‡å¥½å¤„ç†æ–°çš„命令。 + + 1. 调用scsi_eh_stu() + + ``scsi_eh_stu`` + + 对于æ¯ä¸ªå…·æœ‰æœ‰æ•ˆæ„ŸçŸ¥æ•°æ®ä¸”scsi_check_sense()判æ–为失败的 + scmdå‘é€START STOP UNIT(STU)命令且将startç½®1。注æ„,由 + 于我们明确选择错误完æˆçš„scmd,å¯ä»¥ç¡®å®šåº•层驱动已ä¸å†ç»´æŠ¤è¯¥ + scmd,我们å¯ä»¥é‡ç”¨å®ƒè¿›è¡ŒSTU。 + + 如果STUæ“作æˆåŠŸä¸”sdev处于离线或就绪状æ€ï¼Œæ‰€æœ‰åœ¨sdev上失败的 + scmd都会通过scsi_eh_finish_cmd()完æˆã€‚ + + *注æ„* 如果hostt->eh_abort_handler()未实现或返回失败,å¯èƒ½ + æ¤æ—¶ä»æœ‰è¶…æ—¶çš„scmdï¼Œæ¤æ—¶STUä¸ä¼šå¯¼è‡´åº•层驱动ä¸å†ç»´æŠ¤scmd。但 + 是,如果STU执行æˆåŠŸï¼Œè¯¥å‡½æ•°ä¼šé€šè¿‡scsi_eh_finish_cmd()æ¥å®Œæˆ + sdev上的所有scmd,这会导致底层驱动处于ä¸ä¸€è‡´çš„状æ€ã€‚看æ¥STU + æ“作应仅在sdevä¸åŒ…å«è¶…æ—¶scmd时进行。 + + 2. 如果!list_empty(&eh_work_q),调用scsi_eh_bus_device_reset()。 + + ``scsi_eh_bus_device_reset`` + + æ¤æ“作与scsi_eh_stu()éžå¸¸ç›¸ä¼¼ï¼ŒåŒºåˆ«åœ¨äºŽä½¿ç”¨ + hostt->eh_device_reset_handler()替代STU命令。æ¤å¤–,由于我们 + 没有å‘é€SCSI命令且é‡ç½®ä¼šæ¸…空该sdev上所有的scmdï¼Œæ‰€ä»¥æ— éœ€ç›é€‰é”™ + 误完æˆçš„scmd。 + + 3. 如果!list_empty(&eh_work_q),调用scsi_eh_bus_reset()。 + + ``scsi_eh_bus_reset`` + + 对于æ¯ä¸ªåŒ…å«å¤±è´¥scmdçš„SCSI通é“调用 + hostt->eh_bus_reset_handler()。如果总线é‡ç½®æˆåŠŸï¼Œé‚£ä¹ˆè¯¥é€šé“上 + 所有准备就绪或离线状æ€sdev上的失败scmd都会被处ç†å¤„ç†å®Œæˆã€‚ + + 4. 如果!list_empty(&eh_work_q),调用scsi_eh_host_reset()。 + + ``scsi_eh_host_reset`` + + 调用hostt->eh_host_reset_handler()是最终的手段。如果SCSI主机 + é‡ç½®æˆåŠŸï¼Œä¸»æœºä¸Šæ‰€æœ‰å°±ç»ªæˆ–ç¦»çº¿sdev上的失败scmdéƒ½ä¼šé€šè¿‡é”™è¯¯å¤„ç† + 完æˆã€‚ + + 5. 如果!list_empty(&eh_work_q),调用scsi_eh_offline_sdevs()。 + + ``scsi_eh_offline_sdevs`` + + ç¦»çº¿æ‰€æœ‰åŒ…å«æœªæ¢å¤scmd的所有sdev,并通过 + scsi_eh_finish_cmd()完æˆè¿™äº›scmd。 + + 5. 调用scsi_eh_flush_done_q()。 + + ``scsi_eh_flush_done_q`` + + æ¤æ—¶æ‰€æœ‰çš„scmdéƒ½å·²ç»æ¢å¤ï¼ˆæˆ–放弃),并通过 + scsi_eh_finish_cmd()å‡½æ•°åŠ å…¥eh_done_q队列。该函数通过 + é‡è¯•或显示通知上层scmd的失败æ¥åˆ·æ–°eh_done_q。 + + +2.2 基于transportt->eh_strategy_handler()çš„é”™è¯¯å¤„ç†æœºåˆ¶ +------------------------------------------------------------- + +在该机制ä¸ï¼Œtransportt->eh_strategy_handler()替代 +scsi_unjam_host()的被调用,并负责整个错误æ¢å¤è¿‡ç¨‹ã€‚è¯¥å¤„ç† +函数完æˆåŽåº”该确ä¿åº•层驱动ä¸å†ç»´æŠ¤ä»»ä½•失败的scmd并且将设备 +设置为就绪(准备接收新命令)或离线状æ€ã€‚æ¤å¤–,该函数还应该 +执行SCSI错误处ç†çš„维护任务,以维护SCSIä¸é—´å±‚的数æ®å®Œæ•´æ€§ã€‚ +æ¢å¥è¯è¯´ï¼Œeh_strategy_handler()必须实现[2-1-2]ä¸é™¤ç¬¬1æ¥ +外的所有æ¥éª¤ã€‚ + + +2.2.1 transportt->eh_strategy_handler()调用å‰çš„SCSIä¸é—´å±‚çŠ¶æ€ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + 进入该处ç†å‡½æ•°æ—¶ï¼Œä»¥ä¸‹æ¡ä»¶æˆç«‹ã€‚ + + - æ¯ä¸ªå¤±è´¥çš„scmdçš„eh_flagså—æ®µå·²æ£ç¡®è®¾ç½®ã€‚ + + - æ¯ä¸ªå¤±è´¥çš„scmd通过scmd->eh_entry链接到scmd->eh_cmd_q队列。 + + - 已设置SHOST_RECOVERYæ ‡å¿—ã€‚ + + - `shost->host_failed == shost->host_busy`。 + +2.2.2 transportt->eh_strategy_handler()调用åŽçš„SCSIä¸é—´å±‚çŠ¶æ€ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + 从该处ç†å‡½æ•°é€€å‡ºæ—¶ï¼Œä»¥ä¸‹æ¡ä»¶æˆç«‹ã€‚ + + - shost->host_failed为零。 + + - shost->eh_cmd_q被清空。 + + - æ¯ä¸ªscmd->eh_entry被清空。 + + - 对æ¯ä¸ªscmd必须调用scsi_queue_insert()或scsi_finish_command()。 + 注æ„,该处ç†ç¨‹åºå¯ä»¥ä½¿ç”¨scmd->retries(剩余é‡è¯•次数)和 + scmd->allowed(å…许é‡è¯•次数)é™åˆ¶é‡è¯•次数。 + + +2.2.3 注æ„事项 +^^^^^^^^^^^^^^ + + - 需明确已超时的scmd在底层ä»å¤„于活跃状æ€ï¼Œå› æ¤åœ¨æ“作这些 + scmdå‰ï¼Œå¿…须确ä¿åº•层已彻底ä¸å†ç»´æŠ¤ã€‚ + + - 访问或修改shostæ•°æ®ç»“æž„æ—¶ï¼Œå¿…é¡»æŒæœ‰shost->host_locké” + ä»¥ç»´æŒæ•°æ®ä¸€è‡´æ€§ã€‚ + + - 错误处ç†å®ŒæˆåŽï¼Œæ¯ä¸ªæ•…障设备必须彻底清除所有活跃SCSI命 + 令(scmd)的关è”状æ€ã€‚ + + - 错误处ç†å®ŒæˆåŽï¼Œæ¯ä¸ªæ•…障设备必须被设置为就绪(准备接收 + 新命令)或离线状æ€ã€‚ + + +Tejun Heo +htejun@gmail.com + +11th September 2005 diff --git a/Documentation/translations/zh_CN/scsi/scsi_mid_low_api.rst b/Documentation/translations/zh_CN/scsi/scsi_mid_low_api.rst new file mode 100644 index 000000000000..f701945a1b1c --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/scsi_mid_low_api.rst @@ -0,0 +1,1174 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/scsi_mid_low_api.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +========================= +SCSIä¸é—´å±‚ — åº•å±‚é©±åŠ¨æŽ¥å£ +========================= + +简介 +==== +本文档概述了Linux SCSIä¸é—´å±‚与SCSI底层驱动之间的接å£ã€‚底层 +驱动(LLD)通常被称为主机总线适é…器(HBA)驱动或主机驱动 +(HD)。在该上下文ä¸ï¼Œâ€œä¸»æœºâ€æŒ‡çš„æ˜¯è®¡ç®—机IO总线(例如:PCI总 +线或ISA总线)与SCSIä¼ è¾“å±‚ä¸å•个SCSIå¯åŠ¨å™¨ç«¯å£ä¹‹é—´çš„æ¡¥æ¢ã€‚ +“å¯åЍ噍â€ç«¯å£ï¼ˆSCSI术è¯ï¼Œå‚考SAM-3:http://www.t10.orgï¼‰å‘ +â€œç›®æ ‡â€SCSI端å£ï¼ˆä¾‹å¦‚:ç£ç›˜ï¼‰å‘é€SCSI命令。在一个è¿è¡Œçš„系统 +ä¸å˜åœ¨å¤šç§åº•层驱动(LLDs),但æ¯ç§ç¡¬ä»¶ç±»åž‹ä»…对应一ç§åº•层驱动 +(LLD)。大多数底层驱动å¯ä»¥æŽ§åˆ¶ä¸€ä¸ªæˆ–多个SCSI HBA。部分HBA +内部集æˆå¤šä¸ªä¸»æœºæŽ§åˆ¶å™¨ã€‚ + +在æŸäº›æƒ…况下,SCSIä¼ è¾“å±‚æœ¬èº«æ˜¯å·²å˜åœ¨äºŽLinuxä¸çš„外部总线åç³» +统(例如:USBå’Œieee1394)。在æ¤ç±»åœºæ™¯ä¸‹ï¼ŒSCSIå系统的底层驱 +动将作为与其他驱动å系统的软件桥接层。典型示例包括 +usb-storage驱动(ä½äºŽdrivers/usb/storage目录)以 +åŠieee1394/sbp2驱动(ä½äºŽ drivers/ieee1394 目录)。 + +例如,aic7xxx底层驱动负责控制基于Adaptecå…¬å¸7xxx芯片系列的 +SCSI并行接å£ï¼ˆSPI)控制器。aic7xxx底层驱动å¯ä»¥å†…å»ºåˆ°å†…æ ¸ä¸ +或作为模å—åŠ è½½ã€‚ä¸€ä¸ªLinux系统ä¸åªèƒ½è¿è¡Œä¸€ä¸ªaic7xxx底层驱动 +程åºï¼Œä½†ä»–å¯èƒ½æŽ§åˆ¶å¤šä¸ªä¸»æœºæ€»çº¿é€‚é…器(HBA)。这些HBAå¯èƒ½ä½äºŽ +PCIæ‰©å±•å¡æˆ–内置于主æ¿ä¸ï¼ˆæˆ–两者兼有)。æŸäº›åŸºäºŽaic7xxxçš„HBA +é‡‡ç”¨åŒæŽ§åˆ¶å™¨è®¾è®¡ï¼Œå› æ¤ä¼šå‘ˆçŽ°ä¸ºä¸¤ä¸ªSCSI主机适é…器。与大多数现 +代HBA相åŒï¼Œæ¯ä¸ªaic7xxx控制器都拥有其独立的PCI设备地å€ã€‚[SCSI +主机与PCI设备之间一一对应虽然常è§ï¼Œä½†å¹¶éžå¼ºåˆ¶è¦æ±‚(例如ISA适 +é…器就ä¸é€‚用æ¤è§„则)。] + +SCSIä¸é—´å±‚å°†SCSI底层驱动(LLD)与其他层(例如SCSI上层驱动以 +åŠå—层)隔离开æ¥ã€‚ + +本文档的版本大致与Linuxå†…æ ¸2.6.8相匹é…。 + +文档 +==== +å†…æ ¸æºç æ ‘ä¸è®¾æœ‰ä¸“用的SCSI文档目录,通常ä½äºŽ +Documentation/scsi目录下。大多数文档采用 +reStructuredTextæ ¼å¼ã€‚本文档å为 +scsi_mid_low_api.rst,å¯åœ¨è¯¥ç›®å½•䏿‰¾åˆ°ã€‚è¯¥æ–‡æ¡£çš„æœ€æ–°ç‰ˆæœ¬å¯ +以访问 https://docs.kernel.org/scsi/scsi_mid_low_api.html +查阅。许多底层驱动(LLD)的文档也ä½äºŽDocumentation/scsi目录 +下(例如aic7xxx.rst)。SCSIä¸é—´å±‚的简è¦è¯´æ˜Žè§scsi.rst文件, +è¯¥æ–‡æ¡£åŒ…å«æŒ‡å‘Linux Kernel 2.4系列SCSIåç³»ç»Ÿçš„æ–‡æ¡£é“¾æŽ¥ã€‚æ¤ +外还收录了两份SCSI上层驱动文档:st.rst(SCSIç£å¸¦é©±åŠ¨ï¼‰ä¸Ž +scsi-generic.rst(用通用SCSI(sg)驱动)。 + +部分底层驱动的文档(或相关URL)å¯èƒ½åµŒåœ¨Cæºä»£ç 文件或与其 +æºç åŒä½äºŽåŒä¸€ç›®å½•下。例如,USB大容é‡å˜å‚¨é©±åŠ¨çš„æ–‡æ¡£é“¾æŽ¥å¯ä»¥åœ¨ +目录/usr/src/linux/drivers/usb/storage下找到。 + +驱动程åºç»“æž„ +============ +ä¼ ç»Ÿä¸Šï¼ŒSCSIå系统的底层驱动(LLD)至少包å«drivers/scsi +目录下的两个文件。例如,一个å为“xyzâ€çš„驱动会包å«ä¸€ä¸ªå¤´æ–‡ä»¶ +xyz.hå’Œä¸€ä¸ªæºæ–‡ä»¶xyz.c。[实际上所有代ç 完全å¯ä»¥åˆå¹¶ä¸ºå•个 +文件,头文件并éžå¿…需的。] 部分需è¦è·¨æ“作系统移æ¤çš„底层驱动会 +é‡‡ç”¨æ›´å¤æ‚的文件结构。例如,aic7xxx驱动,就为通用代ç 与æ“作 +系统专用代ç (如FreeBSDå’ŒLinux)分别创建了独立的文件。æ¤ç±» +驱动通常会在drivers/scsi目录下拥有自己å•独的å目录。 + +当需è¦å‘Linuxå†…æ ¸æ·»åŠ æ–°çš„åº•å±‚é©±åŠ¨ï¼ˆLLDï¼‰æ—¶ï¼Œå¿…é¡»ç•™æ„ +drivers/scsi目录下的两个文件:Makefile以åŠKconfigã€‚å»ºè®®å‚ +考现有底层驱动的代ç 组织方å¼ã€‚ + +éšç€Linuxå†…æ ¸2.5å¼€å‘å†…æ ¸é€æ¥æ¼”进为2.6ç³»åˆ—çš„ç”Ÿäº§ç‰ˆæœ¬ï¼Œè¯¥æŽ¥å£ +也引入了一些å˜åŒ–。以驱动åˆå§‹åŒ–代ç ä¸ºä¾‹ï¼ŒçŽ°æœ‰ä¸¤ç§æ¨¡åž‹å¯ç”¨ã€‚å…¶ +䏿—§æ¨¡åž‹ä¸ŽLinuxå†…æ ¸2.4çš„å®žçŽ°ç›¸ä¼¼ï¼Œä»–åŸºäºŽåœ¨åŠ è½½HBA驱动时检测 +到的主机,被称为“被动(passive)â€åˆå§‹åŒ–模型。而新的模型å…许 +在底层驱动(LLDï¼‰çš„ç”Ÿå‘½å‘¨æœŸå†…åŠ¨æ€æ‹”æ’HBAï¼Œè¿™ç§æ–¹å¼è¢«ç§°ä¸ºâ€œçƒ +æ’æ‹”(hotplug)â€åˆå§‹åŒ–模型。推èä½¿ç”¨æ–°çš„æ¨¡åž‹ï¼Œå› ä¸ºä»–æ—¢èƒ½å¤„ç† +ä¼ ç»Ÿçš„æ°¸ä¹…è¿žæŽ¥SCSI设备,也能处ç†çŽ°ä»£æ”¯æŒçƒæ’拔的类SCSI设备 +(例如通过USB或IEEE 1394连接的数ç 相机)。这两ç§åˆå§‹åŒ–模型将 +在åŽç»çš„ç« èŠ‚ä¸åˆ†åˆ«è®¨è®ºã€‚ + +SCSI底层驱动(LLD)通过以下3ç§æ–¹å¼ä¸ŽSCSIå系统进行交互: + + a) 直接调用由SCSIä¸é—´å±‚æä¾›çš„æŽ¥å£å‡½æ•° + b) å°†ä¸€ç»„å‡½æ•°æŒ‡é’ˆä¼ é€’ç»™ä¸é—´å±‚æä¾›çš„æ³¨å†Œå‡½æ•°ï¼Œä¸é—´å±‚将在 + åŽç»è¿è¡Œçš„æŸä¸ªæ—¶åˆ»è°ƒç”¨è¿™äº›å‡½æ•°ã€‚è¿™äº›å‡½æ•°ç”±LLD实现。 + c) 直接访问ä¸é—´å±‚ç»´æŠ¤çš„æ ¸å¿ƒæ•°æ®ç»“æž„ + +aï¼‰ç»„ä¸æ‰€æ¶‰åŠçš„æ‰€æœ‰å‡½æ•°ï¼Œå‡åˆ—于下文“ä¸é—´å±‚æä¾›çš„函数â€ç« 节ä¸ã€‚ + +bï¼‰ç»„ä¸æ¶‰åŠçš„æ‰€æœ‰å‡½æ•°å‡åˆ—于下文å为“接å£å‡½æ•°â€çš„ç« èŠ‚ä¸ã€‚这些 +函数指针ä½äºŽç»“构体struct scsi_host_templateä¸ï¼Œè¯¥ç»“构体实 +ä¾‹ä¼šè¢«ä¼ é€’ç»™scsi_host_alloc()。对于LLD未实现的接å£å‡½æ•°ï¼Œåº” +对struct scsi_host_templateä¸çš„对应æˆå‘˜èµ‹NULL。如果在文件 +作用域定义一个struct scsi_host_template的实例,没有显å¼åˆ +始化的函数指针æˆå‘˜å°†è‡ªåŠ¨è®¾ç½®ä¸ºNULL。 + +cï¼‰ç»„ä¸æåˆ°çš„ç”¨æ³•åœ¨â€œçƒæ’æ‹”â€çŽ¯å¢ƒä¸å°¤å…¶éœ€è¦è°¨æ…Žå¤„ç†ã€‚LLDå¿…é¡» +明确知晓这些与ä¸é—´å±‚åŠå…¶ä»–层级共享的数æ®ç»“构的生命周期。 + +LLDä¸å®šä¹‰çš„æ‰€æœ‰å‡½æ•°ä»¥åŠåœ¨æ–‡ä»¶ä½œç”¨åŸŸå†…定义的所有数æ®éƒ½åº”声明 +为static。例如,在一个å为“xxxâ€çš„LLDä¸çš„sdev_init()函数定 +义如下: +``static int xxx_sdev_init(struct scsi_device * sdev) { /* code */ }`` + +çƒæ’æ‹”åˆå§‹åŒ–模型 +================ +在该模型ä¸ï¼Œåº•层驱动(LLD)控制SCSI主机适é…器在å系统ä¸çš„æ³¨ +册与注销时机。主机最早å¯ä»¥åœ¨é©±åЍåˆå§‹åŒ–阶段被注册,最晚å¯ä»¥åœ¨ +驱动å¸è½½æ—¶è¢«ç§»é™¤ã€‚通常,驱动会å“应æ¥è‡ªsysfs probe()的回调, +表示已检测到一个主机总线适é…器(HBA)。在确认该新设备是LLDçš„ +ç›®æ ‡è®¾å¤‡åŽï¼ŒLLDåˆå§‹åŒ–HBA,并将一个新的SCSI主机适é…器注册到 +SCSIä¸é—´å±‚。 + +在LLDåˆå§‹åŒ–过程ä¸ï¼Œé©±åŠ¨åº”å½“å‘其期望å‘现HBAçš„IO总线(例如PCI +总线)进行注册。该æ“作通常å¯ä»¥é€šè¿‡sysfs完æˆã€‚ä»»ä½•é©±åŠ¨å‚æ•°ï¼ˆ +ç‰¹åˆ«æ˜¯é‚£äº›åœ¨é©±åŠ¨åŠ è½½åŽä»å¯ä¿®æ”¹çš„傿•°ï¼‰ä¹Ÿå¯ä»¥åœ¨æ¤æ—¶é€šè¿‡sysfs +注册。当LLD注册其首个HBA时,SCSIä¸é—´å±‚首次感å—到该LLDçš„å˜åœ¨ã€‚ + +在ç¨åŽçš„æŸä¸ªæ—¶é—´ç‚¹ï¼Œå½“LLD检测到新的HBA时,接下æ¥åœ¨LLD与SCSI +ä¸é—´å±‚之间会å‘生一系列典型的调用过程。该示例展示了ä¸é—´å±‚如何 +æ‰«ææ–°å¼•入的HBA,在该过程ä¸å‘现了3个SCSI设备,其ä¸åªæœ‰å‰ä¸¤ä¸ª +设备有å“应:: + + HBA探测:å‡è®¾åœ¨æ‰«æä¸å‘现2个SCSI设备 + 底层驱动 ä¸é—´å±‚ 底层驱动 + =======---------------======---------------======= + scsi_host_alloc() --> + scsi_add_host() ----> + scsi_scan_host() -------+ + | + sdev_init() + sdev_configure() --> scsi_change_queue_depth() + | + sdev_init() + sdev_configure() + | + sdev_init() *** + sdev_destroy() *** + + + *** 对于SCSIä¸é—´å±‚å°è¯•扫æä½†æœªå“应的SCSI设备,系统调用 + sdev_init()å’Œsdev_destroy()函数对。 + +如果LLD期望调整默认队列设置,å¯ä»¥åœ¨å…¶sdev_configure()例程 +ä¸è°ƒç”¨scsi_change_queue_depth()。 + +当移除一个HBA时,å¯èƒ½æ˜¯ç”±äºŽå¸è½½LLD模å—相关的有åºå…³é—(例如通 +过rmmod命令),也å¯èƒ½æ˜¯ç”±äºŽsysfsçš„remove()回调而触å‘çš„â€œçƒæ‹” +æ’â€äº‹ä»¶ã€‚æ— è®ºå“ªç§æƒ…况,其执行顺åºéƒ½æ˜¯ç›¸åŒçš„:: + + HBA移除:å‡è®¾è¿žæŽ¥äº†2个SCSI设备 + 底层驱动 ä¸é—´å±‚ 底层驱动 + =======---------------------======-----------------======= + scsi_remove_host() ---------+ + | + sdev_destroy() + sdev_destroy() + scsi_host_put() + +LLD用于跟踪struct Scsi_Host的实例å¯èƒ½ä¼šéžå¸¸æœ‰ç”¨ +(scsi_host_alloc()返回的指针)。这些实例由ä¸é—´å±‚“拥有â€ã€‚ +当引用计数为零时,struct Scsi_Host实例会被 +scsi_host_put()释放。 + +HBAçš„çƒæ’拔是一个特殊的场景,特别是当HBA下的ç£ç›˜æ£åœ¨å¤„ç†å·²æŒ‚ +载文件系统上的SCSI命令时。为了应对其ä¸çš„诸多问题,ä¸é—´å±‚引入 +了引用计数逻辑。具体内容å‚è€ƒä¸‹æ–‡å…³äºŽå¼•ç”¨è®¡æ•°çš„ç« èŠ‚ã€‚ + +çƒæ’æ‹”æ¦‚å¿µåŒæ ·é€‚用于SCSI设备。目å‰ï¼Œå½“æ·»åŠ HBA时, +scsi_scan_host() 函数会扫æè¯¥HBA所属SCSIä¼ è¾“é€šé“上的设备。在 +æ–°åž‹SCSIä¼ è¾“åè®®ä¸ï¼ŒHBAå¯èƒ½åœ¨æ‰«æå®ŒæˆåŽæ‰æ£€æµ‹åˆ°æ–°çš„SCSI设备。 +LLDå¯é€šè¿‡ä»¥ä¸‹æ¥éª¤é€šçŸ¥ä¸é—´å±‚æ–°SCSI设备的å˜åœ¨:: + + SCSIè®¾å¤‡çƒæ’æ‹” + 底层驱动 ä¸é—´å±‚ 底层驱动 + =======-------------------======-----------------======= + scsi_add_device() ------+ + | + sdev_init() + sdev_configure() [--> scsi_change_queue_depth()] + +类似的,LLDå¯èƒ½ä¼šæ„ŸçŸ¥åˆ°æŸä¸ªSCSI设备已ç»è¢«ç§»é™¤ï¼ˆæ‹”出)或与他的连 +æŽ¥å·²ä¸æ–。æŸäº›çŽ°æœ‰çš„SCSIä¼ è¾“å议(例如SPI)å¯èƒ½ç›´åˆ°åŽç»SCSI命令 +执行失败时æ‰ä¼šå‘现设备已ç»è¢«ç§»é™¤ï¼Œä¸é—´å±‚会将该设备设置为离线状æ€ã€‚ +è‹¥LLD检测到SCSI设备已ç»è¢«ç§»é™¤ï¼Œå¯é€šè¿‡ä»¥ä¸‹æµç¨‹è§¦å‘上层对该设备的 +移除æ“作:: + + SCSIè®¾å¤‡çƒæ‹”æ’ + 底层驱动 ä¸é—´å±‚ 底层驱动 + =======-------------------======-----------------======= + scsi_remove_device() -------+ + | + sdev_destroy() + +对于LLD而言,跟踪struct scsi_device实例å¯èƒ½ä¼šéžå¸¸æœ‰ç”¨ï¼ˆè¯¥ç»“æž„ +çš„æŒ‡é’ˆä¼šä½œä¸ºå‚æ•°ä¼ 递给sdev_init()å’Œsdev_configure()回调函数)。 +这些实例的所有æƒå½’属于ä¸é—´å±‚(mid-level)。struct scsi_device +实例在sdev_destroy()执行åŽé‡Šæ”¾ã€‚ + +引用计数 +======== +Scsi_Host结构体已引入引用计数机制。该机制将struct Scsi_Host +实例的所有æƒåˆ†æ•£åˆ°ä½¿ç”¨ä»–çš„å„SCSI层,而æ¤å‰è¿™ç±»å®žä¾‹å®Œå…¨ç”±ä¸é—´ +层独å 管ç†ã€‚底层驱动(LLDï¼‰é€šå¸¸æ— éœ€ç›´æŽ¥æ“作这些引用计数,仅在 +æŸäº›ç‰¹å®šåœºæ™¯ä¸‹å¯èƒ½éœ€è¦ä»‹å…¥ã€‚ + +与struct Scsi_Hostç›¸å…³çš„å¼•ç”¨è®¡æ•°å‡½æ•°ä¸»è¦æœ‰ä»¥ä¸‹3ç§ï¼š + + - scsi_host_alloc(): + è¿”å›žæŒ‡å‘æ–°å®žä¾‹çš„æŒ‡é’ˆï¼Œè¯¥å®žä¾‹çš„引用计数被设置为1。 + + - scsi_host_get(): + ç»™å®šå®žä¾‹çš„å¼•ç”¨è®¡æ•°åŠ 1。 + + - scsi_host_put(): + 给定实例的引用计数å‡1。如果引用计数å‡å°‘到0,则释放该实例。 + +scsi_device结构体现已引入引用计数机制。该机制将 +struct scsi_device实例的所有æƒåˆ†æ•£åˆ°ä½¿ç”¨ä»–çš„å„SCSIå±‚ï¼Œè€Œæ¤ +å‰è¿™ç±»å®žä¾‹å®Œå…¨ç”±ä¸é—´å±‚独å 管ç†ã€‚ç›¸å…³è®¿é—®å‡½æ•°å£°æ˜Žè¯¦è§ +include/scsi/scsi_device.h文件末尾部分。若LLD需è¦ä¿ç•™ +scsi_device实例的指针副本,则应调用scsi_device_get()å¢žåŠ å…¶ +引用计数;ä¸å†éœ€è¦è¯¥æŒ‡é’ˆæ—¶ï¼Œå¯é€šè¿‡scsi_device_put()递å‡å¼•用 +计数(该æ“作å¯èƒ½ä¼šå¯¼è‡´è¯¥å®žä¾‹è¢«é‡Šæ”¾ï¼‰ã€‚ + +.. Note:: + + struct Scsi_Host实际上包å«ä¸¤ä¸ªå¹¶è¡Œç»´æŠ¤çš„引用计数器,该引 + ç”¨è®¡æ•°ç”±è¿™äº›å‡½æ•°å…±åŒæ“作。 + +ç¼–ç 规范 +======== + +首先,Linus Torvalds关于Cè¯è¨€ç¼–ç é£Žæ ¼çš„è§‚ç‚¹å¯ä»¥åœ¨ +Documentation/process/coding-style.rstæ–‡ä»¶ä¸æ‰¾åˆ°ã€‚ + +æ¤å¤–,在相关gcc编译器支æŒçš„å‰æä¸‹ï¼Œé¼“åŠ±ä½¿ç”¨å¤§å¤šæ•°C99æ ‡å‡†çš„å¢žå¼º +ç‰¹æ€§ã€‚å› æ¤ï¼Œåœ¨é€‚当的情况下鼓励使用C99é£Žæ ¼çš„ç»“æž„ä½“å’Œæ•°ç»„åˆå§‹åŒ– +æ–¹å¼ã€‚但ä¸è¦è¿‡åº¦ä½¿ç”¨ï¼Œç›®å‰å¯¹å¯å˜é•¿åº¦æ•°ç»„(VLA)的支æŒè¿˜å¾…完善。 +一个例外是 ``//`` é£Žæ ¼çš„æ³¨é‡Šï¼›åœ¨Linuxä¸å€¾å‘于使 +用 ``/*...*/`` æ³¨é‡Šæ ¼å¼ã€‚ + +对于编写良好ã€ç»è¿‡å……分测试且有完整文档的代ç ä¸éœ€è¦é‡æ–°æ ¼å¼åŒ– +以符åˆä¸Šè¿°è§„范。例如,aic7xxx驱动是从FreeBSDå’ŒAdaptec代ç 库 +ç§»æ¤åˆ°Linuxçš„ã€‚æ¯«æ— ç–‘é—®ï¼ŒFreeBSDå’ŒAdaptecéµå¾ªå…¶åŽŸæœ‰çš„ç¼–ç è§„ +范。 + + +ä¸é—´å±‚æä¾›çš„函数 +================ +这些函数由SCSIä¸é—´å±‚æä¾›ï¼Œä¾›åº•层驱动(LLD)调用。这些函数的å +称(å³å…¥å£ç‚¹ï¼‰å‡å·²å¯¼å‡ºï¼Œå› æ¤ä½œä¸ºæ¨¡å—åŠ è½½çš„LLDå¯ä»¥è®¿é—®ä»–们。内 +æ ¸ä¼šç¡®ä¿åœ¨ä»»ä½•LLDåˆå§‹åŒ–之å‰ï¼ŒSCSIä¸é—´å±‚å·²å…ˆè¡ŒåŠ è½½å¹¶å®Œæˆåˆå§‹åŒ–。 +ä¸‹æ–‡æŒ‰å—æ¯é¡ºåºåˆ—出这些函数,其åç§°å‡ä»¥ ``scsi_`` 开头。 + +摘è¦ï¼š + + - scsi_add_device - 创建新的SCSI逻辑å•元(LU)设备实例 + - scsi_add_host - 执行sysfsæ³¨å†Œå¹¶è®¾ç½®ä¼ è¾“ç±» + - scsi_change_queue_depth - 调整SCSI设备队列深度 + - scsi_bios_ptable - 返回å—设备分区表的副本 + - scsi_block_requests - 阻æ¢å‘指定主机æäº¤æ–°å‘½ä»¤ + - scsi_host_alloc - 分é…引用计数为1的新SCSI主机适é…器实例scsi_host + - scsi_host_get - å¢žåŠ SCSI主机适é…器实例的引用计数 + - scsi_host_put - å‡å°‘SCSI主机适é…器的引用计数(归零时释放) + - scsi_remove_device - å¸è½½å¹¶ç§»é™¤SCSI设备 + - scsi_remove_host - å¸è½½å¹¶ç§»é™¤ä¸»æœºæŽ§åˆ¶å™¨ä¸‹çš„æ‰€æœ‰SCSI设备 + - scsi_report_bus_reset - 报告检测到的SCSI总线å¤ä½äº‹ä»¶ + - scsi_scan_host - 执行SCSI总线扫æ + - scsi_track_queue_full - 跟踪连ç»å‡ºçŽ°çš„é˜Ÿåˆ—æ»¡äº‹ä»¶ + - scsi_unblock_requests - æ¢å¤å‘指定主机æäº¤å‘½ä»¤ + +详细信æ¯:: + + /** + * scsi_add_device - 创建新的SCSI逻辑å•元(LU)设备实例 + * @shost: 指å‘SCSI主机适é…器实例的指针 + * @channel: 通é“å·ï¼ˆé€šå¸¸ä¸º0) + * @id: ç›®æ ‡IDå· + * @lun: 逻辑å•å…ƒå·ï¼ˆLUN) + * + * è¿”å›žæŒ‡å‘æ–°çš„struct scsi_device实例的指针, + * å¦‚æžœå‡ºçŽ°å¼‚å¸¸ï¼ˆä¾‹å¦‚åœ¨ç»™å®šåœ°å€æ²¡æœ‰è®¾å¤‡å“应),则返 + * 回ERR_PTR(-ENODEV) + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 注æ„äº‹é¡¹ï¼šæœ¬å‡½æ•°é€šå¸¸åœ¨æ·»åŠ HBAçš„SCSI总线扫æè¿‡ç¨‹ + * ä¸ç”±ç³»ç»Ÿå†…部调用(å³scsi_scan_host()æ‰§è¡ŒæœŸé—´ï¼‰ã€‚å› æ¤ï¼Œ + * 仅应在以下情况调用:HBA在scsi_scan_host()å®Œæˆæ‰«æåŽï¼Œ + * åˆæ£€æµ‹åˆ°æ–°çš„SCSI设备(逻辑å•元)。若æˆåŠŸæ‰§è¡Œï¼Œæœ¬æ¬¡è°ƒç”¨ + * å¯èƒ½ä¼šè§¦å‘LLD的以下回调函数:sdev_init()ä»¥åŠ + * sdev_configure() + * + * 函数定义:drivers/scsi/scsi_scan.c + **/ + struct scsi_device * scsi_add_device(struct Scsi_Host *shost, + unsigned int channel, + unsigned int id, unsigned int lun) + + + /** + * scsi_add_host - 执行sysfsæ³¨å†Œå¹¶è®¾ç½®ä¼ è¾“ç±» + * @shost: 指å‘SCSI主机适é…器实例的指针 + * @dev: 指å‘scsi类设备结构体(struct device)的指针 + * + * æˆåŠŸè¿”å›ž0,失败返回负的errno(例如:-ENOMEM) + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 注æ„äº‹é¡¹ï¼šä»…åœ¨â€œçƒæ’æ‹”åˆå§‹åŒ–模型â€ä¸éœ€è¦è°ƒç”¨ï¼Œä¸”必须在 + * scsi_host_alloc()æˆåŠŸæ‰§è¡ŒåŽè°ƒç”¨ã€‚该函数ä¸ä¼šæ‰«ææ€»çº¿ï¼› + * 总线扫æå¯é€šè¿‡è°ƒç”¨scsi_scan_host()æˆ–å…¶ä»–ä¼ è¾“å±‚ç‰¹å®šçš„ + * 方法完æˆã€‚在调用该函数之å‰ï¼ŒLLDå¿…é¡»å…ˆè®¾ç½®å¥½ä¼ è¾“æ¨¡æ¿ï¼Œ + * 并且åªèƒ½åœ¨è°ƒç”¨è¯¥å‡½æ•°ä¹‹åŽæ‰èƒ½è®¿é—®ä¼ 输类 + * (transport class)相关的数æ®ç»“构。 + * + * 函数定义:drivers/scsi/hosts.c + **/ + int scsi_add_host(struct Scsi_Host *shost, struct device * dev) + + + /** + * scsi_change_queue_depth - 调整SCSI设备队列深度 + * @sdev: 指å‘è¦æ›´æ”¹é˜Ÿåˆ—深度的SCSI设备的指针 + * @tags 如果å¯ç”¨äº†æ ‡è®°é˜Ÿåˆ—,则表示å…è®¸çš„æ ‡è®°æ•°ï¼Œ + * æˆ–è€…åœ¨éžæ ‡è®°æ¨¡å¼ä¸‹ï¼ŒLLDå¯ä»¥æŽ’队的命令 + * 数(如 cmd_per_lun)。 + * + * æ— è¿”å›ž + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 注æ„事项:å¯ä»¥åœ¨ä»»ä½•时刻调用该函数,åªè¦è¯¥SCSI设备å—该LLD控 + * 制。[具体æ¥è¯´ï¼Œå¯ä»¥åœ¨sdev_configure()执行期间或之åŽï¼Œä¸”在 + * sdev_destroy()执行之å‰è°ƒç”¨ã€‚] 该函数å¯å®‰å…¨åœ°åœ¨ä¸æ–ä¸Šä¸‹æ–‡ä¸ + * 调用。 + * + * 函数定义:drivers/scsi/scsi.c [更多注释请å‚考æºä»£ç ] + **/ + int scsi_change_queue_depth(struct scsi_device *sdev, int tags) + + + /** + * scsi_bios_ptable - 返回å—设备分区表的副本 + * @dev: 指å‘å—设备的指针 + * + * 返回指å‘分区表的指针,失败返回NULL + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 注æ„事项:调用方负责释放返回的内å˜ï¼ˆé€šè¿‡ kfree() 释放) + * + * 函数定义:drivers/scsi/scsicam.c + **/ + unsigned char *scsi_bios_ptable(struct block_device *dev) + + + /** + * scsi_block_requests - 阻æ¢å‘指定主机æäº¤æ–°å‘½ä»¤ + * + * @shost: 指å‘特定主机的指针,用于阻æ¢å‘½ä»¤çš„å‘é€ + * + * æ— è¿”å›ž + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 注æ„事项:没有定时器或其他任何机制å¯ä»¥è§£é™¤é˜»å¡žï¼Œå”¯ä¸€çš„æ–¹å¼ + * 是由LLD调用scsi_unblock_requests()æ–¹å¯æ¢å¤ã€‚ + * + * 函数定义:drivers/scsi/scsi_lib.c + **/ + void scsi_block_requests(struct Scsi_Host * shost) + + + /** + * scsi_host_alloc - 创建SCSI主机适é…器实例并执行基础åˆå§‹åŒ– + * @sht: 指å‘SCSI主机模æ¿çš„æŒ‡é’ˆ + * @privsize: 在hostdata数组ä¸åˆ†é…çš„é¢å¤–å—节数(该数组是返 + * 回的Scsi_Host实例的最åŽä¸€ä¸ªæˆå‘˜ï¼‰ + * + * è¿”å›žæŒ‡å‘æ–°çš„Scsi_Host实例的指针,失败返回NULL + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 注æ„事项:当æ¤è°ƒç”¨è¿”回给LLD时,该主机适é…器上的 + * SCSI总线扫æå°šæœªè¿›è¡Œã€‚hostdata数组(默认长度为 + * 零)是LLD专属的æ¯ä¸»æœºç§æœ‰åŒºåŸŸï¼Œä¾›LLD独å 使用。 + * 两个相关的引用计数都被设置为1。完整的注册(ä½äºŽ + * sysfs)与总线扫æç”±scsi_add_host()å’Œ + * scsi_scan_host()ç¨åŽæ‰§è¡Œã€‚ + * 函数定义:drivers/scsi/hosts.c + **/ + struct Scsi_Host * scsi_host_alloc(const struct scsi_host_template * sht, + int privsize) + + + /** + * scsi_host_get - å¢žåŠ SCSI主机适é…器实例的引用计数 + * @shost: 指å‘Scsi_Host实例的指针 + * + * æ— è¿”å›ž + * + * 是å¦é˜»å¡žï¼šç›®å‰å¯èƒ½ä¼šé˜»å¡žï¼Œä½†å¯èƒ½è¿ä»£ä¸ºä¸é˜»å¡ž + * + * 注æ„äº‹é¡¹ï¼šä¼šåŒæ—¶å¢žåŠ struct Scsi_Hostä¸ä¸¤ä¸ªå对 + * 象的引用计数 + * + * 函数定义:drivers/scsi/hosts.c + **/ + void scsi_host_get(struct Scsi_Host *shost) + + + /** + * scsi_host_put - å‡å°‘SCSI主机适é…器实例的引用计数 + * (归零时释放) + * @shost: 指å‘Scsi_Host实例的指针 + * + * æ— è¿”å›ž + * + * 是å¦é˜»å¡žï¼šå½“å‰å¯èƒ½ä¼šé˜»å¡žï¼Œä½†å¯èƒ½ä¼šæ”¹ä¸ºä¸é˜»å¡ž + * + * 注æ„事项:实际会递å‡ä¸¤ä¸ªå对象ä¸çš„计数。当åŽä¸€ä¸ªå¼•用 + * 计数归零时系统会自动释放Scsi_Host实例。 + * LLD æ— éœ€å…³æ³¨Scsi_Host实例的具体释放时机,åªè¦åœ¨å¹³è¡¡ + * 引用计数使用åŽä¸å†è®¿é—®è¯¥å®žä¾‹å³å¯ã€‚ + * 函数定义:drivers/scsi/hosts.c + **/ + void scsi_host_put(struct Scsi_Host *shost) + + + /** + * scsi_remove_device - å¸è½½å¹¶ç§»é™¤SCSI设备 + * @sdev: 指å‘SCSI设备实例的指针 + * + * 返回值:æˆåŠŸè¿”å›ž0,若设备未连接,则返回-EINVAL + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 如果LLDå‘现æŸä¸ªSCSI设备(逻辑å•元,lu)已ç»è¢«ç§»é™¤ï¼Œ + * 但其主机适é…å™¨å®žä¾‹ä¾æ—§å˜åœ¨ï¼Œåˆ™å¯ä»¥è¯·æ±‚移除该SCSI设备。 + * 如果该调用æˆåŠŸå°†è§¦å‘sdev_destroy()回调函数的执行。调 + * 用完æˆåŽï¼Œsdevå°†å˜æˆä¸€ä¸ªæ— 效的指针。 + * + * 函数定义:drivers/scsi/scsi_sysfs.c + **/ + int scsi_remove_device(struct scsi_device *sdev) + + + /** + * scsi_remove_host - å¸è½½å¹¶ç§»é™¤ä¸»æœºæŽ§åˆ¶å™¨ä¸‹çš„æ‰€æœ‰SCSI设备 + * @shost: 指å‘SCSI主机适é…器实例的指针 + * + * 返回值:æˆåŠŸè¿”å›ž0,失败返回1(例如:LLDæ£å¿™ï¼Ÿï¼Ÿï¼‰ + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 注æ„äº‹é¡¹ï¼šä»…åœ¨ä½¿ç”¨â€œçƒæ’æ‹”åˆå§‹åŒ–æ¨¡åž‹â€æ—¶è°ƒç”¨ã€‚应在调用 + * scsi_host_put()å‰è°ƒç”¨ã€‚ + * + * 函数定义:drivers/scsi/hosts.c + **/ + int scsi_remove_host(struct Scsi_Host *shost) + + + /** + * scsi_report_bus_reset - 报告检测到的SCSI总线å¤ä½äº‹ä»¶ + * @shost: 指å‘å…³è”çš„SCSI主机适é…器的指针 + * @channel: å‘生SCSI总线å¤ä½çš„通é“å· + * + * è¿”å›žå€¼ï¼šæ— + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 注æ„事项:仅当å¤ä½æ¥è‡ªæœªçŸ¥æ¥æºæ—¶æ‰éœ€è°ƒç”¨æ¤å‡½æ•°ã€‚ + * ç”±SCSIä¸é—´å±‚å‘èµ·çš„å¤ä½æ— 需调用,但调用也ä¸ä¼šå¯¼ + * 致副作用。æ¤å‡½æ•°çš„主è¦ä½œç”¨æ˜¯ç¡®ä¿ç³»ç»Ÿèƒ½æ£ç¡®å¤„ç† + * CHECK_CONDITION状æ€ã€‚ + * + * 函数定义:drivers/scsi/scsi_error.c + **/ + void scsi_report_bus_reset(struct Scsi_Host * shost, int channel) + + + /** + * scsi_scan_host - 执行SCSI总线扫æ + * @shost: 指å‘SCSI主机适é…器实例的指针 + * + * 是å¦é˜»å¡žï¼šæ˜¯ + * + * 注æ„事项:应在调用scsi_add_host()åŽè°ƒç”¨ + * + * 函数定义:drivers/scsi/scsi_scan.c + **/ + void scsi_scan_host(struct Scsi_Host *shost) + + + /** + * scsi_track_queue_full - 跟踪指定设备上连ç»çš„QUEUE_FULL + * äº‹ä»¶ï¼Œä»¥åˆ¤æ–æ˜¯å¦éœ€è¦åŠä½•时调整 + * 该设备的队列深度。 + * @sdev: 指å‘SCSI设备实例的指针 + * @depth: 当å‰è¯¥è®¾å¤‡ä¸Šæœªå®Œæˆçš„SCSI命令数é‡ï¼ˆä¸åŒ…括返回 + * QUEUE_FULL的命令) + * + * 返回值:0 - 当å‰é˜Ÿåˆ—æ·±åº¦æ— éœ€è°ƒæ•´ + * >0 - 需è¦å°†é˜Ÿåˆ—深度调整为æ¤è¿”回值指定的新深度 + * -1 - 需è¦å›žé€€åˆ°éžæ ‡è®°æ“作模å¼ï¼Œå¹¶ä½¿ç”¨ + * host->cmd_per_lunä½œä¸ºéžæ ‡è®°å‘½ä»¤é˜Ÿåˆ—çš„ + * 深度é™åˆ¶ + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 注æ„事项:LLDå¯ä»¥åœ¨ä»»æ„时刻调用该函数。系统将自动执行“æ£ç¡® + * çš„å¤„ç†æµç¨‹â€ï¼›è¯¥å‡½æ•°æ”¯æŒåœ¨ä¸æ–上下文ä¸å®‰å…¨åœ°è°ƒç”¨ + * + * 函数定义:drivers/scsi/scsi.c + **/ + int scsi_track_queue_full(struct scsi_device *sdev, int depth) + + + /** + * scsi_unblock_requests - æ¢å¤å‘指定主机适é…器æäº¤å‘½ä»¤ + * + * @shost: 指å‘è¦è§£é™¤é˜»å¡žçš„主机适é…器的指针 + * + * è¿”å›žå€¼ï¼šæ— + * + * 是å¦é˜»å¡žï¼šå¦ + * + * 函数定义:drivers/scsi/scsi_lib.c + **/ + void scsi_unblock_requests(struct Scsi_Host * shost) + + + +接å£å‡½æ•° +======== +接å£å‡½æ•°ç”±åº•层驱动(LLD)定义实现,其函数指针ä¿å˜åœ¨ +struct scsi_host_template实例ä¸ï¼Œå¹¶å°†è¯¥å®žä¾‹ä¼ 递给 +scsi_host_alloc()。 +部分接å£å‡½æ•°ä¸ºå¿…选实现项。所有 +接å£å‡½æ•°éƒ½åº”声明为static,约定俗æˆçš„命å规则如下, +驱动“xyzâ€åº”将其sdev_configure()函数声明为:: + + static int xyz_sdev_configure(struct scsi_device * sdev); + +其余接å£å‡½æ•°çš„命å规范å‡ä¾æ¤ç±»æŽ¨ã€‚ + +需将该函数指针赋值给“struct scsi_host_templateâ€å®žä¾‹ +的‘sdev_configure’æˆå‘˜å˜é‡ä¸ï¼Œå¹¶å°†è¯¥ç»“æž„ä½“å®žä¾‹æŒ‡é’ˆä¼ +递到ä¸é—´å±‚çš„scsi_host_alloc()函数。 + +å„个接å£å‡½æ•°çš„详细说明å¯å‚考include/scsi/scsi_host.h +文件,具体æè¿°ä½äºŽâ€œstruct scsi_host_templateâ€ç»“构体 +å„个æˆå‘˜çš„上方。在æŸäº›æƒ…况下,scsi_host.h头文件ä¸çš„æ +述比本文æä¾›çš„æ›´ä¸ºè¯¦å°½ã€‚ + +ä»¥ä¸‹æŒ‰å—æ¯é¡ºåºåˆ—出所有接å£å‡½æ•°åŠå…¶è¯´æ˜Žã€‚ + +摘è¦ï¼š + + - bios_param - 获å–ç£ç›˜çš„ç£å¤´/扇区/柱é¢å‚æ•° + - eh_timed_out - SCSI命令超时回调 + - eh_abort_handler - 䏿¢æŒ‡å®šçš„SCSI命令 + - eh_bus_reset_handler - 触å‘SCSI总线å¤ä½ + - eh_device_reset_handler - 执行SCSI设备å¤ä½ + - eh_host_reset_handler - å¤ä½ä¸»æœºï¼ˆä¸»æœºæ€»çº¿é€‚é…器) + - info - æä¾›æŒ‡å®šä¸»æœºé€‚é…å™¨çš„ç›¸å…³ä¿¡æ¯ + - ioctl - 驱动å¯å“应ioctl控制命令 + - proc_info - 支æŒ/proc/scsi/{驱动å}/{主机å·}文件节点的读写æ“作 + - queuecommand - å°†SCSI命令æäº¤åˆ°ä¸»æœºæŽ§åˆ¶å™¨ï¼Œå‘½ä»¤æ‰§è¡Œå®ŒæˆåŽè°ƒç”¨â€˜done’回调 + - sdev_init - åœ¨å‘æ–°è®¾å¤‡å‘é€SCSI命令å‰çš„åˆå§‹åŒ– + - sdev_configure - 设备挂载åŽçš„精细化微调 + - sdev_destroy - 设备å³å°†è¢«ç§»é™¤å‰çš„æ¸…ç† + + +详细信æ¯:: + + /** + * bios_param - 获å–ç£ç›˜çš„ç£å¤´/扇区/柱é¢å‚æ•° + * @sdev: 指å‘SCSI设备实例的指针(定义于 + * include/scsi/scsi_device.hä¸ï¼‰ + * @bdev: 指å‘å—设备实例的指针(定义于fs.hä¸ï¼‰ + * @capacity: 设备容é‡ï¼ˆä»¥512å—节扇区为å•ä½ï¼‰ + * @params: 三元数组用于ä¿å˜è¾“出结果: + * params[0]:ç£å¤´æ•°é‡ï¼ˆæœ€å¤§255) + * params[1]:扇区数é‡ï¼ˆæœ€å¤§63) + * params[2]ï¼šæŸ±é¢æ•°é‡ + * + * 返回值:被忽略 + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: 进程上下文(sd) + * + * 注æ„事项: 若未æä¾›æ¤å‡½æ•°ï¼Œç³»ç»Ÿå°†åŸºäºŽREAD CAPACITY + * ä½¿ç”¨é»˜è®¤å‡ ä½•å‚æ•°ã€‚params数组已预åˆå§‹åŒ–伪值,防æ¢å‡½ + * æ•°æ— è¾“å‡ºã€‚ + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int bios_param(struct scsi_device * sdev, struct block_device *bdev, + sector_t capacity, int params[3]) + + + /** + * eh_timed_out - SCSI命令超时回调 + * @scp: æ ‡è¯†è¶…æ—¶çš„å‘½ä»¤ + * + * 返回值: + * + * EH_HANDLED: 我已修å¤è¯¥é”™è¯¯ï¼Œè¯·ç»§ç»å®Œæˆè¯¥å‘½ä»¤ + * EH_RESET_TIMER: æˆ‘éœ€è¦æ›´å¤šæ—¶é—´ï¼Œè¯·é‡ç½®å®šæ—¶å™¨å¹¶é‡æ–°å¼€å§‹è®¡æ—¶ + * EH_NOT_HANDLED 开始æ£å¸¸çš„错误æ¢å¤æµç¨‹ + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: 䏿–上下文 + * + * 注æ„事项: 该回调函数为LLDæä¾›ä¸€ä¸ªæœºä¼šè¿›è¡Œæœ¬åœ° + * 错误æ¢å¤å¤„ç†ã€‚æ¤å¤„çš„æ¢å¤ä»…é™äºŽåˆ¤æ–该未完æˆçš„命 + * 令是å¦è¿˜æœ‰å¯èƒ½å®Œæˆã€‚æ¤å›žè°ƒä¸ä¸å…è®¸ä¸æ¢æˆ–釿–°å¯ + * 动该命令。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int eh_timed_out(struct scsi_cmnd * scp) + + + /** + * eh_abort_handler - 䏿¢æŒ‡å®šçš„SCSI命令 + * @scp: æ ‡è¯†è¦ä¸æ¢çš„命令 + * + * 返回值:如果命令æˆåŠŸä¸æ¢ï¼Œåˆ™è¿”回SUCCESS,å¦åˆ™è¿”回FAILED + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: å†…æ ¸çº¿ç¨‹ + * + * 注æ„事项: 该函数仅在命令超时时æ‰è¢«è°ƒç”¨ã€‚ + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int eh_abort_handler(struct scsi_cmnd * scp) + + + /** + * eh_bus_reset_handler - å‘èµ·SCSI总线å¤ä½ + * @scp: 包å«è¯¥è®¾å¤‡çš„SCSI总线应进行é‡ç½® + * + * 返回值:é‡ç½®æˆåŠŸè¿”å›žSUCCESSï¼›å¦åˆ™è¿”回FAILED + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: å†…æ ¸çº¿ç¨‹ + * + * 注æ„事项: ç”±SCSI错误处ç†çº¿ç¨‹ï¼ˆscsi_eh)调用。 + * åœ¨é”™è¯¯å¤„ç†æœŸé—´ï¼Œå½“å‰ä¸»æœºé€‚é…器的所有IOè¯·æ±‚å‡ + * 被阻塞。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int eh_bus_reset_handler(struct scsi_cmnd * scp) + + + /** + * eh_device_reset_handler - å‘èµ·SCSI设备å¤ä½ + * @scp: 指定将被é‡ç½®çš„SCSI设备 + * + * 返回值:如果命令æˆåŠŸä¸æ¢è¿”回SUCCESS,å¦åˆ™è¿”回FAILED + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: å†…æ ¸çº¿ç¨‹ + * + * 注æ„事项: ç”±SCSI错误处ç†çº¿ç¨‹ï¼ˆscsi_eh)调用。 + * åœ¨é”™è¯¯å¤„ç†æœŸé—´ï¼Œå½“å‰ä¸»æœºé€‚é…器的所有IOè¯·æ±‚å‡ + * 被阻塞。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int eh_device_reset_handler(struct scsi_cmnd * scp) + + + /** + * eh_host_reset_handler - å¤ä½ä¸»æœºï¼ˆä¸»æœºæ€»çº¿é€‚é…器) + * @scp: 管ç†è¯¥è®¾å¤‡çš„SCSI主机适é…器应该被é‡ç½® + * + * 返回值:如果命令æˆåŠŸä¸æ¢è¿”回SUCCESS,å¦åˆ™è¿”回FAILED + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: å†…æ ¸çº¿ç¨‹ + * + * 注æ„事项: ç”±SCSI错误处ç†çº¿ç¨‹ï¼ˆscsi_eh)调用。 + * åœ¨é”™è¯¯å¤„ç†æœŸé—´ï¼Œå½“å‰ä¸»æœºé€‚é…器的所有IOè¯·æ±‚å‡ + * 被阻塞。当使用默认的eh_strategyç–略时,如果 + * _abort_ã€_device_reset_ã€_bus_reset_和该处 + * ç†å‡½æ•°å‡æœªå®šä¹‰ï¼ˆæˆ–全部返回FAILED),系统强制 + * è¯¥æ•…éšœè®¾å¤‡å¤„äºŽç¦»çº¿çŠ¶æ€ + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int eh_host_reset_handler(struct scsi_cmnd * scp) + + + /** + * info - æä¾›ç»™å®šä¸»æœºé€‚é…器的详细信æ¯ï¼šé©±åŠ¨ç¨‹åºåç§° + * 以åŠç”¨äºŽåŒºåˆ†ä¸åŒä¸»æœºé€‚é…器的数æ®ç»“æž„ + * @shp: 指å‘ç›®æ ‡ä¸»æœºçš„struct Scsi_Host实例 + * + * 返回值:返回以NULL结尾的ASCIIå—符串。[驱动 + * 负责管ç†è¿”回的å—符串所在内å˜å¹¶ç¡®ä¿å…¶åœ¨æ•´ä¸ª + * 主机适é…器生命周期内有效。] + * + * å¹¶å‘安全声明: æ— é” + * + * 调用上下文说明: 进程上下文 + * + * 注æ„事项: 通常æä¾›è¯¸å¦‚I/Oåœ°å€æˆ–䏿–å· + * ç‰PCI或ISAä¿¡æ¯ã€‚如果未实现该函数,则 + * 默认使用struct Scsi_Host::name å—æ®µã€‚ + * 返回的å—符串应为å•行(å³ä¸åŒ…嫿¢è¡Œç¬¦ï¼‰ã€‚ + * 通过SCSI_IOCTL_PROBE_HOST ioctlå¯èŽ· + * å–该函数返回的å—符串,如果该函数ä¸å¯ç”¨ï¼Œ + * 则ioctl返回struct Scsi_Host::nameä¸ + * çš„å—符串。 + + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + const char * info(struct Scsi_Host * shp) + + + /** + * ioctl - 驱动å¯å“应ioctl控制命令 + * @sdp: ioctlæ“作针对的SCSI设备 + * @cmd: ioctlå‘½ä»¤å· + * @arg: 指å‘用户空间读写数æ®çš„æŒ‡é’ˆã€‚由于他指å‘用 + * æˆ·ç©ºé—´ï¼Œå¿…é¡»ä½¿ç”¨é€‚å½“çš„å†…æ ¸å‡½æ•° + * (如 copy_from_user())。按照Unix的风 + * æ ¼ï¼Œè¯¥å‚æ•°ä¹Ÿå¯ä»¥è§†ä¸ºunsigned long 类型。 + * + * 返回值:如果出错则返回负的“errnoâ€å€¼ã€‚返回0或æ£å€¼è¡¨ + * 示æˆåŠŸï¼Œå¹¶å°†è¿”å›žå€¼ä¼ é€’ç»™ç”¨æˆ·ç©ºé—´ã€‚ + * + * å¹¶å‘å®‰å…¨å£°æ˜Žï¼šæ— é” + * + * 调用上下文说明:进程上下文 + * + * 注æ„事项:SCSIå系统使用“é€å±‚ä¸‹ä¼ + * (trickle down)â€çš„ioctl模型。 + * 用户层会对上层驱动设备节点 + * (例如/dev/sdc)å‘èµ·ioctl()调用, + * å¦‚æžœä¸Šå±‚é©±åŠ¨æ— æ³•è¯†åˆ«è¯¥å‘½ä»¤ï¼Œåˆ™å°†å…¶ + * ä¼ é€’ç»™SCSIä¸é—´å±‚,若ä¸é—´å±‚ä¹Ÿæ— æ³•è¯† + * 别,则å†ä¼ 递给控制该设备的LLD。 + * æ ¹æ®æœ€æ–°çš„Unixæ ‡å‡†ï¼Œå¯¹äºŽä¸æ”¯æŒçš„ + * ioctl()命令,应返回-ENOTTY。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int ioctl(struct scsi_device *sdp, int cmd, void *arg) + + + /** + * proc_info - 支æŒ/proc/scsi/{驱动å}/{主机å·}文件节点的读写æ“作 + * @buffer: 输入或出的缓冲区锚点(writeto1_read0==0表示å‘buffer写 + * 入,writeto1_read0==1表示由buffer读å–) + * @start: 当writeto1_read0==0时,用于指定驱动实际填充的起始ä½ç½®ï¼› + * 当writeto1_read0==1时被忽略。 + * @offset: 当writeto1_read0==0时,表示用户关注的数æ®åœ¨ç¼“冲区ä¸çš„ + * å移。当writeto1_read0==1时忽略。 + * @length: 缓冲区的最大(或实际使用)长度 + * @host_no: ç›®æ ‡SCSI Host的编å·ï¼ˆstruct Scsi_Host::host_no) + * @writeto1_read0: 1 -> 表示数æ®ä»Žç”¨æˆ·ç©ºé—´å†™å…¥é©±åЍ + * (例如,“echo some_string > /proc/scsi/xyz/2â€ï¼‰ + * 0 -> è¡¨ç¤ºç”¨æˆ·ä»Žé©±åŠ¨è¯»å–æ•°æ® + * (例如,“cat /proc/scsi/xyz/2â€ï¼‰ + * + * 返回值:当writeto1_read0==1时返回写入长度。å¦åˆ™ï¼Œ + * 返回从offsetå移开始输出到bufferçš„å—符数。 + * + * å¹¶å‘å®‰å…¨å£°æ˜Žï¼šæ— é” + * + * 调用上下文说明:进程上下文 + * + * 注æ„事项:该函数由scsi_proc.c驱动,与proc_fs交互。 + * 当å‰SCSIå系统å¯ç§»é™¤å¯¹proc_fs的支æŒï¼Œç›¸å…³é…置选。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int proc_info(char * buffer, char ** start, off_t offset, + int length, int host_no, int writeto1_read0) + + + /** + * queuecommand - å°†SCSI命令æäº¤åˆ°ä¸»æœºæŽ§åˆ¶å™¨ï¼Œå‘½ä»¤æ‰§è¡Œå®ŒæˆåŽè°ƒç”¨scp->scsi_done回调函数 + * @shost: 指å‘ç›®æ ‡SCSI主机控制器 + * @scp: 指å‘待处ç†çš„SCSI命令 + * + * 返回值:æˆåŠŸè¿”å›ž0。 + * + * 如果å‘生错误,则返回: + * + * SCSI_MLQUEUE_DEVICE_BUSY表示设备队列满, + * SCSI_MLQUEUE_HOST_BUSY表示整个主机队列满 + * + * åœ¨è¿™ä¸¤ç§æƒ…况下,ä¸é—´å±‚å°†è‡ªåŠ¨é‡æ–°æäº¤è¯¥I/O请求 + * + * - 若返回SCSI_MLQUEUE_DEVICE_BUSY,则仅暂åœè¯¥ + * 特定设备的命令处ç†ï¼Œå½“该设备的æŸä¸ªå‘½ä»¤å®Œæˆè¿”回 + * æ—¶ï¼ˆæˆ–åœ¨çŸæš‚延迟åŽå¦‚果没有其他未完æˆå‘½ä»¤ï¼‰å°†æ¢ + * å¤å…¶å¤„ç†ã€‚å…¶ä»–è®¾å¤‡çš„å‘½ä»¤ä»æ£å¸¸ç»§ç»å¤„ç†ã€‚ + * + * - 若返回SCSI_MLQUEUE_HOST_BUSY,将暂åœè¯¥ä¸»æœº + * 的所有I/Oæ“作,当任æ„命令从该主机返回时(或在 + * çŸæš‚延迟åŽå¦‚果没有其他未完æˆå‘½ä»¤ï¼‰å°†æ¢å¤å¤„ç†ã€‚ + * + * 为了与早期的queuecommand兼容,任何其他返回值 + * 都被视作SCSI_MLQUEUE_HOST_BUSY。 + * + * 对于其他å¯ç«‹å³æ£€æµ‹åˆ°çš„错误,å¯é€šè¿‡ä»¥ä¸‹æµç¨‹å¤„ + * ç†ï¼šè®¾ç½®scp->result为适当错误值,调用scp->scsi_done + * 回调函数,然åŽè¯¥å‡½æ•°è¿”回0ã€‚è‹¥è¯¥å‘½ä»¤æœªç«‹å³æ‰§è¡Œï¼ˆLLD + * æ£åœ¨å¯åŠ¨æˆ–å°†è¦å¯åŠ¨è¯¥å‘½ä»¤ï¼‰ï¼Œåˆ™åº”å°†scp->resultç½®0å¹¶ + * 返回0。 + * + * 命令所有æƒè¯´æ˜Žï¼šè‹¥é©±åŠ¨è¿”å›ž0,则表示驱动获得该命令的 + * 所有æƒï¼Œ + * å¹¶å¿…é¡»ç¡®ä¿æœ€ç»ˆæ‰§è¡Œscp->scsi_done回调函数。注æ„:驱动 + * å¯ä»¥åœ¨è¿”回0之å‰è°ƒç”¨scp->scsi_done,但一旦调用该回 + * 调函数åŽï¼Œå°±åªèƒ½è¿”回0。若驱动返回éžé›¶å€¼ï¼Œåˆ™ç¦æ¢åœ¨ä»»ä½•æ—¶ + * 刻执行该命令的scsi_done回调函数。 + * + * å¹¶å‘安全声明:在2.6.36åŠæ›´æ—©çš„å†…æ ¸ç‰ˆæœ¬ä¸ï¼Œè°ƒç”¨è¯¥å‡½æ•°æ—¶æŒæœ‰ + * struct Scsi_Host::host_locké”(通过“irqsaveâ€èŽ·å–䏿–安全的自旋é”), + * 并且返回时ä»éœ€ä¿æŒè¯¥é”;从Linux 2.6.37开始,queuecommand + * å°†åœ¨æ— é”状æ€ä¸‹è¢«è°ƒç”¨ã€‚ + * + * è°ƒç”¨ä¸Šä¸‹æ–‡è¯´æ˜Žï¼šåœ¨ä¸æ–ï¼ˆè½¯ä¸æ–ï¼‰æˆ–è¿›ç¨‹ä¸Šä¸‹æ–‡ä¸ + * + * 注æ„事项:该函数执行应当éžå¸¸å¿«é€Ÿï¼Œé€šå¸¸ä¸ä¼šç‰å¾…I/O + * 完æˆã€‚å› æ¤scp->scsi_done回调函数通常会在该函数返 + * 回åŽçš„æŸä¸ªæ—¶åˆ»è¢«è°ƒç”¨ï¼ˆç»å¸¸ç›´æŽ¥ä»Žä¸æ–æœåŠ¡ä¾‹ç¨‹ä¸è°ƒç”¨ï¼‰ã€‚ + * æŸäº›æƒ…况下(如模拟SCSI INQUIRYå“应的伪适é…器驱动), + * scp->scsi_done回调å¯èƒ½åœ¨è¯¥å‡½æ•°è¿”回å‰å°±è¢«è°ƒç”¨ã€‚ + * è‹¥scp->scsi_done回调函数未在指定时é™å†…被调用,SCSIä¸ + * 间层将å¯åŠ¨é”™è¯¯å¤„ç†æµç¨‹ã€‚当调用scp->scsi_done回调函数 + * 时,若“resultâ€å—段被设置为CHECK CONDITION, + * 则LLD应执行自动感知并填充 + * struct scsi_cmnd::sense_buffer数组。在ä¸é—´å±‚å°† + * å‘½ä»¤åŠ å…¥LLD队列之å‰å‰ï¼Œscsi_cmnd::sense_buffer数组 + * 会被清零。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šLLD必须实现 + **/ + int queuecommand(struct Scsi_Host *shost, struct scsi_cmnd * scp) + + + /** + * sdev_init - åœ¨å‘æ–°è®¾å¤‡å‘é€ä»»ä½•SCSI命令å‰ï¼ˆå³å¼€å§‹æ‰«æ + * 之å‰ï¼‰è°ƒç”¨è¯¥å‡½æ•° + * @sdp: 指å‘å³å°†è¢«æ‰«æçš„æ–°è®¾å¤‡çš„æŒ‡é’ˆ + * + * 返回值:返回0表示æ£å¸¸ã€‚返回其他值表示出错, + * 该设备将被忽略。 + * + * å¹¶å‘å®‰å…¨å£°æ˜Žï¼šæ— é” + * + * 调用上下文说明:进程上下文 + * + * 注æ„事项:该函数å…许LLD在设备首次扫æå‰åˆ†é…所需的资æºã€‚ + * 对应的SCSI设备å¯èƒ½å°šæœªçœŸæ£å˜åœ¨ï¼Œä½†SCSIä¸é—´å±‚å³å°†å¯¹å…¶è¿› + * 行扫æï¼ˆä¾‹å¦‚å‘é€INQUIRY命令ç‰ï¼‰ã€‚如果设备å˜åœ¨ï¼Œå°†è°ƒç”¨ + * sdev_configure()进行é…置;如果设备ä¸å˜åœ¨ï¼Œåˆ™è°ƒç”¨ + * sdev_destroy()销æ¯ã€‚更多细节请å‚考 + * include/scsi/scsi_host.h文件。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int sdev_init(struct scsi_device *sdp) + + + /** + * sdev_configure - åœ¨è®¾å¤‡é¦–æ¬¡å®Œæˆæ‰«æï¼ˆå³å·²æˆåŠŸå“应INQUIRY + * 命令)之åŽï¼ŒLDDå¯è°ƒç”¨è¯¥å‡½æ•°å¯¹è®¾å¤‡è¿›è¡Œè¿›ä¸€æ¥é…ç½® + * @sdp: 已连接的设备 + * + * 返回值:返回0表示æˆåŠŸã€‚ä»»ä½•å…¶ä»–è¿”å›žå€¼éƒ½è¢«è§†ä¸ºé”™è¯¯ï¼Œæ¤æ—¶ + * è®¾å¤‡å°†è¢«æ ‡è®°ä¸ºç¦»çº¿ã€‚[è¢«æ ‡è®°ç¦»çº¿çš„è®¾å¤‡ä¸ä¼šè°ƒç”¨sdev_destroy(), + * å› æ¤éœ€è¦LLD主动清ç†èµ„æºã€‚] + * + * å¹¶å‘å®‰å…¨å£°æ˜Žï¼šæ— é” + * + * 调用上下文说明:进程上下文 + * + * 注æ„事项:该接å£å…许LLD查看设备扫æä»£ç 所å‘出的åˆå§‹INQUIRY + * 命令的å“应,并采å–对应æ“作。具体实现细节请å‚阅 + * include/scsi/scsi_host.h文件。 + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + int sdev_configure(struct scsi_device *sdp) + + + /** + * sdev_destroy - 当指定设备å³å°†è¢«å…³é—æ—¶è°ƒç”¨ã€‚æ¤æ—¶è¯¥è®¾å¤‡ + * 上的所有I/O活动å‡å·²åœæ¢ã€‚ + * @sdp: å³å°†å…³é—的设备 + * + * è¿”å›žå€¼ï¼šæ— + * + * å¹¶å‘å®‰å…¨å£°æ˜Žï¼šæ— é” + * + * 调用上下文说明:进程上下文 + * + * 注æ„事项:该设备的ä¸é—´å±‚æ•°æ®ç»“æž„ä»ç„¶å˜åœ¨ + * 但å³å°†è¢«é”€æ¯ã€‚é©±åŠ¨ç¨‹åºæ¤æ—¶åº”当释放为该设 + * 备分é…的所有专属资æºã€‚系统将ä¸å†å‘æ¤sdp + * 实例å‘é€ä»»ä½•命令。[但该设备å¯èƒ½åœ¨æœªæ¥è¢« + * 釿–°è¿žæŽ¥ï¼Œå±Šæ—¶å°†é€šè¿‡æ–°çš„struct scsi_device + * 实例,并触å‘åŽç»çš„sdev_init()å’Œ + * sdev_configure()调用过程。] + * + * å¯é€‰å®žçŽ°è¯´æ˜Žï¼šç”±LLD选择性定义 + **/ + void sdev_destroy(struct scsi_device *sdp) + + + +æ•°æ®ç»“æž„ +======== +struct scsi_host_template +------------------------- +æ¯ä¸ªLLD对应一个“struct scsi_host_template†+实例 [#]_。该结构体通常被åˆå§‹åŒ–为驱动头文件ä¸çš„é™ +æ€å…¨å±€å˜é‡ï¼Œæ¤æ–¹å¼å¯ç¡®ä¿æœªæ˜¾å¼åˆå§‹åŒ–çš„æˆå‘˜è‡ªåŠ¨ç½®é›¶ +(0或NULL)。关键æˆå‘˜å˜é‡è¯´æ˜Žå¦‚下: + + name + - 驱动程åºçš„å称(å¯ä»¥åŒ…å«ç©ºæ ¼ï¼Œè¯·é™åˆ¶åœ¨80个å—符以内) + + proc_name + - 在“/proc/scsi/<proc_name>/<host_no>†+ å’Œsysfs的“driversâ€ç›®å½•ä¸ä½¿ç”¨çš„åç§°ã€‚å› æ¤ + “proc_nameâ€åº”仅包å«Unix文件åä¸å¯æŽ¥å— + çš„å—符。 + + ``(*queuecommand)()`` + - ä¸é—´å±‚使用的主è¦å›žè°ƒå‡½æ•°ï¼Œç”¨äºŽå°†SCSI命令 + æäº¤åˆ°LLD。 + + vendor_id + - è¯¥å—æ®µæ˜¯ä¸€ä¸ªå”¯ä¸€æ ‡è¯†å€¼ï¼Œç”¨äºŽç¡®è®¤æä¾› + Scsi_Host LLD的供应商,最常用于 + 验è¯ä¾›åº”商特定的消æ¯è¯·æ±‚ã€‚è¯¥å€¼ç”±æ ‡è¯†ç¬¦ç±»åž‹ + 和供应商特定值组æˆï¼Œæœ‰æ•ˆæ ¼å¼æè¿°è¯·å‚阅 + scsi_netlink.h头文件。 + +该结构体的完整定义åŠè¯¦ç»†æ³¨é‡Šè¯·å‚阅 ``include/scsi/scsi_host.h``。 + +.. [#] 在æžç«¯æƒ…况下,å•ä¸ªé©±åŠ¨éœ€è¦æŽ§åˆ¶å¤šç§ä¸åŒç±»åž‹çš„ç¡¬ä»¶æ—¶ï¼Œé©±åŠ¨å¯ + 能包å«å¤šä¸ªå®žä¾‹ï¼Œï¼ˆä¾‹å¦‚æŸä¸ªLLDé©±åŠ¨åŒæ—¶å¤„ç†ISAå’ŒPCI两ç§ç±»åž‹ + 的适é…å¡ï¼Œå¹¶ä¸ºæ¯ç§ç¡¬ä»¶ç±»åž‹ç»´æŠ¤ç‹¬ç«‹çš„ + struct scsi_host_template实例)。 + +struct Scsi_Host +---------------- +æ¯ä¸ªç”±LLD控制的主机适é…器对应一个struct Scsi_Host实例。 +该结构体与struct scsi_host_templateå…·æœ‰å¤šä¸ªç›¸åŒæˆå‘˜ã€‚ +当创建struct Scsi_Host实例时(通过hosts.cä¸çš„ +scsi_host_alloc()函数),这些通用æˆå‘˜ä¼šä»ŽLLDçš„ +struct scsi_host_template实例åˆå§‹åŒ–而æ¥ã€‚关键æˆå‘˜è¯´æ˜Ž +如下: + + host_no + - ç³»ç»ŸèŒƒå›´å†…å”¯ä¸€çš„ä¸»æœºæ ‡è¯†å·ï¼ŒæŒ‰å‡åºä»Ž0å¼€å§‹åˆ†é… + can_queue + - 必须大于0,表示适é…器å¯å¤„ç†çš„æœ€å¤§å¹¶å‘å‘½ä»¤æ•°ï¼Œç¦ + æ¢å‘适é…器å‘é€è¶…è¿‡æ¤æ•°å€¼çš„命令数 + this_id + - 主机适é…器的SCSI ID(SCSIå¯åŠ¨å™¨æ ‡è¯†ï¼‰ï¼Œè‹¥æœªçŸ¥åˆ™ + 设置为-1 + sg_tablesize + - 主机适é…器支æŒçš„æœ€å¤§æ•£åˆ—表(scatter-gatherï¼‰å…ƒç´ + 数。设置为SG_ALL或更å°çš„值å¯é¿å…使用链å¼SG列表, + 且最å°å€¼å¿…须为1 + max_sectors + - å•个SCSI命令ä¸å…许的最大扇区数(通常为512å—节/ + 扇区)。默认值为0ï¼Œæ¤æ—¶ä¼šä½¿ç”¨ + SCSI_DEFAULT_MAX_SECTORS(在scsi_host.hä¸å®šä¹‰ï¼‰ï¼Œ + 当å‰è¯¥å€¼ä¸º1024ã€‚å› æ¤ï¼Œå¦‚果未定义max_sectors,则ç£ç›˜çš„ + æœ€å¤§ä¼ è¾“å¤§å°ä¸º512KB。注æ„:这个大å°å¯èƒ½ä¸è¶³ä»¥æ”¯æŒ + ç£ç›˜å›ºä»¶ä¸Šä¼ 。 + cmd_per_lun + - 主机适é…器的设备上,æ¯ä¸ªLUNå¯æŽ’é˜Ÿçš„æœ€å¤§å‘½ä»¤æ•°ã€‚ + æ¤å€¼å¯é€šè¿‡LLD调用scsi_change_queue_depth()进行 + 调整。 + hostt + - 指å‘LLD struct scsi_host_template实例的指针, + 当å‰struct Scsi_Hostå®žä¾‹æ£æ˜¯ç”±æ¤æ¨¡æ¿ç”Ÿæˆã€‚ + hostt->proc_name + - LLDçš„å称,sysfs使用的驱动å。 + transportt + - 指å‘LLD struct scsi_transport_template实例的指 + 针(如果å˜åœ¨ï¼‰ã€‚当剿”¯æŒFC与SPIä¼ è¾“å议。 + hostdata[0] + - 为LLD在struct Scsi_Host结构体末尾预留的区域,大å°ç”± + scsi_host_alloc()çš„ç¬¬äºŒä¸ªå‚æ•°(privsize)决定。 + +scsi_host结构体的完整定义详è§include/scsi/scsi_host.h。 + +struct scsi_device +------------------ +通常而言,æ¯ä¸ªSCSI逻辑å•元(Logical Unit)对应一个该结构 +的实例。连接到主机适é…器的SCSI设备通过三个è¦ç´ å”¯ä¸€æ ‡è¯†ï¼šé€š +é“å·ï¼ˆChannel Number)ã€ç›®æ ‡ID(Target ID)和逻辑å•å…ƒå· +(LUN)。 +该结构体完整定义于include/scsi/scsi_device.h。 + +struct scsi_cmnd +---------------- +该结构体实例用于在LLD与SCSIä¸é—´å±‚ä¹‹é—´ä¼ é€’SCSI命令 +åŠå…¶å“应。SCSIä¸é—´å±‚会确ä¿ï¼šæäº¤åˆ°LLD的命令数ä¸è¶…过 +scsi_change_queue_depth()(或struct Scsi_Host::cmd_per_lun) +设定的上é™ï¼Œä¸”æ¯ä¸ªSCSI设备至少分é…一个struct scsi_cmnd实例。 +关键æˆå‘˜è¯´æ˜Žå¦‚下: + + cmnd + - 包å«SCSI命令的数组 + cmd_len + - SCSI命令的长度(å—节为å•ä½ï¼‰ + sc_data_direction + - æ•°æ®çš„ä¼ è¾“æ–¹å‘。请å‚考 + include/linux/dma-mapping.hä¸çš„ + “enum dma_data_directionâ€ã€‚ + result + - LLD在调用“doneâ€ä¹‹å‰è®¾ç½®è¯¥å€¼ã€‚值为0表示命令æˆåŠŸ + 完æˆï¼ˆå¹¶ä¸”所有数æ®ï¼ˆå¦‚果有)已æˆåŠŸåœ¨ä¸»æœºä¸ŽSCSI + ç›®æ ‡è®¾å¤‡ä¹‹é—´å®Œæˆä¼ 输)。“resultâ€æ˜¯ä¸€ä¸ª32使— 符 + å·æ•´æ•°ï¼Œå¯ä»¥è§†ä¸º2个相关å—节。SCSI状æ€å€¼ä½äºŽæœ€ + 低有效ä½ã€‚请å‚考include/scsi/scsi.hä¸çš„ + status_byte()与host_byte()å®ä»¥åŠå…¶ç›¸å…³å¸¸é‡ã€‚ + sense_buffer + - 这是一个数组(最大长度为SCSI_SENSE_BUFFERSIZE + å—节),当SCSI状æ€ï¼ˆâ€œresultâ€çš„æœ€ä½Žæœ‰æ•ˆä½ï¼‰è®¾ä¸º + CHECK_CONDITION(2)时,该数组由LLD填写。若 + CHECK_CONDITION被置ä½ï¼Œä¸”sense_buffer[0]的高 + åŠå—节值为7,则ä¸é—´å±‚会认为sense_buffer数组 + åŒ…å«æœ‰æ•ˆçš„SCSI感知数æ®ï¼›å¦åˆ™ï¼Œä¸é—´å±‚会å‘é€ + REQUEST_SENSE SCSI命令æ¥èŽ·å–æ„ŸçŸ¥æ•°æ®ã€‚由于命令 + 排队的å˜åœ¨ï¼ŒåŽä¸€ç§æ–¹å¼å®¹æ˜“å‡ºé”™ï¼Œå› æ¤å»ºè®®LLD始终 + 支æŒâ€œè‡ªåŠ¨æ„ŸçŸ¥â€ã€‚ + device + - 指å‘与该命令关è”çš„scsi_device对象的指针。 + resid_len (通过调用scsi_set_resid() / scsi_get_resid()访问) + - LLDåº”å°†æ¤æ— ç¬¦å·æ•´æ•°è®¾ç½®ä¸ºè¯·æ±‚çš„ä¼ è¾“é•¿åº¦ï¼ˆå³ + “request_bufflenâ€ï¼‰å‡åŽ»å®žé™…ä¼ è¾“çš„å—节数。“resid_len†+ 默认设置为0ï¼Œå› æ¤å¦‚æžœLLDæ— æ³•æ£€æµ‹åˆ°æ•°æ®æ¬ 载(ä¸èƒ½æŠ¥å‘Šæº¢å‡ºï¼‰ï¼Œ + 则å¯ä»¥å¿½ç•¥å®ƒã€‚LLD应在调用“doneâ€ä¹‹å‰è®¾ç½® + “resid_lenâ€ã€‚ + underflow + - å¦‚æžœå®žé™…ä¼ è¾“çš„å—节数å°äºŽè¯¥å—段值,LLD应将 + DID_ERROR << 16赋值给“resultâ€ã€‚å¹¶éžæ‰€æœ‰ + LLD都实现æ¤é¡¹æ£€æŸ¥ï¼Œéƒ¨åˆ†LLD仅将错误信æ¯è¾“出 + åˆ°æ—¥å¿—ï¼Œè€ŒæœªçœŸæ£æŠ¥å‘ŠDID_ERROR。更推è + çš„åšæ³•是由LLD实现“resid_lenâ€çš„æ”¯æŒã€‚ + +建议LLD在从SCSIç›®æ ‡è®¾å¤‡è¿›è¡Œæ•°æ®ä¼ 输时设置“resid_lenâ€å—段 +(例如READæ“作)。当这些数æ®ä¼ è¾“çš„æ„ŸçŸ¥ç æ˜¯MEDIUM ERROR或 +HARDWARE ERROR(有时也包括RECOVERED ERROR)时设置 +resid_len尤为é‡è¦ã€‚åœ¨è¿™ç§æƒ…况下,如果LLDæ— æ³•ç¡®å®šæŽ¥æ”¶äº†å¤š +å°‘æ•°æ®ï¼Œé‚£ä¹ˆæœ€å®‰å…¨çš„åšæ³•是表示没有接收到任何数æ®ã€‚例如: +为了表明没有接收到任何有效数æ®ï¼ŒLLDå¯ä»¥ä½¿ç”¨å¦‚下辅助函数:: + + scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); + +å…¶ä¸SCpnt是一个指å‘scsi_cmnd对象的指针。如果表示仅接收到 +三个512å—节的数æ®å—,å¯ä»¥è¿™æ ·è®¾ç½®resid_len:: + + scsi_set_resid(SCpnt, scsi_bufflen(SCpnt) - (3 * 512)); + +scsi_cmnd结构体定义在 include/scsi/scsi_cmnd.h文件ä¸ã€‚ + + +é” +=== +æ¯ä¸ªstruct Scsi_Host实例都有一个å为default_lock +的自旋é”(spin_lock),它在scsi_host_alloc()函数 +ä¸åˆå§‹åŒ–(该函数定义在hosts.c文件ä¸ï¼‰ã€‚在åŒä¸€ä¸ªå‡½æ•° +ä¸ï¼Œstruct Scsi_Host::host_lock指针会被åˆå§‹åŒ–为指 +å‘default_lock。æ¤åŽï¼ŒSCSIä¸é—´å±‚æ‰§è¡Œçš„åŠ +é”å’Œè§£é”æ“作都会使用host_lock指针。过去,驱动程åºå¯ +以é‡å†™host_lock指针,但现在ä¸å†å…è®¸è¿™æ ·åšã€‚ + + +自动感知 +======== +自动感知(Autosense或auto-sense)在SAM-2规范ä¸è¢«å®š +义为:当SCSI命令完æˆçжæ€ä¸ºCHECK CONDITION时,“自动 +将感知数æ®ï¼ˆsense data)返回给应用程åºå®¢æˆ·ç«¯â€ã€‚底层 +驱动(LLD)应当执行自动感知。当LLD检测到 +CHECK CONDITIONçŠ¶æ€æ—¶ï¼Œå¯é€šè¿‡ä»¥ä¸‹ä»»ä¸€æ–¹å¼å®Œæˆï¼š + + a) è¦æ±‚SCSIå议(例如SCSI并行接å£ï¼ˆSPIï¼‰ï¼‰åœ¨æ¤ + ç±»å“åº”ä¸æ‰§è¡Œä¸€æ¬¡é¢å¤–的数æ®ä¼ 输 + + b) 或由LLD主动å‘èµ·REQUEST SENSEå‘½ä»¤èŽ·å–æ„ŸçŸ¥æ•°æ® + +æ— è®ºé‡‡ç”¨å“ªç§æ–¹å¼ï¼Œå½“检测到CHECK CONDITIONçŠ¶æ€æ—¶ï¼Œä¸ +间层通过检查结构体scsi_cmnd::sense_buffer[0]çš„å€¼æ¥ +判æ–LLD是å¦å·²æ‰§è¡Œè‡ªåŠ¨æ„ŸçŸ¥ã€‚è‹¥è¯¥å—节的高åŠå—节为7 +(或 0xf),则认为已执行自动感知;若该å—节为其他值 +(且æ¤å—èŠ‚åœ¨æ¯æ¡å‘½ä»¤æ‰§è¡Œå‰ä¼šè¢«åˆå§‹åŒ–为0),则ä¸é—´å±‚å°† +主动å‘èµ·REQUEST SENSE命令。 + +在å˜åœ¨å‘½ä»¤é˜Ÿåˆ—的场景下,ä¿å˜å¤±è´¥å‘½ä»¤æ„ŸçŸ¥æ•°æ®çš„“nexus†+å¯èƒ½ä¼šåœ¨ç‰å¾…REQUEST SENSE命令期间å˜å¾—ä¸åŒæ¥ã€‚å› æ¤ï¼Œ +最佳实践是由LLD执行自动感知。 + + +自Linuxå†…æ ¸2.4以æ¥çš„å˜æ›´ +======================== +io_request_lockå·²è¢«å¤šä¸ªç»†ç²’åº¦é”æ›¿ä»£ã€‚与底层驱动 +(LLDï¼‰ç›¸å…³çš„é”æ˜¯struct Scsi_Host::host_lockï¼Œä¸”æ¯ +个SCSI主机都独立拥有一个该é”。 + +æ—§çš„é”™è¯¯å¤„ç†æœºåˆ¶å·²ç»è¢«ç§»é™¤ã€‚è¿™æ„味ç€LLD的接å£å‡½æ•° +abort()与reset()å·²ç»è¢«åˆ 除。 +struct scsi_host_template::use_new_eh_codeæ ‡å¿— +也已ç»è¢«ç§»é™¤ã€‚ + +在Linuxå†…æ ¸2.4ä¸ï¼ŒSCSIå系统的é…ç½®æè¿°ä¸Žå…¶ä»–Linuxåç³» +统的é…ç½®æè¿°é›†ä¸å˜æ”¾åœ¨Documentation/Configure.help +文件ä¸ã€‚在Linuxå†…æ ¸2.6ä¸ï¼ŒSCSIå系统拥有独立的é…置文 +ä»¶drivers/scsi/Kconfig(体积更å°ï¼‰ï¼ŒåŒæ—¶åŒ…å«é…ç½®ä¿¡æ¯ +与帮助信æ¯ã€‚ + +struct SHTå·²é‡å‘½å为struct scsi_host_template。 + +æ–°å¢žâ€œçƒæ’æ‹”åˆå§‹åŒ–模型â€ä»¥åŠè®¸å¤šç”¨äºŽæ”¯æŒè¯¥åŠŸèƒ½çš„é¢å¤–函数。 + + +致谢 +==== +以下人员对本文档åšå‡ºäº†è´¡çŒ®ï¼š + + - Mike Anderson <andmike at us dot ibm dot com> + - James Bottomley <James dot Bottomley at hansenpartnership dot com> + - Patrick Mansfield <patmans at us dot ibm dot com> + - Christoph Hellwig <hch at infradead dot org> + - Doug Ledford <dledford at redhat dot com> + - Andries Brouwer <Andries dot Brouwer at cwi dot nl> + - Randy Dunlap <rdunlap at xenotime dot net> + - Alan Stern <stern at rowland dot harvard dot edu> + + +Douglas Gilbert +dgilbert at interlog dot com + +2004å¹´9月21æ—¥ diff --git a/Documentation/translations/zh_CN/scsi/sd-parameters.rst b/Documentation/translations/zh_CN/scsi/sd-parameters.rst new file mode 100644 index 000000000000..b3d0445dc9f3 --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/sd-parameters.rst @@ -0,0 +1,38 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/sd-parameters.rst + +:翻译: + + éƒæ ‹æ ‹ doubled <doubled@leap-io-kernel.com> + +:æ ¡è¯‘: + + + +============================ +Linux SCSIç£ç›˜é©±åŠ¨ï¼ˆsdï¼‰å‚æ•° +============================ + +缓å˜ç±»åž‹ï¼ˆè¯»/写) +------------------ +å¯ç”¨/ç¦ç”¨é©±åŠ¨å™¨è¯»å†™ç¼“å˜ã€‚ + +=========================== ===== ===== ======= ======= + 缓å˜ç±»åž‹å—符串 WCE RCD å†™ç¼“å˜ è¯»ç¼“å˜ +=========================== ===== ===== ======= ======= + write through 0 0 å…³é— å¼€å¯ + none 0 1 å…³é— å…³é— + write back 1 0 å¼€å¯ å¼€å¯ + write back, no read (daft) 1 1 å¼€å¯ å…³é— +=========================== ===== ===== ======= ======= + +将缓å˜ç±»åž‹è®¾ç½®ä¸ºâ€œwrite backâ€å¹¶å°†è¯¥è®¾ç½®ä¿å˜åˆ°é©±åЍ噍:: + + # echo "write back" > cache_type + +如果è¦ä¿®æ”¹ç¼“å˜æ¨¡å¼ä½†ä¸ä½¿æ›´æ”¹æŒä¹…化,å¯åœ¨ç¼“å˜ç±»åž‹å—ç¬¦ä¸²å‰ +æ·»åŠ â€œtemporary â€ã€‚例如:: + + # echo "temporary write back" > cache_type diff --git a/Documentation/translations/zh_CN/scsi/wd719x.rst b/Documentation/translations/zh_CN/scsi/wd719x.rst new file mode 100644 index 000000000000..79757c42032b --- /dev/null +++ b/Documentation/translations/zh_CN/scsi/wd719x.rst @@ -0,0 +1,35 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/scsi/libsas.rst + +:翻译: + + å¼ é’°æ° Yujie Zhang <yjzhang@leap-io-kernel.com> + +:æ ¡è¯‘: + +==================================================== +Western Digital WD7193, WD7197 å’Œ WD7296 SCSI å¡é©±åЍ +==================================================== + +这些å¡éœ€è¦åŠ è½½å›ºä»¶ã€‚å›ºä»¶å¯ä»Ž WD æä¾›ä¸‹è½½çš„ Windows NT 驱动程 +åºä¸æå–。地å€å¦‚下: + +http://support.wdc.com/product/download.asp?groupid=801&sid=27&lang=en + +该文件或网页上都未包å«ä»»ä½•许å¯å£°æ˜Žï¼Œå› æ¤è¯¥å›ºä»¶å¯èƒ½æ— 法被收录到 +linux-firmware 项目ä¸ã€‚ + +æä¾›çš„脚本å¯ç”¨äºŽä¸‹è½½å¹¶æå–å›ºä»¶ï¼Œç”Ÿæˆ wd719x-risc.bin å’Œ +wd719x-wcs.bin 文件。请将它们放置在 /lib/firmware/ 目录下。 +脚本内容如下: + + #!/bin/sh + wget http://support.wdc.com/download/archive/pciscsi.exe + lha xi pciscsi.exe pci-scsi.exe + lha xi pci-scsi.exe nt/wd7296a.sys + rm pci-scsi.exe + dd if=wd7296a.sys of=wd719x-risc.bin bs=1 skip=5760 count=14336 + dd if=wd7296a.sys of=wd719x-wcs.bin bs=1 skip=20096 count=514 + rm wd7296a.sys diff --git a/Documentation/translations/zh_CN/security/SCTP.rst b/Documentation/translations/zh_CN/security/SCTP.rst new file mode 100644 index 000000000000..f2774b0d66b5 --- /dev/null +++ b/Documentation/translations/zh_CN/security/SCTP.rst @@ -0,0 +1,317 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/security/SCTP.rst + +:翻译: + 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> + +==== +SCTP +==== + +SCTPçš„LSMæ”¯æŒ +============= + +安全钩å +-------- + +å¯¹äºŽå®‰å…¨æ¨¡å—æ”¯æŒï¼Œå·²ç»å®žçŽ°äº†ä¸‰ä¸ªç‰¹å®šäºŽSCTP的钩å:: + + security_sctp_assoc_request() + security_sctp_bind_connect() + security_sctp_sk_clone() + security_sctp_assoc_established() + +这些钩å的用法在下é¢çš„ `SCTPçš„SELinux支æŒ`_ ä¸€ç« ä¸æè¿°SELinux的实现。 + + +security_sctp_assoc_request() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +将关è”INITæ•°æ®åŒ…çš„ ``@asoc`` å’Œ ``@chunk->skb`` ä¼ é€’ç»™å®‰å…¨æ¨¡å—。 +æˆåŠŸæ—¶è¿”å›ž 0,失败时返回错误。 +:: + + @asoc - 指å‘sctpå…³è”结构的指针。 + @skb - 指å‘包å«å…³è”æ•°æ®åŒ…skbuff的指针。 + + +security_sctp_bind_connect() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +将一个或多个IPv4/IPv6地å€ä¼ 递给安全模å—进行基于 ``@optname`` 的验è¯ï¼Œ +这将导致是绑定还是连接æœåŠ¡ï¼Œå¦‚ä¸‹é¢çš„æƒé™æ£€æŸ¥è¡¨æ‰€ç¤ºã€‚æˆåŠŸæ—¶è¿”å›ž 0,失败 +时返回错误。 +:: + + @sk - 指å‘sock结构的指针。 + @optname - 需è¦éªŒè¯çš„选项å称。 + @address - 一个或多个IPv4 / IPv6地å€ã€‚ + @addrlen - 地å€çš„æ€»é•¿åº¦ã€‚使用sizeof(struct sockaddr_in)或 + sizeof(struct sockaddr_in6)æ¥è®¡ç®—æ¯ä¸ªipv4或ipv6地å€ã€‚ + + ------------------------------------------------------------------ + | BIND 类型检查 | + | @optname | @address contains | + |----------------------------|-----------------------------------| + | SCTP_SOCKOPT_BINDX_ADD | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_PRIMARY_ADDR | å•个 ipv4 or ipv6 åœ°å€ | + | SCTP_SET_PEER_PRIMARY_ADDR | å•个 ipv4 or ipv6 åœ°å€ | + ------------------------------------------------------------------ + + ------------------------------------------------------------------ + | CONNECT 类型检查 | + | @optname | @address contains | + |----------------------------|-----------------------------------| + | SCTP_SOCKOPT_CONNECTX | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_PARAM_ADD_IP | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_SENDMSG_CONNECT | å•个 ipv4 or ipv6 åœ°å€ | + | SCTP_PARAM_SET_PRIMARY | å•个 ipv4 or ipv6 åœ°å€ | + ------------------------------------------------------------------ + +æ¡ç›® ``@optname`` 的摘è¦å¦‚下:: + + SCTP_SOCKOPT_BINDX_ADD - å…许在(å¯é€‰åœ°ï¼‰è°ƒç”¨ bind(3) åŽï¼Œå…³è”é¢å¤– + 的绑定地å€ã€‚ + sctp_bindx(3) 用于在套接å—ä¸Šæ·»åŠ ä¸€ç»„ç»‘å®šåœ°å€ã€‚ + + SCTP_SOCKOPT_CONNECTX - å…许分é…多个地å€ä»¥è¿žæŽ¥åˆ°å¯¹ç«¯ï¼ˆå¤šå®¿ä¸»ï¼‰ã€‚ + sctp_connectx(3) ä½¿ç”¨å¤šä¸ªç›®æ ‡åœ°å€åœ¨SCTP + 套接å—上å‘起连接。 + + SCTP_SENDMSG_CONNECT - 通过sendmsg(2)或sctp_sendmsg(3)在新关è”上 + å‘起连接。 + + SCTP_PRIMARY_ADDR - 设置本地主地å€ã€‚ + + SCTP_SET_PEER_PRIMARY_ADDR - 请求远程对端将æŸä¸ªåœ°å€è®¾ç½®ä¸ºå…¶ä¸»åœ°å€ã€‚ + + SCTP_PARAM_ADD_IP - 在å¯ç”¨åЍæ€åœ°å€é‡é…置时使用。 + SCTP_PARAM_SET_PRIMARY - 如下所述,å¯ç”¨é‡æ–°é…置功能。 + + +为了支æŒåЍæ€åœ°å€é‡æ–°é…置,必须在两个端点上å¯ç”¨ä»¥ä¸‹ +傿•°ï¼ˆæˆ–使用适当的 **setsockopt**\(2)):: + + /proc/sys/net/sctp/addip_enable + /proc/sys/net/sctp/addip_noauth_enable + +当相应的 ``@optname`` å˜åœ¨æ—¶ï¼Œä»¥ä¸‹çš„ *_PARAM_* 傿•°ä¼š +通过ASCONFå—å‘é€åˆ°å¯¹ç«¯:: + + @optname ASCONF Parameter + ---------- ------------------ + SCTP_SOCKOPT_BINDX_ADD -> SCTP_PARAM_ADD_IP + SCTP_SET_PEER_PRIMARY_ADDR -> SCTP_PARAM_SET_PRIMARY + + +security_sctp_sk_clone() +~~~~~~~~~~~~~~~~~~~~~~~~ +æ¯å½“通过 **accept**\(2)创建一个新的套接å—(å³TCP类型的套接å—),或者当 +一个套接å—被‘剥离’时如用户空间调用 **sctp_peeloff**\(3),会调用æ¤å‡½æ•°ã€‚ +:: + + @asoc - 指å‘当å‰sctpå…³è”结构的指针。 + @sk - 指å‘当å‰å¥—接å—结构的指针。 + @newsk - æŒ‡å‘æ–°çš„套接å—结构的指针。 + + +security_sctp_assoc_established() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +当收到COOKIE ACK时调用,对于客户端,对端的secid将被ä¿å˜ +到 ``@asoc->peer_secid`` ä¸:: + + @asoc - 指å‘sctpå…³è”结构的指针。 + @skb - 指å‘COOKIE ACKæ•°æ®åŒ…çš„skbuff指针。 + + +用于关è”建立的安全钩å +---------------------- + +ä¸‹å›¾å±•ç¤ºäº†åœ¨å»ºç«‹å…³è”æ—¶ ``security_sctp_bind_connect()``〠``security_sctp_assoc_request()`` +å’Œ ``security_sctp_assoc_established()`` 的使用。 +:: + + SCTP 端点 "A" SCTP 端点 "Z" + ============= ============= + sctp_sf_do_prm_asoc() + å…³è”的设置å¯ä»¥é€šè¿‡connect(2), + sctp_connectx(3),sendmsg(2) + or sctp_sendmsg(3)æ¥å‘起。 + 这将导致调用security_sctp_bind_connect() + å‘起与SCTP对端端点"Z"的关è”。 + INIT ---------------------------------------------> + sctp_sf_do_5_1B_init() + å“应一个INITæ•°æ®å—。 + SCTP对端端点"A"æ£åœ¨è¯·æ±‚一个临时关è”。 + 如果是首次关è”,调用security_sctp_assoc_request() + æ¥è®¾ç½®å¯¹ç‰æ–¹æ ‡ç¾ã€‚ + å¦‚æžœä¸æ˜¯é¦–次关è”,检查是å¦è¢«å…许。 + 如果å…许,则å‘é€: + <----------------------------------------------- INIT ACK + | + | å¦åˆ™ï¼Œç”Ÿæˆå®¡è®¡äº‹ä»¶å¹¶é»˜é»˜ä¸¢å¼ƒè¯¥æ•°æ®åŒ…。 + | + COOKIE ECHO ------------------------------------------> + sctp_sf_do_5_1D_ce() + å“应一个COOKIE ECHOæ•°æ®å—。 + 确认该cookie并创建一个永久关è”。 + 调用security_sctp_assoc_request() + 执行与INITæ•°æ®å—å“应相åŒçš„æ“ä½œã€‚ + <------------------------------------------- COOKIE ACK + | | + sctp_sf_do_5_1E_ca | + 调用security_sctp_assoc_established() | + æ¥è®¾ç½®å¯¹æ–¹æ ‡ç¾ | + | | + | 如果是SCTP_SOCKET_TCP或是剥离的套接 + | å—,会调用 security_sctp_sk_clone() + | æ¥å…‹éš†æ–°çš„套接å—。 + | | + 建立 建立 + | | + ------------------------------------------------------------------ + | å…³è”建立 | + ------------------------------------------------------------------ + + +SCTPçš„SELinuxæ”¯æŒ +================= + +安全钩å +-------- + +上é¢çš„ `SCTPçš„LSM支æŒ`_ ç« èŠ‚æè¿°äº†ä»¥ä¸‹SCTP安全钩å,SELinux的细节 +说明如下:: + + security_sctp_assoc_request() + security_sctp_bind_connect() + security_sctp_sk_clone() + security_sctp_assoc_established() + + +security_sctp_assoc_request() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +将关è”INITæ•°æ®åŒ…çš„ ``@asoc`` å’Œ ``@chunk->skb`` ä¼ é€’ç»™å®‰å…¨æ¨¡å—。 +æˆåŠŸæ—¶è¿”å›ž 0,失败时返回错误。 +:: + + @asoc - 指å‘sctpå…³è”结构的指针。 + @skb - 指å‘å…³è”æ•°æ®åŒ…skbuff的指针。 + +å®‰å…¨æ¨¡å—æ‰§è¡Œä»¥ä¸‹æ“作: + 如果这是 ``@asoc->base.sk`` 上的首次关è”,则将对端的sid设置 + 为 ``@skb`` ä¸çš„值。这将确ä¿åªæœ‰ä¸€ä¸ªå¯¹ç«¯sid分é…ç»™å¯èƒ½æ”¯æŒå¤šä¸ª + å…³è”çš„ ``@asoc->base.sk``。 + + å¦åˆ™éªŒè¯ ``@asoc->base.sk peer sid`` 是å¦ä¸Ž ``@skb peer sid`` + 匹é…ï¼Œä»¥ç¡®å®šè¯¥å…³è”æ˜¯å¦åº”被å…许或拒ç»ã€‚ + + å°†sctpçš„ ``@asoc sid`` 设置为套接å—çš„sid(æ¥è‡ª ``asoc->base.sk``) + 并从 ``@skb peer sid`` 䏿å–MLS部分。这将在SCTPçš„TCP类型套接å—åŠ + 剥离连接ä¸ä½¿ç”¨ï¼Œå› 为它们会导致生æˆä¸€ä¸ªæ–°çš„套接å—。 + + 如果é…置了IP安全选项(CIPSO/CALIPSO),则会在套接å—上设置IP选项。 + + +security_sctp_bind_connect() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +æ ¹æ® ``@optname`` 检查ipv4/ipv6åœ°å€æ‰€éœ€çš„æƒé™ï¼Œå…·ä½“如下:: + + ------------------------------------------------------------------ + | BIND æƒé™æ£€æŸ¥ | + | @optname | @address contains | + |----------------------------|-----------------------------------| + | SCTP_SOCKOPT_BINDX_ADD | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_PRIMARY_ADDR | å•个 ipv4 or ipv6 åœ°å€ | + | SCTP_SET_PEER_PRIMARY_ADDR | å•个 ipv4 or ipv6 åœ°å€ | + ------------------------------------------------------------------ + + ------------------------------------------------------------------ + | CONNECT æƒé™æ£€æŸ¥ | + | @optname | @address contains | + |----------------------------|-----------------------------------| + | SCTP_SOCKOPT_CONNECTX | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_PARAM_ADD_IP | 一个或多个 ipv4 / ipv6 åœ°å€ | + | SCTP_SENDMSG_CONNECT | å•个 ipv4 or ipv6 åœ°å€ | + | SCTP_PARAM_SET_PRIMARY | å•个 ipv4 or ipv6 åœ°å€ | + ------------------------------------------------------------------ + + +`SCTPçš„LSM支æŒ`_ æä¾›äº† ``@optname`` 摘è¦ï¼Œå¹¶ä¸”还æè¿°äº†å½“å¯ç”¨åЍæ€åœ°å€é‡æ–° +é…置时,ASCONFå—的处ç†è¿‡ç¨‹ã€‚ + + +security_sctp_sk_clone() +~~~~~~~~~~~~~~~~~~~~~~~~ +æ¯å½“通过 **accept**\(2)(å³TCP类型的套接å—)创建一个新的套接å—,或者 +当一个套接å—被“剥离â€å¦‚用户空间调用 **sctp_peeloff**\(3)时, +``security_sctp_sk_clone()`` 将会分别将新套接å—çš„sid和对端sid设置为 +``@asoc sid`` å’Œ ``@asoc peer sid`` ä¸åŒ…å«çš„值。 +:: + + @asoc - 指å‘当å‰sctpå…³è”结构的指针。 + @sk - 指å‘当å‰sock结构的指针。 + @newsk - æŒ‡å‘æ–°sock结构的指针。 + + +security_sctp_assoc_established() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +当接收到COOKIE ACK时调用,它将连接的对端sid设置为 ``@skb`` ä¸çš„值:: + + @asoc - 指å‘sctpå…³è”结构的指针。 + @skb - 指å‘COOKIE ACK包skbuff的指针。 + + +ç–略声明 +-------- +以下支æŒSCTP的类和æƒé™åœ¨å†…æ ¸ä¸æ˜¯å¯ç”¨çš„:: + + class sctp_socket inherits socket { node_bind } + +当å¯ç”¨ä»¥ä¸‹ç–略功能时:: + + policycap extended_socket_class; + +SELinux对SCTPçš„æ”¯æŒæ·»åŠ äº†ç”¨äºŽè¿žæŽ¥ç‰¹å®šç«¯å£ç±»åž‹ ``name_connect`` æƒé™ +以åŠåœ¨ä¸‹é¢çš„ç« èŠ‚ä¸è¿›è¡Œè§£é‡Šçš„ ``association`` æƒé™ã€‚ + +如果用户空间工具已更新,SCTP将支æŒå¦‚下所示的 ``portcon`` 声明:: + + portcon sctp 1024-1036 system_u:object_r:sctp_ports_t:s0 + + +SCTPå¯¹ç«¯æ ‡ç¾ +------------ +æ¯ä¸ªSCTP套接å—仅分é…ä¸€ä¸ªå¯¹ç«¯æ ‡ç¾ã€‚è¿™ä¸ªæ ‡ç¾å°†åœ¨å»ºç«‹ç¬¬ä¸€ä¸ªå…³è”时分é…。 +任何åŽç»åœ¨è¯¥å¥—接å—上的关è”都会将它们的数æ®åŒ…å¯¹ç«¯æ ‡ç¾ä¸Žå¥—接å—çš„å¯¹ç«¯æ ‡ +ç¾è¿›è¡Œæ¯”è¾ƒï¼Œåªæœ‰åœ¨å®ƒä»¬ä¸åŒçš„æƒ…况下 ``association`` æƒé™æ‰ä¼šè¢«éªŒè¯ã€‚ +这是通过检查套接å—的对端sid与接收到的数æ®åŒ…ä¸çš„对端sidæ¥éªŒè¯çš„,以决 +定是å¦å…许或拒ç»è¯¥å…³è”。 + +注: + 1) å¦‚æžœå¯¹ç«¯æ ‡ç¾æœªå¯ç”¨ï¼Œåˆ™å¯¹ç«¯ä¸Šä¸‹æ–‡å°†å§‹ç»ˆæ˜¯ ``SECINITSID_UNLABELED`` + (在ç–略声明ä¸ä¸º ``unlabeled_t`` )。 + + 2) 由于SCTPå¯ä»¥åœ¨å•个套接å—ä¸Šæ”¯æŒæ¯ä¸ªç«¯ç‚¹ï¼ˆå¤šå®¿ä¸»ï¼‰çš„å¤šä¸ªä¼ è¾“åœ°å€ï¼Œå› æ¤ + å¯ä»¥é…ç½®ç–略和NetLabel为æ¯ä¸ªç«¯ç‚¹æä¾›ä¸åŒçš„å¯¹ç«¯æ ‡ç¾ã€‚由于套接å—的对端 + æ ‡ç¾æ˜¯ç”±ç¬¬ä¸€ä¸ªå…³è”çš„ä¼ è¾“åœ°å€å†³å®šçš„ï¼Œå› æ¤å»ºè®®æ‰€æœ‰çš„å¯¹ç«¯æ ‡ç¾ä¿æŒä¸€è‡´ã€‚ + + 3) 用户空间å¯ä»¥ä½¿ç”¨ **getpeercon**\(3) æ¥æ£€ç´¢å¥—接å—的对端上下文。 + + 4) è™½ç„¶è¿™ä¸æ˜¯SCTP特有的,但在使用NetLabelæ—¶è¦æ³¨æ„ï¼Œå¦‚æžœæ ‡ç¾åˆ†é…给特定的接 + å£ï¼Œè€Œè¯¥æŽ¥å£â€˜goes down’,则NetLabelæœåŠ¡ä¼šç§»é™¤è¯¥æ¡ç›®ã€‚å› æ¤ï¼Œè¯·ç¡®ä¿ç½‘ç»œå¯ + 动脚本调用 **netlabelctl**\(8) æ¥è®¾ç½®æ‰€éœ€çš„æ ‡ç¾ï¼ˆè¯¦ç»†ä¿¡æ¯ï¼Œ + 请å‚阅 **netlabel-config**\(8) 辅助脚本)。 + + 5) NetLabel SCTPå¯¹ç«¯æ ‡ç¾è§„åˆ™åº”ç”¨å¦‚ä¸‹æ‰€è¿°æ ‡ç¾ä¸ºâ€œnetlabelâ€çš„一组帖å: + https://www.paul-moore.com/blog/t. + + 6) CIPSO仅支æŒIPv4地å€ï¼š ``socket(AF_INET, ...)`` + CALIPSO仅支æŒIPv6地å€ï¼š ``socket(AF_INET6, ...)`` + + 测试CIPSO/CALIPSO时请注æ„以下事项: + a) 如果SCTPæ•°æ®åŒ…ç”±äºŽæ— æ•ˆæ ‡ç¾æ— 法é€è¾¾ï¼ŒCIPSO会å‘é€ä¸€ä¸ªICMP包。 + b) CALIPSOä¸ä¼šå‘é€ICMP包,åªä¼šé»˜é»˜ä¸¢å¼ƒæ•°æ®åŒ…。 + + 7) RFC 3554䏿”¯æŒIPSEC —— SCTP/IPSEC支æŒå°šæœªåœ¨ç”¨æˆ·ç©ºé—´å®žçް(**racoon**\(8) + 或 **ipsec_pluto**\(8))ï¼Œå°½ç®¡å†…æ ¸æ”¯æŒ SCTP/IPSEC。 diff --git a/Documentation/translations/zh_CN/security/index.rst b/Documentation/translations/zh_CN/security/index.rst index 78d9d4b36dca..d33b107405c7 100644 --- a/Documentation/translations/zh_CN/security/index.rst +++ b/Documentation/translations/zh_CN/security/index.rst @@ -18,7 +18,9 @@ credentials snp-tdx-threat-model lsm + lsm-development sak + SCTP self-protection siphash tpm/index @@ -28,7 +30,5 @@ TODOLIST: * IMA-templates * keys/index -* lsm-development -* SCTP * secrets/index * ipe diff --git a/Documentation/translations/zh_CN/security/ipe.rst b/Documentation/translations/zh_CN/security/ipe.rst new file mode 100644 index 000000000000..55968f0c7ae3 --- /dev/null +++ b/Documentation/translations/zh_CN/security/ipe.rst @@ -0,0 +1,398 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/security/sak.rst + +:翻译: + 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> + +完整性ç–略执行(IPE)-å†…æ ¸æ–‡æ¡£ +============================== + +.. NOTE:: + + 这是针对开å‘äººå‘˜è€Œä¸æ˜¯ç®¡ç†å‘˜çš„æ–‡æ¡£ã€‚如果您æ£åœ¨ + 寻找有关IPE使用的文档,请å‚阅 :doc:`IPE admin + guide </admin-guide/LSM/ipe>`。 + +历å²èƒŒæ™¯ +-------- + +最åˆä¿ƒä½¿IPEå®žæ–½çš„åŽŸå› ï¼Œæ˜¯éœ€è¦åˆ›å»ºä¸€ä¸ªé”定å¼ç³»ç»Ÿã€‚该系统将 +ä»Žä¸€å¼€å§‹å°±å…·å¤‡å®‰å…¨æ€§ï¼Œå¹¶ä¸”åœ¨å¯æ‰§è¡Œä»£ç 和系统功能关键的特定 +æ•°æ®æ–‡ä»¶ä¸Šï¼Œæä¾›å¼ºæœ‰åŠ›çš„å®Œæ•´æ€§ä¿éšœã€‚åªæœ‰å½“è¿™äº›ç‰¹å®šæ•°æ®æ–‡ä»¶ +符åˆå®Œæ•´æ€§ç–略时,它们æ‰å¯ä»¥è¢«è¯»å–。系统ä¸è¿˜å°†å˜åœ¨å¼ºåˆ¶è®¿é—® +æŽ§åˆ¶æœºåˆ¶ï¼Œå› æ¤æ‰©å±•属性(xattrs)也必须å—åˆ°ä¿æŠ¤ã€‚è¿™å°±å¼•å‡ºäº† +需è¦é€‰æ‹©èƒ½å¤Ÿæä¾›å®Œæ•´æ€§ä¿è¯çš„æœºåˆ¶ã€‚当时,有两ç§ä¸»è¦æœºåˆ¶è¢«è€ƒ +è™‘ï¼Œç”¨ä»¥åœ¨æ»¡è¶³è¿™äº›è¦æ±‚çš„å‰æä¸‹ä¿è¯ç³»ç»Ÿå®Œæ•´æ€§ï¼š + + 1. IMA + EVM Signatures + 2. DM-Verity + +这两个选项都ç»è¿‡äº†ä»”细考虑,然而在原始的IPE使用场景 +ä¸ï¼Œæœ€ç»ˆé€‰æ‹©DM-Verity而éžIMA+EVM作为完整性机制,主 +è¦æœ‰ä¸‰ä¸ªåŽŸå› ï¼š + + 1. 防护é¢å¤–的攻击途径 + + * 使用IMA+EVMæ—¶ï¼Œå¦‚æžœæ²¡æœ‰åŠ å¯†è§£å†³æ–¹æ¡ˆï¼Œç³»ç»Ÿå¾ˆå®¹æ˜“å—到 + ç¦»çº¿æ”»å‡»ï¼Œç‰¹åˆ«æ˜¯é’ˆå¯¹ä¸Šè¿°ç‰¹å®šæ•°æ®æ–‡ä»¶çš„æ”»å‡»ã€‚ + + ä¸Žå¯æ‰§è¡Œæ–‡ä»¶ä¸åŒï¼Œè¯»å–æ“作(如对å—ä¿æŠ¤æ•°æ®æ–‡ä»¶çš„读 + å–æ“ä½œï¼‰æ— æ³•å¼ºåˆ¶æ€§è¿›è¡Œå…¨å±€å®Œæ•´æ€§éªŒè¯ã€‚è¿™æ„味ç€å¿…é¡» + 有一ç§é€‰æ‹©æœºåˆ¶æ¥å†³å®šæ˜¯å¦åº”对æŸä¸ªè¯»å–æ“作实施完整性 + ç–略。 + + åœ¨å½“æ—¶ï¼Œè¿™æ˜¯é€šè¿‡å¼ºåˆ¶è®¿é—®æŽ§åˆ¶æ ‡ç¾æ¥å®žçŽ°çš„ï¼ŒIMAç–略会 + æŒ‡å®šå“ªäº›æ ‡ç¾éœ€è¦è¿›è¡Œå®Œæ•´æ€§éªŒè¯ï¼Œè¿™å¸¦æ¥äº†ä¸€ä¸ªé—®é¢˜ï¼š + EVM虽然å¯ä»¥ä¿æŠ¤æ ‡ç¾ï¼Œä½†å¦‚果攻击者离线修改文件系统, + 那么攻击者就å¯ä»¥æ¸…除所有的扩展属性(xattrs)——包括 + 用于确定文件是å¦åº”å—完整性ç–略约æŸçš„SELinuxæ ‡ç¾ã€‚ + + 使用DM-Verity,由于xattrs被ä¿å˜ä¸ºMerkelæ ‘çš„ä¸€éƒ¨åˆ†ï¼Œ + 如果对由dm-verityä¿æŠ¤çš„æ–‡ä»¶ç³»ç»Ÿè¿›è¡Œäº†ç¦»çº¿æŒ‚è½½ï¼Œæ ¡éªŒ + 和将ä¸åœ¨åŒ¹é…ï¼Œæ–‡ä»¶å°†æ— æ³•è¯»å–。 + + * 由于用户空间的二进制文件在Linux䏿˜¯åˆ†é¡µåŠ è½½çš„ï¼Œdm- + verityåŒæ ·æä¾›äº†å¯¹æŠ—æ¶æ„å—设备的é¢å¤–ä¿æŠ¤ã€‚åœ¨è¿™æ ·çš„ + 攻击ä¸ï¼Œå—è®¾å¤‡æœ€åˆæŠ¥å‘Šé€‚å½“çš„å†…å®¹ä»¥ä¾›IMA哈希计算,通 + 过所需的完整性检查。然åŽï¼Œåœ¨è®¿é—®çœŸå®žæ•°æ®æ—¶å‘ç”Ÿçš„é¡µé¢ + 错误将报告攻击者的有效载è·ã€‚由于dm-verity会在页é¢é”™ + 误å‘生时检查数æ®ï¼ˆä»¥åŠç£ç›˜è®¿é—®ï¼‰ï¼Œå› æ¤è¿™ç§æ”»å‡»å¾—到了 + 缓解。 + + 2. 性能: + + * dm-verity在å—è¢«è¯»å–æ—¶æŒ‰éœ€æä¾›å®Œæ•´æ€§éªŒè¯ï¼Œè€Œä¸éœ€è¦å°†æ•´ + 个文件读入内å˜è¿›è¡ŒéªŒè¯ã€‚ + + 3. ç¾å的简化性: + + * ä¸éœ€è¦ä¸¤ä¸ªç¾å(IMA ç„¶åŽæ˜¯ EVM):一个ç¾åå¯ä»¥è¦†ç›–整个 + å—设备。 + * ç¾åå¯ä»¥å˜å‚¨åœ¨æ–‡ä»¶ç³»ç»Ÿå…ƒæ•°æ®ä¹‹å¤–。 + * 该ç¾å支æŒåŸºäºŽ x.509 çš„ç¾å基础设施。 + +ä¸‹ä¸€æ¥æ˜¯é€‰æ‹©ä¸€ä¸ªç–ç•¥æ¥æ‰§è¡Œå®Œæ•´æ€§éªŒè¯æœºåˆ¶ï¼Œè¯¥ç–略的最低 +è¦æ±‚是: + + 1. ç–略本身必须ç»è¿‡å®Œæ•´æ€§éªŒè¯ï¼ˆé˜²æ¢é’ˆå¯¹å®ƒçš„ç®€å•æ”»å‡»ï¼‰ã€‚ + 2. ç–略本身必须抵抗回滚攻击。 + 3. ç–ç•¥æ‰§è¡Œå¿…é¡»å…·æœ‰ç±»ä¼¼å®½æ¾æ¨¡å¼çš„功能。 + 4. ç–略必须能够在ä¸é‡å¯çš„æƒ…况下,完整地进行更新。 + 5. ç–ç•¥æ›´æ–°å¿…é¡»æ˜¯åŽŸåæ€§çš„。 + 6. ç–ç•¥å¿…é¡»æ”¯æŒæ’¤é”€å…ˆå‰åˆ›å»ºçš„组件。 + 7. ç–略必须在任何时间点都能进行审计。 + +当时,IMA作为唯一的完整性ç–略机制,被用æ¥ä¸Žè¿™äº›è¦æ±‚进行对比, +ä½†æœªèƒ½æ»¡è¶³æ‰€æœ‰æœ€ä½Žè¦æ±‚。尽管考虑过扩展IMAä»¥æ¶µç›–è¿™äº›è¦æ±‚,但 +æœ€ç»ˆå› ä¸¤ä¸ªåŽŸå› è¢«æ”¾å¼ƒï¼š + + 1. 回归风险;这其ä¸è®¸å¤šå˜æ›´å°†å¯¼è‡´å¯¹å·²ç»å˜åœ¨äºŽå†…æ ¸çš„IMA进行 + é‡å¤§ä»£ç æ›´æ”¹ï¼Œå› æ¤å¯èƒ½ä¼šå½±å“用户。 + + 2. IMA在该系统ä¸ç”¨äºŽæµ‹é‡å’Œè¯æ˜Žï¼›å°†æµ‹é‡ç–略与本地完整性ç–ç•¥ + 的执行分离被认为是有利的。 + +ç”±äºŽè¿™äº›åŽŸå› ï¼Œå†³å®šåˆ›å»ºä¸€ä¸ªæ–°çš„LSM,其èŒè´£æ˜¯ä»…é™äºŽæœ¬åœ°å®Œæ•´æ€§ +ç–略的执行。 + +èŒè´£å’ŒèŒƒå›´ +---------- + +IPEé¡¾åæ€ä¹‰ï¼Œæœ¬è´¨ä¸Šæ˜¯ä¸€ç§å®Œæ•´æ€§ç–略执行解决方案;IPEå¹¶ä¸å¼ºåˆ¶è§„定 +如何æä¾›å®Œæ•´æ€§ä¿éšœï¼Œè€Œæ˜¯å°†è¿™ä¸€å†³ç–æƒç•™ç»™ç³»ç»Ÿç®¡ç†å‘˜ï¼Œç®¡ç†å‘˜æ ¹æ®è‡ªèº« +需求,选择符åˆçš„æœºåˆ¶æ¥è®¾å®šå®‰å…¨æ ‡å‡†ã€‚å˜åœ¨å‡ ç§ä¸åŒçš„完整性解决方案, +它们æä¾›äº†ä¸åŒç¨‹åº¦çš„安全ä¿éšœï¼›è€ŒIPEå…许系统管ç†å‘˜ç†è®ºä¸Šä¸ºæ‰€æœ‰è¿™äº› +解决方案制定ç–略。 + +IPE自身没有内置确ä¿å®Œæ•´æ€§çš„固有机制。相å,在构建具备完整性ä¿éšœèƒ½åŠ› +的系统时,å˜åœ¨æ›´é«˜æ•ˆçš„分层方案å¯ä¾›ä½¿ç”¨ã€‚需è¦é‡ç‚¹æ³¨æ„çš„æ˜¯ï¼Œç”¨äºŽè¯æ˜Žå®Œ +整性的机制,与用于执行完整性声明的ç–略是相互独立的。 + +å› æ¤ï¼ŒIPE便®ä»¥ä¸‹æ–¹é¢è¿›è¡Œè®¾è®¡ï¼š + + 1. 便于与完整性æä¾›æœºåˆ¶é›†æˆã€‚ + 2. 便于平å°ç®¡ç†å‘˜/系统管ç†å‘˜ä½¿ç”¨ã€‚ + +设计ç†ç”±: +--------- + +IPE是在评估其他æ“作系统和环境ä¸çš„现有完整性ç–略解决方案åŽè®¾è®¡çš„。 +在对其他实现的调查ä¸ï¼Œå‘现了一些缺陷: + + 1. ç–ç•¥ä¸æ˜“为人们读å–,通常需è¦äºŒè¿›åˆ¶ä¸é—´æ ¼å¼ã€‚ + 2. 默认情况下会éšå¼é‡‡å–å•一的ã€ä¸å¯å®šåˆ¶çš„æ“ä½œã€‚ + 3. 调试ç–ç•¥éœ€è¦æ‰‹åЍæ¥ç¡®å®šè¿å了哪个规则。 + 4. 编写ç–略需è¦å¯¹æ›´å¤§ç³»ç»Ÿæˆ–æ“作系统有深入的了解。 + +IPEå°è¯•é¿å…所有这些缺陷。 + +ç–ç•¥ +~~~~ + +纯文本 +^^^^^^ + +IPEçš„ç–ç•¥æ˜¯çº¯æ–‡æœ¬æ ¼å¼çš„。相较于其他Linux安全模å—(LSM), +ç–略文件体积略大,但能解决其他平å°ä¸Šéƒ¨åˆ†å®Œæ•´æ€§ç–略方案å˜åœ¨ +çš„ä¸¤ä¸ªæ ¸å¿ƒé—®é¢˜ã€‚ + +第一个问题是代ç 维护和冗余的问题。为了编写ç–略,ç–略必须是 +以æŸç§å½¢å¼çš„å—符串形å¼å‘ˆçŽ°ï¼ˆæ— è®ºæ˜¯ XMLã€JSONã€YAML ç‰ç»“构化 +æ ¼å¼ï¼Œè¿˜æ˜¯å…¶ä»–å½¢å¼ï¼‰ï¼Œä»¥ä¾¿ç–略编写者能够ç†è§£æ‰€å†™å†…容。在å‡è®¾ +的二进制ç–略设计ä¸ï¼Œéœ€è¦ä¸€ä¸ªåºåˆ—化器将ç–略将å¯è¯»çš„å½¢å¼è½¬æ¢ä¸º +二进制形å¼ï¼ŒåŒæ—¶è¿˜éœ€è¦ä¸€ä¸ªååºåˆ—化器æ¥å°†äºŒè¿›åˆ¶å½¢å¼è½¬æ¢ä¸ºå†…æ ¸ +ä¸çš„æ•°æ®ç»“构。 + +最终,还需è¦å¦ä¸€ä¸ªååºåˆ—化器将是必è¦çš„,用于将二进制形å¼è½¬æ¢ +为人类å¯è¯»çš„å½¢å¼ï¼Œå¹¶å°½å¯èƒ½ä¿å˜æ‰€æœ‰ä¿¡æ¯ï¼Œè¿™æ˜¯å› 为使用æ¤è®¿é—®æŽ§ +åˆ¶ç³»ç»Ÿçš„ç”¨æˆ·å¿…é¡»ç»´æŠ¤ä¸€ä¸ªæ ¡éªŒè¡¨å’ŒåŽŸå§‹æ–‡ä»¶ï¼Œæ‰èƒ½ç†è§£å“ªäº›ç–略已 +ç»éƒ¨ç½²åœ¨è¯¥ç³»ç»Ÿä¸Šï¼Œå“ªäº›æ²¡æœ‰ã€‚对于å•个用户æ¥è¯´ï¼Œè¿™å¯èƒ½æ²¡é—®é¢˜ï¼Œ +å› ä¸ºæ—§çš„ç–ç•¥å¯ä»¥åœ¨æ›´æ–°ç”Ÿæ•ˆåŽå¾ˆå¿«è¢«ä¸¢å¼ƒã€‚ä½†å¯¹äºŽç®¡ç†æˆåƒä¸Šä¸‡ã€ +甚至数å万å°è®¡ç®—机的用户,且这些计算机有ä¸åŒçš„æ“ä½œç³»ç»Ÿå’Œä¸åŒ +çš„æ“作需求,这很快就æˆäº†ä¸€ä¸ªé—®é¢˜ï¼Œå› 为数年å‰çš„过时ç–ç•¥å¯èƒ½ä»ç„¶ +å˜åœ¨ï¼Œä»Žè€Œå¯¼è‡´éœ€è¦å¿«é€Ÿæ¢å¤ç–略或投资大é‡åŸºç¡€è®¾æ–½æ¥è·Ÿè¸ªæ¯ä¸ªç–ç•¥ +的内容。 + +有了这三个独立的åºåˆ—化器/ååºåˆ—åŒ–å™¨ï¼Œç»´æŠ¤æˆæœ¬éžå¸¸æ˜‚贵。如果ç–ç•¥ +é¿å…ä½¿ç”¨äºŒè¿›åˆ¶æ ¼å¼ï¼Œåˆ™åªéœ€è¦ä¸€ä¸ªåºåˆ—化器;将人类å¯è¯»çš„å½¢å¼è½¬æ¢ +ä¸ºå†…æ ¸ä¸çš„æ•°æ®ç»“构。从而节çœäº†ä»£ç ç»´æŠ¤æˆæœ¬ï¼Œå¹¶ä¿æŒäº†å¯æ“作性。 + +ç¬¬äºŒä¸ªå…³äºŽäºŒè¿›åˆ¶æ ¼å¼çš„é—®é¢˜æ˜¯é€æ˜Žæ€§ï¼Œç”±äºŽIPEæ ¹æ®ç³»ç»Ÿèµ„æºçš„å¯ä¿¡åº¦ +æ¥æŽ§åˆ¶è®¿é—®ï¼Œå› æ¤å…¶ç–略也必须å¯ä¿¡ï¼Œä»¥ä¾¿å¯ä»¥è¢«æ›´æ”¹ã€‚这是通过ç¾åæ¥ +完æˆçš„,这就需è¦ç¾å过程。ç¾åè¿‡ç¨‹é€šå¸¸å…·æœ‰å¾ˆé«˜çš„å®‰å…¨æ ‡å‡†ï¼Œå› ä¸º +任何被ç¾å的内容都å¯ä»¥è¢«ç”¨æ¥æ”»å‡»å®Œæ•´æ€§æ‰§è¡Œç³»ç»Ÿã€‚ç¾ç½²æ—¶ï¼Œç¾ç½²è€… +必须知é“他们在ç¾ç½²ä»€ä¹ˆï¼ŒäºŒè¿›åˆ¶ç–ç•¥å¯èƒ½ä¼šå¯¼è‡´è¿™ä¸€ç‚¹çš„æ¨¡ç³ŠåŒ–ï¼›ç¾ç½² +è€…çœ‹åˆ°çš„åªæ˜¯ä¸€ä¸ªä¸é€æ˜Žçš„二进制数æ®å—。å¦ä¸€æ–¹é¢ï¼Œå¯¹äºŽçº¯æ–‡æœ¬ç–ç•¥ä¸ï¼Œ +ç¾ç½²è€…看到的则是实际æäº¤çš„ç–略。 + +å¯åЍç–ç•¥ +~~~~~~~~ + +如果é…置得当,IPEèƒ½å¤Ÿåœ¨å†…æ ¸å¯åŠ¨å¹¶è¿›å…¥ç”¨æˆ·æ¨¡å¼æ—¶ç«‹å³æ‰§è¡Œç–略。 +è¿™æ„味ç€éœ€è¦åœ¨ç”¨æˆ·æ¨¡å¼å¼€å§‹çš„那一刻就å˜å‚¨ä¸€å®šçš„ç–ç•¥ã€‚é€šå¸¸ï¼Œè¿™ç§ +å˜å‚¨å¯ä»¥é€šè¿‡ä¸€ä¸‹ä¸‰ç§æ–¹å¼ä¹‹ä¸€æ¥å¤„ç†ï¼š + + 1. ç–略文件å˜å‚¨åœ¨ç£ç›˜ä¸Šï¼Œå†…æ ¸åœ¨è¿›å…¥å¯èƒ½éœ€è¦åšå‡ºæ‰§è¡Œå†³ç–的代ç + 路径之å‰ï¼Œå…ˆåŠ è½½è¯¥ç–略。 + 2. ç–ç•¥æ–‡ä»¶ç”±å¼•å¯¼åŠ è½½ç¨‹åºä¼ é€’ç»™å†…æ ¸ï¼Œå†…æ ¸è§£æžè¿™äº›ç–略。 + 3. 将一个ç–ç•¥æ–‡ä»¶ç¼–è¯‘åˆ°å†…æ ¸ä¸ï¼Œå†…æ ¸åœ¨åˆå§‹åŒ–过程ä¸å¯¹å…¶è¿›è¡Œè§£æžå¹¶ + 执行。 + +ç¬¬ä¸€ç§æ–¹å¼å˜åœ¨é—®é¢˜ï¼šå†…æ ¸ä»Žç”¨æˆ·ç©ºé—´è¯»å–æ–‡ä»¶é€šå¸¸æ˜¯ä¸æŽ¨è的,并且在 +å†…æ ¸ä¸æžä¸ºç½•è§ã€‚ + +第二ç§é€‰é¡¹åŒæ ·å˜åœ¨é—®é¢˜ï¼šLinux在其整个生æ€ç³»ç»Ÿä¸æ”¯æŒå¤šç§å¼•å¯¼åŠ è½½ç¨‹åºï¼Œ +æ‰€æœ‰å¼•å¯¼åŠ è½½ç¨‹åºéƒ½å¿…须支æŒè¿™ç§æ–°æ–¹æ³•ï¼Œæˆ–è€…éœ€è¦æœ‰ä¸€ä¸ªç‹¬ç«‹çš„æ¥æºï¼Œè¿™ +å¯èƒ½ä¼šå¯¼è‡´å†…æ ¸å¯åŠ¨è¿‡ç¨‹å‘生ä¸å¿…è¦çš„é‡å¤§å˜åŒ–。 + +第三ç§é€‰é¡¹æ˜¯æœ€ä½³é€‰æ‹©ï¼Œä½†éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œç¼–è¯‘è¿›å†…æ ¸çš„ç–略会å 用ç£ç›˜ç©ºé—´ã€‚ +é‡è¦çš„æ˜¯è¦ä½¿è¿™ä¸€ç–ç•¥è¶³å¤Ÿé€šç”¨ï¼Œä»¥ä¾¿ç”¨æˆ·ç©ºé—´èƒ½å¤ŸåŠ è½½æ–°çš„ã€æ›´å¤æ‚çš„ç–略, +åŒæ—¶ä¹Ÿè¦è¶³å¤Ÿä¸¥æ ¼ï¼Œä»¥é˜²æ¢è¿‡åº¦æŽˆæƒå¹¶é¿å…引å‘安全问题。 + +initramfsæä¾›äº†ä¸€ç§å»ºç«‹æ¤å¯åŠ¨è·¯å¾„çš„æ–¹æ³•ã€‚å†…æ ¸å¯åŠ¨æ—¶ä»¥æœ€å°åŒ–çš„ç–ç•¥å¯åŠ¨ï¼Œ +该ç–略仅信任initramfs。在initramfså†…ï¼Œå½“çœŸå®žçš„æ ¹æ–‡ä»¶ç³»ç»Ÿå·²æŒ‚è½½ä¸”å°šæœª +åˆ‡æ¢æ—¶ï¼Œå®ƒä¼šéƒ¨ç½²å¹¶æ¿€æ´»ä¸€ä¸ªä¿¡ä»»æ–°æ ¹æ–‡ä»¶ç³»ç»Ÿçš„ç–ç•¥ã€‚è¿™ç§æ–¹æ³•防æ¢äº†åœ¨ä»»ä½• +æ¥éª¤ä¸å‡ºçŽ°è¿‡åº¦æŽˆæƒï¼Œå¹¶ä¿æŒå†…æ ¸ç–略的最å°åŒ–。 + +å¯åЍ +^^^^ + +ç„¶è€Œï¼Œå¹¶ä¸æ˜¯æ¯ä¸ªç³»ç»Ÿéƒ½ä»¥initramfså¯åŠ¨ï¼Œå› æ¤ç¼–è¯‘è¿›å†…æ ¸çš„å¯åЍç–略需è¦å…·å¤‡ +ä¸€å®šçš„çµæ´»æ€§ï¼Œä»¥æ˜Žç¡®å¦‚何为å¯åŠ¨çš„ä¸‹ä¸€ä¸ªé˜¶æ®µå»ºç«‹ä¿¡ä»»ã€‚ä¸ºæ¤ï¼Œå¦‚果我们将编译 +è¿›å†…æ ¸çš„ç–略设计为一个完整的IPEç–ç•¥ï¼Œè¿™æ ·ç³»ç»Ÿæž„å»ºè€…ä¾¿èƒ½åˆç†å®šä¹‰ç¬¬ä¸€é˜¶æ®µå¯ +动的需求。 + +坿›´æ–°ã€æ— 需é‡å¯çš„ç–ç•¥ +~~~~~~~~~~~~~~~~~~~~~~ + +éšç€æ—¶é—´çš„æŽ¨ç§»ï¼Œç³»ç»Ÿéœ€æ±‚å‘生å˜åŒ–(例如,之å‰ä¿¡ä»»çš„应用程åºä¸å‘çŽ°æ¼æ´žã€ç§˜é’¥ +è½®æ¢ç‰ï¼‰ã€‚æ›´æ–°å†…æ ¸ä»¥æ»¡è¶³è¿™äº›å®‰å…¨ç›®æ ‡å¹¶éžå§‹ç»ˆæ˜¯ä¸€ä¸ªåˆé€‚çš„é€‰æ‹©ï¼Œå› ä¸ºå†…æ ¸æ›´æ–°å¹¶ +éžå®Œå…¨æ— 风险的,而æç½®å®‰å…¨æ›´æ–°ä¼šä½¿ç³»ç»Ÿå¤„于脆弱状æ€ã€‚è¿™æ„味ç€IPE需è¦ä¸€ä¸ªå¯ä»¥ +完全更新的ç–略(å…许撤销现有的ç–ç•¥ï¼‰ï¼Œå¹¶ä¸”è¿™ä¸ªæ›´æ–°æ¥æºå¿…é¡»æ˜¯å†…æ ¸å¤–éƒ¨çš„ï¼ˆå…许 +å†ä¸æ›´æ–°å†…æ ¸çš„æƒ…å†µä¸‹æ›´æ–°ç–略)。 + +æ¤å¤–ï¼Œç”±äºŽå†…æ ¸åœ¨è°ƒç”¨ä¹‹é—´æ˜¯æ— çŠ¶æ€çš„ï¼Œå¹¶ä¸”ä»Žå†…æ ¸ç©ºé—´è¯»å–ç£ç›˜ä¸Šçš„ç–ç•¥æ–‡ä»¶ä¸æ˜¯ä¸€ +个好主æ„ï¼Œå› æ¤ç–略更新必须能够在ä¸é‡å¯çš„æƒ…况下完æˆã€‚ + +为了å…è®¸ä»Žå¤–éƒ¨æ¥æºè¿›è¡Œæ›´æ–°ï¼Œè€ƒè™‘åˆ°å¤–éƒ¨æ¥æºå¯èƒ½æ˜¯æ¶æ„çš„ï¼Œå› æ¤è¯¥ç–略需è¦å…·å¤‡å¯è¢« +识别为å¯ä¿¡çš„æœºåˆ¶ã€‚这一机制通过ç¾å链实现:ç–略的ç¾åéœ€ä¸Žå†…æ ¸ä¸çš„æŸä¸ªä¿¡ä»»æºç›¸ +å…³è”ã€‚é€šå¸¸ï¼Œè¿™ä¸ªä¿¡ä»»æºæ˜¯ ``SYSTEM_TRUSTED_KEYRING`` ï¼Œè¿™æ˜¯ä¸€ä¸ªåœ¨å†…æ ¸ç¼–è¯‘æ—¶å°±è¢« +åˆå§‹åŒ–å¡«å……çš„å¯†é’¥çŽ¯ï¼Œå› ä¸ºè¿™ç¬¦åˆä¸Šè¿°ç¼–译进æ¥ç–略的制作者与能够部署ç–略更新的实体 +相åŒçš„预期。 + +防回滚 / é˜²é‡æ”¾ +~~~~~~~~~~~~~~~ + +éšç€æ—¶é—´çš„æŽ¨ç§»ï¼Œç³»ç»Ÿå¯èƒ½ä¼šå‘çŽ°æ¼æ´žï¼Œæ›¾ç»å—信任的资æºå¯èƒ½ä¸å†å¯ä¿¡ï¼ŒIPEçš„ +ç–略也ä¸ä¾‹å¤–。å¯èƒ½ä¼šå‡ºçŽ°çš„æƒ…å†µæ˜¯ï¼Œç–略制作者误部署了一个ä¸å®‰å…¨çš„ç–略, +éšåŽå†ç”¨ä¸€ä¸ªå®‰å…¨çš„ç–略进行修æ£ã€‚ + +å‡è®¾ä¸€æ—¦ä¸å®‰å…¨çš„ç–略被部署,攻击者获å–了这个ä¸å®‰å…¨çš„ç–略,IPEéœ€è¦æœ‰ä¸€ç§ +æ–¹å¼æ¥é˜²æ¢ä»Žå®‰å…¨çš„ç–略更新回滚到ä¸å®‰å…¨çš„ç–略。 + +最åˆï¼ŒIPEçš„ç–ç•¥å¯ä»¥åŒ…å«ä¸€ä¸ªpolicy_versionå—æ®µï¼Œå£°æ˜Žç³»ç»Ÿä¸Šæ‰€æœ‰å¯æ¿€æ´»ç–ç•¥ +所需的最低版本å·ã€‚这将在系统è¿è¡ŒæœŸé—´é˜²æ¢å›žæ»šã€‚ + +.. WARNING:: + + ç„¶è€Œï¼Œç”±äºŽå†…æ ¸æ¯æ¬¡å¯åŠ¨éƒ½æ˜¯æ— çŠ¶æ€çš„ï¼Œå› æ¤è¯¥ç–略版本将在下次 + å¯åŠ¨æ—¶è¢«é‡ç½®ä¸º0.0.0ã€‚ç³»ç»Ÿæž„å»ºè€…éœ€è¦æ„识到这一点,并确ä¿åœ¨å¯ + 动åŽå°½å¿«éƒ¨ç½²æ–°çš„安全ç–ç•¥ï¼Œä»¥ç¡®ä¿æ”»å‡»è€…部署ä¸å®‰å…¨çš„ç–ç•¥çš„å‡ + 率最å°åŒ–。 + +éšå¼æ“作: +~~~~~~~~~ + +éšå¼æ“ä½œçš„é—®é¢˜åªæœ‰åœ¨è€ƒè™‘系统ä¸å¤šä¸ªæ“作具有ä¸åŒçº§åˆ«æ—¶æ‰ä¼šæ˜¾çŽ°å‡ºæ¥ã€‚ +ä¾‹å¦‚ï¼Œè€ƒè™‘ä¸€ä¸ªç³»ç»Ÿï¼Œè¯¥ç³»ç»Ÿå¯¹å¯æ‰§è¡Œä»£ç 和系统ä¸å¯¹å…¶åŠŸèƒ½è‡³å…³é‡è¦çš„ +ç‰¹å®šæ•°æ®æä¾›å¼ºå¤§çš„å®Œæ•´æ€§ä¿éšœã€‚在这个系统ä¸ï¼Œå¯èƒ½å˜åœ¨ä¸‰ç§ç±»åž‹çš„ +ç–略: + + 1. 一ç§ç–略,在这ç§ç–ç•¥ä¸ï¼Œå¦‚æžœæ“作未能匹é…åˆ°ä»»ä½•è§„åˆ™ï¼Œåˆ™è¯¥æ“ + 作将被拒ç»ã€‚ + 2. 一ç§ç–略,在这ç§ç–ç•¥ä¸ï¼Œå¦‚æžœæ“作未能匹é…åˆ°ä»»ä½•è§„åˆ™ï¼Œåˆ™è¯¥æ“ + 作将被å…许。 + 3. 一ç§ç–略,在这ç§ç–ç•¥ä¸ï¼Œå¦‚æžœæ“作未能匹é…到任何规则,则执行 + æ“作由ç–略作者指定。 + +第一ç§ç±»åž‹çš„ç–略示例如下:: + + op=EXECUTE integrity_verified=YES action=ALLOW + +在示例系统ä¸ï¼Œè¿™å¯¹äºŽå¯æ‰§è¡Œæ–‡ä»¶æ¥è¯´æ•ˆæžœå¾ˆå¥½ï¼Œå› ä¸ºæ‰€æœ‰å¯æ‰§è¡Œæ–‡ä»¶ +都应该拥有完整性ä¿éšœã€‚ä½†é—®é¢˜å‡ºçŽ°åœ¨ç¬¬äºŒä¸ªè¦æ±‚上,å³å…³äºŽç‰¹å®šæ•°æ® +æ–‡ä»¶çš„è¦æ±‚。这将导致如下ç–略(å‡è®¾ç–ç•¥æŒ‰è¡Œä¾æ¬¡æ‰§è¡Œï¼‰:: + + op=EXECUTE integrity_verified=YES action=ALLOW + + op=READ integrity_verified=NO label=critical_t action=DENY + op=READ action=ALLOW + +若阅读过文档,了解ç–ç•¥æŒ‰é¡ºåºæ‰§è¡Œä¸”默认动作是拒ç»ï¼Œé‚£ä¹ˆè¿™ä¸ªç–略的 +逻辑还算清晰;但最åŽä¸€è¡Œè§„åˆ™å®žé™…ä¸Šå°†è¯»å–æ“作的默认动作改æˆäº†å…许。 +è¿™ç§è®¾è®¡æ˜¯å¿…è¦çš„ï¼Œå› ä¸ºåœ¨å®žé™…ç³»ç»Ÿä¸ï¼Œå˜åœ¨ä¸€äº›æ— 需验è¯çš„è¯»å–æ“作(例 +如呿—¥å¿—æ–‡ä»¶è¿½åŠ å†…å®¹æ—¶çš„è¯»å–æ“作)。 + +第二ç§ç–略类型(未匹é…任何规则时默认å…è®¸ï¼‰åœ¨ç®¡æŽ§ç‰¹å®šæ•°æ®æ–‡ä»¶æ—¶é€»è¾‘ +更清晰,其ç–ç•¥å¯ç®€åŒ–为:: + + op=READ integrity_verified=NO label=critical_t action=DENY + +但与第一ç§ç–略类似,这ç§é»˜è®¤å…许的ç–略在管控执行æ“作时会å˜åœ¨ç¼ºé™·ï¼Œ +å› æ¤ä»éœ€æ˜¾å¼è¦†ç›–默认动作:: + + op=EXECUTE integrity_verified=YES action=ALLOW + op=EXECUTE action=DENY + + op=READ integrity_verified=NO label=critical_t action=DENY + +这就引出了第三ç§ç–ç•¥ç±»åž‹ï¼ˆè‡ªå®šä¹‰é»˜è®¤åŠ¨ä½œï¼‰ã€‚è¯¥ç±»åž‹æ— éœ€è®©ç”¨æˆ·ç»žå°½è„‘æ± +é€šè¿‡ç©ºè§„åˆ™è¦†ç›–é»˜è®¤åŠ¨ä½œï¼Œè€Œæ˜¯å¼ºåˆ¶ç”¨æˆ·æ ¹æ®è‡ªèº«åœºæ™¯æ€è€ƒåˆé€‚的默认动作是 +什么,并显å¼å£°æ˜Ž:: + + DEFAULT op=EXECUTE action=DENY + op=EXECUTE integrity_verified=YES action=ALLOW + + DEFAULT op=READ action=ALLOW + op=READ integrity_verified=NO label=critical_t action=DENY + +ç–略调试: +~~~~~~~~~ + +在开å‘ç–略时,知é“ç–ç•¥è¿å了哪一行有助于å‡å°‘è°ƒè¯•æˆæœ¬ï¼›å¯ä»¥ +将调查的范围缩å°åˆ°å¯¼è‡´è¯¥è¡Œä¸ºçš„确切行。有些完整性ç–略系统并 +ä¸æä¾›è¿™ä¸€ä¿¡æ¯ï¼Œè€Œæ˜¯æä¾›è¯„估过程ä¸ä½¿ç”¨çš„ä¿¡æ¯ã€‚è¿™éšåŽéœ€è¦å°† +这些信æ¯å’Œç–略进行关è”,以分æžå“ªé‡Œäº†é—®é¢˜ã€‚ + +相å,IPEåªä¼šè¾“出匹é…到的规则。这将调查范围é™åˆ¶åˆ°ç¡®åˆ‡åˆ°ç–略行 +(在特定规则的情况下)或部分(在DEFAULT规则的情况下)。当在 +评估ç–略时观察到ç–略失败时,这å¯ä»¥å‡å°‘è¿ä»£å’Œè°ƒæŸ¥çš„æ—¶é—´ã€‚ + +IPEçš„ç–略引擎还被设计æˆè®©äººç±»å®¹æ˜“ç†è§£å¦‚何调查ç–略失败。æ¯ä¸€ +行都会按编写顺åºè¿›è¡Œè¯„ä¼°ï¼Œå› æ¤ç®—法éžå¸¸ç®€å•,便于人类é‡çŽ°æ¥ +骤并找出å¯èƒ½å¯¼è‡´å¤±è´¥çš„åŽŸå› ã€‚è€Œåœ¨è°ƒæŸ¥å…¶ä»–çš„ç³»ç»Ÿä¸ï¼ŒåŠ è½½ç–ç•¥ +时会进行优化(例如对规则排åºï¼‰ã€‚在这些系统ä¸ï¼Œè°ƒè¯•需è¦å¤šä¸ª +æ¥éª¤ï¼Œè€Œä¸”没有先阅读代ç 的情况下,终端用户å¯èƒ½æ— 法完全ç†è§£ +该算法的原ç†ã€‚ + +简化ç–ç•¥: +~~~~~~~~~ + +最åŽï¼ŒIPEçš„ç–略是为系统管ç†å‘˜è®¾è®¡çš„ï¼Œè€Œä¸æ˜¯å†…æ ¸å¼€å‘人员。 +IPE䏿¶‰åŠå•独的LSMé’©å(或系统调用),而是涵盖æ“作。这 +æ„味ç€ï¼Œç³»ç»Ÿç®¡ç†å‘˜ä¸éœ€è¦çŸ¥é“åƒ ``mmap`` 〠``mprotect`` 〠+``execve`` å’Œ ``uselib`` è¿™äº›ç³»ç»Ÿè°ƒç”¨å¿…é¡»æœ‰è§„åˆ™è¿›è¡Œä¿æŠ¤ï¼Œ +而åªéœ€è¦çŸ¥é“他们想è¦é™åˆ¶ä»£ç 执行。这å‡å°‘了由于缺ä¹å¯¹åº•层 +系统的了解而å¯èƒ½å¯¼è‡´çš„绕过情况;而IPEçš„ç»´æŠ¤è€…ä½œä¸ºå†…æ ¸å¼€å‘ +人员,å¯ä»¥åšå‡ºæ£ç¡®çš„选择,确定æŸäº›æ“作是å¦ä¸Žè¿™äº›æ“作匹é…, +以åŠåœ¨ä»€ä¹ˆæ¡ä»¶ä¸‹åŒ¹é…。 + +实现说明 +-------- + +匿åå†…å˜ +~~~~~~~~ + +在IPEä¸ï¼ŒåŒ¿å内å˜çš„å¤„ç†æ–¹å¼ä¸Žå…¶ä»–任何类型的访问没有区别。当匿 +å内å˜ä½¿ç”¨ ``+X`` æ˜ å°„æ—¶ï¼Œå®ƒä»ç„¶ä¼šè¿›å…¥ ``file_mmp`` 或 +``file_mprotect`` é’©åï¼Œä½†æ¤æ—¶ä¼šå¸¦æœ‰ä¸€ä¸ª ``NULL`` 文件对象 +这会åƒå…¶ä»–æ–‡ä»¶ä¸€æ ·æäº¤è¿›è¡Œè¯„估。然而,所有当å‰çš„信任属性都会 +评估为å‡ï¼Œå› ä¸ºå®ƒä»¬éƒ½æ˜¯åŸºäºŽæ–‡ä»¶çš„ï¼Œè€Œæ¤æ¬¡æ“作并ä¸ä¸Žä»»ä½•文件相关è”。 + +.. WARNING:: + + 这也适用于 ``kernel_load_data`` é’©åï¼Œå½“å†…æ ¸ä»Žä¸€ä¸ªæ²¡æœ‰æ–‡ä»¶ + 支æŒçš„ç”¨æˆ·ç©ºé—´ç¼“å†²åŒºåŠ è½½æ•°æ®æ—¶ã€‚åœ¨è¿™ç§æƒ…况下,所有当å‰çš„ä¿¡ä»» + 属性也将评估为false。 + +SecurityfsæŽ¥å£ +~~~~~~~~~~~~~~ + +æ¯ä¸ªç–略的对应的securityfsæ ‘æ˜¯æœ‰äº›ç‹¬ç‰¹çš„ã€‚ä¾‹å¦‚ï¼Œå¯¹äºŽä¸€ä¸ªæ ‡å‡†çš„ +securityfsç–ç•¥æ ‘:: + + MyPolicy + |- active + |- delete + |- name + |- pkcs7 + |- policy + |- update + |- version + +ç–ç•¥å˜å‚¨åœ¨MyPolicy对应节点的 ``->i_private`` æ•°æ®ä¸ã€‚ + +测试 +---- + +IPE为ç–略解æžå™¨æä¾›äº†KUnit测试。推èkunitconfig:: + + CONFIG_KUNIT=y + CONFIG_SECURITY=y + CONFIG_SECURITYFS=y + CONFIG_PKCS7_MESSAGE_PARSER=y + CONFIG_SYSTEM_DATA_VERIFICATION=y + CONFIG_FS_VERITY=y + CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y + CONFIG_BLOCK=y + CONFIG_MD=y + CONFIG_BLK_DEV_DM=y + CONFIG_DM_VERITY=y + CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y + CONFIG_NET=y + CONFIG_AUDIT=y + CONFIG_AUDITSYSCALL=y + CONFIG_BLK_DEV_INITRD=y + + CONFIG_SECURITY_IPE=y + CONFIG_IPE_PROP_DM_VERITY=y + CONFIG_IPE_PROP_DM_VERITY_SIGNATURE=y + CONFIG_IPE_PROP_FS_VERITY=y + CONFIG_IPE_PROP_FS_VERITY_BUILTIN_SIG=y + CONFIG_SECURITY_IPE_KUNIT_TEST=y + +æ¤å¤–,IPE 具有一个基于 Python çš„é›†æˆ +`测试套件 <https://github.com/microsoft/ipe/tree/test-suite>`_ +å¯ä»¥æµ‹è¯•用户界é¢å’Œå¼ºåˆ¶æ‰§è¡ŒåŠŸèƒ½ã€‚ diff --git a/Documentation/translations/zh_CN/security/lsm-development.rst b/Documentation/translations/zh_CN/security/lsm-development.rst new file mode 100644 index 000000000000..7ed3719a9d07 --- /dev/null +++ b/Documentation/translations/zh_CN/security/lsm-development.rst @@ -0,0 +1,19 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/security/lsm-development.rst + +:翻译: + 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> + +================= +Linux安全模å—å¼€å‘ +================= + +基于https://lore.kernel.org/r/20071026073721.618b4778@laptopd505.fenrus.org, +å½“ä¸€ç§æ–°çš„LSMçš„æ„图(它试图防范什么,以åŠåœ¨å“ªäº›æƒ…况下人们会期望使用它)在 +``Documentation/admin-guide/LSM/`` ä¸é€‚当记录下æ¥åŽï¼Œå°±ä¼šè¢«æŽ¥å—è¿›å…¥å†…æ ¸ã€‚ +这使得LSM的代ç å¯ä»¥å¾ˆè½»æ¾çš„ä¸Žå…¶ç›®æ ‡è¿›è¡Œå¯¹æ¯”ï¼Œä»Žè€Œè®©æœ€ç»ˆç”¨æˆ·å’Œå‘行版å¯ä»¥æ›´ +明智地决定那些LSM适åˆä»–们的需求。 + +有关å¯ç”¨çš„ LSM é’©åæŽ¥å£çš„详细文档,请å‚阅 ``security/security.c`` åŠç›¸å…³ç»“构。 diff --git a/Documentation/translations/zh_CN/security/secrets/coco.rst b/Documentation/translations/zh_CN/security/secrets/coco.rst new file mode 100644 index 000000000000..a27bc1acdb7c --- /dev/null +++ b/Documentation/translations/zh_CN/security/secrets/coco.rst @@ -0,0 +1,96 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../../disclaimer-zh_CN.rst + +:Original: Documentation/security/secrets/coco.rst + +:翻译: + + 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> + +============ +机密计算密钥 +============ + +本文档介ç»äº†åœ¨EFI驱动程åºå’Œefi_secretå†…æ ¸æ¨¡å—ä¸ï¼Œæœºå¯†è®¡ç®—密钥从固件 +到æ“ä½œç³»ç»Ÿçš„æ³¨å…¥å¤„ç†æµç¨‹ã€‚ + +简介 +==== + +机密计算硬件(如AMD SEV,Secure Encrypted Virtualization)å…许虚拟机 +所有者将密钥注入虚拟机(VM)内å˜ï¼Œä¸”主机/è™šæ‹Ÿæœºç›‘æŽ§ç¨‹åºæ— 法读å–这些密 +钥。在SEVä¸ï¼Œå¯†é’¥æ³¨å…¥éœ€åœ¨è™šæ‹Ÿæœºå¯åЍæµç¨‹çš„æ—©æœŸé˜¶æ®µï¼ˆå®¢æˆ·æœºå¼€å§‹è¿è¡Œå‰ï¼‰ +执行。 + +efi_secretå†…æ ¸æ¨¡å—å…许用户空间应用程åºé€šè¿‡securityfs(安全文件系统)访 +问这些密钥。 + +å¯†é’¥æ•°æ®æµ +========== + +客户机固件å¯èƒ½ä¼šä¸ºå¯†é’¥æ³¨å…¥é¢„ç•™ä¸€å—æŒ‡å®šçš„内å˜åŒºåŸŸï¼Œå¹¶å°†è¯¥åŒºåŸŸçš„ä½ç½®ï¼ˆåŸºå‡† +客户机物ç†åœ°å€GPA和长度)在EFIé…置表ä¸ï¼Œé€šè¿‡ ``LINUX_EFI_COCO_SECRET_AREA_GUID`` +æ¡ç›®ï¼ˆå¯¹åº”çš„GUID值为 ``adf956ad-e98c-484c-ae11-b51c7d336447`` )的形å¼å‘布。 +固件应将æ¤å†…å˜åŒºåŸŸæ ‡è®°ä¸º ``EFI_RESERVED_TYPE`` ï¼Œå› æ¤å†…æ ¸ä¸åº”将其用于自身用途。 + +虚拟机å¯åŠ¨è¿‡ç¨‹ä¸ï¼Œè™šæ‹Ÿæœºç®¡ç†å™¨å¯å‘该区域注入密钥。在AMD SEVå’ŒSEV-ESä¸ï¼Œæ¤ +æ“作通过 ``KVM_SEV_LAUNCH_SECRET`` 命令执行(å‚è§ [sev_CN]_ )。注入的“客户机 +所有者密钥数æ®â€åº”采用带GUIDçš„å¯†é’¥å€¼è¡¨ç»“æž„ï¼Œå…¶äºŒè¿›åˆ¶æ ¼å¼åœ¨ ``drivers/virt/ +coco/efi_secret/efi_secret.c`` 文件的EFIå¯†é’¥åŒºåŸŸç»“æž„éƒ¨åˆ†ä¸æœ‰è¯¦ç»†æè¿°ã€‚ + +å†…æ ¸å¯åŠ¨æ—¶ï¼Œå†…æ ¸çš„EFI驱动程åºå°†ä¿å˜å¯†é’¥åŒºåŸŸä½ç½®ï¼ˆæ¥è‡ªEFIé…置表)到 ``efi.coco_secret`` +å—æ®µã€‚éšåŽï¼Œå®ƒä¼šæ£€æŸ¥å¯†é’¥åŒºåŸŸæ˜¯å¦å·²å¡«å……ï¼šæ˜ å°„è¯¥åŒºåŸŸå¹¶æ£€æŸ¥å…¶å†…å®¹æ˜¯å¦ä»¥ +``EFI_SECRET_TABLE_HEADER_GUID`` (对应的GUID为 ``1e74f542-71dd-4d66-963e-ef4287ff173b`` ) +开头。如果密钥区域已填充,EFI驱动程åºå°†è‡ªåŠ¨åŠ è½½efi_secretå†…æ ¸æ¨¡å—,并通过securityfs将密钥 +暴露给用户空间应用程åºã€‚efi_secret文件系统接å£çš„详细信æ¯è¯·å‚考 [secrets-coco-abi_CN]_ 。 + + +应用使用示例 +============ + +å‡è®¾å®¢æˆ·æœºéœ€è¦å¯¹åŠ å¯†æ–‡ä»¶è¿›è¡Œè®¡ç®—å¤„ç†ã€‚客户机所有者通过密钥注入机制æä¾›è§£å¯†å¯†é’¥ +(å³å¯†é’¥ï¼‰ã€‚客户机应用程åºä»Žefi_secret文件系统读å–该密钥,然åŽå°†æ–‡ä»¶è§£å¯†åˆ°å†…å˜ä¸ï¼Œ +接ç€å¯¹å†…容进行需è¦çš„计算。 + +在æ¤ç¤ºä¾‹ä¸ï¼Œä¸»æœºæ— 法从ç£ç›˜é•œåƒä¸è¯»å–æ–‡ä»¶ï¼Œå› ä¸ºæ–‡ä»¶æ˜¯åŠ å¯†çš„ï¼›ä¸»æœºæ— æ³•è¯»å–解密密钥, +å› ä¸ºå®ƒæ˜¯é€šè¿‡å¯†é’¥æ³¨å…¥æœºåˆ¶ï¼ˆå³å®‰å…¨é€šé“ï¼‰ä¼ é€’çš„ï¼›ä¸»æœºä¹Ÿæ— æ³•è¯»å–内å˜ä¸çš„è§£å¯†å†…å®¹ï¼Œå› ä¸º +这是一个机密型(内å˜åŠ å¯†ï¼‰å®¢æˆ·æœºã€‚ + +以下是一个简å•的示例,展示了在客户机ä¸ä½¿ç”¨efi_secret模å—的过程,在å¯åŠ¨æ—¶æ³¨å…¥äº† +一个包å«4个密钥的EFI密钥区域:: + + # ls -la /sys/kernel/security/secrets/coco + total 0 + drwxr-xr-x 2 root root 0 Jun 28 11:54 . + drwxr-xr-x 3 root root 0 Jun 28 11:54 .. + -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b + -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 + -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 + -r--r----- 1 root root 0 Jun 28 11:54 e6f5a162-d67f-4750-a67c-5d065f2a9910 + + # hd /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910 + 00000000 74 68 65 73 65 2d 61 72 65 2d 74 68 65 2d 6b 61 |these-are-the-ka| + 00000010 74 61 2d 73 65 63 72 65 74 73 00 01 02 03 04 05 |ta-secrets......| + 00000020 06 07 |..| + 00000022 + + # rm /sys/kernel/security/secrets/coco/e6f5a162-d67f-4750-a67c-5d065f2a9910 + + # ls -la /sys/kernel/security/secrets/coco + total 0 + drwxr-xr-x 2 root root 0 Jun 28 11:55 . + drwxr-xr-x 3 root root 0 Jun 28 11:54 .. + -r--r----- 1 root root 0 Jun 28 11:54 736870e5-84f0-4973-92ec-06879ce3da0b + -r--r----- 1 root root 0 Jun 28 11:54 83c83f7f-1356-4975-8b7e-d3a0b54312c6 + -r--r----- 1 root root 0 Jun 28 11:54 9553f55d-3da2-43ee-ab5d-ff17f78864d2 + + +å‚考文献 +======== + +请å‚è§ [sev-api-spec_CN]_ ä»¥èŽ·å–æœ‰å…³SEV ``LAUNCH_SECRET`` æ“作的更多信æ¯ã€‚ + +.. [sev_CN] Documentation/virt/kvm/x86/amd-memory-encryption.rst +.. [secrets-coco-abi_CN] Documentation/ABI/testing/securityfs-secrets-coco +.. [sev-api-spec_CN] https://www.amd.com/system/files/TechDocs/55766_SEV-KM_API_Specification.pdf + diff --git a/Documentation/translations/zh_CN/security/secrets/index.rst b/Documentation/translations/zh_CN/security/secrets/index.rst index 5ea78713f10e..38464dcb2c3c 100644 --- a/Documentation/translations/zh_CN/security/secrets/index.rst +++ b/Documentation/translations/zh_CN/security/secrets/index.rst @@ -5,13 +5,10 @@ :翻译: -===================== +======== 密钥文档 -===================== +======== .. toctree:: - -TODOLIST: - -* coco + coco diff --git a/Documentation/translations/zh_CN/subsystem-apis.rst b/Documentation/translations/zh_CN/subsystem-apis.rst index 8b646c1010be..830217140fb6 100644 --- a/Documentation/translations/zh_CN/subsystem-apis.rst +++ b/Documentation/translations/zh_CN/subsystem-apis.rst @@ -71,12 +71,11 @@ TODOList: :maxdepth: 1 filesystems/index + scsi/index TODOList: -* block/index * cdrom/index -* scsi/index * target/index **Fixme**: è¿™é‡Œè¿˜éœ€è¦æ›´å¤šçš„分类组织工作。 diff --git a/Documentation/translations/zh_TW/admin-guide/README.rst b/Documentation/translations/zh_TW/admin-guide/README.rst index 0b038074d9d1..c8b7ccfaa656 100644 --- a/Documentation/translations/zh_TW/admin-guide/README.rst +++ b/Documentation/translations/zh_TW/admin-guide/README.rst @@ -291,5 +291,5 @@ Documentation/translations/zh_CN/admin-guide/bug-hunting.rst 。 更多用GDBèª¿è©¦å…§æ ¸çš„ä¿¡æ¯ï¼Œè«‹åƒé–±ï¼š Documentation/translations/zh_CN/dev-tools/gdb-kernel-debugging.rst -å’Œ Documentation/dev-tools/kgdb.rst 。 +å’Œ Documentation/process/debugging/kgdb.rst 。 diff --git a/Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst b/Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst index b595af59ba78..4fd1757c3036 100644 --- a/Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst +++ b/Documentation/translations/zh_TW/dev-tools/gdb-kernel-debugging.rst @@ -2,7 +2,7 @@ .. include:: ../disclaimer-zh_TW.rst -:Original: Documentation/dev-tools/gdb-kernel-debugging.rst +:Original: Documentation/process/debugging/gdb-kernel-debugging.rst :Translator: 高超 gao chao <gaochao49@huawei.com> 通éŽgdbèª¿è©¦å…§æ ¸å’Œæ¨¡å¡Š diff --git a/Documentation/userspace-api/media/cec/cec-header.rst b/Documentation/userspace-api/media/cec/cec-header.rst index f67003bb8740..648498bc7d6f 100644 --- a/Documentation/userspace-api/media/cec/cec-header.rst +++ b/Documentation/userspace-api/media/cec/cec-header.rst @@ -2,10 +2,12 @@ .. _cec_header: -*************** -CEC Header File -*************** +**************** +CEC uAPI Symbols +**************** .. kernel-include:: include/uapi/linux/cec.h :generate-cross-refs: :exception-file: cec.h.rst.exceptions + :toc: + :warn-broken: diff --git a/Documentation/userspace-api/media/cec/cec.h.rst.exceptions b/Documentation/userspace-api/media/cec/cec.h.rst.exceptions index 15fa1752d4ef..65e8be062bdb 100644 --- a/Documentation/userspace-api/media/cec/cec.h.rst.exceptions +++ b/Documentation/userspace-api/media/cec/cec.h.rst.exceptions @@ -1,5 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 +# All symbols belong to CEC namespace +namespace CEC + # Ignore header name ignore define _CEC_UAPI_H diff --git a/Documentation/userspace-api/media/dvb/dmx.h.rst.exceptions b/Documentation/userspace-api/media/dvb/dmx.h.rst.exceptions index afc14d384b83..2c219388d123 100644 --- a/Documentation/userspace-api/media/dvb/dmx.h.rst.exceptions +++ b/Documentation/userspace-api/media/dvb/dmx.h.rst.exceptions @@ -1,34 +1,36 @@ # SPDX-License-Identifier: GPL-2.0 +# All symbols belone to this namespace +namespace DTV.dmx + # Ignore header name ignore define _UAPI_DVBDMX_H_ # Ignore limit constants ignore define DMX_FILTER_SIZE -# dmx_pes_type_t enum symbols -replace enum dmx_ts_pes :c:type:`dmx_pes_type` -replace symbol DMX_PES_AUDIO0 :c:type:`dmx_pes_type` -replace symbol DMX_PES_VIDEO0 :c:type:`dmx_pes_type` -replace symbol DMX_PES_TELETEXT0 :c:type:`dmx_pes_type` -replace symbol DMX_PES_SUBTITLE0 :c:type:`dmx_pes_type` -replace symbol DMX_PES_PCR0 :c:type:`dmx_pes_type` -replace symbol DMX_PES_AUDIO1 :c:type:`dmx_pes_type` -replace symbol DMX_PES_VIDEO1 :c:type:`dmx_pes_type` -replace symbol DMX_PES_TELETEXT1 :c:type:`dmx_pes_type` -replace symbol DMX_PES_SUBTITLE1 :c:type:`dmx_pes_type` -replace symbol DMX_PES_PCR1 :c:type:`dmx_pes_type` -replace symbol DMX_PES_AUDIO2 :c:type:`dmx_pes_type` -replace symbol DMX_PES_VIDEO2 :c:type:`dmx_pes_type` -replace symbol DMX_PES_TELETEXT2 :c:type:`dmx_pes_type` -replace symbol DMX_PES_SUBTITLE2 :c:type:`dmx_pes_type` -replace symbol DMX_PES_PCR2 :c:type:`dmx_pes_type` -replace symbol DMX_PES_AUDIO3 :c:type:`dmx_pes_type` -replace symbol DMX_PES_VIDEO3 :c:type:`dmx_pes_type` -replace symbol DMX_PES_TELETEXT3 :c:type:`dmx_pes_type` -replace symbol DMX_PES_SUBTITLE3 :c:type:`dmx_pes_type` -replace symbol DMX_PES_PCR3 :c:type:`dmx_pes_type` -replace symbol DMX_PES_OTHER :c:type:`dmx_pes_type` +# dmx_ts_pes_type_t enum symbols +replace symbol DMX_PES_AUDIO0 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_VIDEO0 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_TELETEXT0 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_SUBTITLE0 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_PCR0 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_AUDIO1 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_VIDEO1 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_TELETEXT1 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_SUBTITLE1 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_PCR1 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_AUDIO2 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_VIDEO2 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_TELETEXT2 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_SUBTITLE2 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_PCR2 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_AUDIO3 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_VIDEO3 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_TELETEXT3 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_SUBTITLE3 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_PCR3 :c:type:`DTV.dmx.dmx_ts_pes` +replace symbol DMX_PES_OTHER :c:type:`DTV.dmx.dmx_ts_pes` # Ignore obsolete symbols ignore define DMX_PES_AUDIO @@ -38,29 +40,23 @@ ignore define DMX_PES_SUBTITLE ignore define DMX_PES_PCR # dmx_input_t symbols -replace enum dmx_input :c:type:`dmx_input` -replace symbol DMX_IN_FRONTEND :c:type:`dmx_input` -replace symbol DMX_IN_DVR :c:type:`dmx_input` +replace symbol DMX_IN_FRONTEND :c:enum:`DTV.dmx.dmx_input` +replace symbol DMX_IN_DVR :c:enum:`DTV.dmx.dmx_input` # Flags for struct dmx_sct_filter_params -replace define DMX_CHECK_CRC :c:type:`dmx_sct_filter_params` -replace define DMX_ONESHOT :c:type:`dmx_sct_filter_params` -replace define DMX_IMMEDIATE_START :c:type:`dmx_sct_filter_params` - -# some typedefs should point to struct/enums -replace typedef dmx_filter_t :c:type:`dmx_filter` -replace typedef dmx_pes_type_t :c:type:`dmx_pes_type` -replace typedef dmx_input_t :c:type:`dmx_input` - -replace symbol DMX_BUFFER_FLAG_HAD_CRC32_DISCARD :c:type:`dmx_buffer_flags` -replace symbol DMX_BUFFER_FLAG_TEI :c:type:`dmx_buffer_flags` -replace symbol DMX_BUFFER_PKT_COUNTER_MISMATCH :c:type:`dmx_buffer_flags` -replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED :c:type:`dmx_buffer_flags` -replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR :c:type:`dmx_buffer_flags` - -replace symbol DMX_OUT_DECODER :c:type:`dmx_output` -replace symbol DMX_OUT_TAP :c:type:`dmx_output` -replace symbol DMX_OUT_TS_TAP :c:type:`dmx_output` -replace symbol DMX_OUT_TSDEMUX_TAP :c:type:`dmx_output` +replace define DMX_CHECK_CRC :c:type:`DTV.dmx.dmx_sct_filter_params` +replace define DMX_ONESHOT :c:type:`DTV.dmx.dmx_sct_filter_params` +replace define DMX_IMMEDIATE_START :c:type:`DTV.dmx.dmx_sct_filter_params` + +replace symbol DMX_BUFFER_FLAG_HAD_CRC32_DISCARD :c:type:`DTV.dmx.dmx_buffer_flags` +replace symbol DMX_BUFFER_FLAG_TEI :c:type:`DTV.dmx.dmx_buffer_flags` +replace symbol DMX_BUFFER_PKT_COUNTER_MISMATCH :c:type:`DTV.dmx.dmx_buffer_flags` +replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED :c:type:`DTV.dmx.dmx_buffer_flags` +replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR :c:type:`DTV.dmx.dmx_buffer_flags` + +replace symbol DMX_OUT_DECODER :c:type:`DTV.dmx.dmx_output` +replace symbol DMX_OUT_TAP :c:type:`DTV.dmx.dmx_output` +replace symbol DMX_OUT_TS_TAP :c:type:`DTV.dmx.dmx_output` +replace symbol DMX_OUT_TSDEMUX_TAP :c:type:`DTV.dmx.dmx_output` replace ioctl DMX_DQBUF dmx_qbuf diff --git a/Documentation/userspace-api/media/dvb/dmx_types.rst b/Documentation/userspace-api/media/dvb/dmx_types.rst index 33458fbb84ab..dd76010696c8 100644 --- a/Documentation/userspace-api/media/dvb/dmx_types.rst +++ b/Documentation/userspace-api/media/dvb/dmx_types.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: DTV.dmx .. _dmx_types: diff --git a/Documentation/userspace-api/media/dvb/frontend.h.rst.exceptions b/Documentation/userspace-api/media/dvb/frontend.h.rst.exceptions index dcaf5740de7e..cecd4087d4be 100644 --- a/Documentation/userspace-api/media/dvb/frontend.h.rst.exceptions +++ b/Documentation/userspace-api/media/dvb/frontend.h.rst.exceptions @@ -28,13 +28,14 @@ ignore define MAX_DTV_STATS ignore define DTV_IOCTL_MAX_MSGS # the same reference is used for both get and set ioctls -replace ioctl FE_SET_PROPERTY :c:type:`FE_GET_PROPERTY` +replace ioctl FE_SET_PROPERTY :ref:`FE_GET_PROPERTY` +replace ioctl FE_GET_PROPERTY :ref:`FE_GET_PROPERTY` # Typedefs that use the enum reference replace typedef fe_sec_voltage_t :c:type:`fe_sec_voltage` # Replaces for flag constants -replace define FE_TUNE_MODE_ONESHOT :c:func:`FE_SET_FRONTEND_TUNE_MODE` +replace define FE_TUNE_MODE_ONESHOT :ref:`FE_SET_FRONTEND_TUNE_MODE` replace define LNA_AUTO dtv-lna replace define NO_STREAM_ID_FILTER dtv-stream-id diff --git a/Documentation/userspace-api/media/dvb/headers.rst b/Documentation/userspace-api/media/dvb/headers.rst index c75f64cf21d5..6d69622bf1e0 100644 --- a/Documentation/userspace-api/media/dvb/headers.rst +++ b/Documentation/userspace-api/media/dvb/headers.rst @@ -1,25 +1,46 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later -**************************** -Digital TV uAPI header files -**************************** - -Digital TV uAPI headers *********************** +Digital TV uAPI symbols +*********************** + +.. contents:: Table of Contents + :depth: 2 + :local: + +Frontend +======== .. kernel-include:: include/uapi/linux/dvb/frontend.h :generate-cross-refs: :exception-file: frontend.h.rst.exceptions + :toc: + :warn-broken: + +Demux +===== .. kernel-include:: include/uapi/linux/dvb/dmx.h :generate-cross-refs: :exception-file: dmx.h.rst.exceptions + :toc: + :warn-broken: + +Conditional Access +================== .. kernel-include:: include/uapi/linux/dvb/ca.h :generate-cross-refs: :exception-file: ca.h.rst.exceptions + :toc: + :warn-broken: + +Network +======= .. kernel-include:: include/uapi/linux/dvb/net.h :generate-cross-refs: :exception-file: net.h.rst.exceptions + :toc: + :warn-broken: diff --git a/Documentation/userspace-api/media/mediactl/media-header.rst b/Documentation/userspace-api/media/mediactl/media-header.rst index d561d2845f3d..a47ac5b2e99b 100644 --- a/Documentation/userspace-api/media/mediactl/media-header.rst +++ b/Documentation/userspace-api/media/mediactl/media-header.rst @@ -2,10 +2,12 @@ .. _media_header: -**************************** -Media Controller Header File -**************************** +***************************** +Media controller uAPI symbols +***************************** .. kernel-include:: include/uapi/linux/media.h :generate-cross-refs: :exception-file: media.h.rst.exceptions + :toc: + :warn-broken: diff --git a/Documentation/userspace-api/media/mediactl/media.h.rst.exceptions b/Documentation/userspace-api/media/mediactl/media.h.rst.exceptions index 9b4c26502d95..09aaec2b4718 100644 --- a/Documentation/userspace-api/media/mediactl/media.h.rst.exceptions +++ b/Documentation/userspace-api/media/mediactl/media.h.rst.exceptions @@ -1,5 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 +# All symbols are mapped inside MC C domain namespace +namespace MC + # Ignore header name ignore define __LINUX_MEDIA_H diff --git a/Documentation/userspace-api/media/rc/lirc-header.rst b/Documentation/userspace-api/media/rc/lirc-header.rst index a53328327847..ba4992625684 100644 --- a/Documentation/userspace-api/media/rc/lirc-header.rst +++ b/Documentation/userspace-api/media/rc/lirc-header.rst @@ -2,11 +2,19 @@ .. _lirc_header: -**************** -LIRC Header File -**************** +***************** +LIRC uAPI symbols +***************** + +.. contents:: Table of Contents + :depth: 2 + :local: + + .. kernel-include:: include/uapi/linux/lirc.h :generate-cross-refs: :exception-file: lirc.h.rst.exceptions + :toc: + :warn-broken: diff --git a/Documentation/userspace-api/media/v4l/app-pri.rst b/Documentation/userspace-api/media/v4l/app-pri.rst index 626a42f2e138..47d96cd64525 100644 --- a/Documentation/userspace-api/media/v4l/app-pri.rst +++ b/Documentation/userspace-api/media/v4l/app-pri.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _app-pri: diff --git a/Documentation/userspace-api/media/v4l/audio.rst b/Documentation/userspace-api/media/v4l/audio.rst index 17f0b1c89908..3b424440e478 100644 --- a/Documentation/userspace-api/media/v4l/audio.rst +++ b/Documentation/userspace-api/media/v4l/audio.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _audio: diff --git a/Documentation/userspace-api/media/v4l/biblio.rst b/Documentation/userspace-api/media/v4l/biblio.rst index 856acf6a890c..9721247e66ef 100644 --- a/Documentation/userspace-api/media/v4l/biblio.rst +++ b/Documentation/userspace-api/media/v4l/biblio.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ********** References diff --git a/Documentation/userspace-api/media/v4l/buffer.rst b/Documentation/userspace-api/media/v4l/buffer.rst index 856874341882..94dc2719e907 100644 --- a/Documentation/userspace-api/media/v4l/buffer.rst +++ b/Documentation/userspace-api/media/v4l/buffer.rst @@ -667,6 +667,8 @@ Buffer Flags exposure of the frame has begun. This is only valid for the ``V4L2_BUF_TYPE_VIDEO_CAPTURE`` buffer type. +.. c:enum:: v4l2_memory + .. raw:: latex \normalsize diff --git a/Documentation/userspace-api/media/v4l/capture-example.rst b/Documentation/userspace-api/media/v4l/capture-example.rst index 25891320b7ad..f018a654f59c 100644 --- a/Documentation/userspace-api/media/v4l/capture-example.rst +++ b/Documentation/userspace-api/media/v4l/capture-example.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _capture-example: diff --git a/Documentation/userspace-api/media/v4l/capture.c.rst b/Documentation/userspace-api/media/v4l/capture.c.rst index 349541b1dac0..aae17e1e844a 100644 --- a/Documentation/userspace-api/media/v4l/capture.c.rst +++ b/Documentation/userspace-api/media/v4l/capture.c.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L file: media/v4l/capture.c ========================= diff --git a/Documentation/userspace-api/media/v4l/colorspaces-defs.rst b/Documentation/userspace-api/media/v4l/colorspaces-defs.rst index fe9f8aa8ab9d..0b40e735f3bf 100644 --- a/Documentation/userspace-api/media/v4l/colorspaces-defs.rst +++ b/Documentation/userspace-api/media/v4l/colorspaces-defs.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L **************************** Defining Colorspaces in V4L2 diff --git a/Documentation/userspace-api/media/v4l/colorspaces-details.rst b/Documentation/userspace-api/media/v4l/colorspaces-details.rst index 26a4ace42ca5..f29b0e3978bc 100644 --- a/Documentation/userspace-api/media/v4l/colorspaces-details.rst +++ b/Documentation/userspace-api/media/v4l/colorspaces-details.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ******************************** Detailed Colorspace Descriptions diff --git a/Documentation/userspace-api/media/v4l/colorspaces.rst b/Documentation/userspace-api/media/v4l/colorspaces.rst index 2aa0dda4fd01..11954d7cf999 100644 --- a/Documentation/userspace-api/media/v4l/colorspaces.rst +++ b/Documentation/userspace-api/media/v4l/colorspaces.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _colorspaces: diff --git a/Documentation/userspace-api/media/v4l/common-defs.rst b/Documentation/userspace-api/media/v4l/common-defs.rst index 6ae42ac7ddb7..329ba6ec760b 100644 --- a/Documentation/userspace-api/media/v4l/common-defs.rst +++ b/Documentation/userspace-api/media/v4l/common-defs.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _common-defs: diff --git a/Documentation/userspace-api/media/v4l/common.rst b/Documentation/userspace-api/media/v4l/common.rst index ea0435182e44..507c35fec8ce 100644 --- a/Documentation/userspace-api/media/v4l/common.rst +++ b/Documentation/userspace-api/media/v4l/common.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _common: diff --git a/Documentation/userspace-api/media/v4l/compat.rst b/Documentation/userspace-api/media/v4l/compat.rst index b63b8392dec6..f766ea89f9ff 100644 --- a/Documentation/userspace-api/media/v4l/compat.rst +++ b/Documentation/userspace-api/media/v4l/compat.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _compat: diff --git a/Documentation/userspace-api/media/v4l/control.rst b/Documentation/userspace-api/media/v4l/control.rst index 9253cc946f02..19372bb32c4b 100644 --- a/Documentation/userspace-api/media/v4l/control.rst +++ b/Documentation/userspace-api/media/v4l/control.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _control: diff --git a/Documentation/userspace-api/media/v4l/crop.rst b/Documentation/userspace-api/media/v4l/crop.rst index 3fe185e25ccf..c5f389aca275 100644 --- a/Documentation/userspace-api/media/v4l/crop.rst +++ b/Documentation/userspace-api/media/v4l/crop.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _crop: diff --git a/Documentation/userspace-api/media/v4l/depth-formats.rst b/Documentation/userspace-api/media/v4l/depth-formats.rst index b4f3fc229c85..bd61064d51d3 100644 --- a/Documentation/userspace-api/media/v4l/depth-formats.rst +++ b/Documentation/userspace-api/media/v4l/depth-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _depth-formats: diff --git a/Documentation/userspace-api/media/v4l/dev-decoder.rst b/Documentation/userspace-api/media/v4l/dev-decoder.rst index ef8e8cf31f90..eb662ced0ab4 100644 --- a/Documentation/userspace-api/media/v4l/dev-decoder.rst +++ b/Documentation/userspace-api/media/v4l/dev-decoder.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L .. _decoder: diff --git a/Documentation/userspace-api/media/v4l/dev-encoder.rst b/Documentation/userspace-api/media/v4l/dev-encoder.rst index 6c523c69bdce..cdad276d00bc 100644 --- a/Documentation/userspace-api/media/v4l/dev-encoder.rst +++ b/Documentation/userspace-api/media/v4l/dev-encoder.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _encoder: diff --git a/Documentation/userspace-api/media/v4l/dev-event.rst b/Documentation/userspace-api/media/v4l/dev-event.rst index f34f9cf6ce6c..f61d774f0153 100644 --- a/Documentation/userspace-api/media/v4l/dev-event.rst +++ b/Documentation/userspace-api/media/v4l/dev-event.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _event: diff --git a/Documentation/userspace-api/media/v4l/dev-mem2mem.rst b/Documentation/userspace-api/media/v4l/dev-mem2mem.rst index 7041bb3d5b8d..6058eeaefca4 100644 --- a/Documentation/userspace-api/media/v4l/dev-mem2mem.rst +++ b/Documentation/userspace-api/media/v4l/dev-mem2mem.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _mem2mem: diff --git a/Documentation/userspace-api/media/v4l/dev-meta.rst b/Documentation/userspace-api/media/v4l/dev-meta.rst index 5eee9ab60395..da706d01b808 100644 --- a/Documentation/userspace-api/media/v4l/dev-meta.rst +++ b/Documentation/userspace-api/media/v4l/dev-meta.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _metadata: diff --git a/Documentation/userspace-api/media/v4l/dev-osd.rst b/Documentation/userspace-api/media/v4l/dev-osd.rst index 8e4be9129e75..f37450b1b631 100644 --- a/Documentation/userspace-api/media/v4l/dev-osd.rst +++ b/Documentation/userspace-api/media/v4l/dev-osd.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _osd: diff --git a/Documentation/userspace-api/media/v4l/dev-overlay.rst b/Documentation/userspace-api/media/v4l/dev-overlay.rst index d52977120b41..b7f4302eee6e 100644 --- a/Documentation/userspace-api/media/v4l/dev-overlay.rst +++ b/Documentation/userspace-api/media/v4l/dev-overlay.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _overlay: diff --git a/Documentation/userspace-api/media/v4l/dev-radio.rst b/Documentation/userspace-api/media/v4l/dev-radio.rst index 284ce96a1637..843a2151f470 100644 --- a/Documentation/userspace-api/media/v4l/dev-radio.rst +++ b/Documentation/userspace-api/media/v4l/dev-radio.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _radio: diff --git a/Documentation/userspace-api/media/v4l/dev-sdr.rst b/Documentation/userspace-api/media/v4l/dev-sdr.rst index dfdeddbca41f..99907adc0628 100644 --- a/Documentation/userspace-api/media/v4l/dev-sdr.rst +++ b/Documentation/userspace-api/media/v4l/dev-sdr.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _sdr: diff --git a/Documentation/userspace-api/media/v4l/dev-stateless-decoder.rst b/Documentation/userspace-api/media/v4l/dev-stateless-decoder.rst index 35ed05f2695e..e311f0c13272 100644 --- a/Documentation/userspace-api/media/v4l/dev-stateless-decoder.rst +++ b/Documentation/userspace-api/media/v4l/dev-stateless-decoder.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L .. _stateless_decoder: diff --git a/Documentation/userspace-api/media/v4l/dev-subdev.rst b/Documentation/userspace-api/media/v4l/dev-subdev.rst index 225a45fef994..2530170a56ae 100644 --- a/Documentation/userspace-api/media/v4l/dev-subdev.rst +++ b/Documentation/userspace-api/media/v4l/dev-subdev.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _subdev: diff --git a/Documentation/userspace-api/media/v4l/dev-touch.rst b/Documentation/userspace-api/media/v4l/dev-touch.rst index a71b9def5d58..808957cd9afc 100644 --- a/Documentation/userspace-api/media/v4l/dev-touch.rst +++ b/Documentation/userspace-api/media/v4l/dev-touch.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _touch: diff --git a/Documentation/userspace-api/media/v4l/devices.rst b/Documentation/userspace-api/media/v4l/devices.rst index 8bfbad65a9d4..d4790b9ef81a 100644 --- a/Documentation/userspace-api/media/v4l/devices.rst +++ b/Documentation/userspace-api/media/v4l/devices.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _devices: diff --git a/Documentation/userspace-api/media/v4l/dv-timings.rst b/Documentation/userspace-api/media/v4l/dv-timings.rst index 4b19bcb4bd80..9f117c82df1b 100644 --- a/Documentation/userspace-api/media/v4l/dv-timings.rst +++ b/Documentation/userspace-api/media/v4l/dv-timings.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _dv-timings: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst index cdc515c60468..b4daa7e28dc0 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _camera-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst index 0da635691fdc..497ae74379f6 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _codec-stateless-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst index 4a379bd9e3fb..c8890cb5e00a 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _codec-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-colorimetry.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-colorimetry.rst index 1e7265155715..38a4136d7220 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-colorimetry.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-colorimetry.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _colorimetry-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-detect.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-detect.rst index 312c4fa94dc3..ee2b7e37c1d9 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-detect.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-detect.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _detect-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-dv.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-dv.rst index d2794e03ac6d..5918dde83efb 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-dv.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-dv.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _dv-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-flash.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-flash.rst index d22c5efb806a..bd024ab461a4 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-flash.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-flash.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _flash-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-fm-rx.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-fm-rx.rst index ccd439e9e0e3..b7284768f7ea 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-fm-rx.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-fm-rx.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _fm-rx-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-fm-tx.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-fm-tx.rst index cb40cf4cc3ec..7143a4c08f78 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-fm-tx.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-fm-tx.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _fm-tx-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst index 27803dca8d3e..6d516f041ca2 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-process.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _image-process-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-image-source.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-image-source.rst index 71f23f131f97..f9c0b7ad3b4e 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-image-source.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-image-source.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _image-source-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-jpeg.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-jpeg.rst index 522095c08469..b114650bca5b 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-jpeg.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-jpeg.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _jpeg-controls: diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-rf-tuner.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-rf-tuner.rst index 8a6f9f0373ff..f50802a1c4d4 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-rf-tuner.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-rf-tuner.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _rf-tuner-controls: diff --git a/Documentation/userspace-api/media/v4l/extended-controls.rst b/Documentation/userspace-api/media/v4l/extended-controls.rst index 44fcd67f20bf..5fe71da6afc0 100644 --- a/Documentation/userspace-api/media/v4l/extended-controls.rst +++ b/Documentation/userspace-api/media/v4l/extended-controls.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _extended-controls: diff --git a/Documentation/userspace-api/media/v4l/field-order.rst b/Documentation/userspace-api/media/v4l/field-order.rst index 9a0ed8fc550f..2a01852513b3 100644 --- a/Documentation/userspace-api/media/v4l/field-order.rst +++ b/Documentation/userspace-api/media/v4l/field-order.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _field-order: diff --git a/Documentation/userspace-api/media/v4l/fourcc.rst b/Documentation/userspace-api/media/v4l/fourcc.rst index d3482c40da62..5cea7008814f 100644 --- a/Documentation/userspace-api/media/v4l/fourcc.rst +++ b/Documentation/userspace-api/media/v4l/fourcc.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L Guidelines for Video4Linux pixel format 4CCs ============================================ diff --git a/Documentation/userspace-api/media/v4l/hsv-formats.rst b/Documentation/userspace-api/media/v4l/hsv-formats.rst index d810c914b673..f0731de6f038 100644 --- a/Documentation/userspace-api/media/v4l/hsv-formats.rst +++ b/Documentation/userspace-api/media/v4l/hsv-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _hsv-formats: diff --git a/Documentation/userspace-api/media/v4l/libv4l.rst b/Documentation/userspace-api/media/v4l/libv4l.rst index f446dd2d01ac..ce7a0400891c 100644 --- a/Documentation/userspace-api/media/v4l/libv4l.rst +++ b/Documentation/userspace-api/media/v4l/libv4l.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _libv4l: diff --git a/Documentation/userspace-api/media/v4l/meta-formats.rst b/Documentation/userspace-api/media/v4l/meta-formats.rst index 0de80328c36b..d9868ee88a07 100644 --- a/Documentation/userspace-api/media/v4l/meta-formats.rst +++ b/Documentation/userspace-api/media/v4l/meta-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _meta-formats: diff --git a/Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst b/Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst index 449b45c2ec24..24359601ae25 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-c3-isp.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: (GPL-2.0-only OR MIT) +.. c:namespace:: V4L .. _v4l2-meta-fmt-c3isp-stats: .. _v4l2-meta-fmt-c3isp-params: diff --git a/Documentation/userspace-api/media/v4l/metafmt-d4xx.rst b/Documentation/userspace-api/media/v4l/metafmt-d4xx.rst index 0686413b16b2..d716170bb795 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-d4xx.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-d4xx.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-d4xx: diff --git a/Documentation/userspace-api/media/v4l/metafmt-generic.rst b/Documentation/userspace-api/media/v4l/metafmt-generic.rst index 39d529c910a8..23f69e1a1afa 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-generic.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-generic.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ******************************************************************************************************************************************************************************************************************************************************************************** V4L2_META_FMT_GENERIC_8 ('MET8'), V4L2_META_FMT_GENERIC_CSI2_10 ('MC1A'), V4L2_META_FMT_GENERIC_CSI2_12 ('MC1C'), V4L2_META_FMT_GENERIC_CSI2_14 ('MC1E'), V4L2_META_FMT_GENERIC_CSI2_16 ('MC1G'), V4L2_META_FMT_GENERIC_CSI2_20 ('MC1K'), V4L2_META_FMT_GENERIC_CSI2_24 ('MC1O') diff --git a/Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst b/Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst index 84d81dd7a7b5..c11d17e5a286 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-intel-ipu3.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-params: .. _v4l2-meta-fmt-stat-3a: diff --git a/Documentation/userspace-api/media/v4l/metafmt-pisp-be.rst b/Documentation/userspace-api/media/v4l/metafmt-pisp-be.rst index 3281fe366c86..e230177910f4 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-pisp-be.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-pisp-be.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L .. _v4l2-meta-fmt-rpi-be-cfg: diff --git a/Documentation/userspace-api/media/v4l/metafmt-pisp-fe.rst b/Documentation/userspace-api/media/v4l/metafmt-pisp-fe.rst index fddeada83e4a..a2aa5c4c2920 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-pisp-fe.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-pisp-fe.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L .. _v4l2-meta-fmt-rpi-fe-cfg: diff --git a/Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst b/Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst index 959f6bde8695..d3c899b0150b 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 +.. c:namespace:: V4L .. _v4l2-meta-fmt-rk-isp1-stat-3a: diff --git a/Documentation/userspace-api/media/v4l/metafmt-uvc.rst b/Documentation/userspace-api/media/v4l/metafmt-uvc.rst index 4c05e9e54683..c4ae2f13e7f7 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-uvc.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-uvc.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-uvc: diff --git a/Documentation/userspace-api/media/v4l/metafmt-vivid.rst b/Documentation/userspace-api/media/v4l/metafmt-vivid.rst index 7173e2c3e245..94f28736dc80 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-vivid.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-vivid.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-vivid: diff --git a/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgo.rst b/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgo.rst index 8d886feb180c..70357899a5f0 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgo.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgo.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-vsp1-hgo: diff --git a/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgt.rst b/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgt.rst index d8830ff605de..4a1575a9e728 100644 --- a/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgt.rst +++ b/Documentation/userspace-api/media/v4l/metafmt-vsp1-hgt.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-meta-fmt-vsp1-hgt: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-bayer.rst b/Documentation/userspace-api/media/v4l/pixfmt-bayer.rst index b5ca501842b0..8b4e413177f5 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-bayer.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-bayer.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _pixfmt-bayer: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-cnf4.rst b/Documentation/userspace-api/media/v4l/pixfmt-cnf4.rst index 8f469290c304..4e3e9c5f4387 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-cnf4.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-cnf4.rst @@ -1,4 +1,5 @@ .. -*- coding: utf-8; mode: rst -*- +.. c:namespace:: V4L .. _V4L2-PIX-FMT-CNF4: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst index 806ed73ac474..c7efb0465db6 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ****************** Compressed Formats diff --git a/Documentation/userspace-api/media/v4l/pixfmt-indexed.rst b/Documentation/userspace-api/media/v4l/pixfmt-indexed.rst index 5bd4a47c5854..08d698ebdd64 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-indexed.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-indexed.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _pixfmt-indexed: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-intro.rst b/Documentation/userspace-api/media/v4l/pixfmt-intro.rst index 14239ee826bf..00c1b7b0e907 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-intro.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-intro.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ********************** Standard Image Formats diff --git a/Documentation/userspace-api/media/v4l/pixfmt-inzi.rst b/Documentation/userspace-api/media/v4l/pixfmt-inzi.rst index 3115c8f6a842..0af3a303a7f0 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-inzi.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-inzi.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-INZI: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-m420.rst b/Documentation/userspace-api/media/v4l/pixfmt-m420.rst index c01a949e7c11..f44a6c5eaddf 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-m420.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-m420.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-M420: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-packed-hsv.rst b/Documentation/userspace-api/media/v4l/pixfmt-packed-hsv.rst index dd89860f50e0..d1cab3c632f1 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-packed-hsv.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-packed-hsv.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _packed-hsv: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst b/Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst index 9f111ed594d2..ae7d88ae1c3d 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _packed-yuv: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst index ac52485252d9..1cf6c59f4bc4 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _pixfmt-reserved: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-rgb.rst b/Documentation/userspace-api/media/v4l/pixfmt-rgb.rst index 5ed4d62df909..cf6760bb6109 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-rgb.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _pixfmt-rgb: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs08.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs08.rst index bd6ee6111de4..b2dda90409d9 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs08.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs08.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-sdr-fmt-cs8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs14le.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs14le.rst index ea21b288d357..df8b4b22ebce 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs14le.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cs14le.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-CS14LE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu08.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu08.rst index 45fce09d85ff..86accef8f9f4 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu08.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu08.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-sdr-fmt-cu8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu16le.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu16le.rst index 7f4242f8da6f..13d8c86e9b1d 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu16le.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-cu16le.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-CU16LE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu16be.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu16be.rst index a4d4b70ece63..9c4908d57a25 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu16be.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu16be.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-PCU16BE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu18be.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu18be.rst index 3db690bd683a..56c3f2aee0a4 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu18be.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu18be.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-PCU18BE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu20be.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu20be.rst index 485343cdf150..1992ee5dd2bc 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu20be.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-pcu20be.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-PCU20BE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-sdr-ru12le.rst b/Documentation/userspace-api/media/v4l/pixfmt-sdr-ru12le.rst index 2ad4706bfc7a..3b2a94e64bcd 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-sdr-ru12le.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-sdr-ru12le.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-SDR-FMT-RU12LE: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst index 3322b0600f1d..de4720dba48a 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb10-ipu3.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-pix-fmt-ipu3-sbggr10: .. _v4l2-pix-fmt-ipu3-sgbrg10: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb10.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb10.rst index a66414ab4291..6b4950ad54e0 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb10.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb10.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB10: .. _v4l2-pix-fmt-sbggr10: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb10alaw8.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb10alaw8.rst index a5ae1f099e68..42176c437ebe 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb10alaw8.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb10alaw8.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SBGGR10ALAW8: .. _v4l2-pix-fmt-sgbrg10alaw8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb10dpcm8.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb10dpcm8.rst index f0544c6f4580..dac580181562 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb10dpcm8.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb10dpcm8.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SBGGR10DPCM8: .. _v4l2-pix-fmt-sgbrg10dpcm8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb10p.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb10p.rst index fd5feb415531..af91f12c24e8 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb10p.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb10p.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB10P: .. _v4l2-pix-fmt-sbggr10p: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb12.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb12.rst index 15c34e1e4835..2b3212ef732f 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb12.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb12.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB12: .. _v4l2-pix-fmt-sbggr12: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb12p.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb12p.rst index 8c03aedcc00e..cffb3dfc338a 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb12p.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb12p.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB12P: .. _v4l2-pix-fmt-sbggr12p: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb14.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb14.rst index 4f5120a6c678..7a3552c045a3 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb14.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb14.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB14: .. _v4l2-pix-fmt-sbggr14: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb14p.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb14p.rst index f4f53d7dbdeb..330197aded11 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb14p.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb14p.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB14P: .. _v4l2-pix-fmt-sbggr14p: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb16.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb16.rst index 2f2f1ef430d9..dab222f49522 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb16.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb16.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB16: .. _v4l2-pix-fmt-sbggr16: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb8-pisp-comp.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb8-pisp-comp.rst index 5a82a15559d6..7a55a3c7c9f6 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb8-pisp-comp.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb8-pisp-comp.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-pix-fmt-pisp-comp1-rggb: .. _v4l2-pix-fmt-pisp-comp1-grbg: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-srggb8.rst b/Documentation/userspace-api/media/v4l/pixfmt-srggb8.rst index 02061c5a9778..4cb263a6ea26 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-srggb8.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-srggb8.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-SRGGB8: .. _v4l2-pix-fmt-sbggr8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-tch-td08.rst b/Documentation/userspace-api/media/v4l/pixfmt-tch-td08.rst index ec89f43c60ec..37b03da07cf4 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-tch-td08.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-tch-td08.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-TCH-FMT-DELTA-TD08: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-tch-td16.rst b/Documentation/userspace-api/media/v4l/pixfmt-tch-td16.rst index 7b59a6424243..66d3d7041550 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-tch-td16.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-tch-td16.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-TCH-FMT-DELTA-TD16: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-tch-tu08.rst b/Documentation/userspace-api/media/v4l/pixfmt-tch-tu08.rst index 63c5264b8668..b10bb7bad025 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-tch-tu08.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-tch-tu08.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-TCH-FMT-TU08: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-tch-tu16.rst b/Documentation/userspace-api/media/v4l/pixfmt-tch-tu16.rst index ade618a037a8..889298d010a1 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-tch-tu16.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-tch-tu16.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-TCH-FMT-TU16: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-uv8.rst b/Documentation/userspace-api/media/v4l/pixfmt-uv8.rst index ff1d73ef5dba..8fa97b57ad75 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-uv8.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-uv8.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-UV8: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-v4l2-mplane.rst b/Documentation/userspace-api/media/v4l/pixfmt-v4l2-mplane.rst index ad4da988c3a3..7069b2a6b0b1 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-v4l2-mplane.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-v4l2-mplane.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ****************************** Multi-planar format structures diff --git a/Documentation/userspace-api/media/v4l/pixfmt-v4l2.rst b/Documentation/userspace-api/media/v4l/pixfmt-v4l2.rst index 9c423ffe02f9..995267741a26 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-v4l2.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-v4l2.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ****************************** Single-planar format structure diff --git a/Documentation/userspace-api/media/v4l/pixfmt-y12i.rst b/Documentation/userspace-api/media/v4l/pixfmt-y12i.rst index d9b539381d74..b4223ce3506c 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-y12i.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-y12i.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-Y12I: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-y16i.rst b/Documentation/userspace-api/media/v4l/pixfmt-y16i.rst index 74ba9e910a38..51f216f24e41 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-y16i.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-y16i.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-Y16I: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-y8i.rst b/Documentation/userspace-api/media/v4l/pixfmt-y8i.rst index 770ed4749c14..c5a3648d37e5 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-y8i.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-y8i.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-Y8I: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst index 74df19be91f6..99bcc6d385b7 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _yuv-luma-only: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst index 6e4f399f1f88..0631919bd667 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. planar-yuv: diff --git a/Documentation/userspace-api/media/v4l/pixfmt-z16.rst b/Documentation/userspace-api/media/v4l/pixfmt-z16.rst index 54a8cd723d1a..3ab8844d2e6f 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-z16.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-z16.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _V4L2-PIX-FMT-Z16: diff --git a/Documentation/userspace-api/media/v4l/pixfmt.rst b/Documentation/userspace-api/media/v4l/pixfmt.rst index 11dab4a90630..71b29267488f 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _pixfmt: diff --git a/Documentation/userspace-api/media/v4l/planar-apis.rst b/Documentation/userspace-api/media/v4l/planar-apis.rst index 9207ce4283df..075754f0e423 100644 --- a/Documentation/userspace-api/media/v4l/planar-apis.rst +++ b/Documentation/userspace-api/media/v4l/planar-apis.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _planar-apis: diff --git a/Documentation/userspace-api/media/v4l/querycap.rst b/Documentation/userspace-api/media/v4l/querycap.rst index 15a90271af45..c96f7654c870 100644 --- a/Documentation/userspace-api/media/v4l/querycap.rst +++ b/Documentation/userspace-api/media/v4l/querycap.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _querycap: diff --git a/Documentation/userspace-api/media/v4l/sdr-formats.rst b/Documentation/userspace-api/media/v4l/sdr-formats.rst index d8bdfdb56911..df76b7d2aaf2 100644 --- a/Documentation/userspace-api/media/v4l/sdr-formats.rst +++ b/Documentation/userspace-api/media/v4l/sdr-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _sdr-formats: diff --git a/Documentation/userspace-api/media/v4l/selection-api-configuration.rst b/Documentation/userspace-api/media/v4l/selection-api-configuration.rst index fee49bf1a1c0..978c401f4252 100644 --- a/Documentation/userspace-api/media/v4l/selection-api-configuration.rst +++ b/Documentation/userspace-api/media/v4l/selection-api-configuration.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ************* Configuration diff --git a/Documentation/userspace-api/media/v4l/selection-api-examples.rst b/Documentation/userspace-api/media/v4l/selection-api-examples.rst index 5f8e8a1f59d7..3cf7c067f20f 100644 --- a/Documentation/userspace-api/media/v4l/selection-api-examples.rst +++ b/Documentation/userspace-api/media/v4l/selection-api-examples.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ******** Examples diff --git a/Documentation/userspace-api/media/v4l/selection-api-intro.rst b/Documentation/userspace-api/media/v4l/selection-api-intro.rst index 6534854ae9f7..817e660ce016 100644 --- a/Documentation/userspace-api/media/v4l/selection-api-intro.rst +++ b/Documentation/userspace-api/media/v4l/selection-api-intro.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ************ Introduction diff --git a/Documentation/userspace-api/media/v4l/selection-api-targets.rst b/Documentation/userspace-api/media/v4l/selection-api-targets.rst index 50fdadd5b307..e1aaaa3a7123 100644 --- a/Documentation/userspace-api/media/v4l/selection-api-targets.rst +++ b/Documentation/userspace-api/media/v4l/selection-api-targets.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L ***************** Selection targets diff --git a/Documentation/userspace-api/media/v4l/selection-api-vs-crop-api.rst b/Documentation/userspace-api/media/v4l/selection-api-vs-crop-api.rst index f57b9180012c..0c0d66a0cfe6 100644 --- a/Documentation/userspace-api/media/v4l/selection-api-vs-crop-api.rst +++ b/Documentation/userspace-api/media/v4l/selection-api-vs-crop-api.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _selection-vs-crop: diff --git a/Documentation/userspace-api/media/v4l/selection-api.rst b/Documentation/userspace-api/media/v4l/selection-api.rst index 0360743746dc..1320eb632272 100644 --- a/Documentation/userspace-api/media/v4l/selection-api.rst +++ b/Documentation/userspace-api/media/v4l/selection-api.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _selection-api: diff --git a/Documentation/userspace-api/media/v4l/selections-common.rst b/Documentation/userspace-api/media/v4l/selections-common.rst index 322b39cf0eba..e08da7a9b599 100644 --- a/Documentation/userspace-api/media/v4l/selections-common.rst +++ b/Documentation/userspace-api/media/v4l/selections-common.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-selections-common: diff --git a/Documentation/userspace-api/media/v4l/standard.rst b/Documentation/userspace-api/media/v4l/standard.rst index 1f6678325da9..53818e37db5f 100644 --- a/Documentation/userspace-api/media/v4l/standard.rst +++ b/Documentation/userspace-api/media/v4l/standard.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _standard: diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst index 2a94371448dc..1904390df830 100644 --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-mbus-format: diff --git a/Documentation/userspace-api/media/v4l/tch-formats.rst b/Documentation/userspace-api/media/v4l/tch-formats.rst index 8c941ff9e200..a382d1c20eb3 100644 --- a/Documentation/userspace-api/media/v4l/tch-formats.rst +++ b/Documentation/userspace-api/media/v4l/tch-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _tch-formats: diff --git a/Documentation/userspace-api/media/v4l/tuner.rst b/Documentation/userspace-api/media/v4l/tuner.rst index e2c53c3abdc6..c82f68d2f900 100644 --- a/Documentation/userspace-api/media/v4l/tuner.rst +++ b/Documentation/userspace-api/media/v4l/tuner.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _tuner: diff --git a/Documentation/userspace-api/media/v4l/user-func.rst b/Documentation/userspace-api/media/v4l/user-func.rst index 6f661138801c..5fc95c792408 100644 --- a/Documentation/userspace-api/media/v4l/user-func.rst +++ b/Documentation/userspace-api/media/v4l/user-func.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _user-func: diff --git a/Documentation/userspace-api/media/v4l/v4l2-selection-flags.rst b/Documentation/userspace-api/media/v4l/v4l2-selection-flags.rst index 1cb1531c1e52..6aa00b613148 100644 --- a/Documentation/userspace-api/media/v4l/v4l2-selection-flags.rst +++ b/Documentation/userspace-api/media/v4l/v4l2-selection-flags.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-selection-flags: diff --git a/Documentation/userspace-api/media/v4l/v4l2-selection-targets.rst b/Documentation/userspace-api/media/v4l/v4l2-selection-targets.rst index b46bae984f35..e9fd4b4bad42 100644 --- a/Documentation/userspace-api/media/v4l/v4l2-selection-targets.rst +++ b/Documentation/userspace-api/media/v4l/v4l2-selection-targets.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2-selection-targets: diff --git a/Documentation/userspace-api/media/v4l/v4l2.rst b/Documentation/userspace-api/media/v4l/v4l2.rst index 64fb264fb6c4..be07b717ebe0 100644 --- a/Documentation/userspace-api/media/v4l/v4l2.rst +++ b/Documentation/userspace-api/media/v4l/v4l2.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. include:: <isonum.txt> .. _v4l2spec: diff --git a/Documentation/userspace-api/media/v4l/v4l2grab-example.rst b/Documentation/userspace-api/media/v4l/v4l2grab-example.rst index b323be42c580..b2472d4b0e3f 100644 --- a/Documentation/userspace-api/media/v4l/v4l2grab-example.rst +++ b/Documentation/userspace-api/media/v4l/v4l2grab-example.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _v4l2grab-example: diff --git a/Documentation/userspace-api/media/v4l/v4l2grab.c.rst b/Documentation/userspace-api/media/v4l/v4l2grab.c.rst index 1a55e3617ea8..c958db1e0211 100644 --- a/Documentation/userspace-api/media/v4l/v4l2grab.c.rst +++ b/Documentation/userspace-api/media/v4l/v4l2grab.c.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L file: media/v4l/v4l2grab.c ========================== diff --git a/Documentation/userspace-api/media/v4l/video.rst b/Documentation/userspace-api/media/v4l/video.rst index f8f69a57602c..25cb854c1101 100644 --- a/Documentation/userspace-api/media/v4l/video.rst +++ b/Documentation/userspace-api/media/v4l/video.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _video: diff --git a/Documentation/userspace-api/media/v4l/videodev.rst b/Documentation/userspace-api/media/v4l/videodev.rst index cde485bc9a5f..0b71a60928fb 100644 --- a/Documentation/userspace-api/media/v4l/videodev.rst +++ b/Documentation/userspace-api/media/v4l/videodev.rst @@ -1,11 +1,14 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _videodev: -******************************* -Video For Linux Two Header File -******************************* +*************************************** +Video For Linux Two Header uAPI Symbols +*************************************** .. kernel-include:: include/uapi/linux/videodev2.h :generate-cross-refs: :exception-file: videodev2.h.rst.exceptions + :toc: + :warn-broken: diff --git a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions index 35d3456cc812..c41693115db6 100644 --- a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions +++ b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions @@ -1,5 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 +# All symbols are mapped inside V4L C domain namespace +namespace V4L + # Ignore header name ignore define _UAPI__LINUX_VIDEODEV2_H @@ -15,157 +18,158 @@ ignore define _UAPI__LINUX_VIDEODEV2_H ignore symbol V4L2_BUF_TYPE_PRIVATE ignore symbol V4L2_TUNER_DIGITAL_TV ignore symbol V4L2_COLORSPACE_BT878 +ignore struct __kernel_v4l2_timeval # Documented enum v4l2_field -replace symbol V4L2_FIELD_ALTERNATE :c:type:`v4l2_field` -replace symbol V4L2_FIELD_ANY :c:type:`v4l2_field` -replace symbol V4L2_FIELD_BOTTOM :c:type:`v4l2_field` -replace symbol V4L2_FIELD_INTERLACED :c:type:`v4l2_field` -replace symbol V4L2_FIELD_INTERLACED_BT :c:type:`v4l2_field` -replace symbol V4L2_FIELD_INTERLACED_TB :c:type:`v4l2_field` -replace symbol V4L2_FIELD_NONE :c:type:`v4l2_field` -replace symbol V4L2_FIELD_SEQ_BT :c:type:`v4l2_field` -replace symbol V4L2_FIELD_SEQ_TB :c:type:`v4l2_field` -replace symbol V4L2_FIELD_TOP :c:type:`v4l2_field` +replace symbol V4L2_FIELD_ALTERNATE :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_ANY :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_BOTTOM :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_INTERLACED :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_INTERLACED_BT :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_INTERLACED_TB :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_NONE :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_SEQ_BT :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_SEQ_TB :c:type:`V4L.v4l2_field` +replace symbol V4L2_FIELD_TOP :c:type:`V4L.v4l2_field` # Documented enum v4l2_buf_type -replace symbol V4L2_BUF_TYPE_META_CAPTURE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_META_OUTPUT :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_SDR_CAPTURE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_SDR_OUTPUT :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_SLICED_VBI_CAPTURE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_SLICED_VBI_OUTPUT :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VBI_CAPTURE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VBI_OUTPUT :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_CAPTURE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY :c:type:`v4l2_buf_type` -replace symbol V4L2_BUF_TYPE_VIDEO_OVERLAY :c:type:`v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_META_CAPTURE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_META_OUTPUT :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_SDR_CAPTURE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_SDR_OUTPUT :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_SLICED_VBI_CAPTURE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_SLICED_VBI_OUTPUT :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VBI_CAPTURE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VBI_OUTPUT :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_CAPTURE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY :c:type:`V4L.v4l2_buf_type` +replace symbol V4L2_BUF_TYPE_VIDEO_OVERLAY :c:type:`V4L.v4l2_buf_type` # Documented enum v4l2_tuner_type -replace symbol V4L2_TUNER_ANALOG_TV :c:type:`v4l2_tuner_type` -replace symbol V4L2_TUNER_RADIO :c:type:`v4l2_tuner_type` -replace symbol V4L2_TUNER_RF :c:type:`v4l2_tuner_type` -replace symbol V4L2_TUNER_SDR :c:type:`v4l2_tuner_type` +replace symbol V4L2_TUNER_ANALOG_TV :c:type:`V4L.v4l2_tuner_type` +replace symbol V4L2_TUNER_RADIO :c:type:`V4L.v4l2_tuner_type` +replace symbol V4L2_TUNER_RF :c:type:`V4L.v4l2_tuner_type` +replace symbol V4L2_TUNER_SDR :c:type:`V4L.v4l2_tuner_type` # Documented enum v4l2_memory -replace symbol V4L2_MEMORY_DMABUF :c:type:`v4l2_memory` -replace symbol V4L2_MEMORY_MMAP :c:type:`v4l2_memory` -replace symbol V4L2_MEMORY_OVERLAY :c:type:`v4l2_memory` -replace symbol V4L2_MEMORY_USERPTR :c:type:`v4l2_memory` +replace symbol V4L2_MEMORY_DMABUF :c:type:`V4L.v4l2_memory` +replace symbol V4L2_MEMORY_MMAP :c:type:`V4L.v4l2_memory` +replace symbol V4L2_MEMORY_OVERLAY :c:type:`V4L.v4l2_memory` +replace symbol V4L2_MEMORY_USERPTR :c:type:`V4L.v4l2_memory` # Documented enum v4l2_colorspace -replace symbol V4L2_COLORSPACE_470_SYSTEM_BG :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_470_SYSTEM_M :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_OPRGB :c:type:`v4l2_colorspace` -replace define V4L2_COLORSPACE_ADOBERGB :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_BT2020 :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_DCI_P3 :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_DEFAULT :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_JPEG :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_RAW :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_REC709 :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_SMPTE170M :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_SMPTE240M :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_SRGB :c:type:`v4l2_colorspace` -replace symbol V4L2_COLORSPACE_LAST :c:type:`v4l2_colorspace` +replace symbol V4L2_COLORSPACE_470_SYSTEM_BG :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_470_SYSTEM_M :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_OPRGB :c:type:`V4L.v4l2_colorspace` +replace define V4L2_COLORSPACE_ADOBERGB :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_BT2020 :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_DCI_P3 :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_DEFAULT :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_JPEG :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_RAW :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_REC709 :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_SMPTE170M :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_SMPTE240M :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_SRGB :c:type:`V4L.v4l2_colorspace` +replace symbol V4L2_COLORSPACE_LAST :c:type:`V4L.v4l2_colorspace` # Documented enum v4l2_xfer_func -replace symbol V4L2_XFER_FUNC_709 :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_OPRGB :c:type:`v4l2_xfer_func` -replace define V4L2_XFER_FUNC_ADOBERGB :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_DCI_P3 :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_DEFAULT :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_NONE :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_SMPTE2084 :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_SMPTE240M :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_SRGB :c:type:`v4l2_xfer_func` -replace symbol V4L2_XFER_FUNC_LAST :c:type:`v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_709 :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_OPRGB :c:type:`V4L.v4l2_xfer_func` +replace define V4L2_XFER_FUNC_ADOBERGB :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_DCI_P3 :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_DEFAULT :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_NONE :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_SMPTE2084 :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_SMPTE240M :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_SRGB :c:type:`V4L.v4l2_xfer_func` +replace symbol V4L2_XFER_FUNC_LAST :c:type:`V4L.v4l2_xfer_func` # Documented enum v4l2_ycbcr_encoding -replace symbol V4L2_YCBCR_ENC_601 :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_709 :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_BT2020 :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_BT2020_CONST_LUM :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_DEFAULT :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_SYCC :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_XV601 :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_XV709 :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_SMPTE240M :c:type:`v4l2_ycbcr_encoding` -replace symbol V4L2_YCBCR_ENC_LAST :c:type:`v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_601 :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_709 :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_BT2020 :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_BT2020_CONST_LUM :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_DEFAULT :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_SYCC :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_XV601 :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_XV709 :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_SMPTE240M :c:type:`V4L.v4l2_ycbcr_encoding` +replace symbol V4L2_YCBCR_ENC_LAST :c:type:`V4L.v4l2_ycbcr_encoding` # Documented enum v4l2_hsv_encoding -replace symbol V4L2_HSV_ENC_180 :c:type:`v4l2_hsv_encoding` -replace symbol V4L2_HSV_ENC_256 :c:type:`v4l2_hsv_encoding` +replace symbol V4L2_HSV_ENC_180 :c:type:`V4L.v4l2_hsv_encoding` +replace symbol V4L2_HSV_ENC_256 :c:type:`V4L.v4l2_hsv_encoding` # Documented enum v4l2_quantization -replace symbol V4L2_QUANTIZATION_DEFAULT :c:type:`v4l2_quantization` -replace symbol V4L2_QUANTIZATION_FULL_RANGE :c:type:`v4l2_quantization` -replace symbol V4L2_QUANTIZATION_LIM_RANGE :c:type:`v4l2_quantization` +replace symbol V4L2_QUANTIZATION_DEFAULT :c:type:`V4L.v4l2_quantization` +replace symbol V4L2_QUANTIZATION_FULL_RANGE :c:type:`V4L.v4l2_quantization` +replace symbol V4L2_QUANTIZATION_LIM_RANGE :c:type:`V4L.v4l2_quantization` # Documented enum v4l2_priority -replace symbol V4L2_PRIORITY_BACKGROUND :c:type:`v4l2_priority` -replace symbol V4L2_PRIORITY_DEFAULT :c:type:`v4l2_priority` -replace symbol V4L2_PRIORITY_INTERACTIVE :c:type:`v4l2_priority` -replace symbol V4L2_PRIORITY_RECORD :c:type:`v4l2_priority` -replace symbol V4L2_PRIORITY_UNSET :c:type:`v4l2_priority` +replace symbol V4L2_PRIORITY_BACKGROUND :c:type:`V4L.v4l2_priority` +replace symbol V4L2_PRIORITY_DEFAULT :c:type:`V4L.v4l2_priority` +replace symbol V4L2_PRIORITY_INTERACTIVE :c:type:`V4L.v4l2_priority` +replace symbol V4L2_PRIORITY_RECORD :c:type:`V4L.v4l2_priority` +replace symbol V4L2_PRIORITY_UNSET :c:type:`V4L.v4l2_priority` # Documented enum v4l2_frmsizetypes -replace symbol V4L2_FRMSIZE_TYPE_CONTINUOUS :c:type:`v4l2_frmsizetypes` -replace symbol V4L2_FRMSIZE_TYPE_DISCRETE :c:type:`v4l2_frmsizetypes` -replace symbol V4L2_FRMSIZE_TYPE_STEPWISE :c:type:`v4l2_frmsizetypes` +replace symbol V4L2_FRMSIZE_TYPE_CONTINUOUS :c:type:`V4L.v4l2_frmsizetypes` +replace symbol V4L2_FRMSIZE_TYPE_DISCRETE :c:type:`V4L.v4l2_frmsizetypes` +replace symbol V4L2_FRMSIZE_TYPE_STEPWISE :c:type:`V4L.v4l2_frmsizetypes` # Documented enum frmivaltypes -replace symbol V4L2_FRMIVAL_TYPE_CONTINUOUS :c:type:`v4l2_frmivaltypes` -replace symbol V4L2_FRMIVAL_TYPE_DISCRETE :c:type:`v4l2_frmivaltypes` -replace symbol V4L2_FRMIVAL_TYPE_STEPWISE :c:type:`v4l2_frmivaltypes` +replace symbol V4L2_FRMIVAL_TYPE_CONTINUOUS :c:type:`V4L.v4l2_frmivaltypes` +replace symbol V4L2_FRMIVAL_TYPE_DISCRETE :c:type:`V4L.v4l2_frmivaltypes` +replace symbol V4L2_FRMIVAL_TYPE_STEPWISE :c:type:`V4L.v4l2_frmivaltypes` -# Documented enum :c:type:`v4l2_ctrl_type` +# Documented enum :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_COMPOUND_TYPES vidioc_queryctrl -replace symbol V4L2_CTRL_TYPE_BITMASK :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_BOOLEAN :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_BUTTON :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_CTRL_CLASS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_INTEGER :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_INTEGER64 :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_INTEGER_MENU :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_MENU :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_STRING :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_U16 :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_PRED_WEIGHTS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_AREA :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_RECT :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_FWHT_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_VP8_FRAME :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_VP9_FRAME :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HDR10_CLL_INFO :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_AV1_SEQUENCE :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_AV1_FRAME :c:type:`v4l2_ctrl_type` -replace symbol V4L2_CTRL_TYPE_AV1_FILM_GRAIN :c:type:`v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_BITMASK :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_BOOLEAN :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_BUTTON :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_CTRL_CLASS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_INTEGER :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_INTEGER64 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_INTEGER_MENU :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_MENU :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_STRING :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_U16 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_U32 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_U8 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_PRED_WEIGHTS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_AREA :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_RECT :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_FWHT_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_VP8_FRAME :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_VP9_FRAME :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HDR10_CLL_INFO :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_AV1_SEQUENCE :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_AV1_FRAME :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_AV1_FILM_GRAIN :c:type:`V4L.v4l2_ctrl_type` # V4L2 capability defines replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities @@ -201,10 +205,10 @@ replace define V4L2_CAP_IO_MC device-capabilities replace define V4L2_CAP_EDID device-capabilities # V4L2 pix flags -replace define V4L2_PIX_FMT_PRIV_MAGIC :c:type:`v4l2_pix_format` +replace define V4L2_PIX_FMT_PRIV_MAGIC :c:type:`V4L.v4l2_pix_format` replace define V4L2_PIX_FMT_FLAG_PREMUL_ALPHA format-flags -replace define V4L2_PIX_FMT_HM12 :c:type:`v4l2_pix_format` -replace define V4L2_PIX_FMT_SUNXI_TILED_NV12 :c:type:`v4l2_pix_format` +replace define V4L2_PIX_FMT_HM12 :c:type:`V4L.v4l2_pix_format` +replace define V4L2_PIX_FMT_SUNXI_TILED_NV12 :c:type:`V4L.v4l2_pix_format` # V4L2 format flags replace define V4L2_FMT_FLAG_COMPRESSED fmtdesc-flags @@ -263,7 +267,7 @@ replace define V4L2_FBUF_FLAG_SRC_CHROMAKEY framebuffer-flags # Used on VIDIOC_G_PARM replace define V4L2_MODE_HIGHQUALITY parm-flags -replace define V4L2_CAP_TIMEPERFRAME :c:type:`v4l2_captureparm` +replace define V4L2_CAP_TIMEPERFRAME :c:type:`V4L.v4l2_captureparm` # The V4L2_STD_foo are all defined at v4l2_std_id table @@ -316,11 +320,11 @@ replace define V4L2_STD_ALL v4l2-std-id # V4L2 DT BT timings definitions -replace define V4L2_DV_PROGRESSIVE :c:type:`v4l2_bt_timings` -replace define V4L2_DV_INTERLACED :c:type:`v4l2_bt_timings` +replace define V4L2_DV_PROGRESSIVE :c:type:`V4L.v4l2_bt_timings` +replace define V4L2_DV_INTERLACED :c:type:`V4L.v4l2_bt_timings` -replace define V4L2_DV_VSYNC_POS_POL :c:type:`v4l2_bt_timings` -replace define V4L2_DV_HSYNC_POS_POL :c:type:`v4l2_bt_timings` +replace define V4L2_DV_VSYNC_POS_POL :c:type:`V4L.v4l2_bt_timings` +replace define V4L2_DV_HSYNC_POS_POL :c:type:`V4L.v4l2_bt_timings` replace define V4L2_DV_BT_STD_CEA861 dv-bt-standards replace define V4L2_DV_BT_STD_DMT dv-bt-standards @@ -456,11 +460,11 @@ replace define V4L2_AUDMODE_AVL audio-mode # MPEG -replace define V4L2_ENC_IDX_FRAME_I :c:type:`v4l2_enc_idx` -replace define V4L2_ENC_IDX_FRAME_P :c:type:`v4l2_enc_idx` -replace define V4L2_ENC_IDX_FRAME_B :c:type:`v4l2_enc_idx` -replace define V4L2_ENC_IDX_FRAME_MASK :c:type:`v4l2_enc_idx` -replace define V4L2_ENC_IDX_ENTRIES :c:type:`v4l2_enc_idx` +replace define V4L2_ENC_IDX_FRAME_I :c:type:`V4L.v4l2_enc_idx` +replace define V4L2_ENC_IDX_FRAME_P :c:type:`V4L.v4l2_enc_idx` +replace define V4L2_ENC_IDX_FRAME_B :c:type:`V4L.v4l2_enc_idx` +replace define V4L2_ENC_IDX_FRAME_MASK :c:type:`V4L.v4l2_enc_idx` +replace define V4L2_ENC_IDX_ENTRIES :c:type:`V4L.v4l2_enc_idx` replace define V4L2_ENC_CMD_START encoder-cmds replace define V4L2_ENC_CMD_STOP encoder-cmds @@ -488,10 +492,10 @@ replace define V4L2_DEC_START_FMT_GOP decoder-cmds replace define V4L2_VBI_UNSYNC vbifmt-flags replace define V4L2_VBI_INTERLACED vbifmt-flags -replace define V4L2_VBI_ITU_525_F1_START :c:type:`v4l2_vbi_format` -replace define V4L2_VBI_ITU_525_F2_START :c:type:`v4l2_vbi_format` -replace define V4L2_VBI_ITU_625_F1_START :c:type:`v4l2_vbi_format` -replace define V4L2_VBI_ITU_625_F2_START :c:type:`v4l2_vbi_format` +replace define V4L2_VBI_ITU_525_F1_START :c:type:`V4L.v4l2_vbi_format` +replace define V4L2_VBI_ITU_525_F2_START :c:type:`V4L.v4l2_vbi_format` +replace define V4L2_VBI_ITU_625_F1_START :c:type:`V4L.v4l2_vbi_format` +replace define V4L2_VBI_ITU_625_F2_START :c:type:`V4L.v4l2_vbi_format` replace define V4L2_SLICED_TELETEXT_B vbi-services @@ -527,7 +531,7 @@ replace define V4L2_EVENT_CTRL_CH_DIMENSIONS ctrl-changes-flags replace define V4L2_EVENT_SRC_CH_RESOLUTION src-changes-flags -replace define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ :c:type:`v4l2_event_motion_det` +replace define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ :c:type:`V4L.v4l2_event_motion_det` replace define V4L2_EVENT_SUB_FL_SEND_INITIAL event-flags replace define V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK event-flags diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst index 3549417c7feb..c8baa9430c14 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst @@ -15,6 +15,8 @@ VIDIOC_QUERYCTRL - VIDIOC_QUERY_EXT_CTRL - VIDIOC_QUERYMENU - Enumerate controls Synopsis ======== +.. c:macro:: VIDIOC_QUERY_CTRL + ``int ioctl(int fd, int VIDIOC_QUERYCTRL, struct v4l2_queryctrl *argp)`` .. c:macro:: VIDIOC_QUERY_EXT_CTRL @@ -98,6 +100,8 @@ See also the examples in :ref:`control`. .. _v4l2-queryctrl: +.. c:struct:: v4l2_queryctrl + .. cssclass:: longtable .. flat-table:: struct v4l2_queryctrl @@ -178,6 +182,8 @@ See also the examples in :ref:`control`. .. cssclass:: longtable +.. c:struct:: v4l2_query_ext_ctrl + .. flat-table:: struct v4l2_query_ext_ctrl :header-rows: 0 :stub-columns: 0 @@ -276,6 +282,8 @@ See also the examples in :ref:`control`. .. _v4l2-querymenu: +.. c:struct:: v4l2_querymenu + .. flat-table:: struct v4l2_querymenu :header-rows: 0 :stub-columns: 0 diff --git a/Documentation/userspace-api/media/v4l/yuv-formats.rst b/Documentation/userspace-api/media/v4l/yuv-formats.rst index 78ee406d7647..c5ef408470a5 100644 --- a/Documentation/userspace-api/media/v4l/yuv-formats.rst +++ b/Documentation/userspace-api/media/v4l/yuv-formats.rst @@ -1,4 +1,5 @@ .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later +.. c:namespace:: V4L .. _yuv-formats: diff --git a/Documentation/userspace-api/spec_ctrl.rst b/Documentation/userspace-api/spec_ctrl.rst index 5e8ed9eef9aa..ca89151fc0a8 100644 --- a/Documentation/userspace-api/spec_ctrl.rst +++ b/Documentation/userspace-api/spec_ctrl.rst @@ -26,7 +26,8 @@ PR_GET_SPECULATION_CTRL PR_GET_SPECULATION_CTRL returns the state of the speculation misfeature which is selected with arg2 of prctl(2). The return value uses bits 0-3 with -the following meaning: +the following meaning (with the caveat that PR_SPEC_L1D_FLUSH has less obvious +semantics, see documentation for that specific control below): ==== ====================== ================================================== Bit Define Description @@ -110,6 +111,9 @@ Speculation misfeature controls - PR_SPEC_L1D_FLUSH: Flush L1D Cache on context switch out of the task (works only when tasks run on non SMT cores) +For this control, PR_SPEC_ENABLE means that the **mitigation** is enabled (L1D +is flushed), PR_SPEC_DISABLE means it is disabled. + Invocations: * prctl(PR_GET_SPECULATION_CTRL, PR_SPEC_L1D_FLUSH, 0, 0, 0); * prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_L1D_FLUSH, PR_SPEC_ENABLE, 0, 0); diff --git a/Documentation/w1/w1-netlink.rst b/Documentation/w1/w1-netlink.rst index be4f7b82dcb4..ff281713e626 100644 --- a/Documentation/w1/w1-netlink.rst +++ b/Documentation/w1/w1-netlink.rst @@ -196,7 +196,7 @@ Additional documentation, source code examples ============================================== 1. Documentation/driver-api/connector.rst -2. http://www.ioremap.net/archive/w1 +2. https://github.com/bioothod/w1 This archive includes userspace application w1d.c which uses read/write/search commands for all master/slave devices found on the bus. |
