Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp855433imm; Wed, 20 Jun 2018 07:43:01 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJc24xI1Gt4SQ4KIZSCAQLcQqGP4yqMHIlJI3IVE3NXU88fkNL7Wy3Djcv5+VKH+qXxqBHQ X-Received: by 2002:a63:2ac4:: with SMTP id q187-v6mr19498751pgq.333.1529505781154; Wed, 20 Jun 2018 07:43:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529505781; cv=none; d=google.com; s=arc-20160816; b=Xp2cPIBUcax6BmKHrxCJMibOZpNQEW7BaEmpdf1nEry9FC2tKZpy+l3+UI4B0VNMM9 jEwVCq4LCaUtHNRa/+bZh3x/FSVDLtE15IPf4TAlEDl3va/0SZllYcEfdXE/FKA0io4H YHZJ86ajRcmcRsCwTRoC2+KRLxdFn8X9VVNQ8F6hkmT5em9mdDQpWbsubvFfPd6R8A1I t2zNVpo1VjmEu/7mUStgBdU4Osk0/wioHxwxU9NUFY12cDtoFJycf4jRgczElNsMREFm 2V6SrCWfZ2qxuYB491Bk3lMxeFRlsT+7agi1fu6ThB3UEjtB8HvRZzrDtZwT2bnVaod5 Dnxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=CoCKF8/l3eBYISpKMZqIhCFDbIm0itKWNi9qmfcFMBY=; b=k7bhM3niCYiuwS4NxVpZqjGcwCVM475kUPkcJTfmQ0kz+/LwHjSiU3NxdKe9z+LEh8 1GntM5UFi1tR8lOQGkDcfWnA6DsEabOq5L0IeZV8C99y3YReOzs2AYMm/7WiNdXs313B gdvvEpHRjzWeiEIATelZ2yzDMCEd/QuH/o61FzMoGcu4ENH2DfieR8B2WLvdZNUhTnd/ UMxyrYF0dpbsqNj4gXRpDaFUzKEts6EkNFc5hYzDD94vKd+O/Lu0QNJrydsH+u2mGFGJ LfrfcJq7+n6jylhOpltQ6IzRU3atjusIV9RB+yxGSE0mPSg8QY9hgQ3lPwqG1Bv8CXWy 5Y2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@endlessm-com.20150623.gappssmtp.com header.s=20150623 header.b=vCGhr+es; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y21-v6si2380819pfm.1.2018.06.20.07.42.45; Wed, 20 Jun 2018 07:43:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@endlessm-com.20150623.gappssmtp.com header.s=20150623 header.b=vCGhr+es; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932088AbeFTOku (ORCPT + 99 others); Wed, 20 Jun 2018 10:40:50 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:55339 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752891AbeFTOks (ORCPT ); Wed, 20 Jun 2018 10:40:48 -0400 Received: by mail-wm0-f67.google.com with SMTP id v16-v6so124433wmh.5 for ; Wed, 20 Jun 2018 07:40:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=endlessm-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=CoCKF8/l3eBYISpKMZqIhCFDbIm0itKWNi9qmfcFMBY=; b=vCGhr+esT32LhKhpDxaPO8Vh5kmblk7nuPlO4hUuVBf1SHwfwJKjGFT5toIH7t+5eX /K1+11zDuktdUH3SDKN5e/TIvlc8IMtTEypoboft0muuanObeJ/2YmysNzT2jravGy/Z l/pC9gbieBm8sgPSLafgeud/kSeRdqG7JUN8ZSoY+7Crl6B3A0MR8/emDbZcDw0+0M98 8ZGNY1iqMe/fQQHYhSANRfPbsFfxLRsctLDk7EHdAg/90L+oEzugQc2TG34No1NQcLaU i1OYisK2DyZ0n2bEzmvlj3Cv+fQIwS91+Y72H8lV4joAqUL8y9zm3gr+hRH20wo590UI IVFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=CoCKF8/l3eBYISpKMZqIhCFDbIm0itKWNi9qmfcFMBY=; b=W9D4oVq7a3djp4mIeElHcxC2lugUv1BG3qMji2ym1M34MTTu5TDMjqy3HqsyT7IuGK lspPWJDbq9CnkL4dNT3rr7u0pJ0fPYysfZUKOsxC+Bj50anjYI/Gj0MjgO31nWx69jBi aFicccgJhHYZ1JhaJu12tR3xZnpkjGXrOQZpTirEzxQfVmJKD1YykT0A0jHapQ0VGpf4 6RNQIBFb32AHaXvASHsagh2ZD509km04K+c78sdfgURhT3ISzigApkenOYcf2yO5IH2H tL1mAoaNf7CSBXt03jQvMs5c7M6+reFNZki7Uco3ahXanK7DdMKeBusy1b0jYO+76nwf RrTA== X-Gm-Message-State: APt69E2C3PLKkVXwBBzYl+T9Yj0FnCDW7meShRpBoYlswxHx7FPUi2pY oAZOqMEtEX7EPmSLQHb3SP3zElxQ7pDqR5oko45gY2XJ X-Received: by 2002:a50:f4ba:: with SMTP id s55-v6mr18558115edm.262.1529505647125; Wed, 20 Jun 2018 07:40:47 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a50:90d3:0:0:0:0:0 with HTTP; Wed, 20 Jun 2018 07:40:46 -0700 (PDT) In-Reply-To: References: <20180611071838.47945-1-chiu@endlessm.com> From: Chris Chiu Date: Wed, 20 Jun 2018 22:40:46 +0800 Message-ID: Subject: Re: [PATCH v2 1/2] platform/x86: asus-wmi: Call led hw_changed API on kbd brightness change To: Daniel Drake Cc: Andy Shevchenko , Corentin Chary , Darren Hart , Linux Kernel Mailing List , Platform Driver , acpi4asus-user , Hans de Goede , Linux Upstreaming Team Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 20, 2018 at 12:46 AM, Daniel Drake wrote: > Hi, > > On Thu, Jun 14, 2018 at 1:58 AM, Chris Chiu wrote: >> >> On Wed, Jun 13, 2018 at 8:49 PM, Andy Shevchenko >> wrote: >> > On Mon, Jun 11, 2018 at 10:18 AM, Chris Chiu wrote: >> >> Make asus-wmi notify on hotkey kbd brightness changes, listen for >> >> brightness events and update the brightness directly in the driver. >> > >> >> For this purpose, bound check on brightness in kbd_led_set must be >> >> based on the same data type to prevent illegal value been set. >> > >> >> @@ -497,9 +498,9 @@ static void kbd_led_set(struct led_classdev *led_cdev, >> >> >> >> asus = container_of(led_cdev, struct asus_wmi, kbd_led); >> >> >> >> - if (value > asus->kbd_led.max_brightness) >> >> + if ((int)value > (int)asus->kbd_led.max_brightness) >> >> value = asus->kbd_led.max_brightness; >> >> - else if (value < 0) >> >> + else if ((int)value < 0) >> >> value = 0; >> > >> > I didn't quite understand this part of the problem. >> > Does it exist in the current code? Can it be split to a separate change? >> > >> > Can we avoid those ugly castings? >> > >> >> I'd like to remove the ugly castings but there's a concern I may need some >> advices. I don't know whether if the bound check logic ever verified before. >> Maybe the value passed via sysfs is already correctly bounded? > > The casts come from the underlying need to limit the minumum and > maximum brightness within available bounds, plus difficulties doing > that when you are dealing with an enum data type. > > kbd_led_set is a function pointer (from led_classdev.brightness_set) > which has this definition: > > void (*brightness_set)(struct led_classdev *led_cdev, enum > led_brightness brightness); > > It seems that the compiler has the choice of whether to use a signed > or unsigned type for enums. According to your tests, and a quick test > app below, it seems like gcc is using unsigned. > > #include > enum led_brightness { LED_OFF = 0 }; > int main(void) { > enum led_brightness tmp = -1; > if (tmp < 0) > printf("less than zero\n"); > else > printf("gt zero\n"); > } > > This test app prints "gt zero" > > led-class.c:brightness_store() uses kstrtoul() so there is no chance > of passing a negative value through this codepath, as you suspected. > But we do need to do something with negative bounds for the code that > you are adding here. > > I suggest doing it like this: > > static void __kbd_led_set(struct led_classdev *led_cdev, int value) > { > struct asus_wmi *asus; > > asus = container_of(led_cdev, struct asus_wmi, kbd_led); > > if (value > asus->kbd_led.max_brightness) > value = asus->kbd_led.max_brightness; The `value > asus->kbd_led.max_brightness` will still return false here. So I would modify as follows in v3. int max_level = asus->kbd_led.max_brightness; if (value > max_level) value = max_level; I've verified there's no regression on led_classdev call path via sysfs. > else if (value < 0) > value = 0; > > asus->kbd_led_wk = value; > queue_work(asus->led_workqueue, &asus->kbd_led_work); > } > > static void kbd_led_set(struct led_classdev *led_cdev, > enum led_brightness value) > { > return __kbd_led_set(led_cdev, value); > } > > Now kbd_led_set can continue being a correctly typed function pointer > for led_classdev.brightness_set. And from the code you are adding here > you can call __kbd_led_set directly with signed integer values, and > rely on correct bounds correction without ugly casts. > > Andy, what do you think? > > Thanks > Daniel