History

dax: introduce DAX_RECOVERY_WRITE dax access mode

Up till now, dax_direct_access() is used implicitly for normal access, but for the purpose of recovery write, dax range with poison is requested. To make the interface clear, introduce enum dax_access_mode { DAX_ACCESS, DAX_RECOVERY_WRITE, } where DAX_ACCESS is used for normal dax access, and DAX_RECOVERY_WRITE is used for dax recovery write.

Jane Chu committed 4 years ago

Commit e511c4a1 parent 5898b4316 files · +61 −33Browse files

Unified · Split

16 files
  1. drivers/dax/super.c +3 −2
  2. drivers/md/dm-linear.c +3 −2
  3. drivers/md/dm-log-writes.c +3 −2
  4. drivers/md/dm-stripe.c +3 −2
  5. drivers/md/dm-target.c +3 −1
  6. drivers/md/dm-writecache.c +4 −3
  7. drivers/md/dm.c +3 −2
  8. drivers/nvdimm/pmem.c +5 −3
  9. drivers/nvdimm/pmem.h +4 −1
  10. drivers/s390/block/dcssblk.c +6 −3
  11. fs/dax.c +5 −4
  12. fs/fuse/dax.c +2 −2
  13. fs/fuse/virtio_fs.c +4 −2
  14. include/linux/dax.h +7 −2
  15. include/linux/device-mapper.h +3 −1
  16. tools/testing/nvdimm/pmem-dax.c +3 −1
drivers/dax/super.c+3−2
@@ -117,6 +117,7 @@ enum dax_device_flags { · 116 unmodified lines
117117 * @dax_dev: a dax_device instance representing the logical memory range
118118 * @pgoff: offset in pages from the start of the device to translate
119119 * @nr_pages: number of consecutive pages caller can handle relative to @pfn
120+ * @mode: indicator on normal access or recovery write
120121 * @kaddr: output parameter that returns a virtual address mapping of pfn
121122 * @pfn: output parameter that returns an absolute pfn translation of @pgoff
122123 *
@@ -124,7 +125,7 @@ enum dax_device_flags { · 1 unmodified line
124125 * pages accessible at the device relative @pgoff.
125126 */
126127 long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
127− void **kaddr, pfn_t *pfn)
128+ enum dax_access_mode mode, void **kaddr, pfn_t *pfn)
128129 {
129130 long avail;
130131
@@ -138,7 +139,7 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, · 7 unmodified lines
138139 return -EINVAL;
139140
140141 avail = dax_dev->ops->direct_access(dax_dev, pgoff, nr_pages,
141− kaddr, pfn);
142+ mode, kaddr, pfn);
142143 if (!avail)
143144 return -ERANGE;
144145 return min(avail, nr_pages);
drivers/md/dm-linear.c+3−2
@@ -172,11 +172,12 @@ static struct dax_device *linear_dax_pgoff(struct dm_target *ti, pgoff_t *pgoff) · 171 unmodified lines
172172 }
173173
174174 static long linear_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
175− long nr_pages, void **kaddr, pfn_t *pfn)
175+ long nr_pages, enum dax_access_mode mode, void **kaddr,
176+ pfn_t *pfn)
176177 {
177178 struct dax_device *dax_dev = linear_dax_pgoff(ti, &pgoff);
178179
179− return dax_direct_access(dax_dev, pgoff, nr_pages, kaddr, pfn);
180+ return dax_direct_access(dax_dev, pgoff, nr_pages, mode, kaddr, pfn);
180181 }
181182
182183 static int linear_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff,
drivers/md/dm-log-writes.c+3−2
@@ -889,11 +889,12 @@ static struct dax_device *log_writes_dax_pgoff(struct dm_target *ti, · 888 unmodified lines
889889 }
890890
891891 static long log_writes_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
892− long nr_pages, void **kaddr, pfn_t *pfn)
892+ long nr_pages, enum dax_access_mode mode, void **kaddr,
893+ pfn_t *pfn)
893894 {
894895 struct dax_device *dax_dev = log_writes_dax_pgoff(ti, &pgoff);
895896
896− return dax_direct_access(dax_dev, pgoff, nr_pages, kaddr, pfn);
897+ return dax_direct_access(dax_dev, pgoff, nr_pages, mode, kaddr, pfn);
897898 }
898899
899900 static int log_writes_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff,
drivers/md/dm-stripe.c+3−2
@@ -315,11 +315,12 @@ static struct dax_device *stripe_dax_pgoff(struct dm_target *ti, pgoff_t *pgoff) · 314 unmodified lines
315315 }
316316
317317 static long stripe_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
318− long nr_pages, void **kaddr, pfn_t *pfn)
318+ long nr_pages, enum dax_access_mode mode, void **kaddr,
319+ pfn_t *pfn)
319320 {
320321 struct dax_device *dax_dev = stripe_dax_pgoff(ti, &pgoff);
321322
322− return dax_direct_access(dax_dev, pgoff, nr_pages, kaddr, pfn);
323+ return dax_direct_access(dax_dev, pgoff, nr_pages, mode, kaddr, pfn);
323324 }
324325
325326 static int stripe_dax_zero_page_range(struct dm_target *ti, pgoff_t pgoff,
drivers/md/dm-target.c+3−1
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <linux/init.h>
1111 #include <linux/kmod.h>
1212 #include <linux/bio.h>
13+#include <linux/dax.h>
1314
1415 #define DM_MSG_PREFIX "target"
1516
@@ -142,7 +143,8 @@ static void io_err_release_clone_rq(struct request *clone, · 126 unmodified lines
142143 }
143144
144145 static long io_err_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
145− long nr_pages, void **kaddr, pfn_t *pfn)
146+ long nr_pages, enum dax_access_mode mode, void **kaddr,
147+ pfn_t *pfn)
146148 {
147149 return -EIO;
148150 }
drivers/md/dm-writecache.c+4−3
@@ -286,7 +286,8 @@ static int persistent_memory_claim(struct dm_writecache *wc) · 285 unmodified lines
286286
287287 id = dax_read_lock();
288288
289− da = dax_direct_access(wc->ssd_dev->dax_dev, offset, p, &wc->memory_map, &pfn);
289+ da = dax_direct_access(wc->ssd_dev->dax_dev, offset, p, DAX_ACCESS,
290+ &wc->memory_map, &pfn);
290291 if (da < 0) {
291292 wc->memory_map = NULL;
292293 r = da;
@@ -308,8 +309,8 @@ static int persistent_memory_claim(struct dm_writecache *wc) · 15 unmodified lines
308309 i = 0;
309310 do {
310311 long daa;
311− daa = dax_direct_access(wc->ssd_dev->dax_dev, offset + i, p - i,
312− NULL, &pfn);
312+ daa = dax_direct_access(wc->ssd_dev->dax_dev, offset + i,
313+ p - i, DAX_ACCESS, NULL, &pfn);
313314 if (daa <= 0) {
314315 r = daa ? daa : -EINVAL;
315316 goto err3;
drivers/md/dm.c+3−2
@@ -1093,7 +1093,8 @@ static struct dm_target *dm_dax_get_live_target(struct mapped_device *md, · 1092 unmodified lines
10931093 }
10941094
10951095 static long dm_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
1096− long nr_pages, void **kaddr, pfn_t *pfn)
1096+ long nr_pages, enum dax_access_mode mode, void **kaddr,
1097+ pfn_t *pfn)
10971098 {
10981099 struct mapped_device *md = dax_get_private(dax_dev);
10991100 sector_t sector = pgoff * PAGE_SECTORS;
@@ -1111,7 +1112,7 @@ static long dm_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, · 11 unmodified lines
11111112 if (len < 1)
11121113 goto out;
11131114 nr_pages = min(len, nr_pages);
1114− ret = ti->type->direct_access(ti, pgoff, nr_pages, kaddr, pfn);
1115+ ret = ti->type->direct_access(ti, pgoff, nr_pages, mode, kaddr, pfn);
11151116
11161117 out:
11171118 dm_put_live_table(md, srcu_idx);
drivers/nvdimm/pmem.c+5−3
@@ -239,7 +239,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, · 238 unmodified lines
239239
240240 /* see "strong" declaration in tools/testing/nvdimm/pmem-dax.c */
241241 __weak long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
242− long nr_pages, void **kaddr, pfn_t *pfn)
242+ long nr_pages, enum dax_access_mode mode, void **kaddr,
243+ pfn_t *pfn)
243244 {
244245 resource_size_t offset = PFN_PHYS(pgoff) + pmem->data_offset;
245246
@@ -278,11 +279,12 @@ static int pmem_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, · 32 unmodified lines
278279 }
279280
280281 static long pmem_dax_direct_access(struct dax_device *dax_dev,
281− pgoff_t pgoff, long nr_pages, void **kaddr, pfn_t *pfn)
282+ pgoff_t pgoff, long nr_pages, enum dax_access_mode mode,
283+ void **kaddr, pfn_t *pfn)
282284 {
283285 struct pmem_device *pmem = dax_get_private(dax_dev);
284286
285− return __pmem_direct_access(pmem, pgoff, nr_pages, kaddr, pfn);
287+ return __pmem_direct_access(pmem, pgoff, nr_pages, mode, kaddr, pfn);
286288 }
287289
288290 static const struct dax_operations pmem_dax_ops = {
drivers/nvdimm/pmem.h+4−1
@@ -8,6 +8,8 @@ · 7 unmodified lines
88 #include <linux/pfn_t.h>
99 #include <linux/fs.h>
1010
11+enum dax_access_mode;
12+
1113 /* this definition is in it's own header for tools/testing/nvdimm to consume */
1214 struct pmem_device {
1315 /* One contiguous memory region per device */
@@ -28,7 +30,8 @@ struct pmem_device { · 14 unmodified lines
2830 };
2931
3032 long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
31− long nr_pages, void **kaddr, pfn_t *pfn);
33+ long nr_pages, enum dax_access_mode mode, void **kaddr,
34+ pfn_t *pfn);
3235
3336 #ifdef CONFIG_MEMORY_FAILURE
3437 static inline bool test_and_clear_pmem_poison(struct page *page)
drivers/s390/block/dcssblk.c+6−3
@@ -32,7 +32,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); · 31 unmodified lines
3232 static void dcssblk_release(struct gendisk *disk, fmode_t mode);
3333 static void dcssblk_submit_bio(struct bio *bio);
3434 static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
35− long nr_pages, void **kaddr, pfn_t *pfn);
35+ long nr_pages, enum dax_access_mode mode, void **kaddr,
36+ pfn_t *pfn);
3637
3738 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
3839
@@ -50,7 +51,8 @@ static int dcssblk_dax_zero_page_range(struct dax_device *dax_dev, · 11 unmodified lines
5051 long rc;
5152 void *kaddr;
5253
53− rc = dax_direct_access(dax_dev, pgoff, nr_pages, &kaddr, NULL);
54+ rc = dax_direct_access(dax_dev, pgoff, nr_pages, DAX_ACCESS,
55+ &kaddr, NULL);
5456 if (rc < 0)
5557 return rc;
5658 memset(kaddr, 0, nr_pages << PAGE_SHIFT);
@@ -927,7 +929,8 @@ __dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff, · 870 unmodified lines
927929
928930 static long
929931 dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
930− long nr_pages, void **kaddr, pfn_t *pfn)
932+ long nr_pages, enum dax_access_mode mode, void **kaddr,
933+ pfn_t *pfn)
931934 {
932935 struct dcssblk_dev_info *dev_info = dax_get_private(dax_dev);
933936
fs/dax.c+5−4
@@ -721,7 +721,8 @@ static int copy_cow_page_dax(struct vm_fault *vmf, const struct iomap_iter *iter · 720 unmodified lines
721721 int id;
722722
723723 id = dax_read_lock();
724− rc = dax_direct_access(iter->iomap.dax_dev, pgoff, 1, &kaddr, NULL);
724+ rc = dax_direct_access(iter->iomap.dax_dev, pgoff, 1, DAX_ACCESS,
725+ &kaddr, NULL);
725726 if (rc < 0) {
726727 dax_read_unlock(id);
727728 return rc;
@@ -1013,7 +1014,7 @@ static int dax_iomap_pfn(const struct iomap *iomap, loff_t pos, size_t size, · 285 unmodified lines
10131014
10141015 id = dax_read_lock();
10151016 length = dax_direct_access(iomap->dax_dev, pgoff, PHYS_PFN(size),
1016− NULL, pfnp);
1017+ DAX_ACCESS, NULL, pfnp);
10171018 if (length < 0) {
10181019 rc = length;
10191020 goto out;
@@ -1122,7 +1123,7 @@ static int dax_memzero(struct dax_device *dax_dev, pgoff_t pgoff, · 102 unmodified lines
11221123 void *kaddr;
11231124 long ret;
11241125
1125− ret = dax_direct_access(dax_dev, pgoff, 1, &kaddr, NULL);
1126+ ret = dax_direct_access(dax_dev, pgoff, 1, DAX_ACCESS, &kaddr, NULL);
11261127 if (ret > 0) {
11271128 memset(kaddr + offset, 0, size);
11281129 dax_flush(dax_dev, kaddr + offset, size);
@@ -1247,7 +1248,7 @@ static loff_t dax_iomap_iter(const struct iomap_iter *iomi, · 118 unmodified lines
12471248 }
12481249
12491250 map_len = dax_direct_access(dax_dev, pgoff, PHYS_PFN(size),
1250− &kaddr, NULL);
1251+ DAX_ACCESS, &kaddr, NULL);
12511252 if (map_len < 0) {
12521253 ret = map_len;
12531254 break;
fs/fuse/dax.c+2−2
@@ -1241,8 +1241,8 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd) · 1240 unmodified lines
12411241 INIT_DELAYED_WORK(&fcd->free_work, fuse_dax_free_mem_worker);
12421242
12431243 id = dax_read_lock();
1244− nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), NULL,
1245− NULL);
1244+ nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size),
1245+ DAX_ACCESS, NULL, NULL);
12461246 dax_read_unlock(id);
12471247 if (nr_pages < 0) {
12481248 pr_debug("dax_direct_access() returned %ld\n", nr_pages);
fs/fuse/virtio_fs.c+4−2
@@ -752,7 +752,8 @@ static void virtio_fs_cleanup_vqs(struct virtio_device *vdev, · 751 unmodified lines
752752 * offset.
753753 */
754754 static long virtio_fs_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
755− long nr_pages, void **kaddr, pfn_t *pfn)
755+ long nr_pages, enum dax_access_mode mode,
756+ void **kaddr, pfn_t *pfn)
756757 {
757758 struct virtio_fs *fs = dax_get_private(dax_dev);
758759 phys_addr_t offset = PFN_PHYS(pgoff);
@@ -772,7 +773,8 @@ static int virtio_fs_zero_page_range(struct dax_device *dax_dev, · 13 unmodified lines
772773 long rc;
773774 void *kaddr;
774775
775− rc = dax_direct_access(dax_dev, pgoff, nr_pages, &kaddr, NULL);
776+ rc = dax_direct_access(dax_dev, pgoff, nr_pages, DAX_ACCESS, &kaddr,
777+ NULL);
776778 if (rc < 0)
777779 return rc;
778780 memset(kaddr, 0, nr_pages << PAGE_SHIFT);
include/linux/dax.h+7−2
@@ -14,6 +14,11 @@ struct iomap_ops; · 13 unmodified lines
1414 struct iomap_iter;
1515 struct iomap;
1616
17+enum dax_access_mode {
18+ DAX_ACCESS,
19+ DAX_RECOVERY_WRITE,
20+};
21+
1722 struct dax_operations {
1823 /*
1924 * direct_access: translate a device-relative
@@ -21,7 +26,7 @@ struct dax_operations { · 1 unmodified line
2126 * number of pages available for DAX at that pfn.
2227 */
2328 long (*direct_access)(struct dax_device *, pgoff_t, long,
24− void **, pfn_t *);
29+ enum dax_access_mode, void **, pfn_t *);
2530 /*
2631 * Validate whether this device is usable as an fsdax backing
2732 * device.
@@ -178,7 +183,7 @@ static inline void dax_read_unlock(int id) · 150 unmodified lines
178183 bool dax_alive(struct dax_device *dax_dev);
179184 void *dax_get_private(struct dax_device *dax_dev);
180185 long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
181− void **kaddr, pfn_t *pfn);
186+ enum dax_access_mode mode, void **kaddr, pfn_t *pfn);
182187 size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
183188 size_t bytes, struct iov_iter *i);
184189 size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
include/linux/device-mapper.h+3−1
@@ -20,6 +20,7 @@ struct dm_table; · 19 unmodified lines
2020 struct dm_report_zones_args;
2121 struct mapped_device;
2222 struct bio_vec;
23+enum dax_access_mode;
2324
2425 /*
2526 * Type of table, mapped_device's mempool and request_queue
@@ -146,7 +147,8 @@ typedef int (*dm_busy_fn) (struct dm_target *ti); · 120 unmodified lines
146147 * >= 0 : the number of bytes accessible at the address
147148 */
148149 typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff,
149− long nr_pages, void **kaddr, pfn_t *pfn);
150+ long nr_pages, enum dax_access_mode node, void **kaddr,
151+ pfn_t *pfn);
150152 typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *ti, pgoff_t pgoff,
151153 size_t nr_pages);
152154
tools/testing/nvdimm/pmem-dax.c+3−1
@@ -4,11 +4,13 @@ · 3 unmodified lines
44 */
55 #include "test/nfit_test.h"
66 #include <linux/blkdev.h>
7+#include <linux/dax.h>
78 #include <pmem.h>
89 #include <nd.h>
910
1011 long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
11− long nr_pages, void **kaddr, pfn_t *pfn)
12+ long nr_pages, enum dax_access_mode mode, void **kaddr,
13+ pfn_t *pfn)
1214 {
1315 resource_size_t offset = PFN_PHYS(pgoff) + pmem->data_offset;
1416

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t