From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753719AbcDYG47 (ORCPT ); Mon, 25 Apr 2016 02:56:59 -0400 Received: from mailout3.w1.samsung.com ([210.118.77.13]:12944 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753687AbcDYG44 (ORCPT ); Mon, 25 Apr 2016 02:56:56 -0400 X-AuditID: cbfec7f4-f796c6d000001486-ae-571dbfafa298 Message-id: <571DBFAE.7060605@samsung.com> Date: Mon, 25 Apr 2016 08:56:46 +0200 From: Jacek Anaszewski User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130804 Thunderbird/17.0.8 MIME-version: 1.0 To: Pavel Machek Cc: Ezequiel Garcia , linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Richard Purdie Subject: Re: [PATCH 1/5] leds: triggers: Allow to switch the trigger to "panic" on a kernel panic References: <1459801326-5541-1-git-send-email-ezequiel@vanguardiasur.com.ar> <1459801326-5541-2-git-send-email-ezequiel@vanguardiasur.com.ar> <20160424092551.GB23015@amd> <20160424092951.GA25596@amd> In-reply-to: <20160424092951.GA25596@amd> Content-type: text/plain; charset=ISO-8859-1; format=flowed Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrBLMWRmVeSWpSXmKPExsVy+t/xa7rr98uGG/z/bmKx8cVnFotNj6+x WlzeNYfNYuubdYwWd08dZbPYvespqwObx+Yl9R575v9g9Vix+ju7R9eR62wenzfJBbBGcdmk pOZklqUW6dslcGVc7LrKUjBDpmLBpWtMDYwPxboYOTkkBEwkHjyayAphi0lcuLeerYuRi0NI YCmjxPcddxkhnGeMEhc/7GUGqeIV0JK4f+0VWAeLgKrEyRevweJsAoYSP1+8ZgKxRQUiJP6c 3scKUS8o8WPyPRYQW0RAXmJr3wpmkKHMArsZJRYv6gNrFhZIlri3dwMzxLbTjBJr30J0cwpo Snx/sxrMZhawllg5aRsjhC0vsXnNW+YJjAKzkCyZhaRsFpKyBYzMqxhFU0uTC4qT0nMN9YoT c4tL89L1kvNzNzFCwvvLDsbFx6wOMQpwMCrx8M5gkg0XYk0sK67MPcQowcGsJMK7aB9QiDcl sbIqtSg/vqg0J7X4EKM0B4uSOO/cXe9DhATSE0tSs1NTC1KLYLJMHJxSDYw1cpwH49SOxQWe 5bq+bsm1PWwRRdZ3wu/6ZLvu5ak7Un1HkE0p9OVGtleaaYs372fvWbmtlaNarDt0TsL10xZW 0f4Jexbec89nvGjqruc8syru5891IreYRCcKHjs/78T1QFMLtaTQ9CUOZZ2KGknJC68b5Vut WX5+wwl2e2WX23Et9482hymxFGckGmoxFxUnAgA+ePh8awIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/24/2016 11:29 AM, Pavel Machek wrote: > On Sun 2016-04-24 11:25:51, Pavel Machek wrote: >> On Mon 2016-04-04 17:22:02, Ezequiel Garcia wrote: >>> This commit adds a new led_cdev flag LED_BLINK_AT_PANIC, which >>> allows to mark a specific LED to be switched to the "panic" >>> trigger, on a kernel panic. >>> >>> This is useful to allow the user to assign a regular trigger >>> to a given LED, and still blink that LED on a kernel panic. >>> >>> Signed-off-by: Ezequiel Garcia >> >> >>> drivers/leds/led-triggers.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ >>> include/linux/leds.h | 1 + >> >> Could we get this out of the core? I'm pretty sure most users are not >> interested... Good point. > Thinking about it some more.... > > This is not really a trigger. This is very special. Maybe hard-coded > handling, like we do for keyboard leds on x86 would be suitable? Could you please spot the piece of code you have on mind? > > >> >> Pavel >> >>> +/* >>> + * This is a called in a special context by the atomic panic >>> + * notifier. This means the trigger can be changed without >>> + * worrying about locking. >>> + */ >>> +static void led_trigger_set_panic(struct led_classdev *led_cdev) >>> +{ >>> + struct led_trigger *trig; >>> + >>> + list_for_each_entry(trig, &trigger_list, next_trig) { >>> + if (strcmp("panic", trig->name)) >>> + continue; >>> + if (led_cdev->trigger) >>> + list_del(&led_cdev->trig_list); >>> + list_add_tail(&led_cdev->trig_list, &trig->led_cdevs); >>> + led_cdev->trigger = trig; >>> + if (trig->activate) >>> + trig->activate(led_cdev); >>> + break; >>> + } >>> +} >>> + >>> +static int led_trigger_panic_notifier(struct notifier_block *nb, >>> + unsigned long code, void *unused) >>> +{ >>> + struct led_classdev *led_cdev; >>> + >>> + list_for_each_entry(led_cdev, &leds_list, node) >>> + if (led_cdev->flags & LED_BLINK_AT_PANIC) >>> + led_trigger_set_panic(led_cdev); >>> + return NOTIFY_DONE; >>> +} >>> + >>> +static struct notifier_block led_trigger_panic_nb = { >>> + .notifier_call = led_trigger_panic_notifier, >>> +}; >>> + >>> void led_trigger_set_default(struct led_classdev *led_cdev) >>> { >>> struct led_trigger *trig; >>> @@ -356,6 +393,21 @@ void led_trigger_unregister_simple(struct led_trigger *trig) >>> } >>> EXPORT_SYMBOL_GPL(led_trigger_unregister_simple); >>> >>> +static int __init leds_trigger_init(void) >>> +{ >>> + atomic_notifier_chain_register(&panic_notifier_list, >>> + &led_trigger_panic_nb); >>> + return 0; >>> +} >>> + >>> +static void __exit leds_trigger_exit(void) >>> +{ >>> + atomic_notifier_chain_unregister(&panic_notifier_list, >>> + &led_trigger_panic_nb); >>> +} >>> +module_init(leds_trigger_init); >>> +module_exit(leds_trigger_exit); >>> + >>> MODULE_AUTHOR("Richard Purdie"); >>> MODULE_LICENSE("GPL"); >>> MODULE_DESCRIPTION("LED Triggers Core"); >>> diff --git a/include/linux/leds.h b/include/linux/leds.h >>> index f203a8f89d30..7f1428bb1e69 100644 >>> --- a/include/linux/leds.h >>> +++ b/include/linux/leds.h >>> @@ -50,6 +50,7 @@ struct led_classdev { >>> #define LED_SYSFS_DISABLE (1 << 22) >>> #define LED_DEV_CAP_FLASH (1 << 23) >>> #define LED_HW_PLUGGABLE (1 << 24) >>> +#define LED_BLINK_AT_PANIC (1 << 25) >>> >>> /* Set LED brightness level >>> * Must not sleep. Use brightness_set_blocking for drivers >> > -- Best regards, Jacek Anaszewski