core kernel resource handling changes to support NVDIMM error injection, for v4.6
Subsystems (20)
Linus,
Please pull the latest core-resources-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-resources-for-linus
# HEAD: bc94b99636dc7bcccce439a9fb9c00065e2e2627 Merge tag 'v4.5-rc6' into core/resources, to resolve conflict
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.
Thanks,
Ingo
------------------>
Toshi Kani (17):
resource: Add System RAM resource type
resource: Handle resource flags properly
resource: Add I/O resource descriptor
x86/e820: Set System RAM type and descriptor
ia64: Set System RAM type and descriptor
arch: Set IORESOURCE_SYSTEM_RAM flag for System RAM
kexec: Set IORESOURCE_SYSTEM_RAM for System RAM xen, mm: Set IORESOURCE_SYSTEM_RAM to System RAM
drivers: Initialize resource entry to zero
resource: Change walk_system_ram() to use System RAM type arm/samsung: Change s3c_pm_run_res() to use System RAM type
memremap: Change region_intersects() to take @flags and @desc
resource: Add walk_iomem_res_desc()
x86, kexec, nvdimm: Use walk_iomem_res_desc() for iomem search x86/kexec: Remove walk_iomem_res() call with GART type
resource: Kill walk_iomem_res()
ACPI/EINJ: Allow memory error injection to NVDIMM
arch/arm/kernel/setup.c | 6 +-- arch/arm/plat-samsung/pm-check.c | 4 +- arch/arm64/kernel/setup.c | 6 +-- arch/avr32/kernel/setup.c | 6 +-- arch/ia64/kernel/efi.c | 13 ++++-- arch/ia64/kernel/setup.c | 6 +-- arch/m32r/kernel/setup.c | 4 +- arch/mips/kernel/setup.c | 10 ++-- arch/parisc/mm/init.c | 6 +-- arch/powerpc/mm/mem.c | 2 +- arch/s390/kernel/setup.c | 8 ++-- arch/score/kernel/setup.c | 2 +- arch/sh/kernel/setup.c | 8 ++-- arch/sparc/mm/init_64.c | 8 ++-- arch/tile/kernel/setup.c | 11 +++-- arch/unicore32/kernel/setup.c | 6 +-- arch/x86/kernel/crash.c | 41 ++--------------- arch/x86/kernel/e820.c | 38 +++++++++++++++- arch/x86/kernel/pmem.c | 4 +- arch/x86/kernel/setup.c | 6 +-- drivers/acpi/acpi_platform.c | 2 +- drivers/acpi/apei/einj.c | 15 ++++-- drivers/nvdimm/e820.c | 2 +- drivers/parisc/eisa_enumerator.c | 4 +- drivers/rapidio/rio.c | 8 ++-- drivers/sh/superhyway/superhyway.c | 2 +- drivers/xen/balloon.c | 2 +- include/linux/ioport.h | 33 +++++++++++++- include/linux/mm.h | 3 +- kernel/kexec_core.c | 8 ++-- kernel/kexec_file.c | 8 ++-- kernel/memremap.c | 13 +++--- kernel/resource.c | 93 ++++++++++++++++++++++---------------- mm/memory_hotplug.c | 2 +- 34 files changed, 231 insertions(+), 159 deletions(-)
arch/arm/kernel/setup.c +3 -3
@@ -176,13 +176,13 @@ static struct resource mem_res[] = { .name = "Kernel code", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM }, { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM } };
@@ -851,7 +851,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc) res->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 ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res);
arch/arm/plat-samsung/pm-check.c +2 -2
@@ -53,8 +53,8 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)if (ptr->child !=NULL )s3c_pm_run_res (ptr->child, fn, arg); -if ((ptr->flags &IORESOURCE_MEM ) && -strcmp (ptr->name,"System RAM" ) ==0 ) { +if ((ptr->flags &IORESOURCE_SYSTEM_RAM ) + ==IORESOURCE_SYSTEM_RAM ) {S3C_PMDBG ("Found system RAM at %08lx..%08lx\n" , (unsigned long )ptr->start, (unsigned long )ptr->end);
arch/arm64/kernel/setup.c +3 -3
@@ -73,13 +73,13 @@ static struct resource mem_res[] = { .name = "Kernel code", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM }, { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM } };
@@ -210,7 +210,7 @@ static void __init request_standard_resources(void) res->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 ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res);
arch/avr32/kernel/setup.c +3 -3
@@ -49,13 +49,13 @@ static struct resource __initdata kernel_data = { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_MEM, + .flags = IORESOURCE_SYSTEM_RAM, };static struct resource __initdata kernel_code = { .name ="Kernel code" , .start =0 , .end =0 , - .flags =IORESOURCE_MEM , + .flags =IORESOURCE_SYSTEM_RAM , .sibling = &kernel_data, };
@@ -134,7 +134,7 @@ add_physical_memory(resource_size_t start, resource_size_t end) new->start = start; new->end = end; new->name ="System RAM" ; - new->flags =IORESOURCE_MEM ; + new->flags =IORESOURCE_SYSTEM_RAM ; *pprev = new; }
arch/ia64/kernel/efi.c +10 -3
@@ -1178,7 +1178,7 @@ efi_initialize_iomem_resources(struct resource *code_resource,efi_memory_desc_t *md;u64 efi_desc_size;char *name; -unsigned long flags; +unsigned long flags, desc; efi_map_start =__va (ia64_boot_param->efi_memmap); efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
@@ -1193,6 +1193,8 @@ efi_initialize_iomem_resources(struct resource *code_resource,continue ; flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + desc =IORES_DESC_NONE ; +switch (md->type) {case EFI_MEMORY_MAPPED_IO :
@@ -1207,14 +1209,17 @@ efi_initialize_iomem_resources(struct resource *code_resource,if (md->attribute &EFI_MEMORY_WP ) { name ="System ROM" ; flags |=IORESOURCE_READONLY ; - }else if (md->attribute ==EFI_MEMORY_UC ) + }else if (md->attribute ==EFI_MEMORY_UC ) { name ="Uncached RAM" ; -else + }else { name ="System RAM" ; + flags |=IORESOURCE_SYSRAM ; + }break ;case EFI_ACPI_MEMORY_NVS : name ="ACPI Non-volatile Storage" ; + desc =IORES_DESC_ACPI_NV_STORAGE ;break ;case EFI_UNUSABLE_MEMORY :
@@ -1224,6 +1229,7 @@ efi_initialize_iomem_resources(struct resource *code_resource,case EFI_PERSISTENT_MEMORY : name ="Persistent Memory" ; + desc =IORES_DESC_PERSISTENT_MEMORY ;break ;case EFI_RESERVED_TYPE :
@@ -1246,6 +1252,7 @@ efi_initialize_iomem_resources(struct resource *code_resource, res->start = md->phys_addr; res->end = md->phys_addr +efi_md_size (md) -1 ; res->flags = flags; + res->desc = desc;if (insert_resource (&iomem_resource, res) <0 )kfree (res);
arch/ia64/kernel/setup.c +3 -3
@@ -80,17 +80,17 @@ unsigned long vga_console_membase;static struct resource data_resource = { .name ="Kernel data" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static struct resource code_resource = { .name ="Kernel code" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static struct resource bss_resource = { .name ="Kernel bss" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };unsigned long ia64_max_cacheline_size;
arch/m32r/kernel/setup.c +2 -2
@@ -70,14 +70,14 @@ static struct resource data_resource = { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_BUSY | IORESOURCE_MEM + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM };static struct resource code_resource = { .name ="Kernel code" , .start =0 , .end =0 , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };unsigned long memory_start;
arch/mips/kernel/setup.c +6 -4
@@ -732,21 +732,23 @@ static void __init resource_init(void) end =HIGHMEM_START -1 ; res =alloc_bootmem (sizeof (struct resource )); + + res->start = start; + res->end = end; + res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; +switch (boot_mem_map.map[i].type) {case BOOT_MEM_RAM :case BOOT_MEM_INIT_RAM :case BOOT_MEM_ROM_DATA : res->name ="System RAM" ; + res->flags |=IORESOURCE_SYSRAM ;break ;case BOOT_MEM_RESERVED :default : res->name ="reserved" ; } - res->start = start; - res->end = end; - - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res);/*
arch/parisc/mm/init.c +3 -3
@@ -55,12 +55,12 @@ signed char pfnnid_map[PFNNID_MAP_MAX] __read_mostly;static struct resource data_resource = { .name ="Kernel data" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource code_resource = { .name ="Kernel code" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource pdcdata_resource = {
@@ -201,7 +201,7 @@ static void __init setup_bootmem(void) res->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 ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res); }
arch/powerpc/mm/mem.c +1 -1
@@ -541,7 +541,7 @@ static int __init add_system_ram_resources(void) res->name ="System RAM" ; res->start = base; res->end = base + size -1 ; - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;WARN_ON (request_resource (&iomem_resource, res) <0 ); } }
arch/s390/kernel/setup.c +4 -4
@@ -374,17 +374,17 @@ static void __init setup_lowcore(void)static struct resource code_resource = { .name ="Kernel code" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource data_resource = { .name ="Kernel data" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource bss_resource = { .name ="Kernel bss" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource __initdata *standard_resources[] = {
@@ -408,7 +408,7 @@ static void __init setup_resources(void)for_each_memblock (memory, reg) { res =alloc_bootmem_low (sizeof (*res)); - res->flags =IORESOURCE_BUSY |IORESOURCE_MEM ; + res->flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM ; res->name ="System RAM" ; res->start = reg->base;
arch/score/kernel/setup.c +1 -1
@@ -101,7 +101,7 @@ static void __init resource_init(void) res->name ="System RAM" ; res->start =MEMORY_START ; res->end =MEMORY_START +MEMORY_SIZE -1 ; - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res);request_resource (res, &code_resource);
arch/sh/kernel/setup.c +4 -4
@@ -78,17 +78,17 @@ static char __initdata command_line[COMMAND_LINE_SIZE] = { 0, };static struct resource code_resource = { .name ="Kernel code" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource data_resource = { .name ="Kernel data" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };static struct resource bss_resource = { .name ="Kernel bss" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM , + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , };unsigned long memory_start;
@@ -202,7 +202,7 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn, res->name ="System RAM" ; res->start = start; res->end = end -1 ; - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;if (request_resource (&iomem_resource, res)) { pr_err("unable to request memory_resource 0x%lx 0x%lx\n",
arch/sparc/mm/init_64.c +4 -4
@@ -2863,17 +2863,17 @@ void hugetlb_setup(struct pt_regs *regs)static struct resource code_resource = { .name ="Kernel code" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static struct resource data_resource = { .name ="Kernel data" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static struct resource bss_resource = { .name ="Kernel bss" , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static inline resource_size_t compute_kern_paddr (void *addr)
@@ -2909,7 +2909,7 @@ static int __init report_memory(void) res->name ="System RAM" ; res->start = pavail[i].phys_addr; res->end = pavail[i].phys_addr + pavail[i].reg_size -1 ; - res->flags =IORESOURCE_BUSY |IORESOURCE_MEM ; + res->flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM ;if (insert_resource (&iomem_resource, res) <0 ) {pr_warn ("Resource insertion failed.\n" );
arch/tile/kernel/setup.c +8 -3
@@ -1632,14 +1632,14 @@ static struct resource data_resource = { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_BUSY | IORESOURCE_MEM + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM };static struct resource code_resource = { .name ="Kernel code" , .start =0 , .end =0 , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };/*
@@ -1673,10 +1673,15 @@ insert_ram_resource(u64 start_pfn, u64 end_pfn, bool reserved)kzalloc (sizeof (struct resource ),GFP_ATOMIC );if (!res)return NULL ; - res->name = reserved ?"Reserved" :"System RAM" ; res->start = start_pfn <<PAGE_SHIFT ; res->end = (end_pfn <<PAGE_SHIFT ) -1 ; res->flags =IORESOURCE_BUSY |IORESOURCE_MEM ; +if (reserved) { + res->name ="Reserved" ; + }else { + res->name ="System RAM" ; + res->flags |=IORESOURCE_SYSRAM ; + }if (insert_resource (&iomem_resource, res)) {kfree (res);return NULL ;
arch/unicore32/kernel/setup.c +3 -3
@@ -72,13 +72,13 @@ static struct resource mem_res[] = { .name = "Kernel code", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM }, { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_MEM + .flags = IORESOURCE_SYSTEM_RAM } };
@@ -211,7 +211,7 @@ request_standard_resources(struct meminfo *mi) res->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 ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;request_resource (&iomem_resource, res);
arch/x86/kernel/crash.c +3 -38
77 lines not on this page · raw message
arch/x86/kernel/e820.c +37 -1
@@ -925,6 +925,41 @@ static const char *e820_type_to_string(int e820_type) } } +static unsigned long e820_type_to_iomem_type (int e820_type) +{ +switch (e820_type) { +case E820_RESERVED_KERN : +case E820_RAM : +return IORESOURCE_SYSTEM_RAM ; +case E820_ACPI : +case E820_NVS : +case E820_UNUSABLE : +case E820_PRAM : +case E820_PMEM : +default : +return IORESOURCE_MEM ; + } +} + +static unsigned long e820_type_to_iores_desc (int e820_type) +{ +switch (e820_type) { +case E820_ACPI : +return IORES_DESC_ACPI_TABLES ; +case E820_NVS : +return IORES_DESC_ACPI_NV_STORAGE ; +case E820_PMEM : +return IORES_DESC_PERSISTENT_MEMORY ; +case E820_PRAM : +return IORES_DESC_PERSISTENT_MEMORY_LEGACY ; +case E820_RESERVED_KERN : +case E820_RAM : +case E820_UNUSABLE : +default : +return IORES_DESC_NONE ; + } +} +static bool do_mark_busy (u32 type,struct resource *res) {/* this is the legacy bios/dos rom-shadow + mmio region */
@@ -967,7 +1002,8 @@ void __init e820_reserve_resources(void) res->start = e820.map[i].addr; res->end = end; - res->flags =IORESOURCE_MEM ; + res->flags =e820_type_to_iomem_type (e820.map[i].type); + res->desc =e820_type_to_iores_desc (e820.map[i].type);/* * don't register the region that could be conflicted with
arch/x86/kernel/pmem.c +2 -2
@@ -13,11 +13,11 @@ static int found(u64 start, u64 end, void *data)static __init int register_e820_pmem (void ) { -char *pmem ="Persistent Memory (legacy)" ;struct platform_device *pdev;int rc; - rc =walk_iomem_res (pmem,IORESOURCE_MEM ,0 ,-1 ,NULL , found); + rc =walk_iomem_res_desc (IORES_DESC_PERSISTENT_MEMORY_LEGACY , +IORESOURCE_MEM ,0 ,-1 ,NULL , found);if (rc <=0 )return 0 ;
arch/x86/kernel/setup.c +3 -3
@@ -152,21 +152,21 @@ static struct resource data_resource = { .name = "Kernel data", .start = 0, .end = 0, - .flags = IORESOURCE_BUSY | IORESOURCE_MEM + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM };static struct resource code_resource = { .name ="Kernel code" , .start =0 , .end =0 , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };static struct resource bss_resource = { .name ="Kernel bss" , .start =0 , .end =0 , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM };
drivers/acpi/acpi_platform.c +1 -1
@@ -62,7 +62,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)if (count <0 ) {return NULL ; }else if (count >0 ) { - resources =kmalloc (count *sizeof (struct resource ), + resources =kzalloc (count *sizeof (struct resource ),GFP_KERNEL );if (!resources) {dev_err (&adev->dev,"No memory for resources\n" );
drivers/acpi/apei/einj.c +11 -4
@@ -519,7 +519,7 @@ static int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2, u64 param3, u64 param4) { int rc; -unsigned long pfn; +u64 base_addr, size;/* If user manually set "flags", make sure it is legal */ if (flags && (flags &
@@ -545,10 +545,17 @@ static int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2,/* * Disallow crazy address masks that give BIOS leeway to pick * injection address almost anywhere. Insist on page or -* better granularity and that target address is normal RAM. +* better granularity and that target address is normal RAM or +* NVDIMM. */ - pfn =PFN_DOWN (param1 & param2); -if (!page_is_ram (pfn) || ((param2 &PAGE_MASK ) !=PAGE_MASK )) + base_addr = param1 & param2; + size = ~param2 +1 ; + +if (((param2 &PAGE_MASK ) !=PAGE_MASK ) || + ((region_intersects (base_addr, size,IORESOURCE_SYSTEM_RAM ,IORES_DESC_NONE ) + !=REGION_INTERSECTS ) && + (region_intersects (base_addr, size,IORESOURCE_MEM ,IORES_DESC_PERSISTENT_MEMORY ) + !=REGION_INTERSECTS )))return -EINVAL ; inject:
drivers/nvdimm/e820.c +1 -1
@@ -55,7 +55,7 @@ static int e820_pmem_probe(struct platform_device *pdev)for (p = iomem_resource.child; p ; p = p->sibling) {struct nd_region_desc ndr_desc; -if (strncmp (p->name,"Persistent Memory (legacy)" ,26 ) !=0 ) +if (p->desc !=IORES_DESC_PERSISTENT_MEMORY_LEGACY )continue ;memset (&ndr_desc,0 ,sizeof (ndr_desc));
drivers/parisc/eisa_enumerator.c +2 -2
@@ -91,7 +91,7 @@ static int configure_memory(const unsigned char *buf,for (i=0 ;i<HPEE_MEMORY_MAX_ENT ;i++) { c =get_8 (buf+len); -if (NULL != (res =kmalloc (sizeof (struct resource ),GFP_KERNEL ))) { +if (NULL != (res =kzalloc (sizeof (struct resource ),GFP_KERNEL ))) {int result; res->name = name;
@@ -183,7 +183,7 @@ static int configure_port(const unsigned char *buf, struct resource *io_parent,for (i=0 ;i<HPEE_PORT_MAX_ENT ;i++) { c =get_8 (buf+len); -if (NULL != (res =kmalloc (sizeof (struct resource ),GFP_KERNEL ))) { +if (NULL != (res =kzalloc (sizeof (struct resource ),GFP_KERNEL ))) { res->name = board; res->start =get_16 (buf+len+1 ); res->end =get_16 (buf+len+1 )+(c&HPEE_PORT_SIZE_MASK )+1 ;
drivers/rapidio/rio.c +4 -4
@@ -117,7 +117,7 @@ int rio_request_inb_mbox(struct rio_mport *mport,if (mport->ops->open_inb_mbox ==NULL ) goto out; - res =kmalloc (sizeof (struct resource ),GFP_KERNEL ); + res =kzalloc (sizeof (struct resource ),GFP_KERNEL );if (res) {rio_init_mbox_res (res, mbox, mbox);
@@ -185,7 +185,7 @@ int rio_request_outb_mbox(struct rio_mport *mport,if (mport->ops->open_outb_mbox ==NULL ) goto out; - res =kmalloc (sizeof (struct resource ),GFP_KERNEL ); + res =kzalloc (sizeof (struct resource ),GFP_KERNEL );if (res) {rio_init_mbox_res (res, mbox, mbox);
@@ -285,7 +285,7 @@ int rio_request_inb_dbell(struct rio_mport *mport, {int rc =0 ; -struct resource *res =kmalloc (sizeof (struct resource ),GFP_KERNEL ); +struct resource *res =kzalloc (sizeof (struct resource ),GFP_KERNEL );if (res) {rio_init_dbell_res (res, start, end);
@@ -360,7 +360,7 @@ int rio_release_inb_dbell(struct rio_mport *mport, u16 start, u16 end)struct resource *rio_request_outb_dbell (struct rio_dev *rdev,u16 start,u16 end) { -struct resource *res =kmalloc (sizeof (struct resource ),GFP_KERNEL ); +struct resource *res =kzalloc (sizeof (struct resource ),GFP_KERNEL );if (res) {rio_init_dbell_res (res, start, end);
drivers/sh/superhyway/superhyway.c +1 -1
@@ -66,7 +66,7 @@ int superhyway_add_device(unsigned long base, struct superhyway_device *sdev,superhyway_read_vcr (dev, base, &dev->vcr);if (!dev->resource) { - dev->resource =kmalloc (sizeof (struct resource ),GFP_KERNEL ); + dev->resource =kzalloc (sizeof (struct resource ),GFP_KERNEL );if (!dev->resource) {kfree (dev);return -ENOMEM ;
drivers/xen/balloon.c +1 -1
@@ -257,7 +257,7 @@ static struct resource *additional_memory_resource(phys_addr_t size)return NULL ; res->name ="System RAM" ; - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ; ret = allocate_resource(&iomem_resource, res, size, 0, -1,
include/linux/ioport.h +31 -2
@@ -20,6 +20,7 @@ struct resource {resource_size_t end;const char *name;unsigned long flags; +unsigned long desc;struct resource *parent, *sibling, *child; };
@@ -49,12 +50,19 @@ struct resource {#define IORESOURCE_WINDOW 0x00200000/* forwarded by bridge */ #define IORESOURCE_MUXED 0x00400000/* Resource is software muxed */ +#define IORESOURCE_EXT_TYPE_BITS 0x01000000/* Resource extended types */ +#define IORESOURCE_SYSRAM 0x01000000/* System RAM (modifier) */ +#define IORESOURCE_EXCLUSIVE 0x08000000/* Userland may not map this resource */ +#define IORESOURCE_DISABLED 0x10000000#define IORESOURCE_UNSET 0x20000000/* No address assigned yet */ #define IORESOURCE_AUTO 0x40000000#define IORESOURCE_BUSY 0x80000000/* Driver has marked this resource busy */ +/* I/O resource extended types */ +#define IORESOURCE_SYSTEM_RAM (IORESOURCE_MEM|IORESOURCE_SYSRAM) +/* PnP IRQ specific bits (IORESOURCE_BITS) */ #define IORESOURCE_IRQ_HIGHEDGE (1<<0)#define IORESOURCE_IRQ_LOWEDGE (1<<1)
@@ -105,6 +113,22 @@ struct resource {/* PCI control bits. Shares IORESOURCE_BITS with above PCI ROM. */ #define IORESOURCE_PCI_FIXED (1<<4)/* Do not move resource */ +/* +* I/O Resource Descriptors +* +* Descriptors are used by walk_iomem_res_desc() and region_intersects() +* for searching a specific resource range in the iomem table. Assign +* a new descriptor when a resource range supports the search interfaces. +* Otherwise, resource.desc must be set to IORES_DESC_NONE (0). +*/ +enum { +IORES_DESC_NONE =0 , +IORES_DESC_CRASH_KERNEL =1 , +IORES_DESC_ACPI_TABLES =2 , +IORES_DESC_ACPI_NV_STORAGE =3 , +IORES_DESC_PERSISTENT_MEMORY =4 , +IORES_DESC_PERSISTENT_MEMORY_LEGACY =5 , +};/* helpers to define resources */ #define DEFINE_RES_NAMED (_start, _size, _name, _flags) \
@@ -113,6 +137,7 @@ struct resource { .end = (_start) + (_size) - 1, \ .name = (_name), \ .flags = (_flags), \ + .desc = IORES_DESC_NONE, \ }#define DEFINE_RES_IO_NAMED (_start, _size, _name) \
@@ -170,6 +195,10 @@ static inline unsigned long resource_type(const struct resource *res) {return res->flags &IORESOURCE_TYPE_BITS ; } +static inline unsigned long resource_ext_type (const struct resource *res) +{ +return res->flags &IORESOURCE_EXT_TYPE_BITS ; +}/* True iff r1 completely contains r2 */ static inline bool resource_contains (struct resource *r1,struct resource *r2) {
@@ -239,8 +268,8 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(u64, u64, void *));extern int -walk_iomem_res (char *name,unsigned long flags,u64 start,u64 end,void *arg, -int (*func)(u64 ,u64 ,void *)); +walk_iomem_res_desc (unsigned long desc,unsigned long flags,u64 start,u64 end, +void *arg,int (*func)(u64 ,u64 ,void *));/* True if any part of r1 overlaps r2 */ static inline bool resource_overlaps (struct resource *r1,struct resource *r2)
include/linux/mm.h +2 -1
@@ -387,7 +387,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);
kernel/kexec_core.c +5 -3
@@ -66,13 +66,15 @@ struct resource crashk_res = { .name = "Crash kernel", .start = 0, .end = 0, - .flags = IORESOURCE_BUSY | IORESOURCE_MEM + .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, + .desc = IORES_DESC_CRASH_KERNEL };struct resource crashk_low_res = { .name ="Crash kernel" , .start =0 , .end =0 , - .flags =IORESOURCE_BUSY |IORESOURCE_MEM + .flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM , + .desc =IORES_DESC_CRASH_KERNEL };int kexec_should_crash (struct task_struct *p)
@@ -959,7 +961,7 @@ int crash_shrink_memory(unsigned long new_size) ram_res->start = end; ram_res->end = crashk_res.end; - ram_res->flags =IORESOURCE_BUSY |IORESOURCE_MEM ; + ram_res->flags =IORESOURCE_BUSY |IORESOURCE_SYSTEM_RAM ; ram_res->name ="System RAM" ; crashk_res.end = end -1 ;
kernel/kexec_file.c +4 -4
@@ -524,10 +524,10 @@ int kexec_add_buffer(struct kimage *image, char *buffer, unsigned long bufsz,/* Walk the RAM ranges and allocate a suitable range for the buffer */ if (image->type ==KEXEC_TYPE_CRASH ) - ret =walk_iomem_res ("Crash kernel" , -IORESOURCE_MEM |IORESOURCE_BUSY , - crashk_res.start, crashk_res.end, kbuf, - locate_mem_hole_callback); + ret =walk_iomem_res_desc (crashk_res.desc, +IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY , + crashk_res.start, crashk_res.end, kbuf, + locate_mem_hole_callback);else ret =walk_system_ram_res (0 ,-1 , kbuf, locate_mem_hole_callback);
kernel/memremap.c +7 -6
@@ -47,7 +47,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
@@ -56,11 +56,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 ) {
@@ -76,7 +77,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);
@@ -88,7 +89,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",
@@ -271,7 +272,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res, struct percpu_ref *ref, struct vmem_altmap *altmap) { int is_ram = region_intersects(res->start, resource_size(res), -"System RAM" ); +IORESOURCE_SYSTEM_RAM ,IORES_DESC_NONE );resource_size_t key, align_start, align_size, align_end;struct dev_pagemap *pgmap;struct page_map *page_map;
kernel/resource.c +55 -38
219 lines not on this page · raw message
mm/memory_hotplug.c +1 -1
@@ -138,7 +138,7 @@ static struct resource *register_memory_resource(u64 start, u64 size) res->name ="System RAM" ; res->start = start; res->end = start + size -1 ; - res->flags =IORESOURCE_MEM |IORESOURCE_BUSY ; + res->flags =IORESOURCE_SYSTEM_RAM |IORESOURCE_BUSY ;if (request_resource (&iomem_resource, res) <0 ) {pr_debug ("System RAM resource %pR cannot be added\n" , res);kfree (res);