Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'core-resources-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull ram resource handling changes from Ingo Molnar:
"Core kernel resource handling changes to support NVDIMM error
injection.

This tree introduces a new I/O resource type, IORESOURCE_SYSTEM_RAM,
for System RAM while keeping the current IORESOURCE_MEM type bit set
for all memory-mapped ranges (including System RAM) for backward
compatibility.

With this resource flag it no longer takes a strcmp() loop through the
resource tree to find "System RAM" resources.

The new resource type is then used to extend ACPI/APEI error injection
facility to also support NVDIMM"

* 'core-resources-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
ACPI/EINJ: Allow memory error injection to NVDIMM
resource: Kill walk_iomem_res()
x86/kexec: Remove walk_iomem_res() call with GART type
x86, kexec, nvdimm: Use walk_iomem_res_desc() for iomem search
resource: Add walk_iomem_res_desc()
memremap: Change region_intersects() to take @flags and @desc
arm/samsung: Change s3c_pm_run_res() to use System RAM type
resource: Change walk_system_ram() to use System RAM type
drivers: Initialize resource entry to zero
xen, mm: Set IORESOURCE_SYSTEM_RAM to System RAM
kexec: Set IORESOURCE_SYSTEM_RAM for System RAM
arch: Set IORESOURCE_SYSTEM_RAM flag for System RAM
ia64: Set System RAM type and descriptor
x86/e820: Set System RAM type and descriptor
resource: Add I/O resource descriptor
resource: Handle resource flags properly
resource: Add System RAM resource type

+232 -159
+3 -3
arch/arm/kernel/setup.c
··· 176 176 .name = "Kernel code", 177 177 .start = 0, 178 178 .end = 0, 179 - .flags = IORESOURCE_MEM 179 + .flags = IORESOURCE_SYSTEM_RAM 180 180 }, 181 181 { 182 182 .name = "Kernel data", 183 183 .start = 0, 184 184 .end = 0, 185 - .flags = IORESOURCE_MEM 185 + .flags = IORESOURCE_SYSTEM_RAM 186 186 } 187 187 }; 188 188 ··· 851 851 res->name = "System RAM"; 852 852 res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); 853 853 res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; 854 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 854 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 855 855 856 856 request_resource(&iomem_resource, res); 857 857
+2 -2
arch/arm/plat-samsung/pm-check.c
··· 53 53 if (ptr->child != NULL) 54 54 s3c_pm_run_res(ptr->child, fn, arg); 55 55 56 - if ((ptr->flags & IORESOURCE_MEM) && 57 - strcmp(ptr->name, "System RAM") == 0) { 56 + if ((ptr->flags & IORESOURCE_SYSTEM_RAM) 57 + == IORESOURCE_SYSTEM_RAM) { 58 58 S3C_PMDBG("Found system RAM at %08lx..%08lx\n", 59 59 (unsigned long)ptr->start, 60 60 (unsigned long)ptr->end);
+3 -3
arch/arm64/kernel/setup.c
··· 73 73 .name = "Kernel code", 74 74 .start = 0, 75 75 .end = 0, 76 - .flags = IORESOURCE_MEM 76 + .flags = IORESOURCE_SYSTEM_RAM 77 77 }, 78 78 { 79 79 .name = "Kernel data", 80 80 .start = 0, 81 81 .end = 0, 82 - .flags = IORESOURCE_MEM 82 + .flags = IORESOURCE_SYSTEM_RAM 83 83 } 84 84 }; 85 85 ··· 210 210 res->name = "System RAM"; 211 211 res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); 212 212 res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; 213 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 213 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 214 214 215 215 request_resource(&iomem_resource, res); 216 216
+3 -3
arch/avr32/kernel/setup.c
··· 49 49 .name = "Kernel data", 50 50 .start = 0, 51 51 .end = 0, 52 - .flags = IORESOURCE_MEM, 52 + .flags = IORESOURCE_SYSTEM_RAM, 53 53 }; 54 54 static struct resource __initdata kernel_code = { 55 55 .name = "Kernel code", 56 56 .start = 0, 57 57 .end = 0, 58 - .flags = IORESOURCE_MEM, 58 + .flags = IORESOURCE_SYSTEM_RAM, 59 59 .sibling = &kernel_data, 60 60 }; 61 61 ··· 134 134 new->start = start; 135 135 new->end = end; 136 136 new->name = "System RAM"; 137 - new->flags = IORESOURCE_MEM; 137 + new->flags = IORESOURCE_SYSTEM_RAM; 138 138 139 139 *pprev = new; 140 140 }
+10 -3
arch/ia64/kernel/efi.c
··· 1178 1178 efi_memory_desc_t *md; 1179 1179 u64 efi_desc_size; 1180 1180 char *name; 1181 - unsigned long flags; 1181 + unsigned long flags, desc; 1182 1182 1183 1183 efi_map_start = __va(ia64_boot_param->efi_memmap); 1184 1184 efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size; ··· 1193 1193 continue; 1194 1194 1195 1195 flags = IORESOURCE_MEM | IORESOURCE_BUSY; 1196 + desc = IORES_DESC_NONE; 1197 + 1196 1198 switch (md->type) { 1197 1199 1198 1200 case EFI_MEMORY_MAPPED_IO: ··· 1209 1207 if (md->attribute & EFI_MEMORY_WP) { 1210 1208 name = "System ROM"; 1211 1209 flags |= IORESOURCE_READONLY; 1212 - } else if (md->attribute == EFI_MEMORY_UC) 1210 + } else if (md->attribute == EFI_MEMORY_UC) { 1213 1211 name = "Uncached RAM"; 1214 - else 1212 + } else { 1215 1213 name = "System RAM"; 1214 + flags |= IORESOURCE_SYSRAM; 1215 + } 1216 1216 break; 1217 1217 1218 1218 case EFI_ACPI_MEMORY_NVS: 1219 1219 name = "ACPI Non-volatile Storage"; 1220 + desc = IORES_DESC_ACPI_NV_STORAGE; 1220 1221 break; 1221 1222 1222 1223 case EFI_UNUSABLE_MEMORY: ··· 1229 1224 1230 1225 case EFI_PERSISTENT_MEMORY: 1231 1226 name = "Persistent Memory"; 1227 + desc = IORES_DESC_PERSISTENT_MEMORY; 1232 1228 break; 1233 1229 1234 1230 case EFI_RESERVED_TYPE: ··· 1252 1246 res->start = md->phys_addr; 1253 1247 res->end = md->phys_addr + efi_md_size(md) - 1; 1254 1248 res->flags = flags; 1249 + res->desc = desc; 1255 1250 1256 1251 if (insert_resource(&iomem_resource, res) < 0) 1257 1252 kfree(res);
+3 -3
arch/ia64/kernel/setup.c
··· 80 80 81 81 static struct resource data_resource = { 82 82 .name = "Kernel data", 83 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 83 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 84 84 }; 85 85 86 86 static struct resource code_resource = { 87 87 .name = "Kernel code", 88 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 88 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 89 89 }; 90 90 91 91 static struct resource bss_resource = { 92 92 .name = "Kernel bss", 93 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 93 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 94 94 }; 95 95 96 96 unsigned long ia64_max_cacheline_size;
+2 -2
arch/m32r/kernel/setup.c
··· 70 70 .name = "Kernel data", 71 71 .start = 0, 72 72 .end = 0, 73 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 73 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 74 74 }; 75 75 76 76 static struct resource code_resource = { 77 77 .name = "Kernel code", 78 78 .start = 0, 79 79 .end = 0, 80 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 80 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 81 81 }; 82 82 83 83 unsigned long memory_start;
+6 -4
arch/mips/kernel/setup.c
··· 732 732 end = HIGHMEM_START - 1; 733 733 734 734 res = alloc_bootmem(sizeof(struct resource)); 735 + 736 + res->start = start; 737 + res->end = end; 738 + res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 739 + 735 740 switch (boot_mem_map.map[i].type) { 736 741 case BOOT_MEM_RAM: 737 742 case BOOT_MEM_INIT_RAM: 738 743 case BOOT_MEM_ROM_DATA: 739 744 res->name = "System RAM"; 745 + res->flags |= IORESOURCE_SYSRAM; 740 746 break; 741 747 case BOOT_MEM_RESERVED: 742 748 default: 743 749 res->name = "reserved"; 744 750 } 745 751 746 - res->start = start; 747 - res->end = end; 748 - 749 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 750 752 request_resource(&iomem_resource, res); 751 753 752 754 /*
+3 -3
arch/parisc/mm/init.c
··· 55 55 56 56 static struct resource data_resource = { 57 57 .name = "Kernel data", 58 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 58 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 59 59 }; 60 60 61 61 static struct resource code_resource = { 62 62 .name = "Kernel code", 63 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 63 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 64 64 }; 65 65 66 66 static struct resource pdcdata_resource = { ··· 201 201 res->name = "System RAM"; 202 202 res->start = pmem_ranges[i].start_pfn << PAGE_SHIFT; 203 203 res->end = res->start + (pmem_ranges[i].pages << PAGE_SHIFT)-1; 204 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 204 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 205 205 request_resource(&iomem_resource, res); 206 206 } 207 207
+1 -1
arch/powerpc/mm/mem.c
··· 541 541 res->name = "System RAM"; 542 542 res->start = base; 543 543 res->end = base + size - 1; 544 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 544 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 545 545 WARN_ON(request_resource(&iomem_resource, res) < 0); 546 546 } 547 547 }
+4 -4
arch/s390/kernel/setup.c
··· 374 374 375 375 static struct resource code_resource = { 376 376 .name = "Kernel code", 377 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 377 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 378 378 }; 379 379 380 380 static struct resource data_resource = { 381 381 .name = "Kernel data", 382 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 382 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 383 383 }; 384 384 385 385 static struct resource bss_resource = { 386 386 .name = "Kernel bss", 387 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 387 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 388 388 }; 389 389 390 390 static struct resource __initdata *standard_resources[] = { ··· 408 408 409 409 for_each_memblock(memory, reg) { 410 410 res = alloc_bootmem_low(sizeof(*res)); 411 - res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 411 + res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM; 412 412 413 413 res->name = "System RAM"; 414 414 res->start = reg->base;
+1 -1
arch/score/kernel/setup.c
··· 101 101 res->name = "System RAM"; 102 102 res->start = MEMORY_START; 103 103 res->end = MEMORY_START + MEMORY_SIZE - 1; 104 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 104 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 105 105 request_resource(&iomem_resource, res); 106 106 107 107 request_resource(res, &code_resource);
+4 -4
arch/sh/kernel/setup.c
··· 78 78 79 79 static struct resource code_resource = { 80 80 .name = "Kernel code", 81 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 81 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 82 82 }; 83 83 84 84 static struct resource data_resource = { 85 85 .name = "Kernel data", 86 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 86 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 87 87 }; 88 88 89 89 static struct resource bss_resource = { 90 90 .name = "Kernel bss", 91 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM, 91 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 92 92 }; 93 93 94 94 unsigned long memory_start; ··· 202 202 res->name = "System RAM"; 203 203 res->start = start; 204 204 res->end = end - 1; 205 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 205 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 206 206 207 207 if (request_resource(&iomem_resource, res)) { 208 208 pr_err("unable to request memory_resource 0x%lx 0x%lx\n",
+4 -4
arch/sparc/mm/init_64.c
··· 2863 2863 2864 2864 static struct resource code_resource = { 2865 2865 .name = "Kernel code", 2866 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 2866 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 2867 2867 }; 2868 2868 2869 2869 static struct resource data_resource = { 2870 2870 .name = "Kernel data", 2871 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 2871 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 2872 2872 }; 2873 2873 2874 2874 static struct resource bss_resource = { 2875 2875 .name = "Kernel bss", 2876 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 2876 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 2877 2877 }; 2878 2878 2879 2879 static inline resource_size_t compute_kern_paddr(void *addr) ··· 2909 2909 res->name = "System RAM"; 2910 2910 res->start = pavail[i].phys_addr; 2911 2911 res->end = pavail[i].phys_addr + pavail[i].reg_size - 1; 2912 - res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 2912 + res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM; 2913 2913 2914 2914 if (insert_resource(&iomem_resource, res) < 0) { 2915 2915 pr_warn("Resource insertion failed.\n");
+8 -3
arch/tile/kernel/setup.c
··· 1632 1632 .name = "Kernel data", 1633 1633 .start = 0, 1634 1634 .end = 0, 1635 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 1635 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 1636 1636 }; 1637 1637 1638 1638 static struct resource code_resource = { 1639 1639 .name = "Kernel code", 1640 1640 .start = 0, 1641 1641 .end = 0, 1642 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 1642 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 1643 1643 }; 1644 1644 1645 1645 /* ··· 1673 1673 kzalloc(sizeof(struct resource), GFP_ATOMIC); 1674 1674 if (!res) 1675 1675 return NULL; 1676 - res->name = reserved ? "Reserved" : "System RAM"; 1677 1676 res->start = start_pfn << PAGE_SHIFT; 1678 1677 res->end = (end_pfn << PAGE_SHIFT) - 1; 1679 1678 res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 1679 + if (reserved) { 1680 + res->name = "Reserved"; 1681 + } else { 1682 + res->name = "System RAM"; 1683 + res->flags |= IORESOURCE_SYSRAM; 1684 + } 1680 1685 if (insert_resource(&iomem_resource, res)) { 1681 1686 kfree(res); 1682 1687 return NULL;
+3 -3
arch/unicore32/kernel/setup.c
··· 72 72 .name = "Kernel code", 73 73 .start = 0, 74 74 .end = 0, 75 - .flags = IORESOURCE_MEM 75 + .flags = IORESOURCE_SYSTEM_RAM 76 76 }, 77 77 { 78 78 .name = "Kernel data", 79 79 .start = 0, 80 80 .end = 0, 81 - .flags = IORESOURCE_MEM 81 + .flags = IORESOURCE_SYSTEM_RAM 82 82 } 83 83 }; 84 84 ··· 211 211 res->name = "System RAM"; 212 212 res->start = mi->bank[i].start; 213 213 res->end = mi->bank[i].start + mi->bank[i].size - 1; 214 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 214 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 215 215 216 216 request_resource(&iomem_resource, res); 217 217
+3 -38
arch/x86/kernel/crash.c
··· 57 57 struct kimage *image; 58 58 /* 59 59 * Total number of ram ranges we have after various adjustments for 60 - * GART, crash reserved region etc. 60 + * crash reserved region, etc. 61 61 */ 62 62 unsigned int max_nr_ranges; 63 - unsigned long gart_start, gart_end; 64 63 65 64 /* Pointer to elf header */ 66 65 void *ehdr; ··· 200 201 return 0; 201 202 } 202 203 203 - static int get_gart_ranges_callback(u64 start, u64 end, void *arg) 204 - { 205 - struct crash_elf_data *ced = arg; 206 - 207 - ced->gart_start = start; 208 - ced->gart_end = end; 209 - 210 - /* Not expecting more than 1 gart aperture */ 211 - return 1; 212 - } 213 - 214 204 215 205 /* Gather all the required information to prepare elf headers for ram regions */ 216 206 static void fill_up_crash_elf_data(struct crash_elf_data *ced, ··· 213 225 get_nr_ram_ranges_callback); 214 226 215 227 ced->max_nr_ranges = nr_ranges; 216 - 217 - /* 218 - * We don't create ELF headers for GART aperture as an attempt 219 - * to dump this memory in second kernel leads to hang/crash. 220 - * If gart aperture is present, one needs to exclude that region 221 - * and that could lead to need of extra phdr. 222 - */ 223 - walk_iomem_res("GART", IORESOURCE_MEM, 0, -1, 224 - ced, get_gart_ranges_callback); 225 - 226 - /* 227 - * If we have gart region, excluding that could potentially split 228 - * a memory range, resulting in extra header. Account for that. 229 - */ 230 - if (ced->gart_end) 231 - ced->max_nr_ranges++; 232 228 233 229 /* Exclusion of crash region could split memory ranges */ 234 230 ced->max_nr_ranges++; ··· 318 346 319 347 if (crashk_low_res.end) { 320 348 ret = exclude_mem_range(cmem, crashk_low_res.start, crashk_low_res.end); 321 - if (ret) 322 - return ret; 323 - } 324 - 325 - /* Exclude GART region */ 326 - if (ced->gart_end) { 327 - ret = exclude_mem_range(cmem, ced->gart_start, ced->gart_end); 328 349 if (ret) 329 350 return ret; 330 351 } ··· 564 599 /* Add ACPI tables */ 565 600 cmd.type = E820_ACPI; 566 601 flags = IORESOURCE_MEM | IORESOURCE_BUSY; 567 - walk_iomem_res("ACPI Tables", flags, 0, -1, &cmd, 602 + walk_iomem_res_desc(IORES_DESC_ACPI_TABLES, flags, 0, -1, &cmd, 568 603 memmap_entry_callback); 569 604 570 605 /* Add ACPI Non-volatile Storage */ 571 606 cmd.type = E820_NVS; 572 - walk_iomem_res("ACPI Non-volatile Storage", flags, 0, -1, &cmd, 607 + walk_iomem_res_desc(IORES_DESC_ACPI_NV_STORAGE, flags, 0, -1, &cmd, 573 608 memmap_entry_callback); 574 609 575 610 /* Add crashk_low_res region */
+37 -1
arch/x86/kernel/e820.c
··· 925 925 } 926 926 } 927 927 928 + static unsigned long e820_type_to_iomem_type(int e820_type) 929 + { 930 + switch (e820_type) { 931 + case E820_RESERVED_KERN: 932 + case E820_RAM: 933 + return IORESOURCE_SYSTEM_RAM; 934 + case E820_ACPI: 935 + case E820_NVS: 936 + case E820_UNUSABLE: 937 + case E820_PRAM: 938 + case E820_PMEM: 939 + default: 940 + return IORESOURCE_MEM; 941 + } 942 + } 943 + 944 + static unsigned long e820_type_to_iores_desc(int e820_type) 945 + { 946 + switch (e820_type) { 947 + case E820_ACPI: 948 + return IORES_DESC_ACPI_TABLES; 949 + case E820_NVS: 950 + return IORES_DESC_ACPI_NV_STORAGE; 951 + case E820_PMEM: 952 + return IORES_DESC_PERSISTENT_MEMORY; 953 + case E820_PRAM: 954 + return IORES_DESC_PERSISTENT_MEMORY_LEGACY; 955 + case E820_RESERVED_KERN: 956 + case E820_RAM: 957 + case E820_UNUSABLE: 958 + default: 959 + return IORES_DESC_NONE; 960 + } 961 + } 962 + 928 963 static bool do_mark_busy(u32 type, struct resource *res) 929 964 { 930 965 /* this is the legacy bios/dos rom-shadow + mmio region */ ··· 1002 967 res->start = e820.map[i].addr; 1003 968 res->end = end; 1004 969 1005 - res->flags = IORESOURCE_MEM; 970 + res->flags = e820_type_to_iomem_type(e820.map[i].type); 971 + res->desc = e820_type_to_iores_desc(e820.map[i].type); 1006 972 1007 973 /* 1008 974 * don't register the region that could be conflicted with
+2 -2
arch/x86/kernel/pmem.c
··· 13 13 14 14 static __init int register_e820_pmem(void) 15 15 { 16 - char *pmem = "Persistent Memory (legacy)"; 17 16 struct platform_device *pdev; 18 17 int rc; 19 18 20 - rc = walk_iomem_res(pmem, IORESOURCE_MEM, 0, -1, NULL, found); 19 + rc = walk_iomem_res_desc(IORES_DESC_PERSISTENT_MEMORY_LEGACY, 20 + IORESOURCE_MEM, 0, -1, NULL, found); 21 21 if (rc <= 0) 22 22 return 0; 23 23
+3 -3
arch/x86/kernel/setup.c
··· 152 152 .name = "Kernel data", 153 153 .start = 0, 154 154 .end = 0, 155 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 155 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 156 156 }; 157 157 158 158 static struct resource code_resource = { 159 159 .name = "Kernel code", 160 160 .start = 0, 161 161 .end = 0, 162 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 162 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 163 163 }; 164 164 165 165 static struct resource bss_resource = { 166 166 .name = "Kernel bss", 167 167 .start = 0, 168 168 .end = 0, 169 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 169 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM 170 170 }; 171 171 172 172
+1 -1
drivers/acpi/acpi_platform.c
··· 62 62 if (count < 0) { 63 63 return NULL; 64 64 } else if (count > 0) { 65 - resources = kmalloc(count * sizeof(struct resource), 65 + resources = kzalloc(count * sizeof(struct resource), 66 66 GFP_KERNEL); 67 67 if (!resources) { 68 68 dev_err(&adev->dev, "No memory for resources\n");
+11 -4
drivers/acpi/apei/einj.c
··· 519 519 u64 param3, u64 param4) 520 520 { 521 521 int rc; 522 - unsigned long pfn; 522 + u64 base_addr, size; 523 523 524 524 /* If user manually set "flags", make sure it is legal */ 525 525 if (flags && (flags & ··· 545 545 /* 546 546 * Disallow crazy address masks that give BIOS leeway to pick 547 547 * injection address almost anywhere. Insist on page or 548 - * better granularity and that target address is normal RAM. 548 + * better granularity and that target address is normal RAM or 549 + * NVDIMM. 549 550 */ 550 - pfn = PFN_DOWN(param1 & param2); 551 - if (!page_is_ram(pfn) || ((param2 & PAGE_MASK) != PAGE_MASK)) 551 + base_addr = param1 & param2; 552 + size = ~param2 + 1; 553 + 554 + if (((param2 & PAGE_MASK) != PAGE_MASK) || 555 + ((region_intersects(base_addr, size, IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE) 556 + != REGION_INTERSECTS) && 557 + (region_intersects(base_addr, size, IORESOURCE_MEM, IORES_DESC_PERSISTENT_MEMORY) 558 + != REGION_INTERSECTS))) 552 559 return -EINVAL; 553 560 554 561 inject:
+1 -1
drivers/nvdimm/e820.c
··· 55 55 for (p = iomem_resource.child; p ; p = p->sibling) { 56 56 struct nd_region_desc ndr_desc; 57 57 58 - if (strncmp(p->name, "Persistent Memory (legacy)", 26) != 0) 58 + if (p->desc != IORES_DESC_PERSISTENT_MEMORY_LEGACY) 59 59 continue; 60 60 61 61 memset(&ndr_desc, 0, sizeof(ndr_desc));
+2 -2
drivers/parisc/eisa_enumerator.c
··· 91 91 for (i=0;i<HPEE_MEMORY_MAX_ENT;i++) { 92 92 c = get_8(buf+len); 93 93 94 - if (NULL != (res = kmalloc(sizeof(struct resource), GFP_KERNEL))) { 94 + if (NULL != (res = kzalloc(sizeof(struct resource), GFP_KERNEL))) { 95 95 int result; 96 96 97 97 res->name = name; ··· 183 183 for (i=0;i<HPEE_PORT_MAX_ENT;i++) { 184 184 c = get_8(buf+len); 185 185 186 - if (NULL != (res = kmalloc(sizeof(struct resource), GFP_KERNEL))) { 186 + if (NULL != (res = kzalloc(sizeof(struct resource), GFP_KERNEL))) { 187 187 res->name = board; 188 188 res->start = get_16(buf+len+1); 189 189 res->end = get_16(buf+len+1)+(c&HPEE_PORT_SIZE_MASK)+1;
+4 -4
drivers/rapidio/rio.c
··· 117 117 if (mport->ops->open_inb_mbox == NULL) 118 118 goto out; 119 119 120 - res = kmalloc(sizeof(struct resource), GFP_KERNEL); 120 + res = kzalloc(sizeof(struct resource), GFP_KERNEL); 121 121 122 122 if (res) { 123 123 rio_init_mbox_res(res, mbox, mbox); ··· 185 185 if (mport->ops->open_outb_mbox == NULL) 186 186 goto out; 187 187 188 - res = kmalloc(sizeof(struct resource), GFP_KERNEL); 188 + res = kzalloc(sizeof(struct resource), GFP_KERNEL); 189 189 190 190 if (res) { 191 191 rio_init_mbox_res(res, mbox, mbox); ··· 285 285 { 286 286 int rc = 0; 287 287 288 - struct resource *res = kmalloc(sizeof(struct resource), GFP_KERNEL); 288 + struct resource *res = kzalloc(sizeof(struct resource), GFP_KERNEL); 289 289 290 290 if (res) { 291 291 rio_init_dbell_res(res, start, end); ··· 360 360 struct resource *rio_request_outb_dbell(struct rio_dev *rdev, u16 start, 361 361 u16 end) 362 362 { 363 - struct resource *res = kmalloc(sizeof(struct resource), GFP_KERNEL); 363 + struct resource *res = kzalloc(sizeof(struct resource), GFP_KERNEL); 364 364 365 365 if (res) { 366 366 rio_init_dbell_res(res, start, end);
+1 -1
drivers/sh/superhyway/superhyway.c
··· 66 66 superhyway_read_vcr(dev, base, &dev->vcr); 67 67 68 68 if (!dev->resource) { 69 - dev->resource = kmalloc(sizeof(struct resource), GFP_KERNEL); 69 + dev->resource = kzalloc(sizeof(struct resource), GFP_KERNEL); 70 70 if (!dev->resource) { 71 71 kfree(dev); 72 72 return -ENOMEM;
+1 -1
drivers/xen/balloon.c
··· 257 257 return NULL; 258 258 259 259 res->name = "System RAM"; 260 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 260 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 261 261 262 262 ret = allocate_resource(&iomem_resource, res, 263 263 size, 0, -1,
+31 -2
include/linux/ioport.h
··· 20 20 resource_size_t end; 21 21 const char *name; 22 22 unsigned long flags; 23 + unsigned long desc; 23 24 struct resource *parent, *sibling, *child; 24 25 }; 25 26 ··· 50 49 #define IORESOURCE_WINDOW 0x00200000 /* forwarded by bridge */ 51 50 #define IORESOURCE_MUXED 0x00400000 /* Resource is software muxed */ 52 51 52 + #define IORESOURCE_EXT_TYPE_BITS 0x01000000 /* Resource extended types */ 53 + #define IORESOURCE_SYSRAM 0x01000000 /* System RAM (modifier) */ 54 + 53 55 #define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */ 56 + 54 57 #define IORESOURCE_DISABLED 0x10000000 55 58 #define IORESOURCE_UNSET 0x20000000 /* No address assigned yet */ 56 59 #define IORESOURCE_AUTO 0x40000000 57 60 #define IORESOURCE_BUSY 0x80000000 /* Driver has marked this resource busy */ 61 + 62 + /* I/O resource extended types */ 63 + #define IORESOURCE_SYSTEM_RAM (IORESOURCE_MEM|IORESOURCE_SYSRAM) 58 64 59 65 /* PnP IRQ specific bits (IORESOURCE_BITS) */ 60 66 #define IORESOURCE_IRQ_HIGHEDGE (1<<0) ··· 113 105 /* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ 114 106 #define IORESOURCE_PCI_FIXED (1<<4) /* Do not move resource */ 115 107 108 + /* 109 + * I/O Resource Descriptors 110 + * 111 + * Descriptors are used by walk_iomem_res_desc() and region_intersects() 112 + * for searching a specific resource range in the iomem table. Assign 113 + * a new descriptor when a resource range supports the search interfaces. 114 + * Otherwise, resource.desc must be set to IORES_DESC_NONE (0). 115 + */ 116 + enum { 117 + IORES_DESC_NONE = 0, 118 + IORES_DESC_CRASH_KERNEL = 1, 119 + IORES_DESC_ACPI_TABLES = 2, 120 + IORES_DESC_ACPI_NV_STORAGE = 3, 121 + IORES_DESC_PERSISTENT_MEMORY = 4, 122 + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, 123 + }; 116 124 117 125 /* helpers to define resources */ 118 126 #define DEFINE_RES_NAMED(_start, _size, _name, _flags) \ ··· 137 113 .end = (_start) + (_size) - 1, \ 138 114 .name = (_name), \ 139 115 .flags = (_flags), \ 116 + .desc = IORES_DESC_NONE, \ 140 117 } 141 118 142 119 #define DEFINE_RES_IO_NAMED(_start, _size, _name) \ ··· 194 169 static inline unsigned long resource_type(const struct resource *res) 195 170 { 196 171 return res->flags & IORESOURCE_TYPE_BITS; 172 + } 173 + static inline unsigned long resource_ext_type(const struct resource *res) 174 + { 175 + return res->flags & IORESOURCE_EXT_TYPE_BITS; 197 176 } 198 177 /* True iff r1 completely contains r2 */ 199 178 static inline bool resource_contains(struct resource *r1, struct resource *r2) ··· 268 239 walk_system_ram_res(u64 start, u64 end, void *arg, 269 240 int (*func)(u64, u64, void *)); 270 241 extern int 271 - walk_iomem_res(char *name, unsigned long flags, u64 start, u64 end, void *arg, 272 - int (*func)(u64, u64, void *)); 242 + walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, 243 + void *arg, int (*func)(u64, u64, void *)); 273 244 274 245 /* True if any part of r1 overlaps r2 */ 275 246 static inline bool resource_overlaps(struct resource *r1, struct resource *r2)
+2 -1
include/linux/mm.h
··· 387 387 REGION_MIXED, 388 388 }; 389 389 390 - int region_intersects(resource_size_t offset, size_t size, const char *type); 390 + int region_intersects(resource_size_t offset, size_t size, unsigned long flags, 391 + unsigned long desc); 391 392 392 393 /* Support for virtually mapped pages */ 393 394 struct page *vmalloc_to_page(const void *addr);
+5 -3
kernel/kexec_core.c
··· 66 66 .name = "Crash kernel", 67 67 .start = 0, 68 68 .end = 0, 69 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 69 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 70 + .desc = IORES_DESC_CRASH_KERNEL 70 71 }; 71 72 struct resource crashk_low_res = { 72 73 .name = "Crash kernel", 73 74 .start = 0, 74 75 .end = 0, 75 - .flags = IORESOURCE_BUSY | IORESOURCE_MEM 76 + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, 77 + .desc = IORES_DESC_CRASH_KERNEL 76 78 }; 77 79 78 80 int kexec_should_crash(struct task_struct *p) ··· 961 959 962 960 ram_res->start = end; 963 961 ram_res->end = crashk_res.end; 964 - ram_res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 962 + ram_res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM; 965 963 ram_res->name = "System RAM"; 966 964 967 965 crashk_res.end = end - 1;
+4 -4
kernel/kexec_file.c
··· 524 524 525 525 /* Walk the RAM ranges and allocate a suitable range for the buffer */ 526 526 if (image->type == KEXEC_TYPE_CRASH) 527 - ret = walk_iomem_res("Crash kernel", 528 - IORESOURCE_MEM | IORESOURCE_BUSY, 529 - crashk_res.start, crashk_res.end, kbuf, 530 - locate_mem_hole_callback); 527 + ret = walk_iomem_res_desc(crashk_res.desc, 528 + IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, 529 + crashk_res.start, crashk_res.end, kbuf, 530 + locate_mem_hole_callback); 531 531 else 532 532 ret = walk_system_ram_res(0, -1, kbuf, 533 533 locate_mem_hole_callback);
+8 -6
kernel/memremap.c
··· 47 47 * being mapped does not have i/o side effects and the __iomem 48 48 * annotation is not applicable. 49 49 * 50 - * MEMREMAP_WB - matches the default mapping for "System RAM" on 50 + * MEMREMAP_WB - matches the default mapping for System RAM on 51 51 * the architecture. This is usually a read-allocate write-back cache. 52 52 * Morever, if MEMREMAP_WB is specified and the requested remap region is RAM 53 53 * memremap() will bypass establishing a new mapping and instead return ··· 56 56 * MEMREMAP_WT - establish a mapping whereby writes either bypass the 57 57 * cache or are written through to memory and never exist in a 58 58 * cache-dirty state with respect to program visibility. Attempts to 59 - * map "System RAM" with this mapping type will fail. 59 + * map System RAM with this mapping type will fail. 60 60 */ 61 61 void *memremap(resource_size_t offset, size_t size, unsigned long flags) 62 62 { 63 - int is_ram = region_intersects(offset, size, "System RAM"); 63 + int is_ram = region_intersects(offset, size, 64 + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); 64 65 void *addr = NULL; 65 66 66 67 if (is_ram == REGION_MIXED) { ··· 77 76 * MEMREMAP_WB is special in that it can be satisifed 78 77 * from the direct map. Some archs depend on the 79 78 * capability of memremap() to autodetect cases where 80 - * the requested range is potentially in "System RAM" 79 + * the requested range is potentially in System RAM. 81 80 */ 82 81 if (is_ram == REGION_INTERSECTS) 83 82 addr = try_ram_remap(offset, size); ··· 89 88 * If we don't have a mapping yet and more request flags are 90 89 * pending then we will be attempting to establish a new virtual 91 90 * address mapping. Enforce that this mapping is not aliasing 92 - * "System RAM" 91 + * System RAM. 93 92 */ 94 93 if (!addr && is_ram == REGION_INTERSECTS && flags) { 95 94 WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n", ··· 280 279 align_start = res->start & ~(SECTION_SIZE - 1); 281 280 align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) 282 281 - align_start; 283 - is_ram = region_intersects(align_start, align_size, "System RAM"); 282 + is_ram = region_intersects(align_start, align_size, 283 + IORESOURCE_SYSTEM_RAM, IORES_DESC_NONE); 284 284 285 285 if (is_ram == REGION_MIXED) { 286 286 WARN_ONCE(1, "%s attempted on mixed region %pr\n",
+55 -38
kernel/resource.c
··· 333 333 EXPORT_SYMBOL(release_resource); 334 334 335 335 /* 336 - * Finds the lowest iomem reosurce exists with-in [res->start.res->end) 337 - * the caller must specify res->start, res->end, res->flags and "name". 338 - * If found, returns 0, res is overwritten, if not found, returns -1. 339 - * This walks through whole tree and not just first level children 340 - * until and unless first_level_children_only is true. 336 + * Finds the lowest iomem resource existing within [res->start.res->end). 337 + * The caller must specify res->start, res->end, res->flags, and optionally 338 + * desc. If found, returns 0, res is overwritten, if not found, returns -1. 339 + * This function walks the whole tree and not just first level children until 340 + * and unless first_level_children_only is true. 341 341 */ 342 - static int find_next_iomem_res(struct resource *res, char *name, 342 + static int find_next_iomem_res(struct resource *res, unsigned long desc, 343 343 bool first_level_children_only) 344 344 { 345 345 resource_size_t start, end; ··· 358 358 read_lock(&resource_lock); 359 359 360 360 for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { 361 - if (p->flags != res->flags) 361 + if ((p->flags & res->flags) != res->flags) 362 362 continue; 363 - if (name && strcmp(p->name, name)) 363 + if ((desc != IORES_DESC_NONE) && (desc != p->desc)) 364 364 continue; 365 365 if (p->start > end) { 366 366 p = NULL; ··· 385 385 * Walks through iomem resources and calls func() with matching resource 386 386 * ranges. This walks through whole tree and not just first level children. 387 387 * All the memory ranges which overlap start,end and also match flags and 388 - * name are valid candidates. 388 + * desc are valid candidates. 389 389 * 390 - * @name: name of resource 391 - * @flags: resource flags 390 + * @desc: I/O resource descriptor. Use IORES_DESC_NONE to skip @desc check. 391 + * @flags: I/O resource flags 392 392 * @start: start addr 393 393 * @end: end addr 394 + * 395 + * NOTE: For a new descriptor search, define a new IORES_DESC in 396 + * <linux/ioport.h> and set it in 'desc' of a target resource entry. 394 397 */ 395 - int walk_iomem_res(char *name, unsigned long flags, u64 start, u64 end, 396 - void *arg, int (*func)(u64, u64, void *)) 398 + int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, 399 + u64 end, void *arg, int (*func)(u64, u64, void *)) 397 400 { 398 401 struct resource res; 399 402 u64 orig_end; ··· 406 403 res.end = end; 407 404 res.flags = flags; 408 405 orig_end = res.end; 406 + 409 407 while ((res.start < res.end) && 410 - (!find_next_iomem_res(&res, name, false))) { 408 + (!find_next_iomem_res(&res, desc, false))) { 409 + 411 410 ret = (*func)(res.start, res.end, arg); 412 411 if (ret) 413 412 break; 413 + 414 414 res.start = res.end + 1; 415 415 res.end = orig_end; 416 416 } 417 + 417 418 return ret; 418 419 } 419 420 420 421 /* 421 - * This function calls callback against all memory range of "System RAM" 422 - * which are marked as IORESOURCE_MEM and IORESOUCE_BUSY. 423 - * Now, this function is only for "System RAM". This function deals with 424 - * full ranges and not pfn. If resources are not pfn aligned, dealing 425 - * with pfn can truncate ranges. 422 + * This function calls the @func callback against all memory ranges of type 423 + * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY. 424 + * Now, this function is only for System RAM, it deals with full ranges and 425 + * not PFNs. If resources are not PFN-aligned, dealing with PFNs can truncate 426 + * ranges. 426 427 */ 427 428 int walk_system_ram_res(u64 start, u64 end, void *arg, 428 429 int (*func)(u64, u64, void *)) ··· 437 430 438 431 res.start = start; 439 432 res.end = end; 440 - res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 433 + res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 441 434 orig_end = res.end; 442 435 while ((res.start < res.end) && 443 - (!find_next_iomem_res(&res, "System RAM", true))) { 436 + (!find_next_iomem_res(&res, IORES_DESC_NONE, true))) { 444 437 ret = (*func)(res.start, res.end, arg); 445 438 if (ret) 446 439 break; ··· 453 446 #if !defined(CONFIG_ARCH_HAS_WALK_MEMORY) 454 447 455 448 /* 456 - * This function calls callback against all memory range of "System RAM" 457 - * which are marked as IORESOURCE_MEM and IORESOUCE_BUSY. 458 - * Now, this function is only for "System RAM". 449 + * This function calls the @func callback against all memory ranges of type 450 + * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY. 451 + * It is to be used only for System RAM. 459 452 */ 460 453 int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, 461 454 void *arg, int (*func)(unsigned long, unsigned long, void *)) ··· 467 460 468 461 res.start = (u64) start_pfn << PAGE_SHIFT; 469 462 res.end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; 470 - res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 463 + res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 471 464 orig_end = res.end; 472 465 while ((res.start < res.end) && 473 - (find_next_iomem_res(&res, "System RAM", true) >= 0)) { 466 + (find_next_iomem_res(&res, IORES_DESC_NONE, true) >= 0)) { 474 467 pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; 475 468 end_pfn = (res.end + 1) >> PAGE_SHIFT; 476 469 if (end_pfn > pfn) ··· 491 484 } 492 485 /* 493 486 * This generic page_is_ram() returns true if specified address is 494 - * registered as "System RAM" in iomem_resource list. 487 + * registered as System RAM in iomem_resource list. 495 488 */ 496 489 int __weak page_is_ram(unsigned long pfn) 497 490 { ··· 503 496 * region_intersects() - determine intersection of region with known resources 504 497 * @start: region start address 505 498 * @size: size of region 506 - * @name: name of resource (in iomem_resource) 499 + * @flags: flags of resource (in iomem_resource) 500 + * @desc: descriptor of resource (in iomem_resource) or IORES_DESC_NONE 507 501 * 508 502 * Check if the specified region partially overlaps or fully eclipses a 509 - * resource identified by @name. Return REGION_DISJOINT if the region 510 - * does not overlap @name, return REGION_MIXED if the region overlaps 511 - * @type and another resource, and return REGION_INTERSECTS if the 512 - * region overlaps @type and no other defined resource. Note, that 513 - * REGION_INTERSECTS is also returned in the case when the specified 514 - * region overlaps RAM and undefined memory holes. 503 + * resource identified by @flags and @desc (optional with IORES_DESC_NONE). 504 + * Return REGION_DISJOINT if the region does not overlap @flags/@desc, 505 + * return REGION_MIXED if the region overlaps @flags/@desc and another 506 + * resource, and return REGION_INTERSECTS if the region overlaps @flags/@desc 507 + * and no other defined resource. Note that REGION_INTERSECTS is also 508 + * returned in the case when the specified region overlaps RAM and undefined 509 + * memory holes. 515 510 * 516 511 * region_intersect() is used by memory remapping functions to ensure 517 512 * the user is not remapping RAM and is a vast speed up over walking 518 513 * through the resource table page by page. 519 514 */ 520 - int region_intersects(resource_size_t start, size_t size, const char *name) 515 + int region_intersects(resource_size_t start, size_t size, unsigned long flags, 516 + unsigned long desc) 521 517 { 522 - unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; 523 518 resource_size_t end = start + size - 1; 524 519 int type = 0; int other = 0; 525 520 struct resource *p; 526 521 527 522 read_lock(&resource_lock); 528 523 for (p = iomem_resource.child; p ; p = p->sibling) { 529 - bool is_type = strcmp(p->name, name) == 0 && p->flags == flags; 524 + bool is_type = (((p->flags & flags) == flags) && 525 + ((desc == IORES_DESC_NONE) || 526 + (desc == p->desc))); 530 527 531 528 if (start >= p->start && start <= p->end) 532 529 is_type ? type++ : other++; ··· 549 538 550 539 return REGION_DISJOINT; 551 540 } 541 + EXPORT_SYMBOL_GPL(region_intersects); 552 542 553 543 void __weak arch_remove_reservations(struct resource *avail) 554 544 { ··· 960 948 res->start = start; 961 949 res->end = end; 962 950 res->flags = IORESOURCE_BUSY; 951 + res->desc = IORES_DESC_NONE; 963 952 964 953 while (1) { 965 954 ··· 995 982 next_res->start = conflict->end + 1; 996 983 next_res->end = end; 997 984 next_res->flags = IORESOURCE_BUSY; 985 + next_res->desc = IORES_DESC_NONE; 998 986 } 999 987 } else { 1000 988 res->start = conflict->end + 1; ··· 1085 1071 res->name = name; 1086 1072 res->start = start; 1087 1073 res->end = start + n - 1; 1088 - res->flags = resource_type(parent); 1074 + res->flags = resource_type(parent) | resource_ext_type(parent); 1089 1075 res->flags |= IORESOURCE_BUSY | flags; 1076 + res->desc = IORES_DESC_NONE; 1090 1077 1091 1078 write_lock(&resource_lock); 1092 1079 ··· 1253 1238 new_res->start = end + 1; 1254 1239 new_res->end = res->end; 1255 1240 new_res->flags = res->flags; 1241 + new_res->desc = res->desc; 1256 1242 new_res->parent = res->parent; 1257 1243 new_res->sibling = res->sibling; 1258 1244 new_res->child = NULL; ··· 1429 1413 res->start = io_start; 1430 1414 res->end = io_start + io_num - 1; 1431 1415 res->flags = IORESOURCE_BUSY; 1416 + res->desc = IORES_DESC_NONE; 1432 1417 res->child = NULL; 1433 1418 if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0) 1434 1419 reserved = x+1;
+1 -1
mm/memory_hotplug.c
··· 138 138 res->name = "System RAM"; 139 139 res->start = start; 140 140 res->end = start + size - 1; 141 - res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; 141 + res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; 142 142 if (request_resource(&iomem_resource, res) < 0) { 143 143 pr_debug("System RAM resource %pR cannot be added\n", res); 144 144 kfree(res);