Skip to content

Commit e511c4a

Browse files
jchu314atgithubdjbw
authored andcommitted
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. Suggested-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Jane Chu <jane.chu@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Cc: Mike Snitzer <snitzer@redhat.com> Reviewed-by: Vivek Goyal <vgoyal@redhat.com> Link: https://lore.kernel.org/r/165247982851.52965.11024212198889762949.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
1 parent 5898b43 commit e511c4a

16 files changed

Lines changed: 61 additions & 33 deletions

File tree

drivers/dax/super.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,15 @@ enum dax_device_flags {
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
*
123124
* Return: negative errno if an error occurs, otherwise the number of
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,
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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,12 @@ static struct dax_device *linear_dax_pgoff(struct dm_target *ti, pgoff_t *pgoff)
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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,11 +889,12 @@ static struct dax_device *log_writes_dax_pgoff(struct dm_target *ti,
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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,12 @@ static struct dax_device *stripe_dax_pgoff(struct dm_target *ti, pgoff_t *pgoff)
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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
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,
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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ static int persistent_memory_claim(struct dm_writecache *wc)
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)
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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,8 @@ static struct dm_target *dm_dax_get_live_target(struct mapped_device *md,
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,
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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
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,
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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
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 {
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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode);
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,
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,
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

0 commit comments

Comments
 (0)