| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Huaisheng Ye <yehs1@lenovo.com> |
| Date: Mon, 30 Jul 2018 15:15:45 +0800 |
| Subject: tools/testing/nvdimm: kaddr and pfn can be NULL to ->direct_access() |
| |
| From: Huaisheng Ye <yehs1@lenovo.com> |
| |
| [ Upstream commit 45df5d3dc0c7289c1e67afe6d2ba806ad5174314 ] |
| |
| The mock / test version of pmem_direct_access() needs to check the |
| validity of pointers kaddr and pfn for NULL assignment. If anyone |
| equals to NULL, it doesn't need to calculate the value. |
| |
| If pointer equals to NULL, that is to say callers may have no need for |
| kaddr or pfn, so this patch is prepared for allowing them to pass in |
| NULL instead of having to pass in a local pointer or variable that |
| they then just throw away. |
| |
| Suggested-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Huaisheng Ye <yehs1@lenovo.com> |
| Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com> |
| Signed-off-by: Dave Jiang <dave.jiang@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/testing/nvdimm/pmem-dax.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| --- a/tools/testing/nvdimm/pmem-dax.c |
| +++ b/tools/testing/nvdimm/pmem-dax.c |
| @@ -31,17 +31,21 @@ long __pmem_direct_access(struct pmem_de |
| if (get_nfit_res(pmem->phys_addr + offset)) { |
| struct page *page; |
| |
| - *kaddr = pmem->virt_addr + offset; |
| + if (kaddr) |
| + *kaddr = pmem->virt_addr + offset; |
| page = vmalloc_to_page(pmem->virt_addr + offset); |
| - *pfn = page_to_pfn_t(page); |
| + if (pfn) |
| + *pfn = page_to_pfn_t(page); |
| pr_debug_ratelimited("%s: pmem: %p pgoff: %#lx pfn: %#lx\n", |
| __func__, pmem, pgoff, page_to_pfn(page)); |
| |
| return 1; |
| } |
| |
| - *kaddr = pmem->virt_addr + offset; |
| - *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); |
| + if (kaddr) |
| + *kaddr = pmem->virt_addr + offset; |
| + if (pfn) |
| + *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); |
| |
| /* |
| * If badblocks are present, limit known good range to the |