ACPI: Add acpi_handle_<level>() interfaces
This patch introduces acpi_handle_<level>(), where <level> is a kernel message level such as err/warn/info, to support improved logging messages for ACPI, esp. hot-plug operations. acpi_handle_<level>() appends "ACPI" prefix and ACPI object path to the messages. This improves diagnosis of hotplug operations since an error message in a log file identifies an object that caused an issue. This interface acquires the global namespace mutex to obtain an object path. In interrupt context, it shows the object path as <n/a>. acpi_handle_<level>() takes acpi_handle as an argument, which is passed to ACPI hotplug notify handlers from the ACPICA. Therefore, it is always available unlike other kernel objects, such as device. For example: acpi_handle_err(handle, "Device don't exist, dropping EJECT\n"); logs an error message like this at KERN_ERR. ACPI: \_SB_.SCK4.CPU4: Device don't exist, dropping EJECT ACPI hot-plug drivers can use acpi_handle_<level>() when they need to identify a target ACPI object path in their messages, such as error cases. The usage model is similar to dev_<level>(). acpi_handle_<level>() can be used when a device is not created or is invalid during hot-plug operations. ACPI object path is also consistent on the platform, unlike device name that gets incremented over hotplug operations. ACPI drivers should use dev_<level>() when a device object is valid. Device name provides more user friendly information, and avoids acquiring the global ACPI namespace mutex. ACPI drivers also continue to use pr_<level>() when they do not need to specify device information, such as boot-up messages. Note: ACPI_[WARNING|INFO|ERROR]() are intended for the ACPICA and are not associated with the kernel message level. Signed-off-by: Toshi Kani <toshi.kani@hp.com> Tested-by: Vijay Mohan Pandarathil <vijaymohan.pandarathil@hp.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
					parent
					
						
							
								b59bc2fbb4
							
						
					
				
			
			
				commit
				
					
						fbfddae696
					
				
			
		
					 2 changed files with 81 additions and 0 deletions
				
			
		|  | @ -28,6 +28,8 @@ | |||
| #include <linux/slab.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/hardirq.h> | ||||
| #include <linux/acpi.h> | ||||
| #include <acpi/acpi_bus.h> | ||||
| #include <acpi/acpi_drivers.h> | ||||
| 
 | ||||
|  | @ -457,3 +459,39 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, | |||
| #endif | ||||
| } | ||||
| EXPORT_SYMBOL(acpi_evaluate_hotplug_ost); | ||||
| 
 | ||||
| /**
 | ||||
|  * acpi_handle_printk: Print message with ACPI prefix and object path | ||||
|  * | ||||
|  * This function is called through acpi_handle_<level> macros and prints | ||||
|  * a message with ACPI prefix and object path.  This function acquires | ||||
|  * the global namespace mutex to obtain an object path.  In interrupt | ||||
|  * context, it shows the object path as <n/a>. | ||||
|  */ | ||||
| void | ||||
| acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...) | ||||
| { | ||||
| 	struct va_format vaf; | ||||
| 	va_list args; | ||||
| 	struct acpi_buffer buffer = { | ||||
| 		.length = ACPI_ALLOCATE_BUFFER, | ||||
| 		.pointer = NULL | ||||
| 	}; | ||||
| 	const char *path; | ||||
| 
 | ||||
| 	va_start(args, fmt); | ||||
| 	vaf.fmt = fmt; | ||||
| 	vaf.va = &args; | ||||
| 
 | ||||
| 	if (in_interrupt() || | ||||
| 	    acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer) != AE_OK) | ||||
| 		path = "<n/a>"; | ||||
| 	else | ||||
| 		path = buffer.pointer; | ||||
| 
 | ||||
| 	printk("%sACPI: %s: %pV", level, path, &vaf); | ||||
| 
 | ||||
| 	va_end(args); | ||||
| 	kfree(buffer.pointer); | ||||
| } | ||||
| EXPORT_SYMBOL(acpi_handle_printk); | ||||
|  |  | |||
|  | @ -434,4 +434,47 @@ acpi_status acpi_os_prepare_sleep(u8 sleep_state, | |||
| #define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0) | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_ACPI | ||||
| __printf(3, 4) | ||||
| void acpi_handle_printk(const char *level, acpi_handle handle, | ||||
| 			const char *fmt, ...); | ||||
| #else	/* !CONFIG_ACPI */ | ||||
| static inline __printf(3, 4) void | ||||
| acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {} | ||||
| #endif	/* !CONFIG_ACPI */ | ||||
| 
 | ||||
| /*
 | ||||
|  * acpi_handle_<level>: Print message with ACPI prefix and object path | ||||
|  * | ||||
|  * These interfaces acquire the global namespace mutex to obtain an object | ||||
|  * path.  In interrupt context, it shows the object path as <n/a>. | ||||
|  */ | ||||
| #define acpi_handle_emerg(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_EMERG, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_alert(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_ALERT, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_crit(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_CRIT, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_err(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_ERR, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_warn(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_WARNING, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_notice(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_NOTICE, handle, fmt, ##__VA_ARGS__) | ||||
| #define acpi_handle_info(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_INFO, handle, fmt, ##__VA_ARGS__) | ||||
| 
 | ||||
| /* REVISIT: Support CONFIG_DYNAMIC_DEBUG when necessary */ | ||||
| #if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) | ||||
| #define acpi_handle_debug(handle, fmt, ...)				\ | ||||
| 	acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__) | ||||
| #else | ||||
| #define acpi_handle_debug(handle, fmt, ...)				\ | ||||
| ({									\ | ||||
| 	if (0)								\ | ||||
| 		acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__); \ | ||||
| 	0;								\ | ||||
| }) | ||||
| #endif | ||||
| 
 | ||||
| #endif	/*_LINUX_ACPI_H*/ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Toshi Kani
				Toshi Kani