mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ACPI / APEI: Don't update struct ghes' flags in read/clear estatus
ghes_read_estatus() sets a flag in struct ghes if the buffer of CPER records needs to be cleared once the records have been processed. This flag value is a problem if a struct ghes can be processed concurrently, as happens at probe time if an NMI arrives for the same error source. The NMI clears the flag, meaning the interrupted handler may never do the ghes_estatus_clear() work. The GHES_TO_CLEAR flags is only set at the same time as buffer_paddr, which is now owned by the caller and passed to ghes_clear_estatus(). Use this value as the flag. A non-zero buf_paddr returned by ghes_read_estatus() means ghes_clear_estatus() should clear this address. ghes_read_estatus() already checks for a read of error_status_address being zero, so CPER records cannot be written here. 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
							
								
									7d49f2c75a
								
							
						
					
					
						commit
						5cc6c68287
					
				
					 2 changed files with 0 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -329,8 +329,6 @@ static int ghes_read_estatus(struct ghes *ghes, u64 *buf_paddr)
 | 
			
		|||
		return -ENOENT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ghes->flags |= GHES_TO_CLEAR;
 | 
			
		||||
 | 
			
		||||
	rc = -EIO;
 | 
			
		||||
	len = cper_estatus_len(ghes->estatus);
 | 
			
		||||
	if (len < sizeof(*ghes->estatus))
 | 
			
		||||
| 
						 | 
				
			
			@ -357,15 +355,12 @@ static int ghes_read_estatus(struct ghes *ghes, u64 *buf_paddr)
 | 
			
		|||
static void ghes_clear_estatus(struct ghes *ghes, u64 buf_paddr)
 | 
			
		||||
{
 | 
			
		||||
	ghes->estatus->block_status = 0;
 | 
			
		||||
	if (!(ghes->flags & GHES_TO_CLEAR))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (!buf_paddr)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	ghes_copy_tofrom_phys(ghes->estatus, buf_paddr,
 | 
			
		||||
			      sizeof(ghes->estatus->block_status), 0);
 | 
			
		||||
	ghes->flags &= ~GHES_TO_CLEAR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int sev)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,6 @@
 | 
			
		|||
 * estatus: memory buffer for error status block, allocated during
 | 
			
		||||
 * HEST parsing.
 | 
			
		||||
 */
 | 
			
		||||
#define GHES_TO_CLEAR		0x0001
 | 
			
		||||
#define GHES_EXITING		0x0002
 | 
			
		||||
 | 
			
		||||
struct ghes {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue