From: Toshi Kani <toshi.kani@hpe.com> To: akpm@linux-foundation.org, bp@alien8.de Cc: linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Dan Williams <dan.j.williams@intel.com>, Toshi Kani <toshi.kani@hpe.com> Subject: [PATCH v3 12/17] memremap: Change region_intersects() to take @flags and @desc Date: Tue, 5 Jan 2016 11:54:36 -0700 [thread overview] Message-ID: <1452020081-26534-12-git-send-email-toshi.kani@hpe.com> (raw) In-Reply-To: <1452020081-26534-1-git-send-email-toshi.kani@hpe.com> Change region_intersects() to identify a target with @flags and @desc, instead of @name with strcmp(). Change the callers of region_intersects(), memremap() and devm_memremap(), to set IORESOURCE_SYSTEM_RAM to @flags and IORES_DESC_NONE to @desc for searching System RAM. Also, export region_intersects() so that the EINJ driver can call this function in a later patch. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Toshi Kani <toshi.kani@hpe.com> --- include/linux/mm.h | 3 ++- kernel/memremap.c | 13 +++++++------ kernel/resource.c | 26 +++++++++++++++----------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 00bad77..82f6ca9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -362,7 +362,8 @@ enum { REGION_MIXED, }; -int region_intersects(resource_size_t offset, size_t size, const char *type); +int region_intersects(resource_size_t offset, size_t size, unsigned long flags, + unsigned long desc); /* Support for virtually mapped pages */ struct page *vmalloc_to_page(const void *addr); diff --git a/kernel/memremap.c b/kernel/memremap.c index 7658d32..47f3436 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -44,7 +44,7 @@ static void *try_ram_remap(resource_size_t offset, size_t size) * being mapped does not have i/o side effects and the __iomem * annotation is not applicable. * - * MEMREMAP_WB - matches the default mapping for "System RAM" on + * MEMREMAP_WB - matches the default mapping for System RAM on * the architecture. This is usually a read-allocate write-back cache. * Morever, if MEMREMAP_WB is specified and the requested remap region is RAM * memremap() will bypass establishing a new mapping and instead return @@ -53,11 +53,12 @@ static void *try_ram_remap(resource_size_t offset, size_t size) * MEMREMAP_WT - establish a mapping whereby writes either bypass the * cache or are written through to memory and never exist in a * cache-dirty state with respect to program visibility. Attempts to - * map "System RAM" with this mapping type will fail. + * map System RAM with this mapping type will fail. */ void *memremap(resource_size_t offset, size_t size, unsigned long flags) { - int is_ram = region_intersects(offset, size, "System RAM"); + int is_ram = region_intersects(offset, size, + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); void *addr = NULL; if (is_ram == REGION_MIXED) { @@ -73,7 +74,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * MEMREMAP_WB is special in that it can be satisifed * from the direct map. Some archs depend on the * capability of memremap() to autodetect cases where - * the requested range is potentially in "System RAM" + * the requested range is potentially in System RAM. */ if (is_ram == REGION_INTERSECTS) addr = try_ram_remap(offset, size); @@ -85,7 +86,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * If we don't have a mapping yet and more request flags are * pending then we will be attempting to establish a new virtual * address mapping. Enforce that this mapping is not aliasing - * "System RAM" + * System RAM. */ if (!addr && is_ram == REGION_INTERSECTS && flags) { WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n", @@ -163,7 +164,7 @@ static void devm_memremap_pages_release(struct device *dev, void *res) void *devm_memremap_pages(struct device *dev, struct resource *res) { int is_ram = region_intersects(res->start, resource_size(res), - "System RAM"); + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); struct page_map *page_map; int error, nid; diff --git a/kernel/resource.c b/kernel/resource.c index 1d3ea50..52e6380 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -496,31 +496,34 @@ EXPORT_SYMBOL_GPL(page_is_ram); * region_intersects() - determine intersection of region with known resources * @start: region start address * @size: size of region - * @name: name of resource (in iomem_resource) + * @flags: flags of resource (in iomem_resource) + * @desc: descriptor of resource (in iomem_resource) or IORES_DESC_NONE * * Check if the specified region partially overlaps or fully eclipses a - * resource identified by @name. Return REGION_DISJOINT if the region - * does not overlap @name, return REGION_MIXED if the region overlaps - * @type and another resource, and return REGION_INTERSECTS if the - * region overlaps @type and no other defined resource. Note, that - * REGION_INTERSECTS is also returned in the case when the specified - * region overlaps RAM and undefined memory holes. + * resource identified by @flags and @desc (optinal with IORES_DESC_NONE). + * Return REGION_DISJOINT if the region does not overlap @flags/@desc, + * return REGION_MIXED if the region overlaps @flags/@desc and another + * resource, and return REGION_INTERSECTS if the region overlaps @flags/@desc + * and no other defined resource. Note, that REGION_INTERSECTS is also + * returned in the case when the specified region overlaps RAM and undefined + * memory holes. * * region_intersect() is used by memory remapping functions to ensure * the user is not remapping RAM and is a vast speed up over walking * through the resource table page by page. */ -int region_intersects(resource_size_t start, size_t size, const char *name) +int region_intersects(resource_size_t start, size_t size, unsigned long flags, + unsigned long desc) { - unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; resource_size_t end = start + size - 1; int type = 0; int other = 0; struct resource *p; read_lock(&resource_lock); for (p = iomem_resource.child; p ; p = p->sibling) { - bool is_type = strcmp(p->name, name) == 0 && - ((p->flags & flags) == flags); + bool is_type = (((p->flags & flags) == flags) && + ((desc == IORES_DESC_NONE) || + (desc == p->desc))); if (start >= p->start && start <= p->end) is_type ? type++ : other++; @@ -539,6 +542,7 @@ int region_intersects(resource_size_t start, size_t size, const char *name) return REGION_DISJOINT; } +EXPORT_SYMBOL_GPL(region_intersects); void __weak arch_remove_reservations(struct resource *avail) { -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Toshi Kani <toshi.kani@hpe.com> To: akpm@linux-foundation.org, bp@alien8.de Cc: linux-arch@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Dan Williams <dan.j.williams@intel.com>, Toshi Kani <toshi.kani@hpe.com> Subject: [PATCH v3 12/17] memremap: Change region_intersects() to take @flags and @desc Date: Tue, 5 Jan 2016 11:54:36 -0700 [thread overview] Message-ID: <1452020081-26534-12-git-send-email-toshi.kani@hpe.com> (raw) Message-ID: <20160105185436.IhtxYxYRRSb3xBBEZ0L_rwefG7ukZ1uRceOtvVF0aQs@z> (raw) In-Reply-To: <1452020081-26534-1-git-send-email-toshi.kani@hpe.com> Change region_intersects() to identify a target with @flags and @desc, instead of @name with strcmp(). Change the callers of region_intersects(), memremap() and devm_memremap(), to set IORESOURCE_SYSTEM_RAM to @flags and IORES_DESC_NONE to @desc for searching System RAM. Also, export region_intersects() so that the EINJ driver can call this function in a later patch. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Toshi Kani <toshi.kani@hpe.com> --- include/linux/mm.h | 3 ++- kernel/memremap.c | 13 +++++++------ kernel/resource.c | 26 +++++++++++++++----------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 00bad77..82f6ca9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -362,7 +362,8 @@ enum { REGION_MIXED, }; -int region_intersects(resource_size_t offset, size_t size, const char *type); +int region_intersects(resource_size_t offset, size_t size, unsigned long flags, + unsigned long desc); /* Support for virtually mapped pages */ struct page *vmalloc_to_page(const void *addr); diff --git a/kernel/memremap.c b/kernel/memremap.c index 7658d32..47f3436 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -44,7 +44,7 @@ static void *try_ram_remap(resource_size_t offset, size_t size) * being mapped does not have i/o side effects and the __iomem * annotation is not applicable. * - * MEMREMAP_WB - matches the default mapping for "System RAM" on + * MEMREMAP_WB - matches the default mapping for System RAM on * the architecture. This is usually a read-allocate write-back cache. * Morever, if MEMREMAP_WB is specified and the requested remap region is RAM * memremap() will bypass establishing a new mapping and instead return @@ -53,11 +53,12 @@ static void *try_ram_remap(resource_size_t offset, size_t size) * MEMREMAP_WT - establish a mapping whereby writes either bypass the * cache or are written through to memory and never exist in a * cache-dirty state with respect to program visibility. Attempts to - * map "System RAM" with this mapping type will fail. + * map System RAM with this mapping type will fail. */ void *memremap(resource_size_t offset, size_t size, unsigned long flags) { - int is_ram = region_intersects(offset, size, "System RAM"); + int is_ram = region_intersects(offset, size, + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); void *addr = NULL; if (is_ram == REGION_MIXED) { @@ -73,7 +74,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * MEMREMAP_WB is special in that it can be satisifed * from the direct map. Some archs depend on the * capability of memremap() to autodetect cases where - * the requested range is potentially in "System RAM" + * the requested range is potentially in System RAM. */ if (is_ram == REGION_INTERSECTS) addr = try_ram_remap(offset, size); @@ -85,7 +86,7 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * If we don't have a mapping yet and more request flags are * pending then we will be attempting to establish a new virtual * address mapping. Enforce that this mapping is not aliasing - * "System RAM" + * System RAM. */ if (!addr && is_ram == REGION_INTERSECTS && flags) { WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n", @@ -163,7 +164,7 @@ static void devm_memremap_pages_release(struct device *dev, void *res) void *devm_memremap_pages(struct device *dev, struct resource *res) { int is_ram = region_intersects(res->start, resource_size(res), - "System RAM"); + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); struct page_map *page_map; int error, nid; diff --git a/kernel/resource.c b/kernel/resource.c index 1d3ea50..52e6380 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -496,31 +496,34 @@ EXPORT_SYMBOL_GPL(page_is_ram); * region_intersects() - determine intersection of region with known resources * @start: region start address * @size: size of region - * @name: name of resource (in iomem_resource) + * @flags: flags of resource (in iomem_resource) + * @desc: descriptor of resource (in iomem_resource) or IORES_DESC_NONE * * Check if the specified region partially overlaps or fully eclipses a - * resource identified by @name. Return REGION_DISJOINT if the region - * does not overlap @name, return REGION_MIXED if the region overlaps - * @type and another resource, and return REGION_INTERSECTS if the - * region overlaps @type and no other defined resource. Note, that - * REGION_INTERSECTS is also returned in the case when the specified - * region overlaps RAM and undefined memory holes. + * resource identified by @flags and @desc (optinal with IORES_DESC_NONE). + * Return REGION_DISJOINT if the region does not overlap @flags/@desc, + * return REGION_MIXED if the region overlaps @flags/@desc and another + * resource, and return REGION_INTERSECTS if the region overlaps @flags/@desc + * and no other defined resource. Note, that REGION_INTERSECTS is also + * returned in the case when the specified region overlaps RAM and undefined + * memory holes. * * region_intersect() is used by memory remapping functions to ensure * the user is not remapping RAM and is a vast speed up over walking * through the resource table page by page. */ -int region_intersects(resource_size_t start, size_t size, const char *name) +int region_intersects(resource_size_t start, size_t size, unsigned long flags, + unsigned long desc) { - unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; resource_size_t end = start + size - 1; int type = 0; int other = 0; struct resource *p; read_lock(&resource_lock); for (p = iomem_resource.child; p ; p = p->sibling) { - bool is_type = strcmp(p->name, name) == 0 && - ((p->flags & flags) == flags); + bool is_type = (((p->flags & flags) == flags) && + ((desc == IORES_DESC_NONE) || + (desc == p->desc))); if (start >= p->start && start <= p->end) is_type ? type++ : other++; @@ -539,6 +542,7 @@ int region_intersects(resource_size_t start, size_t size, const char *name) return REGION_DISJOINT; } +EXPORT_SYMBOL_GPL(region_intersects); void __weak arch_remove_reservations(struct resource *avail) {
next prev parent reply other threads:[~2016-01-05 18:54 UTC|newest] Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-01-05 18:54 [PATCH v3 01/17] resource: Add System RAM resource type Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 02/17] resource: make resource flags handled properly Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 03/17] resource: Add I/O resource descriptor Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 04/17] x86/e820: Set System RAM type and descriptor Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 05/17] ia64: " Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 19:04 ` Luck, Tony 2016-01-05 18:54 ` [PATCH v3 06/17] arch: Set IORESOURCE_SYSTEM_RAM to System RAM Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-24 18:00 ` Borislav Petkov 2016-01-24 18:00 ` Borislav Petkov 2016-01-05 18:54 ` [PATCH v3 07/17] kexec: " Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-07 12:38 ` Dave Young 2016-01-05 18:54 ` [PATCH v3 08/17] xen, mm: " Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 09/17] drivers: Initialize resource entry to zero Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 20:57 ` Helge Deller 2016-01-05 20:57 ` Helge Deller 2016-01-05 18:54 ` [PATCH v3 10/17] resource: Change walk_system_ram to use System RAM type Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` [PATCH v3 11/17] arm/samsung: Change s3c_pm_run_res() " Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-05 18:54 ` Toshi Kani [this message] 2016-01-05 18:54 ` [PATCH v3 12/17] memremap: Change region_intersects() to take @flags and @desc Toshi Kani 2016-01-05 18:54 ` [PATCH v3 13/17] resource: Add walk_iomem_res_desc() Toshi Kani 2016-01-05 18:54 ` Toshi Kani [not found] ` <1452020081-26534-1-git-send-email-toshi.kani-ZPxbGqLxI0U@public.gmane.org> 2016-01-05 18:54 ` [PATCH v3 14/17] x86, nvdimm, kexec: Use walk_iomem_res_desc() for iomem search Toshi Kani 2016-01-05 18:54 ` [PATCH v3 14/17] x86,nvdimm,kexec: " Toshi Kani 2016-01-07 12:39 ` Dave Young 2016-01-05 18:54 ` [PATCH v3 15/17] x86/kexec: Remove walk_iomem_res() call with GART Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-07 12:37 ` Dave Young 2016-01-05 18:54 ` [PATCH v3 16/17] resource: Kill walk_iomem_res() Toshi Kani 2016-01-05 18:54 ` Toshi Kani 2016-01-07 12:40 ` Dave Young 2016-01-07 12:40 ` Dave Young 2016-01-05 18:54 ` [PATCH v3 17/17] ACPI/EINJ: Allow memory error injection to NVDIMM Toshi Kani 2016-01-05 18:54 ` Toshi Kani
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1452020081-26534-12-git-send-email-toshi.kani@hpe.com \ --to=toshi.kani@hpe.com \ --cc=akpm@linux-foundation.org \ --cc=bp@alien8.de \ --cc=dan.j.williams@intel.com \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).