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:

committed by
Rafael J. Wysocki

parent
b59bc2fbb4
commit
fbfddae696
@@ -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*/
|
||||
|
Reference in New Issue
Block a user