Merge tag 'libnvdimm-for-5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull libnvdimm updates from Dan Williams: "The highlight this cycle is continuing integration fixes for PowerPC and some resulting optimizations. Summary: - Updates to better support vmalloc space restrictions on PowerPC platforms. - Cleanups to move common sysfs attributes to core 'struct device_type' objects. - Export the 'target_node' attribute (the effective numa node if pmem is marked online) for regions and namespaces. - Miscellaneous fixups and optimizations" * tag 'libnvdimm-for-5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: (21 commits) MAINTAINERS: Remove Keith from NVDIMM maintainers libnvdimm: Export the target_node attribute for regions and namespaces dax: Add numa_node to the default device-dax attributes libnvdimm: Simplify root read-only definition for the 'resource' attribute dax: Simplify root read-only definition for the 'resource' attribute dax: Create a dax device_type libnvdimm: Move nvdimm_bus_attribute_group to device_type libnvdimm: Move nvdimm_attribute_group to device_type libnvdimm: Move nd_mapping_attribute_group to device_type libnvdimm: Move nd_region_attribute_group to device_type libnvdimm: Move nd_numa_attribute_group to device_type libnvdimm: Move nd_device_attribute_group to device_type libnvdimm: Move region attribute group definition libnvdimm: Move attribute groups to device type libnvdimm: Remove prototypes for nonexistent functions libnvdimm/btt: fix variable 'rc' set but not used libnvdimm/pmem: Delete include of nd-core.h libnvdimm/namespace: Differentiate between probe mapping and runtime mapping libnvdimm/pfn_dev: Don't clear device memmap area during generic namespace probe libnvdimm: Trivial comment fix ...
This commit is contained in:
@@ -140,36 +140,6 @@ static void nd_region_release(struct device *dev)
|
||||
kfree(nd_region);
|
||||
}
|
||||
|
||||
static struct device_type nd_blk_device_type = {
|
||||
.name = "nd_blk",
|
||||
.release = nd_region_release,
|
||||
};
|
||||
|
||||
static struct device_type nd_pmem_device_type = {
|
||||
.name = "nd_pmem",
|
||||
.release = nd_region_release,
|
||||
};
|
||||
|
||||
static struct device_type nd_volatile_device_type = {
|
||||
.name = "nd_volatile",
|
||||
.release = nd_region_release,
|
||||
};
|
||||
|
||||
bool is_nd_pmem(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_pmem_device_type : false;
|
||||
}
|
||||
|
||||
bool is_nd_blk(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_blk_device_type : false;
|
||||
}
|
||||
|
||||
bool is_nd_volatile(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_volatile_device_type : false;
|
||||
}
|
||||
|
||||
struct nd_region *to_nd_region(struct device *dev)
|
||||
{
|
||||
struct nd_region *nd_region = container_of(dev, struct nd_region, dev);
|
||||
@@ -583,7 +553,7 @@ static ssize_t resource_show(struct device *dev,
|
||||
|
||||
return sprintf(buf, "%#llx\n", nd_region->ndr_start);
|
||||
}
|
||||
static DEVICE_ATTR_RO(resource);
|
||||
static DEVICE_ATTR(resource, 0400, resource_show, NULL);
|
||||
|
||||
static ssize_t persistence_domain_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
@@ -635,12 +605,8 @@ static umode_t region_visible(struct kobject *kobj, struct attribute *a, int n)
|
||||
if (!is_memory(dev) && a == &dev_attr_badblocks.attr)
|
||||
return 0;
|
||||
|
||||
if (a == &dev_attr_resource.attr) {
|
||||
if (is_memory(dev))
|
||||
return 0400;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
if (a == &dev_attr_resource.attr && !is_memory(dev))
|
||||
return 0;
|
||||
|
||||
if (a == &dev_attr_deep_flush.attr) {
|
||||
int has_flush = nvdimm_has_flush(nd_region);
|
||||
@@ -674,80 +640,6 @@ static umode_t region_visible(struct kobject *kobj, struct attribute *a, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct attribute_group nd_region_attribute_group = {
|
||||
.attrs = nd_region_attributes,
|
||||
.is_visible = region_visible,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nd_region_attribute_group);
|
||||
|
||||
u64 nd_region_interleave_set_cookie(struct nd_region *nd_region,
|
||||
struct nd_namespace_index *nsindex)
|
||||
{
|
||||
struct nd_interleave_set *nd_set = nd_region->nd_set;
|
||||
|
||||
if (!nd_set)
|
||||
return 0;
|
||||
|
||||
if (nsindex && __le16_to_cpu(nsindex->major) == 1
|
||||
&& __le16_to_cpu(nsindex->minor) == 1)
|
||||
return nd_set->cookie1;
|
||||
return nd_set->cookie2;
|
||||
}
|
||||
|
||||
u64 nd_region_interleave_set_altcookie(struct nd_region *nd_region)
|
||||
{
|
||||
struct nd_interleave_set *nd_set = nd_region->nd_set;
|
||||
|
||||
if (nd_set)
|
||||
return nd_set->altcookie;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nd_mapping_free_labels(struct nd_mapping *nd_mapping)
|
||||
{
|
||||
struct nd_label_ent *label_ent, *e;
|
||||
|
||||
lockdep_assert_held(&nd_mapping->lock);
|
||||
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
|
||||
list_del(&label_ent->list);
|
||||
kfree(label_ent);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When a namespace is activated create new seeds for the next
|
||||
* namespace, or namespace-personality to be configured.
|
||||
*/
|
||||
void nd_region_advance_seeds(struct nd_region *nd_region, struct device *dev)
|
||||
{
|
||||
nvdimm_bus_lock(dev);
|
||||
if (nd_region->ns_seed == dev) {
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_btt(dev)) {
|
||||
struct nd_btt *nd_btt = to_nd_btt(dev);
|
||||
|
||||
if (nd_region->btt_seed == dev)
|
||||
nd_region_create_btt_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_btt->ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_pfn(dev)) {
|
||||
struct nd_pfn *nd_pfn = to_nd_pfn(dev);
|
||||
|
||||
if (nd_region->pfn_seed == dev)
|
||||
nd_region_create_pfn_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_pfn->ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_dax(dev)) {
|
||||
struct nd_dax *nd_dax = to_nd_dax(dev);
|
||||
|
||||
if (nd_region->dax_seed == dev)
|
||||
nd_region_create_dax_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_dax->nd_pfn.ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
}
|
||||
nvdimm_bus_unlock(dev);
|
||||
}
|
||||
|
||||
static ssize_t mappingN(struct device *dev, char *buf, int n)
|
||||
{
|
||||
struct nd_region *nd_region = to_nd_region(dev);
|
||||
@@ -855,11 +747,124 @@ static struct attribute *mapping_attributes[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
struct attribute_group nd_mapping_attribute_group = {
|
||||
static const struct attribute_group nd_mapping_attribute_group = {
|
||||
.is_visible = mapping_visible,
|
||||
.attrs = mapping_attributes,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nd_mapping_attribute_group);
|
||||
|
||||
static const struct attribute_group nd_region_attribute_group = {
|
||||
.attrs = nd_region_attributes,
|
||||
.is_visible = region_visible,
|
||||
};
|
||||
|
||||
static const struct attribute_group *nd_region_attribute_groups[] = {
|
||||
&nd_device_attribute_group,
|
||||
&nd_region_attribute_group,
|
||||
&nd_numa_attribute_group,
|
||||
&nd_mapping_attribute_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const struct device_type nd_blk_device_type = {
|
||||
.name = "nd_blk",
|
||||
.release = nd_region_release,
|
||||
.groups = nd_region_attribute_groups,
|
||||
};
|
||||
|
||||
static const struct device_type nd_pmem_device_type = {
|
||||
.name = "nd_pmem",
|
||||
.release = nd_region_release,
|
||||
.groups = nd_region_attribute_groups,
|
||||
};
|
||||
|
||||
static const struct device_type nd_volatile_device_type = {
|
||||
.name = "nd_volatile",
|
||||
.release = nd_region_release,
|
||||
.groups = nd_region_attribute_groups,
|
||||
};
|
||||
|
||||
bool is_nd_pmem(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_pmem_device_type : false;
|
||||
}
|
||||
|
||||
bool is_nd_blk(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_blk_device_type : false;
|
||||
}
|
||||
|
||||
bool is_nd_volatile(struct device *dev)
|
||||
{
|
||||
return dev ? dev->type == &nd_volatile_device_type : false;
|
||||
}
|
||||
|
||||
u64 nd_region_interleave_set_cookie(struct nd_region *nd_region,
|
||||
struct nd_namespace_index *nsindex)
|
||||
{
|
||||
struct nd_interleave_set *nd_set = nd_region->nd_set;
|
||||
|
||||
if (!nd_set)
|
||||
return 0;
|
||||
|
||||
if (nsindex && __le16_to_cpu(nsindex->major) == 1
|
||||
&& __le16_to_cpu(nsindex->minor) == 1)
|
||||
return nd_set->cookie1;
|
||||
return nd_set->cookie2;
|
||||
}
|
||||
|
||||
u64 nd_region_interleave_set_altcookie(struct nd_region *nd_region)
|
||||
{
|
||||
struct nd_interleave_set *nd_set = nd_region->nd_set;
|
||||
|
||||
if (nd_set)
|
||||
return nd_set->altcookie;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nd_mapping_free_labels(struct nd_mapping *nd_mapping)
|
||||
{
|
||||
struct nd_label_ent *label_ent, *e;
|
||||
|
||||
lockdep_assert_held(&nd_mapping->lock);
|
||||
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
|
||||
list_del(&label_ent->list);
|
||||
kfree(label_ent);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When a namespace is activated create new seeds for the next
|
||||
* namespace, or namespace-personality to be configured.
|
||||
*/
|
||||
void nd_region_advance_seeds(struct nd_region *nd_region, struct device *dev)
|
||||
{
|
||||
nvdimm_bus_lock(dev);
|
||||
if (nd_region->ns_seed == dev) {
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_btt(dev)) {
|
||||
struct nd_btt *nd_btt = to_nd_btt(dev);
|
||||
|
||||
if (nd_region->btt_seed == dev)
|
||||
nd_region_create_btt_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_btt->ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_pfn(dev)) {
|
||||
struct nd_pfn *nd_pfn = to_nd_pfn(dev);
|
||||
|
||||
if (nd_region->pfn_seed == dev)
|
||||
nd_region_create_pfn_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_pfn->ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
} else if (is_nd_dax(dev)) {
|
||||
struct nd_dax *nd_dax = to_nd_dax(dev);
|
||||
|
||||
if (nd_region->dax_seed == dev)
|
||||
nd_region_create_dax_seed(nd_region);
|
||||
if (nd_region->ns_seed == &nd_dax->nd_pfn.ndns->dev)
|
||||
nd_region_create_ns_seed(nd_region);
|
||||
}
|
||||
nvdimm_bus_unlock(dev);
|
||||
}
|
||||
|
||||
int nd_blk_region_init(struct nd_region *nd_region)
|
||||
{
|
||||
@@ -931,8 +936,8 @@ void nd_region_release_lane(struct nd_region *nd_region, unsigned int lane)
|
||||
EXPORT_SYMBOL(nd_region_release_lane);
|
||||
|
||||
static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus,
|
||||
struct nd_region_desc *ndr_desc, struct device_type *dev_type,
|
||||
const char *caller)
|
||||
struct nd_region_desc *ndr_desc,
|
||||
const struct device_type *dev_type, const char *caller)
|
||||
{
|
||||
struct nd_region *nd_region;
|
||||
struct device *dev;
|
||||
|
Reference in New Issue
Block a user