-
Notifications
You must be signed in to change notification settings - Fork 52.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
device-dax, tools/testing/nvdimm: enable device-dax with mock resources
Provide a replacement pgoff_to_phys() that translates an nfit_test resource (allocated by vmalloc()) to a pfn. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
- Loading branch information
Showing
4 changed files
with
118 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* | ||
* Copyright(c) 2016 Intel Corporation. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of version 2 of the GNU General Public License as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
*/ | ||
#ifndef __DAX_PRIVATE_H__ | ||
#define __DAX_PRIVATE_H__ | ||
|
||
#include <linux/device.h> | ||
#include <linux/cdev.h> | ||
|
||
/** | ||
* struct dax_region - mapping infrastructure for dax devices | ||
* @id: kernel-wide unique region for a memory range | ||
* @base: linear address corresponding to @res | ||
* @kref: to pin while other agents have a need to do lookups | ||
* @dev: parent device backing this region | ||
* @align: allocation and mapping alignment for child dax devices | ||
* @res: physical address range of the region | ||
* @pfn_flags: identify whether the pfns are paged back or not | ||
*/ | ||
struct dax_region { | ||
int id; | ||
struct ida ida; | ||
void *base; | ||
struct kref kref; | ||
struct device *dev; | ||
unsigned int align; | ||
struct resource res; | ||
unsigned long pfn_flags; | ||
}; | ||
|
||
/** | ||
* struct dax_dev - subdivision of a dax region | ||
* @region - parent region | ||
* @inode - inode | ||
* @dev - device backing the character device | ||
* @cdev - core chardev data | ||
* @alive - !alive + srcu grace period == no new mappings can be established | ||
* @id - child id in the region | ||
* @num_resources - number of physical address extents in this device | ||
* @res - array of physical address ranges | ||
*/ | ||
struct dax_dev { | ||
struct dax_region *region; | ||
struct inode *inode; | ||
struct device dev; | ||
struct cdev cdev; | ||
bool alive; | ||
int id; | ||
int num_resources; | ||
struct resource res[0]; | ||
}; | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/* | ||
* Copyright (c) 2016, Intel Corporation. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms and conditions of the GNU General Public License, | ||
* version 2, as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope it will be useful, but WITHOUT | ||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
* more details. | ||
*/ | ||
#include "test/nfit_test.h" | ||
#include <linux/mm.h> | ||
#include "../../../drivers/dax/dax-private.h" | ||
|
||
phys_addr_t dax_pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff, | ||
unsigned long size) | ||
{ | ||
struct resource *res; | ||
phys_addr_t addr; | ||
int i; | ||
|
||
for (i = 0; i < dax_dev->num_resources; i++) { | ||
res = &dax_dev->res[i]; | ||
addr = pgoff * PAGE_SIZE + res->start; | ||
if (addr >= res->start && addr <= res->end) | ||
break; | ||
pgoff -= PHYS_PFN(resource_size(res)); | ||
} | ||
|
||
if (i < dax_dev->num_resources) { | ||
res = &dax_dev->res[i]; | ||
if (addr + size - 1 <= res->end) { | ||
if (get_nfit_res(addr)) { | ||
struct page *page; | ||
|
||
if (dax_dev->region->align > PAGE_SIZE) | ||
return -1; | ||
|
||
page = vmalloc_to_page((void *)addr); | ||
return PFN_PHYS(page_to_pfn(page)); | ||
} else | ||
return addr; | ||
} | ||
} | ||
|
||
return -1; | ||
} |