From patchwork Tue Aug 28 19:02:57 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Toshi Kani X-Patchwork-Id: 1382351 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 99ED4DFFD0 for ; Tue, 28 Aug 2012 19:09:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753022Ab2H1TJa (ORCPT ); Tue, 28 Aug 2012 15:09:30 -0400 Received: from g4t0014.houston.hp.com ([15.201.24.17]:4329 "EHLO g4t0014.houston.hp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752083Ab2H1TJ1 (ORCPT ); Tue, 28 Aug 2012 15:09:27 -0400 Received: from g4t0018.houston.hp.com (g4t0018.houston.hp.com [16.234.32.27]) by g4t0014.houston.hp.com (Postfix) with ESMTP id DE97D245BD; Tue, 28 Aug 2012 19:09:26 +0000 (UTC) Received: from misato.fc.hp.com (misato.fc.hp.com [16.71.12.41]) by g4t0018.houston.hp.com (Postfix) with ESMTP id 7A0401018A; Tue, 28 Aug 2012 19:09:26 +0000 (UTC) From: Toshi Kani To: lenb@kernel.org, linux-acpi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, joe@perches.com, bhelgaas@google.com, isimatu.yasuaki@jp.fujitsu.com, vijaymohan.pandarathil@hp.com, shaohua.li@intel.com, Toshi Kani Subject: [PATCH v5 1/5] ACPI: Add acpi_pr_() interfaces Date: Tue, 28 Aug 2012 13:02:57 -0600 Message-Id: <1346180581-12641-2-git-send-email-toshi.kani@hp.com> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1346180581-12641-1-git-send-email-toshi.kani@hp.com> References: <1346180581-12641-1-git-send-email-toshi.kani@hp.com> Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org This patch introduces acpi_pr_(), where is a kernel message level such as err/warn/info, to support improved logging messages for ACPI, esp. for hotplug operations. acpi_pr_() appends "ACPI" prefix and ACPI object path to the messages. This improves diagnosis of hotplug operations since an error message in a log file now identifies an object that caused an issue. acpi_pr_() 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_pr_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 drivers can use acpi_pr_() when they need to identify a target ACPI object path in their messages, such as error cases. The usage model is similar to dev_(). acpi_pr_() can be used when device is not created/valid, which may be the case in ACPI hotplug handlers. ACPI object path is also consistent on the platform, unlike device name that changes over hotplug operations. ACPI drivers should use dev_() when device is valid and acpi_pr_() is already used by the caller in its error path. Device name provides more user friendly information. ACPI drivers also continue to use pr_() when messages 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 Tested-by: Vijay Mohan Pandarathil --- drivers/acpi/utils.c | 34 ++++++++++++++++++++++++++++++++++ include/acpi/acpi_bus.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 0 deletions(-) diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index 3e87c9c..ec0c6f9 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c @@ -454,3 +454,37 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, #endif } EXPORT_SYMBOL(acpi_evaluate_hotplug_ost); + +/** + * acpi_printk: Print messages with ACPI prefix and object path + * + * This function is intended to be called through acpi_pr_ macros. + */ +void +acpi_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; + acpi_status ret; + + va_start(args, fmt); + vaf.fmt = fmt; + vaf.va = &args; + + ret = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); + if (ret == AE_OK) + path = buffer.pointer; + else + path = ""; + + printk("%sACPI: %s: %pV", level, path, &vaf); + + va_end(args); + kfree(buffer.pointer); +} +EXPORT_SYMBOL(acpi_printk); diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index bde976e..a3f9a6b 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -85,6 +85,37 @@ struct acpi_pld { acpi_status acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld *pld); + +void acpi_printk(const char *level, acpi_handle handle, const char *fmt, ...); + +#define acpi_pr_emerg(handle, fmt, ...) \ + acpi_printk(KERN_EMERG, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_alert(handle, fmt, ...) \ + acpi_printk(KERN_ALERT, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_crit(handle, fmt, ...) \ + acpi_printk(KERN_CRIT, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_err(handle, fmt, ...) \ + acpi_printk(KERN_ERR, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_warn(handle, fmt, ...) \ + acpi_printk(KERN_WARNING, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_notice(handle, fmt, ...) \ + acpi_printk(KERN_NOTICE, handle, fmt, ##__VA_ARGS__) +#define acpi_pr_info(handle, fmt, ...) \ + acpi_printk(KERN_INFO, handle, fmt, ##__VA_ARGS__) + +/* REVISIT: Support CONFIG_DYNAMIC_DEBUG when necessary */ +#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#define acpi_pr_debug(handle, fmt, ...) \ + acpi_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__) +#else +#define acpi_pr_debug(handle, fmt, ...) \ +({ \ + if (0) \ + acpi_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__); \ + 0; \ +}) +#endif + #ifdef CONFIG_ACPI #include