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 26*073c3ab6SJeffle XuCurrently 4 filesystems support `DAX`: ext2, ext4, xfs and virtiofs. 27*073c3ab6SJeffle XuEnabling `DAX` on them is different. 28acda97acSIgor Matheus Andrade Torrente 29acda97acSIgor Matheus Andrade TorrenteEnabling DAX on ext2 30acda97acSIgor Matheus Andrade Torrente-------------------- 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 171*073c3ab6SJeffle XuEnabling DAX on virtiofs 172*073c3ab6SJeffle Xu---------------------------- 173*073c3ab6SJeffle XuThe semantic of DAX on virtiofs is basically equal to that on ext4 and xfs, 174*073c3ab6SJeffle Xuexcept that when '-o dax=inode' is specified, virtiofs client derives the hint 175*073c3ab6SJeffle Xuwhether DAX shall be enabled or not from virtiofs server through FUSE protocol, 176*073c3ab6SJeffle Xurather than the persistent `FS_XFLAG_DAX` flag. That is, whether DAX shall be 177*073c3ab6SJeffle Xuenabled or not is completely determined by virtiofs server, while virtiofs 178*073c3ab6SJeffle Xuserver itself may deploy various algorithm making this decision, e.g. depending 179*073c3ab6SJeffle Xuon the persistent `FS_XFLAG_DAX` flag on the host. 180*073c3ab6SJeffle Xu 181*073c3ab6SJeffle XuIt is still supported to set or clear persistent `FS_XFLAG_DAX` flag inside 182*073c3ab6SJeffle Xuguest, but it is not guaranteed that DAX will be enabled or disabled for 183*073c3ab6SJeffle Xucorresponding file then. Users inside guest still need to call statx(2) and 184*073c3ab6SJeffle Xucheck the statx flag `STATX_ATTR_DAX` to see if DAX is enabled for this file. 185*073c3ab6SJeffle Xu 186*073c3ab6SJeffle 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 294acda97acSIgor Matheus Andrade Torrentemmaped 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