From: Greg Kroah-Hartman Date: Tue, 11 Dec 2018 14:49:38 +0000 (+0100) Subject: drop broken nvdimm patch from 4.9.y X-Git-Tag: v4.19.9~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7bf9d48d9939c0f465470b820a3c09c51e48d0e2;p=thirdparty%2Fkernel%2Fstable-queue.git drop broken nvdimm patch from 4.9.y --- diff --git a/queue-4.9/libnvdimm-pfn-pad-pfn-namespaces-relative-to-other-regions.patch b/queue-4.9/libnvdimm-pfn-pad-pfn-namespaces-relative-to-other-regions.patch deleted file mode 100644 index b988e15abfd..00000000000 --- a/queue-4.9/libnvdimm-pfn-pad-pfn-namespaces-relative-to-other-regions.patch +++ /dev/null @@ -1,194 +0,0 @@ -From ae86cbfef3818300f1972e52f67a93211acb0e24 Mon Sep 17 00:00:00 2001 -From: Dan Williams -Date: Sat, 24 Nov 2018 10:47:04 -0800 -Subject: libnvdimm, pfn: Pad pfn namespaces relative to other regions - -From: Dan Williams - -commit ae86cbfef3818300f1972e52f67a93211acb0e24 upstream. - -Commit cfe30b872058 "libnvdimm, pmem: adjust for section collisions with -'System RAM'" enabled Linux to workaround occasions where platform -firmware arranges for "System RAM" and "Persistent Memory" to collide -within a single section boundary. Unfortunately, as reported in this -issue [1], platform firmware can inflict the same collision between -persistent memory regions. - -The approach of interrogating iomem_resource does not work in this -case because platform firmware may merge multiple regions into a single -iomem_resource range. Instead provide a method to interrogate regions -that share the same parent bus. - -This is a stop-gap until the core-MM can grow support for hotplug on -sub-section boundaries. - -[1]: https://github.com/pmem/ndctl/issues/76 - -Fixes: cfe30b872058 ("libnvdimm, pmem: adjust for section collisions with...") -Cc: -Reported-by: Patrick Geary -Tested-by: Patrick Geary -Reviewed-by: Vishal Verma -Signed-off-by: Dan Williams -Signed-off-by: Greg Kroah-Hartman - ---- - drivers/nvdimm/nd-core.h | 2 + - drivers/nvdimm/pfn_devs.c | 64 ++++++++++++++++++++++++------------------- - drivers/nvdimm/region_devs.c | 41 +++++++++++++++++++++++++++ - 3 files changed, 80 insertions(+), 27 deletions(-) - ---- a/drivers/nvdimm/nd-core.h -+++ b/drivers/nvdimm/nd-core.h -@@ -95,6 +95,8 @@ resource_size_t nd_pmem_available_dpa(st - struct nd_mapping *nd_mapping, resource_size_t *overlap); - resource_size_t nd_blk_available_dpa(struct nd_region *nd_region); - resource_size_t nd_region_available_dpa(struct nd_region *nd_region); -+int nd_region_conflict(struct nd_region *nd_region, resource_size_t start, -+ resource_size_t size); - resource_size_t nvdimm_allocated_dpa(struct nvdimm_drvdata *ndd, - struct nd_label_id *label_id); - int alias_dpa_busy(struct device *dev, void *data); ---- a/drivers/nvdimm/pfn_devs.c -+++ b/drivers/nvdimm/pfn_devs.c -@@ -569,14 +569,47 @@ static u64 phys_pmem_align_down(struct n - ALIGN_DOWN(phys, nd_pfn->align)); - } - -+/* -+ * Check if pmem collides with 'System RAM', or other regions when -+ * section aligned. Trim it accordingly. -+ */ -+static void trim_pfn_device(struct nd_pfn *nd_pfn, u32 *start_pad, u32 *end_trunc) -+{ -+ struct nd_namespace_common *ndns = nd_pfn->ndns; -+ struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev); -+ struct nd_region *nd_region = to_nd_region(nd_pfn->dev.parent); -+ const resource_size_t start = nsio->res.start; -+ const resource_size_t end = start + resource_size(&nsio->res); -+ resource_size_t adjust, size; -+ -+ *start_pad = 0; -+ *end_trunc = 0; -+ -+ adjust = start - PHYS_SECTION_ALIGN_DOWN(start); -+ size = resource_size(&nsio->res) + adjust; -+ if (region_intersects(start - adjust, size, IORESOURCE_SYSTEM_RAM, -+ IORES_DESC_NONE) == REGION_MIXED -+ || nd_region_conflict(nd_region, start - adjust, size)) -+ *start_pad = PHYS_SECTION_ALIGN_UP(start) - start; -+ -+ /* Now check that end of the range does not collide. */ -+ adjust = PHYS_SECTION_ALIGN_UP(end) - end; -+ size = resource_size(&nsio->res) + adjust; -+ if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM, -+ IORES_DESC_NONE) == REGION_MIXED -+ || !IS_ALIGNED(end, nd_pfn->align) -+ || nd_region_conflict(nd_region, start, size + adjust)) -+ *end_trunc = end - phys_pmem_align_down(nd_pfn, end); -+} -+ - static int nd_pfn_init(struct nd_pfn *nd_pfn) - { - u32 dax_label_reserve = is_nd_dax(&nd_pfn->dev) ? SZ_128K : 0; - struct nd_namespace_common *ndns = nd_pfn->ndns; -- u32 start_pad = 0, end_trunc = 0; -+ struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev); - resource_size_t start, size; -- struct nd_namespace_io *nsio; - struct nd_region *nd_region; -+ u32 start_pad, end_trunc; - struct nd_pfn_sb *pfn_sb; - unsigned long npfns; - phys_addr_t offset; -@@ -608,30 +641,7 @@ static int nd_pfn_init(struct nd_pfn *nd - - memset(pfn_sb, 0, sizeof(*pfn_sb)); - -- /* -- * Check if pmem collides with 'System RAM' when section aligned and -- * trim it accordingly -- */ -- nsio = to_nd_namespace_io(&ndns->dev); -- start = PHYS_SECTION_ALIGN_DOWN(nsio->res.start); -- size = resource_size(&nsio->res); -- if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM, -- IORES_DESC_NONE) == REGION_MIXED) { -- start = nsio->res.start; -- start_pad = PHYS_SECTION_ALIGN_UP(start) - start; -- } -- -- start = nsio->res.start; -- size = PHYS_SECTION_ALIGN_UP(start + size) - start; -- if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM, -- IORES_DESC_NONE) == REGION_MIXED -- || !IS_ALIGNED(start + resource_size(&nsio->res), -- nd_pfn->align)) { -- size = resource_size(&nsio->res); -- end_trunc = start + size - phys_pmem_align_down(nd_pfn, -- start + size); -- } -- -+ trim_pfn_device(nd_pfn, &start_pad, &end_trunc); - if (start_pad + end_trunc) - dev_info(&nd_pfn->dev, "%s alignment collision, truncate %d bytes\n", - dev_name(&ndns->dev), start_pad + end_trunc); -@@ -642,7 +652,7 @@ static int nd_pfn_init(struct nd_pfn *nd - * implementation will limit the pfns advertised through - * ->direct_access() to those that are included in the memmap. - */ -- start += start_pad; -+ start = nsio->res.start + start_pad; - size = resource_size(&nsio->res); - npfns = PFN_SECTION_ALIGN_UP((size - start_pad - end_trunc - SZ_8K) - / PAGE_SIZE); ---- a/drivers/nvdimm/region_devs.c -+++ b/drivers/nvdimm/region_devs.c -@@ -991,6 +991,47 @@ int nvdimm_has_flush(struct nd_region *n - } - EXPORT_SYMBOL_GPL(nvdimm_has_flush); - -+struct conflict_context { -+ struct nd_region *nd_region; -+ resource_size_t start, size; -+}; -+ -+static int region_conflict(struct device *dev, void *data) -+{ -+ struct nd_region *nd_region; -+ struct conflict_context *ctx = data; -+ resource_size_t res_end, region_end, region_start; -+ -+ if (!is_memory(dev)) -+ return 0; -+ -+ nd_region = to_nd_region(dev); -+ if (nd_region == ctx->nd_region) -+ return 0; -+ -+ res_end = ctx->start + ctx->size; -+ region_start = nd_region->ndr_start; -+ region_end = region_start + nd_region->ndr_size; -+ if (ctx->start >= region_start && ctx->start < region_end) -+ return -EBUSY; -+ if (res_end > region_start && res_end <= region_end) -+ return -EBUSY; -+ return 0; -+} -+ -+int nd_region_conflict(struct nd_region *nd_region, resource_size_t start, -+ resource_size_t size) -+{ -+ struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(&nd_region->dev); -+ struct conflict_context ctx = { -+ .nd_region = nd_region, -+ .start = start, -+ .size = size, -+ }; -+ -+ return device_for_each_child(&nvdimm_bus->dev, &ctx, region_conflict); -+} -+ - void __exit nd_region_devs_exit(void) - { - ida_destroy(®ion_ida); diff --git a/queue-4.9/series b/queue-4.9/series index ec29624f6b8..b55d917f839 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -42,7 +42,6 @@ staging-rtl8712-fix-possible-buffer-overrun.patch tty-serial-8250_mtk-always-resume-the-device-in-probe.patch tty-do-not-set-tty_io_error-flag-if-console-port.patch kgdboc-fix-kasan-global-out-of-bounds-bug-in-param_set_kgdboc_var.patch -libnvdimm-pfn-pad-pfn-namespaces-relative-to-other-regions.patch mac80211_hwsim-timer-should-be-initialized-before-device-registered.patch mac80211-clear-beacon_int-in-ieee80211_do_stop.patch mac80211-ignore-tx-status-for-ps-stations-in-ieee80211_tx_status_ext.patch