Skip to content

Commit 828bf6e

Browse files
committedAug 26, 2018
Merge tag 'libnvdimm-for-4.19_misc' of gitolite.kernel.org:pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull libnvdimm updates from Dave Jiang: "Collection of misc libnvdimm patches for 4.19 submission: - Adding support to read locked nvdimm capacity. - Change test code to make DSM failure code injection an override. - Add support for calculate maximum contiguous area for namespace. - Add support for queueing a short ARS when there is on going ARS for nvdimm. - Allow NULL to be passed in to ->direct_access() for kaddr and pfn params. - Improve smart injection support for nvdimm emulation testing. - Fix test code that supports for emulating controller temperature. - Fix hang on error before devm_memremap_pages() - Fix a bug that causes user memory corruption when data returned to user for ars_status. - Maintainer updates for Ross Zwisler emails and adding Jan Kara to fsdax" * tag 'libnvdimm-for-4.19_misc' of gitolite.kernel.org:pub/scm/linux/kernel/git/nvdimm/nvdimm: libnvdimm: fix ars_status output length calculation device-dax: avoid hang on error before devm_memremap_pages() tools/testing/nvdimm: improve emulation of smart injection filesystem-dax: Do not request kaddr and pfn when not required md/dm-writecache: Don't request pointer dummy_addr when not required dax/super: Do not request a pointer kaddr when not required tools/testing/nvdimm: kaddr and pfn can be NULL to ->direct_access() s390, dcssblk: kaddr and pfn can be NULL to ->direct_access() libnvdimm, pmem: kaddr and pfn can be NULL to ->direct_access() acpi/nfit: queue issuing of ars when an uc error notification comes in libnvdimm: Export max available extent libnvdimm: Use max contiguous area for namespace size MAINTAINERS: Add Jan Kara for filesystem DAX MAINTAINERS: update Ross Zwisler's email address tools/testing/nvdimm: Fix support for emulating controller temperature tools/testing/nvdimm: Make DSM failure code injection an override acpi, nfit: Prefer _DSM over _LSR for namespace label reads libnvdimm: Introduce locked DIMM capacity support
2 parents b326272 + 286e877 commit 828bf6e

File tree

19 files changed

+270
-90
lines changed

19 files changed

+270
-90
lines changed
 

‎.mailmap

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
159159
Randy Dunlap <rdunlap@infradead.org> <rdunlap@xenotime.net>
160160
Rémi Denis-Courmont <rdenis@simphalempin.com>
161161
Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
162+
Ross Zwisler <zwisler@kernel.org> <ross.zwisler@linux.intel.com>
162163
Rudolf Marek <R.Marek@sh.cvut.cz>
163164
Rui Saraiva <rmps@joel.ist.utl.pt>
164165
Sachin P Sant <ssant@in.ibm.com>

‎MAINTAINERS

+7-6
Original file line numberDiff line numberDiff line change
@@ -4364,7 +4364,8 @@ F: drivers/i2c/busses/i2c-diolan-u2c.c
43644364

43654365
FILESYSTEM DIRECT ACCESS (DAX)
43664366
M: Matthew Wilcox <mawilcox@microsoft.com>
4367-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
4367+
M: Ross Zwisler <zwisler@kernel.org>
4368+
M: Jan Kara <jack@suse.cz>
43684369
L: linux-fsdevel@vger.kernel.org
43694370
S: Supported
43704371
F: fs/dax.c
@@ -4374,7 +4375,7 @@ F: include/trace/events/fs_dax.h
43744375
DEVICE DIRECT ACCESS (DAX)
43754376
M: Dan Williams <dan.j.williams@intel.com>
43764377
M: Dave Jiang <dave.jiang@intel.com>
4377-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
4378+
M: Ross Zwisler <zwisler@kernel.org>
43784379
M: Vishal Verma <vishal.l.verma@intel.com>
43794380
L: linux-nvdimm@lists.01.org
43804381
S: Supported
@@ -8303,7 +8304,7 @@ S: Maintained
83038304
F: tools/lib/lockdep/
83048305

83058306
LIBNVDIMM BLK: MMIO-APERTURE DRIVER
8306-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
8307+
M: Ross Zwisler <zwisler@kernel.org>
83078308
M: Dan Williams <dan.j.williams@intel.com>
83088309
M: Vishal Verma <vishal.l.verma@intel.com>
83098310
M: Dave Jiang <dave.jiang@intel.com>
@@ -8316,15 +8317,15 @@ F: drivers/nvdimm/region_devs.c
83168317
LIBNVDIMM BTT: BLOCK TRANSLATION TABLE
83178318
M: Vishal Verma <vishal.l.verma@intel.com>
83188319
M: Dan Williams <dan.j.williams@intel.com>
8319-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
8320+
M: Ross Zwisler <zwisler@kernel.org>
83208321
M: Dave Jiang <dave.jiang@intel.com>
83218322
L: linux-nvdimm@lists.01.org
83228323
Q: https://patchwork.kernel.org/project/linux-nvdimm/list/
83238324
S: Supported
83248325
F: drivers/nvdimm/btt*
83258326

83268327
LIBNVDIMM PMEM: PERSISTENT MEMORY DRIVER
8327-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
8328+
M: Ross Zwisler <zwisler@kernel.org>
83288329
M: Dan Williams <dan.j.williams@intel.com>
83298330
M: Vishal Verma <vishal.l.verma@intel.com>
83308331
M: Dave Jiang <dave.jiang@intel.com>
@@ -8343,7 +8344,7 @@ F: Documentation/devicetree/bindings/pmem/pmem-region.txt
83438344

83448345
LIBNVDIMM: NON-VOLATILE MEMORY DEVICE SUBSYSTEM
83458346
M: Dan Williams <dan.j.williams@intel.com>
8346-
M: Ross Zwisler <ross.zwisler@linux.intel.com>
8347+
M: Ross Zwisler <zwisler@kernel.org>
83478348
M: Vishal Verma <vishal.l.verma@intel.com>
83488349
M: Dave Jiang <dave.jiang@intel.com>
83498350
L: linux-nvdimm@lists.01.org

‎drivers/acpi/nfit/core.c

+20-4
Original file line numberDiff line numberDiff line change
@@ -1699,7 +1699,7 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
16991699
{
17001700
struct acpi_device *adev, *adev_dimm;
17011701
struct device *dev = acpi_desc->dev;
1702-
unsigned long dsm_mask;
1702+
unsigned long dsm_mask, label_mask;
17031703
const guid_t *guid;
17041704
int i;
17051705
int family = -1;
@@ -1771,6 +1771,16 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
17711771
1ULL << i))
17721772
set_bit(i, &nfit_mem->dsm_mask);
17731773

1774+
/*
1775+
* Prefer the NVDIMM_FAMILY_INTEL label read commands if present
1776+
* due to their better semantics handling locked capacity.
1777+
*/
1778+
label_mask = 1 << ND_CMD_GET_CONFIG_SIZE | 1 << ND_CMD_GET_CONFIG_DATA
1779+
| 1 << ND_CMD_SET_CONFIG_DATA;
1780+
if (family == NVDIMM_FAMILY_INTEL
1781+
&& (dsm_mask & label_mask) == label_mask)
1782+
return 0;
1783+
17741784
if (acpi_nvdimm_has_method(adev_dimm, "_LSI")
17751785
&& acpi_nvdimm_has_method(adev_dimm, "_LSR")) {
17761786
dev_dbg(dev, "%s: has _LSR\n", dev_name(&adev_dimm->dev));
@@ -2559,7 +2569,12 @@ static void ars_complete(struct acpi_nfit_desc *acpi_desc,
25592569
test_bit(ARS_SHORT, &nfit_spa->ars_state)
25602570
? "short" : "long");
25612571
clear_bit(ARS_SHORT, &nfit_spa->ars_state);
2562-
set_bit(ARS_DONE, &nfit_spa->ars_state);
2572+
if (test_and_clear_bit(ARS_REQ_REDO, &nfit_spa->ars_state)) {
2573+
set_bit(ARS_SHORT, &nfit_spa->ars_state);
2574+
set_bit(ARS_REQ, &nfit_spa->ars_state);
2575+
dev_dbg(dev, "ARS: processing scrub request received while in progress\n");
2576+
} else
2577+
set_bit(ARS_DONE, &nfit_spa->ars_state);
25632578
}
25642579

25652580
static int ars_status_process_records(struct acpi_nfit_desc *acpi_desc)
@@ -3256,9 +3271,10 @@ int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc, unsigned long flags)
32563271
if (test_bit(ARS_FAILED, &nfit_spa->ars_state))
32573272
continue;
32583273

3259-
if (test_and_set_bit(ARS_REQ, &nfit_spa->ars_state))
3274+
if (test_and_set_bit(ARS_REQ, &nfit_spa->ars_state)) {
32603275
busy++;
3261-
else {
3276+
set_bit(ARS_REQ_REDO, &nfit_spa->ars_state);
3277+
} else {
32623278
if (test_bit(ARS_SHORT, &flags))
32633279
set_bit(ARS_SHORT, &nfit_spa->ars_state);
32643280
scheduled++;

‎drivers/acpi/nfit/nfit.h

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ enum nfit_dimm_notifiers {
119119

120120
enum nfit_ars_state {
121121
ARS_REQ,
122+
ARS_REQ_REDO,
122123
ARS_DONE,
123124
ARS_SHORT,
124125
ARS_FAILED,

‎drivers/dax/pmem.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,19 @@ static int dax_pmem_probe(struct device *dev)
105105
if (rc)
106106
return rc;
107107

108-
rc = devm_add_action_or_reset(dev, dax_pmem_percpu_exit,
109-
&dax_pmem->ref);
110-
if (rc)
108+
rc = devm_add_action(dev, dax_pmem_percpu_exit, &dax_pmem->ref);
109+
if (rc) {
110+
percpu_ref_exit(&dax_pmem->ref);
111111
return rc;
112+
}
112113

113114
dax_pmem->pgmap.ref = &dax_pmem->ref;
114115
addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
115-
if (IS_ERR(addr))
116+
if (IS_ERR(addr)) {
117+
devm_remove_action(dev, dax_pmem_percpu_exit, &dax_pmem->ref);
118+
percpu_ref_exit(&dax_pmem->ref);
116119
return PTR_ERR(addr);
120+
}
117121

118122
rc = devm_add_action_or_reset(dev, dax_pmem_percpu_kill,
119123
&dax_pmem->ref);

‎drivers/dax/super.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ bool __bdev_dax_supported(struct block_device *bdev, int blocksize)
8989
struct request_queue *q;
9090
pgoff_t pgoff;
9191
int err, id;
92-
void *kaddr;
9392
pfn_t pfn;
9493
long len;
9594
char buf[BDEVNAME_SIZE];
@@ -122,7 +121,7 @@ bool __bdev_dax_supported(struct block_device *bdev, int blocksize)
122121
}
123122

124123
id = dax_read_lock();
125-
len = dax_direct_access(dax_dev, pgoff, 1, &kaddr, &pfn);
124+
len = dax_direct_access(dax_dev, pgoff, 1, NULL, &pfn);
126125
dax_read_unlock(id);
127126

128127
put_dax(dax_dev);

‎drivers/md/dm-writecache.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,8 @@ static int persistent_memory_claim(struct dm_writecache *wc)
268268
i = 0;
269269
do {
270270
long daa;
271-
void *dummy_addr;
272271
daa = dax_direct_access(wc->ssd_dev->dax_dev, i, p - i,
273-
&dummy_addr, &pfn);
272+
NULL, &pfn);
274273
if (daa <= 0) {
275274
r = daa ? daa : -EINVAL;
276275
goto err3;

‎drivers/nvdimm/bus.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -812,9 +812,9 @@ u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
812812
* overshoots the remainder by 4 bytes, assume it was
813813
* including 'status'.
814814
*/
815-
if (out_field[1] - 8 == remainder)
815+
if (out_field[1] - 4 == remainder)
816816
return remainder;
817-
return out_field[1] - 4;
817+
return out_field[1] - 8;
818818
} else if (cmd == ND_CMD_CALL) {
819819
struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
820820

‎drivers/nvdimm/dimm.c

+22-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ static int nvdimm_probe(struct device *dev)
3434
return rc;
3535
}
3636

37+
/* reset locked, to be validated below... */
38+
nvdimm_clear_locked(dev);
39+
3740
ndd = kzalloc(sizeof(*ndd), GFP_KERNEL);
3841
if (!ndd)
3942
return -ENOMEM;
@@ -48,12 +51,30 @@ static int nvdimm_probe(struct device *dev)
4851
get_device(dev);
4952
kref_init(&ndd->kref);
5053

54+
/*
55+
* EACCES failures reading the namespace label-area-properties
56+
* are interpreted as the DIMM capacity being locked but the
57+
* namespace labels themselves being accessible.
58+
*/
5159
rc = nvdimm_init_nsarea(ndd);
52-
if (rc == -EACCES)
60+
if (rc == -EACCES) {
61+
/*
62+
* See nvdimm_namespace_common_probe() where we fail to
63+
* allow namespaces to probe while the DIMM is locked,
64+
* but we do allow for namespace enumeration.
65+
*/
5366
nvdimm_set_locked(dev);
67+
rc = 0;
68+
}
5469
if (rc)
5570
goto err;
5671

72+
/*
73+
* EACCES failures reading the namespace label-data are
74+
* interpreted as the label area being locked in addition to the
75+
* DIMM capacity. We fail the dimm probe to prevent regions from
76+
* attempting to parse the label area.
77+
*/
5778
rc = nvdimm_init_config_data(ndd);
5879
if (rc == -EACCES)
5980
nvdimm_set_locked(dev);
@@ -72,7 +93,6 @@ static int nvdimm_probe(struct device *dev)
7293
if (rc == 0)
7394
nvdimm_set_aliasing(dev);
7495
}
75-
nvdimm_clear_locked(dev);
7696
nvdimm_bus_unlock(dev);
7797

7898
if (rc)

‎drivers/nvdimm/dimm_devs.c

+31
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,37 @@ resource_size_t nd_blk_available_dpa(struct nd_region *nd_region)
536536
return info.available;
537537
}
538538

539+
/**
540+
* nd_pmem_max_contiguous_dpa - For the given dimm+region, return the max
541+
* contiguous unallocated dpa range.
542+
* @nd_region: constrain available space check to this reference region
543+
* @nd_mapping: container of dpa-resource-root + labels
544+
*/
545+
resource_size_t nd_pmem_max_contiguous_dpa(struct nd_region *nd_region,
546+
struct nd_mapping *nd_mapping)
547+
{
548+
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
549+
struct nvdimm_bus *nvdimm_bus;
550+
resource_size_t max = 0;
551+
struct resource *res;
552+
553+
/* if a dimm is disabled the available capacity is zero */
554+
if (!ndd)
555+
return 0;
556+
557+
nvdimm_bus = walk_to_nvdimm_bus(ndd->dev);
558+
if (__reserve_free_pmem(&nd_region->dev, nd_mapping->nvdimm))
559+
return 0;
560+
for_each_dpa_resource(ndd, res) {
561+
if (strcmp(res->name, "pmem-reserve") != 0)
562+
continue;
563+
if (resource_size(res) > max)
564+
max = resource_size(res);
565+
}
566+
release_free_pmem(nvdimm_bus, nd_mapping);
567+
return max;
568+
}
569+
539570
/**
540571
* nd_pmem_available_dpa - for the given dimm+region account unallocated dpa
541572
* @nd_mapping: container of dpa-resource-root + labels

‎drivers/nvdimm/namespace_devs.c

+26-3
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,7 @@ static int merge_dpa(struct nd_region *nd_region,
799799
return 0;
800800
}
801801

802-
static int __reserve_free_pmem(struct device *dev, void *data)
802+
int __reserve_free_pmem(struct device *dev, void *data)
803803
{
804804
struct nvdimm *nvdimm = data;
805805
struct nd_region *nd_region;
@@ -836,7 +836,7 @@ static int __reserve_free_pmem(struct device *dev, void *data)
836836
return 0;
837837
}
838838

839-
static void release_free_pmem(struct nvdimm_bus *nvdimm_bus,
839+
void release_free_pmem(struct nvdimm_bus *nvdimm_bus,
840840
struct nd_mapping *nd_mapping)
841841
{
842842
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
@@ -1032,7 +1032,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
10321032

10331033
allocated += nvdimm_allocated_dpa(ndd, &label_id);
10341034
}
1035-
available = nd_region_available_dpa(nd_region);
1035+
available = nd_region_allocatable_dpa(nd_region);
10361036

10371037
if (val > available + allocated)
10381038
return -ENOSPC;
@@ -1144,6 +1144,26 @@ resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns)
11441144
}
11451145
EXPORT_SYMBOL(nvdimm_namespace_capacity);
11461146

1147+
bool nvdimm_namespace_locked(struct nd_namespace_common *ndns)
1148+
{
1149+
int i;
1150+
bool locked = false;
1151+
struct device *dev = &ndns->dev;
1152+
struct nd_region *nd_region = to_nd_region(dev->parent);
1153+
1154+
for (i = 0; i < nd_region->ndr_mappings; i++) {
1155+
struct nd_mapping *nd_mapping = &nd_region->mapping[i];
1156+
struct nvdimm *nvdimm = nd_mapping->nvdimm;
1157+
1158+
if (test_bit(NDD_LOCKED, &nvdimm->flags)) {
1159+
dev_dbg(dev, "%s locked\n", nvdimm_name(nvdimm));
1160+
locked = true;
1161+
}
1162+
}
1163+
return locked;
1164+
}
1165+
EXPORT_SYMBOL(nvdimm_namespace_locked);
1166+
11471167
static ssize_t size_show(struct device *dev,
11481168
struct device_attribute *attr, char *buf)
11491169
{
@@ -1695,6 +1715,9 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
16951715
}
16961716
}
16971717

1718+
if (nvdimm_namespace_locked(ndns))
1719+
return ERR_PTR(-EACCES);
1720+
16981721
size = nvdimm_namespace_capacity(ndns);
16991722
if (size < ND_MIN_NAMESPACE_SIZE) {
17001723
dev_dbg(&ndns->dev, "%pa, too small must be at least %#x\n",

‎drivers/nvdimm/nd-core.h

+8
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ struct nd_region;
100100
struct nvdimm_drvdata;
101101
struct nd_mapping;
102102
void nd_mapping_free_labels(struct nd_mapping *nd_mapping);
103+
104+
int __reserve_free_pmem(struct device *dev, void *data);
105+
void release_free_pmem(struct nvdimm_bus *nvdimm_bus,
106+
struct nd_mapping *nd_mapping);
107+
108+
resource_size_t nd_pmem_max_contiguous_dpa(struct nd_region *nd_region,
109+
struct nd_mapping *nd_mapping);
110+
resource_size_t nd_region_allocatable_dpa(struct nd_region *nd_region);
103111
resource_size_t nd_pmem_available_dpa(struct nd_region *nd_region,
104112
struct nd_mapping *nd_mapping, resource_size_t *overlap);
105113
resource_size_t nd_blk_available_dpa(struct nd_region *nd_region);

‎drivers/nvdimm/nd.h

+1
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ struct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd,
357357
struct nd_label_id *label_id, resource_size_t start,
358358
resource_size_t n);
359359
resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns);
360+
bool nvdimm_namespace_locked(struct nd_namespace_common *ndns);
360361
struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev);
361362
int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns);
362363
int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt);

‎drivers/nvdimm/pmem.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,11 @@ __weak long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
226226
if (unlikely(is_bad_pmem(&pmem->bb, PFN_PHYS(pgoff) / 512,
227227
PFN_PHYS(nr_pages))))
228228
return -EIO;
229-
*kaddr = pmem->virt_addr + offset;
230-
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
229+
230+
if (kaddr)
231+
*kaddr = pmem->virt_addr + offset;
232+
if (pfn)
233+
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
231234

232235
/*
233236
* If badblocks are present, limit known good range to the

‎drivers/nvdimm/region_devs.c

+40
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,30 @@ resource_size_t nd_region_available_dpa(struct nd_region *nd_region)
389389
return available;
390390
}
391391

392+
resource_size_t nd_region_allocatable_dpa(struct nd_region *nd_region)
393+
{
394+
resource_size_t available = 0;
395+
int i;
396+
397+
if (is_memory(&nd_region->dev))
398+
available = PHYS_ADDR_MAX;
399+
400+
WARN_ON(!is_nvdimm_bus_locked(&nd_region->dev));
401+
for (i = 0; i < nd_region->ndr_mappings; i++) {
402+
struct nd_mapping *nd_mapping = &nd_region->mapping[i];
403+
404+
if (is_memory(&nd_region->dev))
405+
available = min(available,
406+
nd_pmem_max_contiguous_dpa(nd_region,
407+
nd_mapping));
408+
else if (is_nd_blk(&nd_region->dev))
409+
available += nd_blk_available_dpa(nd_region);
410+
}
411+
if (is_memory(&nd_region->dev))
412+
return available * nd_region->ndr_mappings;
413+
return available;
414+
}
415+
392416
static ssize_t available_size_show(struct device *dev,
393417
struct device_attribute *attr, char *buf)
394418
{
@@ -410,6 +434,21 @@ static ssize_t available_size_show(struct device *dev,
410434
}
411435
static DEVICE_ATTR_RO(available_size);
412436

437+
static ssize_t max_available_extent_show(struct device *dev,
438+
struct device_attribute *attr, char *buf)
439+
{
440+
struct nd_region *nd_region = to_nd_region(dev);
441+
unsigned long long available = 0;
442+
443+
nvdimm_bus_lock(dev);
444+
wait_nvdimm_bus_probe_idle(dev);
445+
available = nd_region_allocatable_dpa(nd_region);
446+
nvdimm_bus_unlock(dev);
447+
448+
return sprintf(buf, "%llu\n", available);
449+
}
450+
static DEVICE_ATTR_RO(max_available_extent);
451+
413452
static ssize_t init_namespaces_show(struct device *dev,
414453
struct device_attribute *attr, char *buf)
415454
{
@@ -561,6 +600,7 @@ static struct attribute *nd_region_attributes[] = {
561600
&dev_attr_read_only.attr,
562601
&dev_attr_set_cookie.attr,
563602
&dev_attr_available_size.attr,
603+
&dev_attr_max_available_extent.attr,
564604
&dev_attr_namespace_seed.attr,
565605
&dev_attr_init_namespaces.attr,
566606
&dev_attr_badblocks.attr,

‎drivers/s390/block/dcssblk.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -922,9 +922,11 @@ __dcssblk_direct_access(struct dcssblk_dev_info *dev_info, pgoff_t pgoff,
922922
unsigned long dev_sz;
923923

924924
dev_sz = dev_info->end - dev_info->start + 1;
925-
*kaddr = (void *) dev_info->start + offset;
926-
*pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset),
927-
PFN_DEV|PFN_SPECIAL);
925+
if (kaddr)
926+
*kaddr = (void *) dev_info->start + offset;
927+
if (pfn)
928+
*pfn = __pfn_to_pfn_t(PFN_DOWN(dev_info->start + offset),
929+
PFN_DEV|PFN_SPECIAL);
928930

929931
return (dev_sz - offset) / PAGE_SIZE;
930932
}

‎fs/dax.c

+4-9
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,6 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev,
655655
{
656656
void *vto, *kaddr;
657657
pgoff_t pgoff;
658-
pfn_t pfn;
659658
long rc;
660659
int id;
661660

@@ -664,7 +663,7 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev,
664663
return rc;
665664

666665
id = dax_read_lock();
667-
rc = dax_direct_access(dax_dev, pgoff, PHYS_PFN(size), &kaddr, &pfn);
666+
rc = dax_direct_access(dax_dev, pgoff, PHYS_PFN(size), &kaddr, NULL);
668667
if (rc < 0) {
669668
dax_read_unlock(id);
670669
return rc;
@@ -975,7 +974,6 @@ static int dax_iomap_pfn(struct iomap *iomap, loff_t pos, size_t size,
975974
{
976975
const sector_t sector = dax_iomap_sector(iomap, pos);
977976
pgoff_t pgoff;
978-
void *kaddr;
979977
int id, rc;
980978
long length;
981979

@@ -984,7 +982,7 @@ static int dax_iomap_pfn(struct iomap *iomap, loff_t pos, size_t size,
984982
return rc;
985983
id = dax_read_lock();
986984
length = dax_direct_access(iomap->dax_dev, pgoff, PHYS_PFN(size),
987-
&kaddr, pfnp);
985+
NULL, pfnp);
988986
if (length < 0) {
989987
rc = length;
990988
goto out;
@@ -1060,15 +1058,13 @@ int __dax_zero_page_range(struct block_device *bdev,
10601058
pgoff_t pgoff;
10611059
long rc, id;
10621060
void *kaddr;
1063-
pfn_t pfn;
10641061

10651062
rc = bdev_dax_pgoff(bdev, sector, PAGE_SIZE, &pgoff);
10661063
if (rc)
10671064
return rc;
10681065

10691066
id = dax_read_lock();
1070-
rc = dax_direct_access(dax_dev, pgoff, 1, &kaddr,
1071-
&pfn);
1067+
rc = dax_direct_access(dax_dev, pgoff, 1, &kaddr, NULL);
10721068
if (rc < 0) {
10731069
dax_read_unlock(id);
10741070
return rc;
@@ -1124,7 +1120,6 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
11241120
ssize_t map_len;
11251121
pgoff_t pgoff;
11261122
void *kaddr;
1127-
pfn_t pfn;
11281123

11291124
if (fatal_signal_pending(current)) {
11301125
ret = -EINTR;
@@ -1136,7 +1131,7 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
11361131
break;
11371132

11381133
map_len = dax_direct_access(dax_dev, pgoff, PHYS_PFN(size),
1139-
&kaddr, &pfn);
1134+
&kaddr, NULL);
11401135
if (map_len < 0) {
11411136
ret = map_len;
11421137
break;

‎tools/testing/nvdimm/pmem-dax.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,21 @@ long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
3131
if (get_nfit_res(pmem->phys_addr + offset)) {
3232
struct page *page;
3333

34-
*kaddr = pmem->virt_addr + offset;
34+
if (kaddr)
35+
*kaddr = pmem->virt_addr + offset;
3536
page = vmalloc_to_page(pmem->virt_addr + offset);
36-
*pfn = page_to_pfn_t(page);
37+
if (pfn)
38+
*pfn = page_to_pfn_t(page);
3739
pr_debug_ratelimited("%s: pmem: %p pgoff: %#lx pfn: %#lx\n",
3840
__func__, pmem, pgoff, page_to_pfn(page));
3941

4042
return 1;
4143
}
4244

43-
*kaddr = pmem->virt_addr + offset;
44-
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
45+
if (kaddr)
46+
*kaddr = pmem->virt_addr + offset;
47+
if (pfn)
48+
*pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags);
4549

4650
/*
4751
* If badblocks are present, limit known good range to the

‎tools/testing/nvdimm/test/nfit.c

+79-47
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,28 @@ static u32 handle[] = {
142142
static unsigned long dimm_fail_cmd_flags[NUM_DCR];
143143
static int dimm_fail_cmd_code[NUM_DCR];
144144

145+
static const struct nd_intel_smart smart_def = {
146+
.flags = ND_INTEL_SMART_HEALTH_VALID
147+
| ND_INTEL_SMART_SPARES_VALID
148+
| ND_INTEL_SMART_ALARM_VALID
149+
| ND_INTEL_SMART_USED_VALID
150+
| ND_INTEL_SMART_SHUTDOWN_VALID
151+
| ND_INTEL_SMART_MTEMP_VALID
152+
| ND_INTEL_SMART_CTEMP_VALID,
153+
.health = ND_INTEL_SMART_NON_CRITICAL_HEALTH,
154+
.media_temperature = 23 * 16,
155+
.ctrl_temperature = 25 * 16,
156+
.pmic_temperature = 40 * 16,
157+
.spares = 75,
158+
.alarm_flags = ND_INTEL_SMART_SPARE_TRIP
159+
| ND_INTEL_SMART_TEMP_TRIP,
160+
.ait_status = 1,
161+
.life_used = 5,
162+
.shutdown_state = 0,
163+
.vendor_size = 0,
164+
.shutdown_count = 100,
165+
};
166+
145167
struct nfit_test_fw {
146168
enum intel_fw_update_state state;
147169
u32 context;
@@ -752,15 +774,30 @@ static int nfit_test_cmd_smart_inject(
752774
if (buf_len != sizeof(*inj))
753775
return -EINVAL;
754776

755-
if (inj->mtemp_enable)
756-
smart->media_temperature = inj->media_temperature;
757-
if (inj->spare_enable)
758-
smart->spares = inj->spares;
759-
if (inj->fatal_enable)
760-
smart->health = ND_INTEL_SMART_FATAL_HEALTH;
761-
if (inj->unsafe_shutdown_enable) {
762-
smart->shutdown_state = 1;
763-
smart->shutdown_count++;
777+
if (inj->flags & ND_INTEL_SMART_INJECT_MTEMP) {
778+
if (inj->mtemp_enable)
779+
smart->media_temperature = inj->media_temperature;
780+
else
781+
smart->media_temperature = smart_def.media_temperature;
782+
}
783+
if (inj->flags & ND_INTEL_SMART_INJECT_SPARE) {
784+
if (inj->spare_enable)
785+
smart->spares = inj->spares;
786+
else
787+
smart->spares = smart_def.spares;
788+
}
789+
if (inj->flags & ND_INTEL_SMART_INJECT_FATAL) {
790+
if (inj->fatal_enable)
791+
smart->health = ND_INTEL_SMART_FATAL_HEALTH;
792+
else
793+
smart->health = ND_INTEL_SMART_NON_CRITICAL_HEALTH;
794+
}
795+
if (inj->flags & ND_INTEL_SMART_INJECT_SHUTDOWN) {
796+
if (inj->unsafe_shutdown_enable) {
797+
smart->shutdown_state = 1;
798+
smart->shutdown_count++;
799+
} else
800+
smart->shutdown_state = 0;
764801
}
765802
inj->status = 0;
766803
smart_notify(bus_dev, dimm_dev, smart, thresh);
@@ -884,6 +921,16 @@ static int nd_intel_test_cmd_set_lss_status(struct nfit_test *t,
884921
return 0;
885922
}
886923

924+
static int override_return_code(int dimm, unsigned int func, int rc)
925+
{
926+
if ((1 << func) & dimm_fail_cmd_flags[dimm]) {
927+
if (dimm_fail_cmd_code[dimm])
928+
return dimm_fail_cmd_code[dimm];
929+
return -EIO;
930+
}
931+
return rc;
932+
}
933+
887934
static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
888935
{
889936
int i;
@@ -894,13 +941,6 @@ static int get_dimm(struct nfit_mem *nfit_mem, unsigned int func)
894941
break;
895942
if (i >= ARRAY_SIZE(handle))
896943
return -ENXIO;
897-
898-
if ((1 << func) & dimm_fail_cmd_flags[i]) {
899-
if (dimm_fail_cmd_code[i])
900-
return dimm_fail_cmd_code[i];
901-
return -EIO;
902-
}
903-
904944
return i;
905945
}
906946

@@ -939,48 +979,59 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
939979

940980
switch (func) {
941981
case ND_INTEL_ENABLE_LSS_STATUS:
942-
return nd_intel_test_cmd_set_lss_status(t,
982+
rc = nd_intel_test_cmd_set_lss_status(t,
943983
buf, buf_len);
984+
break;
944985
case ND_INTEL_FW_GET_INFO:
945-
return nd_intel_test_get_fw_info(t, buf,
986+
rc = nd_intel_test_get_fw_info(t, buf,
946987
buf_len, i - t->dcr_idx);
988+
break;
947989
case ND_INTEL_FW_START_UPDATE:
948-
return nd_intel_test_start_update(t, buf,
990+
rc = nd_intel_test_start_update(t, buf,
949991
buf_len, i - t->dcr_idx);
992+
break;
950993
case ND_INTEL_FW_SEND_DATA:
951-
return nd_intel_test_send_data(t, buf,
994+
rc = nd_intel_test_send_data(t, buf,
952995
buf_len, i - t->dcr_idx);
996+
break;
953997
case ND_INTEL_FW_FINISH_UPDATE:
954-
return nd_intel_test_finish_fw(t, buf,
998+
rc = nd_intel_test_finish_fw(t, buf,
955999
buf_len, i - t->dcr_idx);
1000+
break;
9561001
case ND_INTEL_FW_FINISH_QUERY:
957-
return nd_intel_test_finish_query(t, buf,
1002+
rc = nd_intel_test_finish_query(t, buf,
9581003
buf_len, i - t->dcr_idx);
1004+
break;
9591005
case ND_INTEL_SMART:
960-
return nfit_test_cmd_smart(buf, buf_len,
1006+
rc = nfit_test_cmd_smart(buf, buf_len,
9611007
&t->smart[i - t->dcr_idx]);
1008+
break;
9621009
case ND_INTEL_SMART_THRESHOLD:
963-
return nfit_test_cmd_smart_threshold(buf,
1010+
rc = nfit_test_cmd_smart_threshold(buf,
9641011
buf_len,
9651012
&t->smart_threshold[i -
9661013
t->dcr_idx]);
1014+
break;
9671015
case ND_INTEL_SMART_SET_THRESHOLD:
968-
return nfit_test_cmd_smart_set_threshold(buf,
1016+
rc = nfit_test_cmd_smart_set_threshold(buf,
9691017
buf_len,
9701018
&t->smart_threshold[i -
9711019
t->dcr_idx],
9721020
&t->smart[i - t->dcr_idx],
9731021
&t->pdev.dev, t->dimm_dev[i]);
1022+
break;
9741023
case ND_INTEL_SMART_INJECT:
975-
return nfit_test_cmd_smart_inject(buf,
1024+
rc = nfit_test_cmd_smart_inject(buf,
9761025
buf_len,
9771026
&t->smart_threshold[i -
9781027
t->dcr_idx],
9791028
&t->smart[i - t->dcr_idx],
9801029
&t->pdev.dev, t->dimm_dev[i]);
1030+
break;
9811031
default:
9821032
return -ENOTTY;
9831033
}
1034+
return override_return_code(i, func, rc);
9841035
}
9851036

9861037
if (!test_bit(cmd, &cmd_mask)
@@ -1006,6 +1057,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
10061057
default:
10071058
return -ENOTTY;
10081059
}
1060+
return override_return_code(i, func, rc);
10091061
} else {
10101062
struct ars_state *ars_state = &t->ars_state;
10111063
struct nd_cmd_pkg *call_pkg = buf;
@@ -1302,29 +1354,9 @@ static void smart_init(struct nfit_test *t)
13021354
.ctrl_temperature = 30 * 16,
13031355
.spares = 5,
13041356
};
1305-
const struct nd_intel_smart smart_data = {
1306-
.flags = ND_INTEL_SMART_HEALTH_VALID
1307-
| ND_INTEL_SMART_SPARES_VALID
1308-
| ND_INTEL_SMART_ALARM_VALID
1309-
| ND_INTEL_SMART_USED_VALID
1310-
| ND_INTEL_SMART_SHUTDOWN_VALID
1311-
| ND_INTEL_SMART_MTEMP_VALID,
1312-
.health = ND_INTEL_SMART_NON_CRITICAL_HEALTH,
1313-
.media_temperature = 23 * 16,
1314-
.ctrl_temperature = 25 * 16,
1315-
.pmic_temperature = 40 * 16,
1316-
.spares = 75,
1317-
.alarm_flags = ND_INTEL_SMART_SPARE_TRIP
1318-
| ND_INTEL_SMART_TEMP_TRIP,
1319-
.ait_status = 1,
1320-
.life_used = 5,
1321-
.shutdown_state = 0,
1322-
.vendor_size = 0,
1323-
.shutdown_count = 100,
1324-
};
13251357

13261358
for (i = 0; i < t->num_dcr; i++) {
1327-
memcpy(&t->smart[i], &smart_data, sizeof(smart_data));
1359+
memcpy(&t->smart[i], &smart_def, sizeof(smart_def));
13281360
memcpy(&t->smart_threshold[i], &smart_t_data,
13291361
sizeof(smart_t_data));
13301362
}

0 commit comments

Comments
 (0)
Please sign in to comment.