On a PAT system, inserting a pfn is quite expensive due to the query of
the protections for the page based on its physical location. A large
part of this overhead is due to the linear walk of resource regions and
the strcmp to find "System RAM". By restricting memory to use a global
string for its resource name, we can reduce this strcmp to a direct
pointer comparison and so eliminate the largest single overhead for
vma_insert_pfn().

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 arch/arm/kernel/setup.c          |    8 ++++----
 arch/arm/plat-samsung/pm-check.c |    2 +-
 arch/avr32/kernel/setup.c        |    2 +-
 arch/ia64/kernel/efi.c           |    8 ++++----
 arch/mips/kernel/setup.c         |    4 ++--
 arch/parisc/mm/init.c            |    2 +-
 arch/s390/kernel/setup.c         |    6 +++---
 arch/score/kernel/setup.c        |    2 +-
 arch/sh/kernel/setup.c           |    2 +-
 arch/sparc/kernel/pci_common.c   |    2 +-
 arch/tile/kernel/setup.c         |    2 +-
 arch/unicore32/kernel/setup.c    |    2 +-
 arch/x86/kernel/e820.c           |    4 ++--
 arch/x86/kernel/probe_roms.c     |    2 +-
 include/linux/ioport.h           |    5 +++++
 kernel/resource.c                |   15 +++++++++++----
 mm/memory_hotplug.c              |    4 ++--
 17 files changed, 42 insertions(+), 30 deletions(-)

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index ed11fb0..e525baa 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -166,19 +166,19 @@ static struct resource mem_res[] = {
 
 static struct resource io_res[] = {
        {
-               .name = "reserved",
+               .name = resource_name__reserved,
                .start = 0x3bc,
                .end = 0x3be,
                .flags = IORESOURCE_IO | IORESOURCE_BUSY
        },
        {
-               .name = "reserved",
+               .name = resource_name__reserved,
                .start = 0x378,
                .end = 0x37f,
                .flags = IORESOURCE_IO | IORESOURCE_BUSY
        },
        {
-               .name = "reserved",
+               .name = resource_name__reserved,
                .start = 0x278,
                .end = 0x27f,
                .flags = IORESOURCE_IO | IORESOURCE_BUSY
@@ -543,7 +543,7 @@ static void __init request_standard_resources(struct 
machine_desc *mdesc)
 
        for_each_memblock(memory, region) {
                res = alloc_bootmem_low(sizeof(*res));
-               res->name  = "System RAM";
+               res->name  = resource_name__system_ram;
                res->start = 
__pfn_to_phys(memblock_region_memory_base_pfn(region));
                res->end = 
__pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
                res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c
index 6b733fa..d402409 100644
--- a/arch/arm/plat-samsung/pm-check.c
+++ b/arch/arm/plat-samsung/pm-check.c
@@ -54,7 +54,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, 
u32 *arg)
                        s3c_pm_run_res(ptr->child, fn, arg);
 
                if ((ptr->flags & IORESOURCE_MEM) &&
-                   strcmp(ptr->name, "System RAM") == 0) {
+                   ptr->name == resource_name__system_ram) {
                        S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
                                  (unsigned long)ptr->start,
                                  (unsigned long)ptr->end);
diff --git a/arch/avr32/kernel/setup.c b/arch/avr32/kernel/setup.c
index bb0974c..90ded04 100644
--- a/arch/avr32/kernel/setup.c
+++ b/arch/avr32/kernel/setup.c
@@ -133,7 +133,7 @@ add_physical_memory(resource_size_t start, resource_size_t 
end)
        new = &res_cache[res_cache_next_free++];
        new->start = start;
        new->end = end;
-       new->name = "System RAM";
+       new->name = resource_name__system_ram;
        new->flags = IORESOURCE_MEM;
 
        *pprev = new;
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
index 6fc03af..44d5116 100644
--- a/arch/ia64/kernel/efi.c
+++ b/arch/ia64/kernel/efi.c
@@ -1233,12 +1233,12 @@ efi_initialize_iomem_resources(struct resource 
*code_resource,
                        case EFI_BOOT_SERVICES_CODE:
                        case EFI_CONVENTIONAL_MEMORY:
                                if (md->attribute & EFI_MEMORY_WP) {
-                                       name = "System ROM";
+                                       name = resource_name__system_rom;
                                        flags |= IORESOURCE_READONLY;
                                } else if (md->attribute == EFI_MEMORY_UC)
                                        name = "Uncached RAM";
                                else
-                                       name = "System RAM";
+                                       name = resource_name__system_ram;
                                break;
 
                        case EFI_ACPI_MEMORY_NVS:
@@ -1246,7 +1246,7 @@ efi_initialize_iomem_resources(struct resource 
*code_resource,
                                break;
 
                        case EFI_UNUSABLE_MEMORY:
-                               name = "reserved";
+                               name = resource_name__reserved;
                                flags |= IORESOURCE_DISABLED;
                                break;
 
@@ -1255,7 +1255,7 @@ efi_initialize_iomem_resources(struct resource 
*code_resource,
                        case EFI_RUNTIME_SERVICES_DATA:
                        case EFI_ACPI_RECLAIM_MEMORY:
                        default:
-                               name = "reserved";
+                               name = resource_name__reserved;
                                break;
                }
 
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 8ad1d56..713352d 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -524,11 +524,11 @@ static void __init resource_init(void)
                switch (boot_mem_map.map[i].type) {
                case BOOT_MEM_RAM:
                case BOOT_MEM_ROM_DATA:
-                       res->name = "System RAM";
+                       res->name = resource_name__system_ram;
                        break;
                case BOOT_MEM_RESERVED:
                default:
-                       res->name = "reserved";
+                       res->name = resource_name__reserved;
                }
 
                res->start = start;
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
index 82f364e..4915ca8 100644
--- a/arch/parisc/mm/init.c
+++ b/arch/parisc/mm/init.c
@@ -183,7 +183,7 @@ static void __init setup_bootmem(void)
        sysram_resource_count = npmem_ranges;
        for (i = 0; i < sysram_resource_count; i++) {
                struct resource *res = &sysram_resources[i];
-               res->name = "System RAM";
+               res->name = resource_name__system_ram;
                res->start = pmem_ranges[i].start_pfn << PAGE_SHIFT;
                res->end = res->start + (pmem_ranges[i].pages << PAGE_SHIFT)-1;
                res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index 0c35dee..f892eb4 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -439,14 +439,14 @@ static void __init setup_resources(void)
                res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
                switch (memory_chunk[i].type) {
                case CHUNK_READ_WRITE:
-                       res->name = "System RAM";
+                       res->name = resource_name__system_ram;
                        break;
                case CHUNK_READ_ONLY:
-                       res->name = "System ROM";
+                       res->name = resource_name__system_rom;
                        res->flags |= IORESOURCE_READONLY;
                        break;
                default:
-                       res->name = "reserved";
+                       res->name = resource_name__reserved;
                }
                res->start = memory_chunk[i].addr;
                res->end = res->start + memory_chunk[i].size - 1;
diff --git a/arch/score/kernel/setup.c b/arch/score/kernel/setup.c
index 6f898c0..5feab05 100644
--- a/arch/score/kernel/setup.c
+++ b/arch/score/kernel/setup.c
@@ -96,7 +96,7 @@ static void __init resource_init(void)
        data_resource.end = __pa(&_edata) - 1;
 
        res = alloc_bootmem(sizeof(struct resource));
-       res->name = "System RAM";
+       res->name = resource_name__system_ram;
        res->start = MEMORY_START;
        res->end = MEMORY_START + MEMORY_SIZE - 1;
        res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
index 58bff45..4d8edae 100644
--- a/arch/sh/kernel/setup.c
+++ b/arch/sh/kernel/setup.c
@@ -199,7 +199,7 @@ void __init __add_active_range(unsigned int nid, unsigned 
long start_pfn,
        start = start_pfn << PAGE_SHIFT;
        end = end_pfn << PAGE_SHIFT;
 
-       res->name = "System RAM";
+       res->name = resource_name__system_ram;
        res->start = start;
        res->end = end - 1;
        res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c
index 6e3874b..e7cf5ea 100644
--- a/arch/sparc/kernel/pci_common.c
+++ b/arch/sparc/kernel/pci_common.c
@@ -349,7 +349,7 @@ static void pci_register_legacy_regions(struct resource 
*io_res,
        if (!p)
                return;
 
-       p->name = "System ROM";
+       p->name = resource_name__system_rom;
        p->start = mem_res->start + 0xf0000UL;
        p->end = p->start + 0xffffUL;
        p->flags = IORESOURCE_BUSY;
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
index 6cdc9ba..901d908 100644
--- a/arch/tile/kernel/setup.c
+++ b/arch/tile/kernel/setup.c
@@ -1466,7 +1466,7 @@ insert_ram_resource(u64 start_pfn, u64 end_pfn)
 {
        struct resource *res =
                kzalloc(sizeof(struct resource), GFP_ATOMIC);
-       res->name = "System RAM";
+       res->name = resource_name__system_ram;
        res->start = start_pfn << PAGE_SHIFT;
        res->end = (end_pfn << PAGE_SHIFT) - 1;
        res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
diff --git a/arch/unicore32/kernel/setup.c b/arch/unicore32/kernel/setup.c
index 471b6bc..2522832 100644
--- a/arch/unicore32/kernel/setup.c
+++ b/arch/unicore32/kernel/setup.c
@@ -203,7 +203,7 @@ request_standard_resources(struct meminfo *mi)
                        continue;
 
                res = alloc_bootmem_low(sizeof(*res));
-               res->name  = "System RAM";
+               res->name  = resource_name__system_ram;
                res->start = mi->bank[i].start;
                res->end   = mi->bank[i].start + mi->bank[i].size - 1;
                res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 3e2ef84..8642272 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -925,11 +925,11 @@ static inline const char *e820_type_to_string(int 
e820_type)
 {
        switch (e820_type) {
        case E820_RESERVED_KERN:
-       case E820_RAM:  return "System RAM";
+       case E820_RAM:  return resource_name__system_ram;
        case E820_ACPI: return "ACPI Tables";
        case E820_NVS:  return "ACPI Non-volatile Storage";
        case E820_UNUSABLE:     return "Unusable memory";
-       default:        return "reserved";
+       default:        return resource_name__reserved;
        }
 }
 
diff --git a/arch/x86/kernel/probe_roms.c b/arch/x86/kernel/probe_roms.c
index ba0a4cc..ce7f8d4 100644
--- a/arch/x86/kernel/probe_roms.c
+++ b/arch/x86/kernel/probe_roms.c
@@ -21,7 +21,7 @@
 #include <asm/setup_arch.h>
 
 static struct resource system_rom_resource = {
-       .name   = "System ROM",
+       .name   = resource_name__system_rom,
        .start  = 0xf0000,
        .end    = 0xfffff,
        .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index e9bb22c..b6222ee 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -109,6 +109,11 @@ struct resource_list {
 /* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
 #define IORESOURCE_PCI_FIXED           (1<<4)  /* Do not move resource */
 
+/* Some common resource names, must be used when appropriate. */
+extern const char resource_name__system_ram[];
+extern const char resource_name__system_rom[];
+extern const char resource_name__reserved[];
+
 /* PC/ISA/whatever - the normal PC address spaces: IO and memory */
 extern struct resource ioport_resource;
 extern struct resource iomem_resource;
diff --git a/kernel/resource.c b/kernel/resource.c
index 798e2fa..8c29c2e 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -269,13 +269,20 @@ int release_resource(struct resource *old)
 
 EXPORT_SYMBOL(release_resource);
 
+const char resource_name__system_ram[] = "System RAM";
+EXPORT_SYMBOL(resource_name__system_ram);
+const char resource_name__system_rom[] = "System ROM";
+EXPORT_SYMBOL(resource_name__system_rom);
+const char resource_name__reserved[] = "reserved";
+EXPORT_SYMBOL(resource_name__reserved);
+
 #if !defined(CONFIG_ARCH_HAS_WALK_MEMORY)
 /*
  * Finds the lowest memory reosurce exists within [res->start.res->end)
  * the caller must specify res->start, res->end, res->flags and "name".
  * If found, returns 0, res is overwritten, if not found, returns -1.
  */
-static int find_next_system_ram(struct resource *res, char *name)
+static int find_next_system_ram(struct resource *res, const char *name)
 {
        resource_size_t start, end;
        struct resource *p;
@@ -291,7 +298,7 @@ static int find_next_system_ram(struct resource *res, char 
*name)
                /* system ram is just marked as IORESOURCE_MEM */
                if (p->flags != res->flags)
                        continue;
-               if (name && strcmp(p->name, name))
+               if (name && p->name == name)
                        continue;
                if (p->start > end) {
                        p = NULL;
@@ -329,7 +336,7 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned 
long nr_pages,
        res.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
        orig_end = res.end;
        while ((res.start < res.end) &&
-               (find_next_system_ram(&res, "System RAM") >= 0)) {
+               (find_next_system_ram(&res, resource_name__system_ram) >= 0)) {
                pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT;
                end_pfn = (res.end + 1) >> PAGE_SHIFT;
                if (end_pfn > pfn)
@@ -936,7 +943,7 @@ static int __init reserve_setup(char *str)
                        break;
                if (x < MAXRESERVE) {
                        struct resource *res = reserve + x;
-                       res->name = "reserved";
+                       res->name = resource_name__reserved;
                        res->start = io_start;
                        res->end = io_start + io_num - 1;
                        res->flags = IORESOURCE_BUSY;
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 9f64637..97aa891 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -58,7 +58,7 @@ static struct resource *register_memory_resource(u64 start, 
u64 size)
        res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        BUG_ON(!res);
 
-       res->name = "System RAM";
+       res->name = resource_name__system_ram;
        res->start = start;
        res->end = start + size - 1;
        res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
@@ -571,7 +571,7 @@ int __ref add_memory(int nid, u64 start, u64 size)
        }
 
        /* create new memmap entry */
-       firmware_map_add_hotplug(start, start + size, "System RAM");
+       firmware_map_add_hotplug(start, start + size, 
resource_name__system_ram);
 
        goto out;
 
-- 
1.7.5.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to