mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'docs-6.17' of git://git.lwn.net/linux
Pull documentation updates from Jonathan Corbet:
"It has been a relatively busy cycle for docs, especially the build
system:
- The Perl kernel-doc script was added to 2.3.52pre1 just after the
turn of the millennium. Over the following 25 years, it accumulated
a vast amount of cruft, all in a language few people want to deal
with anymore. Mauro's Python replacement in 6.16 faithfully
reproduced all of the cruft in the hope of avoiding regressions.
Now that we have a more reasonable code base, though, we can work
on cleaning it up; many of the changes this time around are toward
that end.
- A reorganization of the ext4 docs into the usual TOC format.
- Various Chinese translations and updates.
- A new script from Mauro to help with docs-build testing.
- A new document for linked lists
- A sweep through MAINTAINERS fixing broken GitHub git:// repository
links.
...and lots of fixes and updates"
* tag 'docs-6.17' of git://git.lwn.net/linux: (147 commits)
scripts: add origin commit identification based on specific patterns
sphinx: kernel_abi: fix performance regression with O=<dir>
Documentation: core-api: entry: Replace deprecated KVM entry/exit functions
docs: fault-injection: drop reference to md-faulty
docs: document linked lists
scripts: kdoc: make it backward-compatible with Python 3.7
docs: kernel-doc: emit warnings for ancient versions of Python
Documentation/rtla: Describe exit status
Documentation/rtla: Add include common_appendix.rst
docs: kernel: Clarify printk_ratelimit_burst reset behavior
Documentation: ioctl-number: Don't repeat macro names
Documentation: ioctl-number: Shorten macros table
Documentation: ioctl-number: Correct full path to papr-physical-attestation.h
Documentation: ioctl-number: Extend "Include File" column width
Documentation: ioctl-number: Fix linuxppc-dev mailto link
overlayfs.rst: fix typos
docs: kdoc: emit a warning for ancient versions of Python
docs: kdoc: clean up check_sections()
docs: kdoc: directly access the always-there KdocItem fields
docs: kdoc: straighten up dump_declaration()
...
This commit is contained in:
@@ -114,6 +114,7 @@ modules.order
|
||||
!.gitignore
|
||||
!.kunitconfig
|
||||
!.mailmap
|
||||
!.pylintrc
|
||||
!.rustfmt.toml
|
||||
|
||||
#
|
||||
|
||||
@@ -46,7 +46,9 @@ Every file in these directories will contain the following information:
|
||||
|
||||
What: Short description of the interface
|
||||
Date: Date created
|
||||
KernelVersion: Kernel version this feature first showed up in.
|
||||
KernelVersion: (Optional) Kernel version this feature first showed up in.
|
||||
Note: git history often provides more accurate version
|
||||
info, so this field may be omitted.
|
||||
Contact: Primary contact for this interface (may be a mailing list)
|
||||
Description: Long description of the interface and how to use it.
|
||||
Users: All users of this interface who wish to be notified when
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
# for cleaning
|
||||
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)
|
||||
@@ -14,6 +15,7 @@ endif
|
||||
ifeq ($(CONFIG_WARN_ABI_ERRORS),y)
|
||||
$(shell $(srctree)/scripts/get_abi.py --dir $(srctree)/Documentation/ABI validate)
|
||||
endif
|
||||
endif
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXBUILD = sphinx-build
|
||||
|
||||
@@ -265,7 +265,7 @@ The final kernel cmdline will be the following::
|
||||
Config File Limitation
|
||||
======================
|
||||
|
||||
Currently the maximum config size size is 32KB and the total key-words (not
|
||||
Currently the maximum config size is 32KB and the total key-words (not
|
||||
key-value entries) must be under 1024 nodes.
|
||||
Note: this is not the number of entries but nodes, an entry must consume
|
||||
more than 2 nodes (a key-word and a value). So theoretically, it will be
|
||||
|
||||
@@ -177,6 +177,7 @@ core_pattern
|
||||
%E executable path
|
||||
%c maximum size of core file by resource limit RLIMIT_CORE
|
||||
%C CPU the task ran on
|
||||
%F pidfd number
|
||||
%<OTHER> both are dropped
|
||||
======== ==========================================
|
||||
|
||||
@@ -1106,7 +1107,8 @@ printk_ratelimit_burst
|
||||
While long term we enforce one message per `printk_ratelimit`_
|
||||
seconds, we do allow a burst of messages to pass through.
|
||||
``printk_ratelimit_burst`` specifies the number of messages we can
|
||||
send before ratelimiting kicks in.
|
||||
send before ratelimiting kicks in. After `printk_ratelimit`_ seconds
|
||||
have elapsed, another burst of messages may be sent.
|
||||
|
||||
The default value is 10 messages.
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ powerpc
|
||||
elf_hwcaps
|
||||
elfnote
|
||||
firmware-assisted-dump
|
||||
htm
|
||||
hvcs
|
||||
imc
|
||||
isa-versions
|
||||
|
||||
+226
-174
File diff suppressed because it is too large
Load Diff
@@ -155,7 +155,7 @@ a device with limitations, it needs to be decreased.
|
||||
|
||||
Special note about PCI: PCI-X specification requires PCI-X devices to support
|
||||
64-bit addressing (DAC) for all transactions. And at least one platform (SGI
|
||||
SN2) requires 64-bit consistent allocations to operate correctly when the IO
|
||||
SN2) requires 64-bit coherent allocations to operate correctly when the IO
|
||||
bus is in PCI-X mode.
|
||||
|
||||
For correct operation, you must set the DMA mask to inform the kernel about
|
||||
@@ -174,7 +174,7 @@ used instead:
|
||||
|
||||
int dma_set_mask(struct device *dev, u64 mask);
|
||||
|
||||
The setup for consistent allocations is performed via a call
|
||||
The setup for coherent allocations is performed via a call
|
||||
to dma_set_coherent_mask()::
|
||||
|
||||
int dma_set_coherent_mask(struct device *dev, u64 mask);
|
||||
@@ -241,7 +241,7 @@ it would look like this::
|
||||
|
||||
The coherent mask will always be able to set the same or a smaller mask as
|
||||
the streaming mask. However for the rare case that a device driver only
|
||||
uses consistent allocations, one would have to check the return value from
|
||||
uses coherent allocations, one would have to check the return value from
|
||||
dma_set_coherent_mask().
|
||||
|
||||
Finally, if your device can only drive the low 24-bits of
|
||||
@@ -298,20 +298,20 @@ Types of DMA mappings
|
||||
|
||||
There are two types of DMA mappings:
|
||||
|
||||
- Consistent DMA mappings which are usually mapped at driver
|
||||
- Coherent DMA mappings which are usually mapped at driver
|
||||
initialization, unmapped at the end and for which the hardware should
|
||||
guarantee that the device and the CPU can access the data
|
||||
in parallel and will see updates made by each other without any
|
||||
explicit software flushing.
|
||||
|
||||
Think of "consistent" as "synchronous" or "coherent".
|
||||
Think of "coherent" as "synchronous".
|
||||
|
||||
The current default is to return consistent memory in the low 32
|
||||
The current default is to return coherent memory in the low 32
|
||||
bits of the DMA space. However, for future compatibility you should
|
||||
set the consistent mask even if this default is fine for your
|
||||
set the coherent mask even if this default is fine for your
|
||||
driver.
|
||||
|
||||
Good examples of what to use consistent mappings for are:
|
||||
Good examples of what to use coherent mappings for are:
|
||||
|
||||
- Network card DMA ring descriptors.
|
||||
- SCSI adapter mailbox command data structures.
|
||||
@@ -320,13 +320,13 @@ There are two types of DMA mappings:
|
||||
|
||||
The invariant these examples all require is that any CPU store
|
||||
to memory is immediately visible to the device, and vice
|
||||
versa. Consistent mappings guarantee this.
|
||||
versa. Coherent mappings guarantee this.
|
||||
|
||||
.. important::
|
||||
|
||||
Consistent DMA memory does not preclude the usage of
|
||||
Coherent DMA memory does not preclude the usage of
|
||||
proper memory barriers. The CPU may reorder stores to
|
||||
consistent memory just as it may normal memory. Example:
|
||||
coherent memory just as it may normal memory. Example:
|
||||
if it is important for the device to see the first word
|
||||
of a descriptor updated before the second, you must do
|
||||
something like::
|
||||
@@ -365,10 +365,10 @@ Also, systems with caches that aren't DMA-coherent will work better
|
||||
when the underlying buffers don't share cache lines with other data.
|
||||
|
||||
|
||||
Using Consistent DMA mappings
|
||||
=============================
|
||||
Using Coherent DMA mappings
|
||||
===========================
|
||||
|
||||
To allocate and map large (PAGE_SIZE or so) consistent DMA regions,
|
||||
To allocate and map large (PAGE_SIZE or so) coherent DMA regions,
|
||||
you should do::
|
||||
|
||||
dma_addr_t dma_handle;
|
||||
@@ -385,10 +385,10 @@ __get_free_pages() (but takes size instead of a page order). If your
|
||||
driver needs regions sized smaller than a page, you may prefer using
|
||||
the dma_pool interface, described below.
|
||||
|
||||
The consistent DMA mapping interfaces, will by default return a DMA address
|
||||
The coherent DMA mapping interfaces, will by default return a DMA address
|
||||
which is 32-bit addressable. Even if the device indicates (via the DMA mask)
|
||||
that it may address the upper 32-bits, consistent allocation will only
|
||||
return > 32-bit addresses for DMA if the consistent DMA mask has been
|
||||
that it may address the upper 32-bits, coherent allocation will only
|
||||
return > 32-bit addresses for DMA if the coherent DMA mask has been
|
||||
explicitly changed via dma_set_coherent_mask(). This is true of the
|
||||
dma_pool interface as well.
|
||||
|
||||
@@ -497,7 +497,7 @@ program address space. Such platforms can and do report errors in the
|
||||
kernel logs when the DMA controller hardware detects violation of the
|
||||
permission setting.
|
||||
|
||||
Only streaming mappings specify a direction, consistent mappings
|
||||
Only streaming mappings specify a direction, coherent mappings
|
||||
implicitly have a direction attribute setting of
|
||||
DMA_BIDIRECTIONAL.
|
||||
|
||||
|
||||
@@ -8,15 +8,15 @@ This document describes the DMA API. For a more gentle introduction
|
||||
of the API (and actual examples), see Documentation/core-api/dma-api-howto.rst.
|
||||
|
||||
This API is split into two pieces. Part I describes the basic API.
|
||||
Part II describes extensions for supporting non-consistent memory
|
||||
Part II describes extensions for supporting non-coherent memory
|
||||
machines. Unless you know that your driver absolutely has to support
|
||||
non-consistent platforms (this is usually only legacy platforms) you
|
||||
non-coherent platforms (this is usually only legacy platforms) you
|
||||
should only use the API described in part I.
|
||||
|
||||
Part I - dma_API
|
||||
Part I - DMA API
|
||||
----------------
|
||||
|
||||
To get the dma_API, you must #include <linux/dma-mapping.h>. This
|
||||
To get the DMA API, you must #include <linux/dma-mapping.h>. This
|
||||
provides dma_addr_t and the interfaces described below.
|
||||
|
||||
A dma_addr_t can hold any valid DMA address for the platform. It can be
|
||||
@@ -33,13 +33,13 @@ Part Ia - Using large DMA-coherent buffers
|
||||
dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
|
||||
Consistent memory is memory for which a write by either the device or
|
||||
Coherent memory is memory for which a write by either the device or
|
||||
the processor can immediately be read by the processor or device
|
||||
without having to worry about caching effects. (You may however need
|
||||
to make sure to flush the processor's write buffers before telling
|
||||
devices to read that memory.)
|
||||
|
||||
This routine allocates a region of <size> bytes of consistent memory.
|
||||
This routine allocates a region of <size> bytes of coherent memory.
|
||||
|
||||
It returns a pointer to the allocated region (in the processor's virtual
|
||||
address space) or NULL if the allocation failed.
|
||||
@@ -48,15 +48,14 @@ It also returns a <dma_handle> which may be cast to an unsigned integer the
|
||||
same width as the bus and given to the device as the DMA address base of
|
||||
the region.
|
||||
|
||||
Note: consistent memory can be expensive on some platforms, and the
|
||||
Note: coherent memory can be expensive on some platforms, and the
|
||||
minimum allocation length may be as big as a page, so you should
|
||||
consolidate your requests for consistent memory as much as possible.
|
||||
consolidate your requests for coherent memory as much as possible.
|
||||
The simplest way to do that is to use the dma_pool calls (see below).
|
||||
|
||||
The flag parameter (dma_alloc_coherent() only) allows the caller to
|
||||
specify the ``GFP_`` flags (see kmalloc()) for the allocation (the
|
||||
implementation may choose to ignore flags that affect the location of
|
||||
the returned memory, like GFP_DMA).
|
||||
The flag parameter allows the caller to specify the ``GFP_`` flags (see
|
||||
kmalloc()) for the allocation (the implementation may ignore flags that affect
|
||||
the location of the returned memory, like GFP_DMA).
|
||||
|
||||
::
|
||||
|
||||
@@ -64,19 +63,18 @@ the returned memory, like GFP_DMA).
|
||||
dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
|
||||
dma_addr_t dma_handle)
|
||||
|
||||
Free a region of consistent memory you previously allocated. dev,
|
||||
size and dma_handle must all be the same as those passed into
|
||||
dma_alloc_coherent(). cpu_addr must be the virtual address returned by
|
||||
the dma_alloc_coherent().
|
||||
Free a previously allocated region of coherent memory. dev, size and dma_handle
|
||||
must all be the same as those passed into dma_alloc_coherent(). cpu_addr must
|
||||
be the virtual address returned by dma_alloc_coherent().
|
||||
|
||||
Note that unlike their sibling allocation calls, these routines
|
||||
may only be called with IRQs enabled.
|
||||
Note that unlike the sibling allocation call, this routine may only be called
|
||||
with IRQs enabled.
|
||||
|
||||
|
||||
Part Ib - Using small DMA-coherent buffers
|
||||
------------------------------------------
|
||||
|
||||
To get this part of the dma_API, you must #include <linux/dmapool.h>
|
||||
To get this part of the DMA API, you must #include <linux/dmapool.h>
|
||||
|
||||
Many drivers need lots of small DMA-coherent memory regions for DMA
|
||||
descriptors or I/O buffers. Rather than allocating in units of a page
|
||||
@@ -85,78 +83,29 @@ much like a struct kmem_cache, except that they use the DMA-coherent allocator,
|
||||
not __get_free_pages(). Also, they understand common hardware constraints
|
||||
for alignment, like queue heads needing to be aligned on N-byte boundaries.
|
||||
|
||||
.. kernel-doc:: mm/dmapool.c
|
||||
:export:
|
||||
|
||||
::
|
||||
|
||||
struct dma_pool *
|
||||
dma_pool_create(const char *name, struct device *dev,
|
||||
size_t size, size_t align, size_t alloc);
|
||||
|
||||
dma_pool_create() initializes a pool of DMA-coherent buffers
|
||||
for use with a given device. It must be called in a context which
|
||||
can sleep.
|
||||
|
||||
The "name" is for diagnostics (like a struct kmem_cache name); dev and size
|
||||
are like what you'd pass to dma_alloc_coherent(). The device's hardware
|
||||
alignment requirement for this type of data is "align" (which is expressed
|
||||
in bytes, and must be a power of two). If your device has no boundary
|
||||
crossing restrictions, pass 0 for alloc; passing 4096 says memory allocated
|
||||
from this pool must not cross 4KByte boundaries.
|
||||
|
||||
::
|
||||
|
||||
void *
|
||||
dma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags,
|
||||
dma_addr_t *handle)
|
||||
|
||||
Wraps dma_pool_alloc() and also zeroes the returned memory if the
|
||||
allocation attempt succeeded.
|
||||
|
||||
|
||||
::
|
||||
|
||||
void *
|
||||
dma_pool_alloc(struct dma_pool *pool, gfp_t gfp_flags,
|
||||
dma_addr_t *dma_handle);
|
||||
|
||||
This allocates memory from the pool; the returned memory will meet the
|
||||
size and alignment requirements specified at creation time. Pass
|
||||
GFP_ATOMIC to prevent blocking, or if it's permitted (not
|
||||
in_interrupt, not holding SMP locks), pass GFP_KERNEL to allow
|
||||
blocking. Like dma_alloc_coherent(), this returns two values: an
|
||||
address usable by the CPU, and the DMA address usable by the pool's
|
||||
device.
|
||||
|
||||
::
|
||||
|
||||
void
|
||||
dma_pool_free(struct dma_pool *pool, void *vaddr,
|
||||
dma_addr_t addr);
|
||||
|
||||
This puts memory back into the pool. The pool is what was passed to
|
||||
dma_pool_alloc(); the CPU (vaddr) and DMA addresses are what
|
||||
were returned when that routine allocated the memory being freed.
|
||||
|
||||
::
|
||||
|
||||
void
|
||||
dma_pool_destroy(struct dma_pool *pool);
|
||||
|
||||
dma_pool_destroy() frees the resources of the pool. It must be
|
||||
called in a context which can sleep. Make sure you've freed all allocated
|
||||
memory back to the pool before you destroy it.
|
||||
.. kernel-doc:: include/linux/dmapool.h
|
||||
|
||||
|
||||
Part Ic - DMA addressing limitations
|
||||
------------------------------------
|
||||
|
||||
DMA mask is a bit mask of the addressable region for the device. In other words,
|
||||
if applying the DMA mask (a bitwise AND operation) to the DMA address of a
|
||||
memory region does not clear any bits in the address, then the device can
|
||||
perform DMA to that memory region.
|
||||
|
||||
All the below functions which set a DMA mask may fail if the requested mask
|
||||
cannot be used with the device, or if the device is not capable of doing DMA.
|
||||
|
||||
::
|
||||
|
||||
int
|
||||
dma_set_mask_and_coherent(struct device *dev, u64 mask)
|
||||
|
||||
Checks to see if the mask is possible and updates the device
|
||||
streaming and coherent DMA mask parameters if it is.
|
||||
Updates both streaming and coherent DMA masks.
|
||||
|
||||
Returns: 0 if successful and a negative error if not.
|
||||
|
||||
@@ -165,8 +114,7 @@ Returns: 0 if successful and a negative error if not.
|
||||
int
|
||||
dma_set_mask(struct device *dev, u64 mask)
|
||||
|
||||
Checks to see if the mask is possible and updates the device
|
||||
parameters if it is.
|
||||
Updates only the streaming DMA mask.
|
||||
|
||||
Returns: 0 if successful and a negative error if not.
|
||||
|
||||
@@ -175,8 +123,7 @@ Returns: 0 if successful and a negative error if not.
|
||||
int
|
||||
dma_set_coherent_mask(struct device *dev, u64 mask)
|
||||
|
||||
Checks to see if the mask is possible and updates the device
|
||||
parameters if it is.
|
||||
Updates only the coherent DMA mask.
|
||||
|
||||
Returns: 0 if successful and a negative error if not.
|
||||
|
||||
@@ -231,12 +178,32 @@ transfer memory ownership. Returns %false if those calls can be skipped.
|
||||
unsigned long
|
||||
dma_get_merge_boundary(struct device *dev);
|
||||
|
||||
Returns the DMA merge boundary. If the device cannot merge any the DMA address
|
||||
Returns the DMA merge boundary. If the device cannot merge any DMA address
|
||||
segments, the function returns 0.
|
||||
|
||||
Part Id - Streaming DMA mappings
|
||||
--------------------------------
|
||||
|
||||
Streaming DMA allows to map an existing buffer for DMA transfers and then
|
||||
unmap it when finished. Map functions are not guaranteed to succeed, so the
|
||||
return value must be checked.
|
||||
|
||||
.. note::
|
||||
|
||||
In particular, mapping may fail for memory not addressable by the
|
||||
device, e.g. if it is not within the DMA mask of the device and/or a
|
||||
connecting bus bridge. Streaming DMA functions try to overcome such
|
||||
addressing constraints, either by using an IOMMU (a device which maps
|
||||
I/O DMA addresses to physical memory addresses), or by copying the
|
||||
data to/from a bounce buffer if the kernel is configured with a
|
||||
:doc:`SWIOTLB <swiotlb>`. However, these methods are not always
|
||||
available, and even if they are, they may still fail for a number of
|
||||
reasons.
|
||||
|
||||
In short, a device driver may need to be wary of where buffers are
|
||||
located in physical memory, especially if the DMA mask is less than 32
|
||||
bits.
|
||||
|
||||
::
|
||||
|
||||
dma_addr_t
|
||||
@@ -246,9 +213,7 @@ Part Id - Streaming DMA mappings
|
||||
Maps a piece of processor virtual memory so it can be accessed by the
|
||||
device and returns the DMA address of the memory.
|
||||
|
||||
The direction for both APIs may be converted freely by casting.
|
||||
However the dma_API uses a strongly typed enumerator for its
|
||||
direction:
|
||||
The DMA API uses a strongly typed enumerator for its direction:
|
||||
|
||||
======================= =============================================
|
||||
DMA_NONE no direction (used for debugging)
|
||||
@@ -259,31 +224,13 @@ DMA_BIDIRECTIONAL direction isn't known
|
||||
|
||||
.. note::
|
||||
|
||||
Not all memory regions in a machine can be mapped by this API.
|
||||
Further, contiguous kernel virtual space may not be contiguous as
|
||||
Contiguous kernel virtual space may not be contiguous as
|
||||
physical memory. Since this API does not provide any scatter/gather
|
||||
capability, it will fail if the user tries to map a non-physically
|
||||
contiguous piece of memory. For this reason, memory to be mapped by
|
||||
this API should be obtained from sources which guarantee it to be
|
||||
physically contiguous (like kmalloc).
|
||||
|
||||
Further, the DMA address of the memory must be within the
|
||||
dma_mask of the device (the dma_mask is a bit mask of the
|
||||
addressable region for the device, i.e., if the DMA address of
|
||||
the memory ANDed with the dma_mask is still equal to the DMA
|
||||
address, then the device can perform DMA to the memory). To
|
||||
ensure that the memory allocated by kmalloc is within the dma_mask,
|
||||
the driver may specify various platform-dependent flags to restrict
|
||||
the DMA address range of the allocation (e.g., on x86, GFP_DMA
|
||||
guarantees to be within the first 16MB of available DMA addresses,
|
||||
as required by ISA devices).
|
||||
|
||||
Note also that the above constraints on physical contiguity and
|
||||
dma_mask may not apply if the platform has an IOMMU (a device which
|
||||
maps an I/O DMA address to a physical memory address). However, to be
|
||||
portable, device driver writers may *not* assume that such an IOMMU
|
||||
exists.
|
||||
|
||||
.. warning::
|
||||
|
||||
Memory coherency operates at a granularity called the cache
|
||||
@@ -325,8 +272,7 @@ DMA_BIDIRECTIONAL direction isn't known
|
||||
enum dma_data_direction direction)
|
||||
|
||||
Unmaps the region previously mapped. All the parameters passed in
|
||||
must be identical to those passed in (and returned) by the mapping
|
||||
API.
|
||||
must be identical to those passed to (and returned by) dma_map_single().
|
||||
|
||||
::
|
||||
|
||||
@@ -376,10 +322,10 @@ action (e.g. reduce current DMA mapping usage or delay and try again later).
|
||||
dma_map_sg(struct device *dev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction direction)
|
||||
|
||||
Returns: the number of DMA address segments mapped (this may be shorter
|
||||
than <nents> passed in if some elements of the scatter/gather list are
|
||||
physically or virtually adjacent and an IOMMU maps them with a single
|
||||
entry).
|
||||
Maps a scatter/gather list for DMA. Returns the number of DMA address segments
|
||||
mapped, which may be smaller than <nents> passed in if several consecutive
|
||||
sglist entries are merged (e.g. with an IOMMU, or if some adjacent segments
|
||||
just happen to be physically contiguous).
|
||||
|
||||
Please note that the sg cannot be mapped again if it has been mapped once.
|
||||
The mapping process is allowed to destroy information in the sg.
|
||||
@@ -403,9 +349,8 @@ With scatterlists, you use the resulting mapping like this::
|
||||
where nents is the number of entries in the sglist.
|
||||
|
||||
The implementation is free to merge several consecutive sglist entries
|
||||
into one (e.g. with an IOMMU, or if several pages just happen to be
|
||||
physically contiguous) and returns the actual number of sg entries it
|
||||
mapped them to. On failure 0, is returned.
|
||||
into one. The returned number is the actual number of sg entries it
|
||||
mapped them to. On failure, 0 is returned.
|
||||
|
||||
Then you should loop count times (note: this can be less than nents times)
|
||||
and use sg_dma_address() and sg_dma_len() macros where you previously
|
||||
@@ -775,19 +720,19 @@ memory or doing partial flushes.
|
||||
of two for easy alignment.
|
||||
|
||||
|
||||
Part III - Debug drivers use of the DMA-API
|
||||
Part III - Debug drivers use of the DMA API
|
||||
-------------------------------------------
|
||||
|
||||
The DMA-API as described above has some constraints. DMA addresses must be
|
||||
The DMA API as described above has some constraints. DMA addresses must be
|
||||
released with the corresponding function with the same size for example. With
|
||||
the advent of hardware IOMMUs it becomes more and more important that drivers
|
||||
do not violate those constraints. In the worst case such a violation can
|
||||
result in data corruption up to destroyed filesystems.
|
||||
|
||||
To debug drivers and find bugs in the usage of the DMA-API checking code can
|
||||
To debug drivers and find bugs in the usage of the DMA API checking code can
|
||||
be compiled into the kernel which will tell the developer about those
|
||||
violations. If your architecture supports it you can select the "Enable
|
||||
debugging of DMA-API usage" option in your kernel configuration. Enabling this
|
||||
debugging of DMA API usage" option in your kernel configuration. Enabling this
|
||||
option has a performance impact. Do not enable it in production kernels.
|
||||
|
||||
If you boot the resulting kernel will contain code which does some bookkeeping
|
||||
@@ -826,7 +771,7 @@ example warning message may look like this::
|
||||
<EOI> <4>---[ end trace f6435a98e2a38c0e ]---
|
||||
|
||||
The driver developer can find the driver and the device including a stacktrace
|
||||
of the DMA-API call which caused this warning.
|
||||
of the DMA API call which caused this warning.
|
||||
|
||||
Per default only the first error will result in a warning message. All other
|
||||
errors will only silently counted. This limitation exist to prevent the code
|
||||
@@ -834,7 +779,7 @@ from flooding your kernel log. To support debugging a device driver this can
|
||||
be disabled via debugfs. See the debugfs interface documentation below for
|
||||
details.
|
||||
|
||||
The debugfs directory for the DMA-API debugging code is called dma-api/. In
|
||||
The debugfs directory for the DMA API debugging code is called dma-api/. In
|
||||
this directory the following files can currently be found:
|
||||
|
||||
=============================== ===============================================
|
||||
@@ -882,7 +827,7 @@ dma-api/driver_filter You can write a name of a driver into this file
|
||||
|
||||
If you have this code compiled into your kernel it will be enabled by default.
|
||||
If you want to boot without the bookkeeping anyway you can provide
|
||||
'dma_debug=off' as a boot parameter. This will disable DMA-API debugging.
|
||||
'dma_debug=off' as a boot parameter. This will disable DMA API debugging.
|
||||
Notice that you can not enable it again at runtime. You have to reboot to do
|
||||
so.
|
||||
|
||||
@@ -915,3 +860,9 @@ the driver. When driver does unmap, debug_dma_unmap() checks the flag and if
|
||||
this flag is still set, prints warning message that includes call trace that
|
||||
leads up to the unmap. This interface can be called from dma_mapping_error()
|
||||
routines to enable DMA mapping error check debugging.
|
||||
|
||||
Functions and structures
|
||||
========================
|
||||
|
||||
.. kernel-doc:: include/linux/scatterlist.h
|
||||
.. kernel-doc:: lib/scatterlist.c
|
||||
|
||||
@@ -105,7 +105,7 @@ has to do extra work between the various steps. In such cases it has to
|
||||
ensure that enter_from_user_mode() is called first on entry and
|
||||
exit_to_user_mode() is called last on exit.
|
||||
|
||||
Do not nest syscalls. Nested systcalls will cause RCU and/or context tracking
|
||||
Do not nest syscalls. Nested syscalls will cause RCU and/or context tracking
|
||||
to print a warning.
|
||||
|
||||
KVM
|
||||
@@ -115,8 +115,8 @@ Entering or exiting guest mode is very similar to syscalls. From the host
|
||||
kernel point of view the CPU goes off into user space when entering the
|
||||
guest and returns to the kernel on exit.
|
||||
|
||||
kvm_guest_enter_irqoff() is a KVM-specific variant of exit_to_user_mode()
|
||||
and kvm_guest_exit_irqoff() is the KVM variant of enter_from_user_mode().
|
||||
guest_state_enter_irqoff() is a KVM-specific variant of exit_to_user_mode()
|
||||
and guest_state_exit_irqoff() is the KVM variant of enter_from_user_mode().
|
||||
The state operations have the same ordering.
|
||||
|
||||
Task work handling is done separately for guest at the boundary of the
|
||||
|
||||
@@ -54,6 +54,7 @@ Library functionality that is used throughout the kernel.
|
||||
union_find
|
||||
min_heap
|
||||
parser
|
||||
list
|
||||
|
||||
Low level entry and exit
|
||||
========================
|
||||
|
||||
@@ -3,12 +3,6 @@ The Linux Kernel API
|
||||
====================
|
||||
|
||||
|
||||
List Management Functions
|
||||
=========================
|
||||
|
||||
.. kernel-doc:: include/linux/list.h
|
||||
:internal:
|
||||
|
||||
Basic C Library Functions
|
||||
=========================
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -91,12 +91,6 @@ Memory pools
|
||||
.. kernel-doc:: mm/mempool.c
|
||||
:export:
|
||||
|
||||
DMA pools
|
||||
=========
|
||||
|
||||
.. kernel-doc:: mm/dmapool.c
|
||||
:export:
|
||||
|
||||
More Memory Management Functions
|
||||
================================
|
||||
|
||||
|
||||
@@ -319,7 +319,7 @@ Here is an example of how to use the fields APIs:
|
||||
|
||||
#define SIZE 13
|
||||
|
||||
typdef struct __packed { u8 buf[SIZE]; } packed_buf_t;
|
||||
typedef struct __packed { u8 buf[SIZE]; } packed_buf_t;
|
||||
|
||||
static const struct packed_field_u8 fields[] = {
|
||||
PACKED_FIELD(100, 90, struct data, field1),
|
||||
|
||||
@@ -131,6 +131,29 @@ It supports two optional parameters:
|
||||
``--no-virtualenv``
|
||||
Use OS packaging for Sphinx instead of Python virtual environment.
|
||||
|
||||
Installing Sphinx Minimal Version
|
||||
---------------------------------
|
||||
|
||||
When changing Sphinx build system, it is important to ensure that
|
||||
the minimal version will still be supported. Nowadays, it is
|
||||
becoming harder to do that on modern distributions, as it is not
|
||||
possible to install with Python 3.13 and above.
|
||||
|
||||
Testing with the lowest supported Python version as defined at
|
||||
Documentation/process/changes.rst can be done by creating
|
||||
a venv with it with, and install minimal requirements with::
|
||||
|
||||
/usr/bin/python3.9 -m venv sphinx_min
|
||||
. sphinx_min/bin/activate
|
||||
pip install -r Documentation/sphinx/min_requirements.txt
|
||||
|
||||
A more comprehensive test can be done by using:
|
||||
|
||||
scripts/test_doc_build.py
|
||||
|
||||
Such script create one Python venv per supported version,
|
||||
optionally building documentation for a range of Sphinx versions.
|
||||
|
||||
|
||||
Sphinx Build
|
||||
============
|
||||
|
||||
@@ -750,7 +750,7 @@ compliance:
|
||||
- Test your driver with the appropriate in-kernel real-time test cases for both
|
||||
level and edge IRQs
|
||||
|
||||
* [1] http://www.spinics.net/lists/linux-omap/msg120425.html
|
||||
* [1] https://lore.kernel.org/r/1437496011-11486-1-git-send-email-bigeasy@linutronix.de/
|
||||
* [2] https://lore.kernel.org/r/1443209283-20781-2-git-send-email-grygorii.strashko@ti.com
|
||||
* [3] https://lore.kernel.org/r/1443209283-20781-3-git-send-email-grygorii.strashko@ti.com
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Fault injection capabilities infrastructure
|
||||
===========================================
|
||||
|
||||
See also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug.
|
||||
See also "every_nth" module option for scsi_debug.
|
||||
|
||||
|
||||
Available fault injection capabilities
|
||||
|
||||
@@ -206,7 +206,6 @@ stall the CPU for an extended period, you should also not attempt to
|
||||
implement direct_access.
|
||||
|
||||
These block devices may be used for inspiration:
|
||||
- brd: RAM backed block device driver
|
||||
- pmem: NVDIMM persistent memory driver
|
||||
|
||||
|
||||
|
||||
@@ -148,10 +148,10 @@ reserved during:
|
||||
only required to handle a split extent across leaf blocks.
|
||||
|
||||
How to
|
||||
------
|
||||
~~~~~~
|
||||
|
||||
Creating Filesystems with Atomic Write Support
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
First check the atomic write units supported by block device.
|
||||
See :ref:`atomic_write_bdev_support` for more details.
|
||||
@@ -176,7 +176,7 @@ Where ``-b`` specifies the block size, ``-C`` specifies the cluster size in byte
|
||||
and ``-O bigalloc`` enables the bigalloc feature.
|
||||
|
||||
Application Interface
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Applications can use the ``pwritev2()`` system call with the ``RWF_ATOMIC`` flag
|
||||
to perform atomic writes:
|
||||
@@ -204,7 +204,7 @@ writes are supported.
|
||||
.. _atomic_write_bdev_support:
|
||||
|
||||
Hardware Support
|
||||
----------------
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The underlying storage device must support atomic write operations.
|
||||
Modern NVMe and SCSI devices often provide this capability.
|
||||
@@ -217,7 +217,7 @@ Nonzero values for these attributes indicate that the device supports
|
||||
atomic writes.
|
||||
|
||||
See Also
|
||||
--------
|
||||
~~~~~~~~
|
||||
|
||||
* :doc:`bigalloc` - Documentation on the bigalloc feature
|
||||
* :doc:`allocators` - Documentation on block allocation in ext4
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user