xref: /linux/Documentation/filesystems/dax.rst (revision a1c613ae4c322ddd58d5a8539dbfba2a0380a8c0)
1acda97acSIgor Matheus Andrade Torrente=======================
2acda97acSIgor Matheus Andrade TorrenteDirect Access for files
3acda97acSIgor Matheus Andrade Torrente=======================
4acda97acSIgor Matheus Andrade Torrente
5acda97acSIgor Matheus Andrade TorrenteMotivation
6acda97acSIgor Matheus Andrade Torrente----------
7acda97acSIgor Matheus Andrade Torrente
8acda97acSIgor Matheus Andrade TorrenteThe page cache is usually used to buffer reads and writes to files.
9acda97acSIgor Matheus Andrade TorrenteIt is also used to provide the pages which are mapped into userspace
10acda97acSIgor Matheus Andrade Torrenteby a call to mmap.
11acda97acSIgor Matheus Andrade Torrente
12acda97acSIgor Matheus Andrade TorrenteFor block devices that are memory-like, the page cache pages would be
13acda97acSIgor Matheus Andrade Torrenteunnecessary copies of the original storage.  The `DAX` code removes the
14acda97acSIgor Matheus Andrade Torrenteextra copy by performing reads and writes directly to the storage device.
15acda97acSIgor Matheus Andrade TorrenteFor file mappings, the storage device is mapped directly into userspace.
16acda97acSIgor Matheus Andrade Torrente
17acda97acSIgor Matheus Andrade Torrente
18acda97acSIgor Matheus Andrade TorrenteUsage
19acda97acSIgor Matheus Andrade Torrente-----
20acda97acSIgor Matheus Andrade Torrente
21acda97acSIgor Matheus Andrade TorrenteIf you have a block device which supports `DAX`, you can make a filesystem
22acda97acSIgor Matheus Andrade Torrenteon it as usual.  The `DAX` code currently only supports files with a block
23acda97acSIgor Matheus Andrade Torrentesize equal to your kernel's `PAGE_SIZE`, so you may need to specify a block
24acda97acSIgor Matheus Andrade Torrentesize when creating the filesystem.
25acda97acSIgor Matheus Andrade Torrente
26faac5095SlihongnanCurrently 5 filesystems support `DAX`: ext2, ext4, xfs, virtiofs and erofs.
27073c3ab6SJeffle XuEnabling `DAX` on them is different.
28acda97acSIgor Matheus Andrade Torrente
29faac5095SlihongnanEnabling DAX on ext2 and erofs
30faac5095Slihongnan------------------------------
31acda97acSIgor Matheus Andrade Torrente
32acda97acSIgor Matheus Andrade TorrenteWhen mounting the filesystem, use the ``-o dax`` option on the command line or
33acda97acSIgor Matheus Andrade Torrenteadd 'dax' to the options in ``/etc/fstab``.  This works to enable `DAX` on all files
34acda97acSIgor Matheus Andrade Torrentewithin the filesystem.  It is equivalent to the ``-o dax=always`` behavior below.
35acda97acSIgor Matheus Andrade Torrente
36acda97acSIgor Matheus Andrade Torrente
37acda97acSIgor Matheus Andrade TorrenteEnabling DAX on xfs and ext4
38acda97acSIgor Matheus Andrade Torrente----------------------------
39acda97acSIgor Matheus Andrade Torrente
40acda97acSIgor Matheus Andrade TorrenteSummary
41acda97acSIgor Matheus Andrade Torrente-------
42acda97acSIgor Matheus Andrade Torrente
43acda97acSIgor Matheus Andrade Torrente 1. There exists an in-kernel file access mode flag `S_DAX` that corresponds to
44acda97acSIgor Matheus Andrade Torrente    the statx flag `STATX_ATTR_DAX`.  See the manpage for statx(2) for details
45acda97acSIgor Matheus Andrade Torrente    about this access mode.
46acda97acSIgor Matheus Andrade Torrente
47acda97acSIgor Matheus Andrade Torrente 2. There exists a persistent flag `FS_XFLAG_DAX` that can be applied to regular
48acda97acSIgor Matheus Andrade Torrente    files and directories. This advisory flag can be set or cleared at any
49acda97acSIgor Matheus Andrade Torrente    time, but doing so does not immediately affect the `S_DAX` state.
50acda97acSIgor Matheus Andrade Torrente
51acda97acSIgor Matheus Andrade Torrente 3. If the persistent `FS_XFLAG_DAX` flag is set on a directory, this flag will
52acda97acSIgor Matheus Andrade Torrente    be inherited by all regular files and subdirectories that are subsequently
53acda97acSIgor Matheus Andrade Torrente    created in this directory. Files and subdirectories that exist at the time
54acda97acSIgor Matheus Andrade Torrente    this flag is set or cleared on the parent directory are not modified by
55acda97acSIgor Matheus Andrade Torrente    this modification of the parent directory.
56acda97acSIgor Matheus Andrade Torrente
57acda97acSIgor Matheus Andrade Torrente 4. There exist dax mount options which can override `FS_XFLAG_DAX` in the
58acda97acSIgor Matheus Andrade Torrente    setting of the `S_DAX` flag.  Given underlying storage which supports `DAX` the
59acda97acSIgor Matheus Andrade Torrente    following hold:
60acda97acSIgor Matheus Andrade Torrente
61acda97acSIgor Matheus Andrade Torrente    ``-o dax=inode``  means "follow `FS_XFLAG_DAX`" and is the default.
62acda97acSIgor Matheus Andrade Torrente
63acda97acSIgor Matheus Andrade Torrente    ``-o dax=never``  means "never set `S_DAX`, ignore `FS_XFLAG_DAX`."
64acda97acSIgor Matheus Andrade Torrente
65acda97acSIgor Matheus Andrade Torrente    ``-o dax=always`` means "always set `S_DAX` ignore `FS_XFLAG_DAX`."
66acda97acSIgor Matheus Andrade Torrente
67acda97acSIgor Matheus Andrade Torrente    ``-o dax``      is a legacy option which is an alias for ``dax=always``.
68acda97acSIgor Matheus Andrade Torrente
69acda97acSIgor Matheus Andrade Torrente    .. warning::
70acda97acSIgor Matheus Andrade Torrente
71acda97acSIgor Matheus Andrade Torrente      The option ``-o dax`` may be removed in the future so ``-o dax=always`` is
72acda97acSIgor Matheus Andrade Torrente      the preferred method for specifying this behavior.
73acda97acSIgor Matheus Andrade Torrente
74acda97acSIgor Matheus Andrade Torrente    .. note::
75acda97acSIgor Matheus Andrade Torrente
76acda97acSIgor Matheus Andrade Torrente      Modifications to and the inheritance behavior of `FS_XFLAG_DAX` remain
77acda97acSIgor Matheus Andrade Torrente      the same even when the filesystem is mounted with a dax option.  However,
78acda97acSIgor Matheus Andrade Torrente      in-core inode state (`S_DAX`) will be overridden until the filesystem is
79acda97acSIgor Matheus Andrade Torrente      remounted with dax=inode and the inode is evicted from kernel memory.
80acda97acSIgor Matheus Andrade Torrente
81acda97acSIgor Matheus Andrade Torrente 5. The `S_DAX` policy can be changed via:
82acda97acSIgor Matheus Andrade Torrente
83acda97acSIgor Matheus Andrade Torrente    a) Setting the parent directory `FS_XFLAG_DAX` as needed before files are
84acda97acSIgor Matheus Andrade Torrente       created
85acda97acSIgor Matheus Andrade Torrente
86acda97acSIgor Matheus Andrade Torrente    b) Setting the appropriate dax="foo" mount option
87acda97acSIgor Matheus Andrade Torrente
88acda97acSIgor Matheus Andrade Torrente    c) Changing the `FS_XFLAG_DAX` flag on existing regular files and
89acda97acSIgor Matheus Andrade Torrente       directories.  This has runtime constraints and limitations that are
90acda97acSIgor Matheus Andrade Torrente       described in 6) below.
91acda97acSIgor Matheus Andrade Torrente
92acda97acSIgor Matheus Andrade Torrente 6. When changing the `S_DAX` policy via toggling the persistent `FS_XFLAG_DAX`
93acda97acSIgor Matheus Andrade Torrente    flag, the change to existing regular files won't take effect until the
94acda97acSIgor Matheus Andrade Torrente    files are closed by all processes.
95acda97acSIgor Matheus Andrade Torrente
96acda97acSIgor Matheus Andrade Torrente
97acda97acSIgor Matheus Andrade TorrenteDetails
98acda97acSIgor Matheus Andrade Torrente-------
99acda97acSIgor Matheus Andrade Torrente
100acda97acSIgor Matheus Andrade TorrenteThere are 2 per-file dax flags.  One is a persistent inode setting (`FS_XFLAG_DAX`)
101acda97acSIgor Matheus Andrade Torrenteand the other is a volatile flag indicating the active state of the feature
102acda97acSIgor Matheus Andrade Torrente(`S_DAX`).
103acda97acSIgor Matheus Andrade Torrente
104acda97acSIgor Matheus Andrade Torrente`FS_XFLAG_DAX` is preserved within the filesystem.  This persistent config
105acda97acSIgor Matheus Andrade Torrentesetting can be set, cleared and/or queried using the `FS_IOC_FS`[`GS`]`ETXATTR` ioctl
106acda97acSIgor Matheus Andrade Torrente(see ioctl_xfs_fsgetxattr(2)) or an utility such as 'xfs_io'.
107acda97acSIgor Matheus Andrade Torrente
108acda97acSIgor Matheus Andrade TorrenteNew files and directories automatically inherit `FS_XFLAG_DAX` from
109acda97acSIgor Matheus Andrade Torrentetheir parent directory **when created**.  Therefore, setting `FS_XFLAG_DAX` at
110acda97acSIgor Matheus Andrade Torrentedirectory creation time can be used to set a default behavior for an entire
111acda97acSIgor Matheus Andrade Torrentesub-tree.
112acda97acSIgor Matheus Andrade Torrente
113acda97acSIgor Matheus Andrade TorrenteTo clarify inheritance, here are 3 examples:
114acda97acSIgor Matheus Andrade Torrente
115acda97acSIgor Matheus Andrade TorrenteExample A:
116acda97acSIgor Matheus Andrade Torrente
117acda97acSIgor Matheus Andrade Torrente.. code-block:: shell
118acda97acSIgor Matheus Andrade Torrente
119acda97acSIgor Matheus Andrade Torrente  mkdir -p a/b/c
120acda97acSIgor Matheus Andrade Torrente  xfs_io -c 'chattr +x' a
121acda97acSIgor Matheus Andrade Torrente  mkdir a/b/c/d
122acda97acSIgor Matheus Andrade Torrente  mkdir a/e
123acda97acSIgor Matheus Andrade Torrente
124acda97acSIgor Matheus Andrade Torrente  ------[outcome]------
125acda97acSIgor Matheus Andrade Torrente
126acda97acSIgor Matheus Andrade Torrente  dax: a,e
127acda97acSIgor Matheus Andrade Torrente  no dax: b,c,d
128acda97acSIgor Matheus Andrade Torrente
129acda97acSIgor Matheus Andrade TorrenteExample B:
130acda97acSIgor Matheus Andrade Torrente
131acda97acSIgor Matheus Andrade Torrente.. code-block:: shell
132acda97acSIgor Matheus Andrade Torrente
133acda97acSIgor Matheus Andrade Torrente  mkdir a
134acda97acSIgor Matheus Andrade Torrente  xfs_io -c 'chattr +x' a
135acda97acSIgor Matheus Andrade Torrente  mkdir -p a/b/c/d
136acda97acSIgor Matheus Andrade Torrente
137acda97acSIgor Matheus Andrade Torrente  ------[outcome]------
138acda97acSIgor Matheus Andrade Torrente
139acda97acSIgor Matheus Andrade Torrente  dax: a,b,c,d
140acda97acSIgor Matheus Andrade Torrente  no dax:
141acda97acSIgor Matheus Andrade Torrente
142acda97acSIgor Matheus Andrade TorrenteExample C:
143acda97acSIgor Matheus Andrade Torrente
144acda97acSIgor Matheus Andrade Torrente.. code-block:: shell
145acda97acSIgor Matheus Andrade Torrente
146acda97acSIgor Matheus Andrade Torrente  mkdir -p a/b/c
147acda97acSIgor Matheus Andrade Torrente  xfs_io -c 'chattr +x' c
148acda97acSIgor Matheus Andrade Torrente  mkdir a/b/c/d
149acda97acSIgor Matheus Andrade Torrente
150acda97acSIgor Matheus Andrade Torrente  ------[outcome]------
151acda97acSIgor Matheus Andrade Torrente
152acda97acSIgor Matheus Andrade Torrente  dax: c,d
153acda97acSIgor Matheus Andrade Torrente  no dax: a,b
154acda97acSIgor Matheus Andrade Torrente
155acda97acSIgor Matheus Andrade TorrenteThe current enabled state (`S_DAX`) is set when a file inode is instantiated in
156acda97acSIgor Matheus Andrade Torrentememory by the kernel.  It is set based on the underlying media support, the
157acda97acSIgor Matheus Andrade Torrentevalue of `FS_XFLAG_DAX` and the filesystem's dax mount option.
158acda97acSIgor Matheus Andrade Torrente
159acda97acSIgor Matheus Andrade Torrentestatx can be used to query `S_DAX`.
160acda97acSIgor Matheus Andrade Torrente
161acda97acSIgor Matheus Andrade Torrente.. note::
162acda97acSIgor Matheus Andrade Torrente
163acda97acSIgor Matheus Andrade Torrente  That only regular files will ever have `S_DAX` set and therefore statx
164acda97acSIgor Matheus Andrade Torrente  will never indicate that `S_DAX` is set on directories.
165acda97acSIgor Matheus Andrade Torrente
166acda97acSIgor Matheus Andrade TorrenteSetting the `FS_XFLAG_DAX` flag (specifically or through inheritance) occurs even
167acda97acSIgor Matheus Andrade Torrenteif the underlying media does not support dax and/or the filesystem is
168acda97acSIgor Matheus Andrade Torrenteoverridden with a mount option.
169acda97acSIgor Matheus Andrade Torrente
170acda97acSIgor Matheus Andrade Torrente
171073c3ab6SJeffle XuEnabling DAX on virtiofs
172073c3ab6SJeffle Xu----------------------------
173073c3ab6SJeffle XuThe semantic of DAX on virtiofs is basically equal to that on ext4 and xfs,
174073c3ab6SJeffle Xuexcept that when '-o dax=inode' is specified, virtiofs client derives the hint
175073c3ab6SJeffle Xuwhether DAX shall be enabled or not from virtiofs server through FUSE protocol,
176073c3ab6SJeffle Xurather than the persistent `FS_XFLAG_DAX` flag. That is, whether DAX shall be
177073c3ab6SJeffle Xuenabled or not is completely determined by virtiofs server, while virtiofs
178073c3ab6SJeffle Xuserver itself may deploy various algorithm making this decision, e.g. depending
179073c3ab6SJeffle Xuon the persistent `FS_XFLAG_DAX` flag on the host.
180073c3ab6SJeffle Xu
181073c3ab6SJeffle XuIt is still supported to set or clear persistent `FS_XFLAG_DAX` flag inside
182073c3ab6SJeffle Xuguest, but it is not guaranteed that DAX will be enabled or disabled for
183073c3ab6SJeffle Xucorresponding file then. Users inside guest still need to call statx(2) and
184073c3ab6SJeffle Xucheck the statx flag `STATX_ATTR_DAX` to see if DAX is enabled for this file.
185073c3ab6SJeffle Xu
186073c3ab6SJeffle Xu
187acda97acSIgor Matheus Andrade TorrenteImplementation Tips for Block Driver Writers
188acda97acSIgor Matheus Andrade Torrente--------------------------------------------
189acda97acSIgor Matheus Andrade Torrente
190acda97acSIgor Matheus Andrade TorrenteTo support `DAX` in your block driver, implement the 'direct_access'
191acda97acSIgor Matheus Andrade Torrenteblock device operation.  It is used to translate the sector number
192acda97acSIgor Matheus Andrade Torrente(expressed in units of 512-byte sectors) to a page frame number (pfn)
193acda97acSIgor Matheus Andrade Torrentethat identifies the physical page for the memory.  It also returns a
194acda97acSIgor Matheus Andrade Torrentekernel virtual address that can be used to access the memory.
195acda97acSIgor Matheus Andrade Torrente
196acda97acSIgor Matheus Andrade TorrenteThe direct_access method takes a 'size' parameter that indicates the
197acda97acSIgor Matheus Andrade Torrentenumber of bytes being requested.  The function should return the number
198acda97acSIgor Matheus Andrade Torrenteof bytes that can be contiguously accessed at that offset.  It may also
199acda97acSIgor Matheus Andrade Torrentereturn a negative errno if an error occurs.
200acda97acSIgor Matheus Andrade Torrente
201acda97acSIgor Matheus Andrade TorrenteIn order to support this method, the storage must be byte-accessible by
202acda97acSIgor Matheus Andrade Torrentethe CPU at all times.  If your device uses paging techniques to expose
203acda97acSIgor Matheus Andrade Torrentea large amount of memory through a smaller window, then you cannot
204acda97acSIgor Matheus Andrade Torrenteimplement direct_access.  Equally, if your device can occasionally
205acda97acSIgor Matheus Andrade Torrentestall the CPU for an extended period, you should also not attempt to
206acda97acSIgor Matheus Andrade Torrenteimplement direct_access.
207acda97acSIgor Matheus Andrade Torrente
208acda97acSIgor Matheus Andrade TorrenteThese block devices may be used for inspiration:
209acda97acSIgor Matheus Andrade Torrente- brd: RAM backed block device driver
210acda97acSIgor Matheus Andrade Torrente- dcssblk: s390 dcss block device driver
211acda97acSIgor Matheus Andrade Torrente- pmem: NVDIMM persistent memory driver
212acda97acSIgor Matheus Andrade Torrente
213acda97acSIgor Matheus Andrade Torrente
214acda97acSIgor Matheus Andrade TorrenteImplementation Tips for Filesystem Writers
215acda97acSIgor Matheus Andrade Torrente------------------------------------------
216acda97acSIgor Matheus Andrade Torrente
217acda97acSIgor Matheus Andrade TorrenteFilesystem support consists of:
218acda97acSIgor Matheus Andrade Torrente
219acda97acSIgor Matheus Andrade Torrente* Adding support to mark inodes as being `DAX` by setting the `S_DAX` flag in
220acda97acSIgor Matheus Andrade Torrente  i_flags
221acda97acSIgor Matheus Andrade Torrente* Implementing ->read_iter and ->write_iter operations which use
222acda97acSIgor Matheus Andrade Torrente  :c:func:`dax_iomap_rw()` when inode has `S_DAX` flag set
223acda97acSIgor Matheus Andrade Torrente* Implementing an mmap file operation for `DAX` files which sets the
224acda97acSIgor Matheus Andrade Torrente  `VM_MIXEDMAP` and `VM_HUGEPAGE` flags on the `VMA`, and setting the vm_ops to
225acda97acSIgor Matheus Andrade Torrente  include handlers for fault, pmd_fault, page_mkwrite, pfn_mkwrite. These
226acda97acSIgor Matheus Andrade Torrente  handlers should probably call :c:func:`dax_iomap_fault()` passing the
227acda97acSIgor Matheus Andrade Torrente  appropriate fault size and iomap operations.
228acda97acSIgor Matheus Andrade Torrente* Calling :c:func:`iomap_zero_range()` passing appropriate iomap operations
229acda97acSIgor Matheus Andrade Torrente  instead of :c:func:`block_truncate_page()` for `DAX` files
230acda97acSIgor Matheus Andrade Torrente* Ensuring that there is sufficient locking between reads, writes,
231acda97acSIgor Matheus Andrade Torrente  truncates and page faults
232acda97acSIgor Matheus Andrade Torrente
233acda97acSIgor Matheus Andrade TorrenteThe iomap handlers for allocating blocks must make sure that allocated blocks
234acda97acSIgor Matheus Andrade Torrenteare zeroed out and converted to written extents before being returned to avoid
235acda97acSIgor Matheus Andrade Torrenteexposure of uninitialized data through mmap.
236acda97acSIgor Matheus Andrade Torrente
237acda97acSIgor Matheus Andrade TorrenteThese filesystems may be used for inspiration:
238acda97acSIgor Matheus Andrade Torrente
239acda97acSIgor Matheus Andrade Torrente.. seealso::
240acda97acSIgor Matheus Andrade Torrente
241acda97acSIgor Matheus Andrade Torrente  ext2: see Documentation/filesystems/ext2.rst
242acda97acSIgor Matheus Andrade Torrente
243acda97acSIgor Matheus Andrade Torrente.. seealso::
244acda97acSIgor Matheus Andrade Torrente
245acda97acSIgor Matheus Andrade Torrente  xfs:  see Documentation/admin-guide/xfs.rst
246acda97acSIgor Matheus Andrade Torrente
247acda97acSIgor Matheus Andrade Torrente.. seealso::
248acda97acSIgor Matheus Andrade Torrente
249acda97acSIgor Matheus Andrade Torrente  ext4: see Documentation/filesystems/ext4/
250acda97acSIgor Matheus Andrade Torrente
251acda97acSIgor Matheus Andrade Torrente
252acda97acSIgor Matheus Andrade TorrenteHandling Media Errors
253acda97acSIgor Matheus Andrade Torrente---------------------
254acda97acSIgor Matheus Andrade Torrente
255acda97acSIgor Matheus Andrade TorrenteThe libnvdimm subsystem stores a record of known media error locations for
256acda97acSIgor Matheus Andrade Torrenteeach pmem block device (in gendisk->badblocks). If we fault at such location,
257acda97acSIgor Matheus Andrade Torrenteor one with a latent error not yet discovered, the application can expect
258acda97acSIgor Matheus Andrade Torrenteto receive a `SIGBUS`. Libnvdimm also allows clearing of these errors by simply
259acda97acSIgor Matheus Andrade Torrentewriting the affected sectors (through the pmem driver, and if the underlying
260acda97acSIgor Matheus Andrade TorrenteNVDIMM supports the clear_poison DSM defined by ACPI).
261acda97acSIgor Matheus Andrade Torrente
262acda97acSIgor Matheus Andrade TorrenteSince `DAX` IO normally doesn't go through the ``driver/bio`` path, applications or
263acda97acSIgor Matheus Andrade Torrentesysadmins have an option to restore the lost data from a prior ``backup/inbuilt``
264acda97acSIgor Matheus Andrade Torrenteredundancy in the following ways:
265acda97acSIgor Matheus Andrade Torrente
266acda97acSIgor Matheus Andrade Torrente1. Delete the affected file, and restore from a backup (sysadmin route):
267acda97acSIgor Matheus Andrade Torrente   This will free the filesystem blocks that were being used by the file,
268acda97acSIgor Matheus Andrade Torrente   and the next time they're allocated, they will be zeroed first, which
269acda97acSIgor Matheus Andrade Torrente   happens through the driver, and will clear bad sectors.
270acda97acSIgor Matheus Andrade Torrente
271acda97acSIgor Matheus Andrade Torrente2. Truncate or hole-punch the part of the file that has a bad-block (at least
272acda97acSIgor Matheus Andrade Torrente   an entire aligned sector has to be hole-punched, but not necessarily an
273acda97acSIgor Matheus Andrade Torrente   entire filesystem block).
274acda97acSIgor Matheus Andrade Torrente
275acda97acSIgor Matheus Andrade TorrenteThese are the two basic paths that allow `DAX` filesystems to continue operating
276acda97acSIgor Matheus Andrade Torrentein the presence of media errors. More robust error recovery mechanisms can be
277acda97acSIgor Matheus Andrade Torrentebuilt on top of this in the future, for example, involving redundancy/mirroring
278acda97acSIgor Matheus Andrade Torrenteprovided at the block layer through DM, or additionally, at the filesystem
279acda97acSIgor Matheus Andrade Torrentelevel. These would have to rely on the above two tenets, that error clearing
280acda97acSIgor Matheus Andrade Torrentecan happen either by sending an IO through the driver, or zeroing (also through
281acda97acSIgor Matheus Andrade Torrentethe driver).
282acda97acSIgor Matheus Andrade Torrente
283acda97acSIgor Matheus Andrade Torrente
284acda97acSIgor Matheus Andrade TorrenteShortcomings
285acda97acSIgor Matheus Andrade Torrente------------
286acda97acSIgor Matheus Andrade Torrente
287acda97acSIgor Matheus Andrade TorrenteEven if the kernel or its modules are stored on a filesystem that supports
288acda97acSIgor Matheus Andrade Torrente`DAX` on a block device that supports `DAX`, they will still be copied into RAM.
289acda97acSIgor Matheus Andrade Torrente
290acda97acSIgor Matheus Andrade TorrenteThe DAX code does not work correctly on architectures which have virtually
291acda97acSIgor Matheus Andrade Torrentemapped caches such as ARM, MIPS and SPARC.
292acda97acSIgor Matheus Andrade Torrente
293acda97acSIgor Matheus Andrade TorrenteCalling :c:func:`get_user_pages()` on a range of user memory that has been
294*d56b699dSBjorn Helgaasmmapped from a `DAX` file will fail when there are no 'struct page' to describe
295acda97acSIgor Matheus Andrade Torrentethose pages.  This problem has been addressed in some device drivers
296acda97acSIgor Matheus Andrade Torrenteby adding optional struct page support for pages under the control of
297acda97acSIgor Matheus Andrade Torrentethe driver (see `CONFIG_NVDIMM_PFN` in ``drivers/nvdimm`` for an example of
298acda97acSIgor Matheus Andrade Torrentehow to do this). In the non struct page cases `O_DIRECT` reads/writes to
299acda97acSIgor Matheus Andrade Torrentethose memory ranges from a non-`DAX` file will fail
300acda97acSIgor Matheus Andrade Torrente
301acda97acSIgor Matheus Andrade Torrente
302acda97acSIgor Matheus Andrade Torrente.. note::
303acda97acSIgor Matheus Andrade Torrente
304acda97acSIgor Matheus Andrade Torrente  `O_DIRECT` reads/writes _of a `DAX` file do work, it is the memory that
305acda97acSIgor Matheus Andrade Torrente  is being accessed that is key here).  Other things that will not work in
306acda97acSIgor Matheus Andrade Torrente  the non struct page case include RDMA, :c:func:`sendfile()` and
307acda97acSIgor Matheus Andrade Torrente  :c:func:`splice()`.
308