mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02:00 
			
		
		
		
	ACPI / APEI: Make hest.c manage the estatus memory pool
ghes.c has a memory pool it uses for the estatus cache and the estatus queue. The cache is initialised when registering the platform driver. For the queue, an NMI-like notification has to grow/shrink the pool as it is registered and unregistered. This is all pretty noisy when adding new NMI-like notifications, it would be better to replace this with a static pool size based on the number of users. As a precursor, move the call that creates the pool from ghes_init(), into hest.c. Later this will take the number of ghes entries and consolidate the queue allocations. Remove ghes_estatus_pool_exit() as hest.c doesn't have anywhere to put this. The pool is now initialised as part of ACPI's subsys_initcall(): (acpi_init(), acpi_scan_init(), acpi_pci_root_init(), acpi_hest_init()) Before this patch it happened later as a GHES specific device_initcall(). Signed-off-by: James Morse <james.morse@arm.com> Reviewed-by: Borislav Petkov <bp@suse.de> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									0ac234be1a
								
							
						
					
					
						commit
						e147133a42
					
				
					 3 changed files with 17 additions and 28 deletions
				
			
		|  | @ -162,26 +162,16 @@ static void ghes_iounmap_irq(void) | |||
| 	clear_fixmap(FIX_APEI_GHES_IRQ); | ||||
| } | ||||
| 
 | ||||
| static int ghes_estatus_pool_init(void) | ||||
| static int ghes_estatus_pool_expand(unsigned long len); //temporary
 | ||||
| 
 | ||||
| int ghes_estatus_pool_init(void) | ||||
| { | ||||
| 	ghes_estatus_pool = gen_pool_create(GHES_ESTATUS_POOL_MIN_ALLOC_ORDER, -1); | ||||
| 	if (!ghes_estatus_pool) | ||||
| 		return -ENOMEM; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ghes_estatus_pool_free_chunk(struct gen_pool *pool, | ||||
| 					      struct gen_pool_chunk *chunk, | ||||
| 					      void *data) | ||||
| { | ||||
| 	vfree((void *)chunk->start_addr); | ||||
| } | ||||
| 
 | ||||
| static void ghes_estatus_pool_exit(void) | ||||
| { | ||||
| 	gen_pool_for_each_chunk(ghes_estatus_pool, | ||||
| 				ghes_estatus_pool_free_chunk, NULL); | ||||
| 	gen_pool_destroy(ghes_estatus_pool); | ||||
| 	return ghes_estatus_pool_expand(GHES_ESTATUS_CACHE_AVG_SIZE * | ||||
| 					GHES_ESTATUS_CACHE_ALLOCED_MAX); | ||||
| } | ||||
| 
 | ||||
| static int ghes_estatus_pool_expand(unsigned long len) | ||||
|  | @ -1227,18 +1217,9 @@ static int __init ghes_init(void) | |||
| 
 | ||||
| 	ghes_nmi_init_cxt(); | ||||
| 
 | ||||
| 	rc = ghes_estatus_pool_init(); | ||||
| 	if (rc) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	rc = ghes_estatus_pool_expand(GHES_ESTATUS_CACHE_AVG_SIZE * | ||||
| 				      GHES_ESTATUS_CACHE_ALLOCED_MAX); | ||||
| 	if (rc) | ||||
| 		goto err_pool_exit; | ||||
| 
 | ||||
| 	rc = platform_driver_register(&ghes_platform_driver); | ||||
| 	if (rc) | ||||
| 		goto err_pool_exit; | ||||
| 		goto err; | ||||
| 
 | ||||
| 	rc = apei_osc_setup(); | ||||
| 	if (rc == 0 && osc_sb_apei_support_acked) | ||||
|  | @ -1251,8 +1232,6 @@ static int __init ghes_init(void) | |||
| 		pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n"); | ||||
| 
 | ||||
| 	return 0; | ||||
| err_pool_exit: | ||||
| 	ghes_estatus_pool_exit(); | ||||
| err: | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ | |||
| #include <linux/io.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <acpi/apei.h> | ||||
| #include <acpi/ghes.h> | ||||
| 
 | ||||
| #include "apei-internal.h" | ||||
| 
 | ||||
|  | @ -209,6 +210,11 @@ static int __init hest_ghes_dev_register(unsigned int ghes_count) | |||
| 	rc = apei_hest_parse(hest_parse_ghes, &ghes_arr); | ||||
| 	if (rc) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	rc = ghes_estatus_pool_init(); | ||||
| 	if (rc) | ||||
| 		goto err; | ||||
| 
 | ||||
| out: | ||||
| 	kfree(ghes_arr.ghes_devs); | ||||
| 	return rc; | ||||
|  | @ -257,7 +263,9 @@ void __init acpi_hest_init(void) | |||
| 		rc = apei_hest_parse(hest_parse_ghes_count, &ghes_count); | ||||
| 		if (rc) | ||||
| 			goto err; | ||||
| 		rc = hest_ghes_dev_register(ghes_count); | ||||
| 
 | ||||
| 		if (ghes_count) | ||||
| 			rc = hest_ghes_dev_register(ghes_count); | ||||
| 		if (rc) | ||||
| 			goto err; | ||||
| 	} | ||||
|  |  | |||
|  | @ -52,6 +52,8 @@ enum { | |||
| 	GHES_SEV_PANIC = 0x3, | ||||
| }; | ||||
| 
 | ||||
| int ghes_estatus_pool_init(void); | ||||
| 
 | ||||
| /* From drivers/edac/ghes_edac.c */ | ||||
| 
 | ||||
| #ifdef CONFIG_EDAC_GHES | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 James Morse
						James Morse