Commit db58028e authored by Dave Jiang's avatar Dave Jiang Committed by Dan Williams

nvdimm: reduce duplicated wpq flushes

Existing implemenetation writes to all the flush hint addresses for a
given ND region. This is not necessary as the flushes are per imc and
not per DIMM. Search the mappings and clear out the duplicates at init
to avoid multiple flush to the same imc.
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 595c7307
...@@ -70,7 +70,7 @@ static int nvdimm_map_flush(struct device *dev, struct nvdimm *nvdimm, int dimm, ...@@ -70,7 +70,7 @@ static int nvdimm_map_flush(struct device *dev, struct nvdimm *nvdimm, int dimm,
int nd_region_activate(struct nd_region *nd_region) int nd_region_activate(struct nd_region *nd_region)
{ {
int i, num_flush = 0; int i, j, num_flush = 0;
struct nd_region_data *ndrd; struct nd_region_data *ndrd;
struct device *dev = &nd_region->dev; struct device *dev = &nd_region->dev;
size_t flush_data_size = sizeof(void *); size_t flush_data_size = sizeof(void *);
...@@ -107,6 +107,21 @@ int nd_region_activate(struct nd_region *nd_region) ...@@ -107,6 +107,21 @@ int nd_region_activate(struct nd_region *nd_region)
return rc; return rc;
} }
/*
* Clear out entries that are duplicates. This should prevent the
* extra flushings.
*/
for (i = 0; i < nd_region->ndr_mappings - 1; i++) {
/* ignore if NULL already */
if (!ndrd_get_flush_wpq(ndrd, i, 0))
continue;
for (j = i + 1; j < nd_region->ndr_mappings; j++)
if (ndrd_get_flush_wpq(ndrd, i, 0) ==
ndrd_get_flush_wpq(ndrd, j, 0))
ndrd_set_flush_wpq(ndrd, j, 0, NULL);
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment