diff options
Diffstat (limited to 'include/linux/dax.h')
-rw-r--r-- | include/linux/dax.h | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/include/linux/dax.h b/include/linux/dax.h index e9ea78c1cf98..8d1a5c47945f 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h | |||
@@ -9,20 +9,32 @@ | |||
9 | struct iomap_ops; | 9 | struct iomap_ops; |
10 | 10 | ||
11 | /* | 11 | /* |
12 | * We use lowest available bit in exceptional entry for locking, other two | 12 | * We use lowest available bit in exceptional entry for locking, one bit for |
13 | * bits to determine entry type. In total 3 special bits. | 13 | * the entry size (PMD) and two more to tell us if the entry is a huge zero |
14 | * page (HZP) or an empty entry that is just used for locking. In total four | ||
15 | * special bits. | ||
16 | * | ||
17 | * If the PMD bit isn't set the entry has size PAGE_SIZE, and if the HZP and | ||
18 | * EMPTY bits aren't set the entry is a normal DAX entry with a filesystem | ||
19 | * block allocation. | ||
14 | */ | 20 | */ |
15 | #define RADIX_DAX_SHIFT (RADIX_TREE_EXCEPTIONAL_SHIFT + 3) | 21 | #define RADIX_DAX_SHIFT (RADIX_TREE_EXCEPTIONAL_SHIFT + 4) |
16 | #define RADIX_DAX_ENTRY_LOCK (1 << RADIX_TREE_EXCEPTIONAL_SHIFT) | 22 | #define RADIX_DAX_ENTRY_LOCK (1 << RADIX_TREE_EXCEPTIONAL_SHIFT) |
17 | #define RADIX_DAX_PTE (1 << (RADIX_TREE_EXCEPTIONAL_SHIFT + 1)) | 23 | #define RADIX_DAX_PMD (1 << (RADIX_TREE_EXCEPTIONAL_SHIFT + 1)) |
18 | #define RADIX_DAX_PMD (1 << (RADIX_TREE_EXCEPTIONAL_SHIFT + 2)) | 24 | #define RADIX_DAX_HZP (1 << (RADIX_TREE_EXCEPTIONAL_SHIFT + 2)) |
19 | #define RADIX_DAX_TYPE_MASK (RADIX_DAX_PTE | RADIX_DAX_PMD) | 25 | #define RADIX_DAX_EMPTY (1 << (RADIX_TREE_EXCEPTIONAL_SHIFT + 3)) |
20 | #define RADIX_DAX_TYPE(entry) ((unsigned long)entry & RADIX_DAX_TYPE_MASK) | ||
21 | #define RADIX_DAX_SECTOR(entry) (((unsigned long)entry >> RADIX_DAX_SHIFT)) | ||
22 | #define RADIX_DAX_ENTRY(sector, pmd) ((void *)((unsigned long)sector << \ | ||
23 | RADIX_DAX_SHIFT | (pmd ? RADIX_DAX_PMD : RADIX_DAX_PTE) | \ | ||
24 | RADIX_TREE_EXCEPTIONAL_ENTRY)) | ||
25 | 26 | ||
27 | static inline unsigned long dax_radix_sector(void *entry) | ||
28 | { | ||
29 | return (unsigned long)entry >> RADIX_DAX_SHIFT; | ||
30 | } | ||
31 | |||
32 | static inline void *dax_radix_locked_entry(sector_t sector, unsigned long flags) | ||
33 | { | ||
34 | return (void *)(RADIX_TREE_EXCEPTIONAL_ENTRY | flags | | ||
35 | ((unsigned long)sector << RADIX_DAX_SHIFT) | | ||
36 | RADIX_DAX_ENTRY_LOCK); | ||
37 | } | ||
26 | 38 | ||
27 | ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, | 39 | ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, |
28 | struct iomap_ops *ops); | 40 | struct iomap_ops *ops); |
@@ -67,6 +79,27 @@ static inline int dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | |||
67 | return VM_FAULT_FALLBACK; | 79 | return VM_FAULT_FALLBACK; |
68 | } | 80 | } |
69 | 81 | ||
82 | #ifdef CONFIG_FS_DAX_PMD | ||
83 | static inline unsigned int dax_radix_order(void *entry) | ||
84 | { | ||
85 | if ((unsigned long)entry & RADIX_DAX_PMD) | ||
86 | return PMD_SHIFT - PAGE_SHIFT; | ||
87 | return 0; | ||
88 | } | ||
89 | int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, | ||
90 | pmd_t *pmd, unsigned int flags, struct iomap_ops *ops); | ||
91 | #else | ||
92 | static inline unsigned int dax_radix_order(void *entry) | ||
93 | { | ||
94 | return 0; | ||
95 | } | ||
96 | static inline int dax_iomap_pmd_fault(struct vm_area_struct *vma, | ||
97 | unsigned long address, pmd_t *pmd, unsigned int flags, | ||
98 | struct iomap_ops *ops) | ||
99 | { | ||
100 | return VM_FAULT_FALLBACK; | ||
101 | } | ||
102 | #endif | ||
70 | int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); | 103 | int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); |
71 | #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) | 104 | #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) |
72 | 105 | ||