From patchwork Thu Dec 7 22:26:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 175462 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp5101165vqy; Thu, 7 Dec 2023 14:27:58 -0800 (PST) X-Google-Smtp-Source: AGHT+IFv7dNBGFk1Nr5L7hSeAYRSjMG3OcYPXMYtcxsLh0Y7+/Q7cptTgxbXm7y2q3zPTA82Al4B X-Received: by 2002:a17:903:26d2:b0:1cf:b14d:8939 with SMTP id jg18-20020a17090326d200b001cfb14d8939mr2674413plb.63.1701988077946; Thu, 07 Dec 2023 14:27:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701988077; cv=none; d=google.com; s=arc-20160816; b=EoVBR2Gx/uW4nQkcnRNCJkpVBdj4EJcaFWeds1mA1uIfrrU4sI2xGbTYpMmcH3TYZT qFQ/cTOkDM0mDMHUoqC0WZdLaW9VfPt87yFg6vO9P26WwDweqrlr1oohNyWfua0owsZW dMEZ2guEAGK934sm98OKAcziZUIEPrOGZqVMaZNH66cPQhSHT1O8oFNhkp4/AZsTNq+G igtNbX9sk5qukHW5cgISZKJ8i68mez84aKc8iqNUHSA3qFP1nEf1nWptfmDpqJuY5T7c hI3lppbmfEx6+S3xJkxTsAGtcVx8GSoyczvZJz5ToQqL6kX9qB1HFv8fCfZS2OtzCW8x Z3Sg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:ui-outboundreport:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=d+EegmElKqwqp2lATXtS/oUtHRG3isZPMw2E+pmB55I=; fh=li8yxIESWfZR7lmBO8wCmgOg4WdXsWPyQvEuWPhaOvo=; b=uG4jMbmgdg2aS8gBgqblG6nNGrysllpbp+DlsfKSJuL5Hxj+l68cEffpW9vklCZraf iHi8IE5mvzg1B05mwAzH53DJRQh2eVd8uu/xO4kdwo6NY/h/ohKHIy/tk6wcf7bUKF8Z IQtCBcnxCyq/R+L/VqX+ZNzrf1cRQyaRr6CuRzJQ2EpvKYGCzTIHN6ZA7qyxJuzEfFp5 hYyRQiM64p2L4DXMgMvJAYNIOxEMHxRnNHdTHKe0gBLjAc5pteP7XXOYIWViQUX3ImCV GTb2xfdJevXPqO/nlTdlvruj8l+WSBFIKS1/x93rfp6Gq8t0uSpKwNd7CRzoRT/Vbh1W blfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmx.de header.s=s31663417 header.b=Yj+srHue; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=gmx.de Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id y15-20020a17090322cf00b001d08cfd3933si427459plg.394.2023.12.07.14.27.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Dec 2023 14:27:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=pass header.i=@gmx.de header.s=s31663417 header.b=Yj+srHue; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=gmx.de Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 038588061CF2; Thu, 7 Dec 2023 14:27:55 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235331AbjLGW1K (ORCPT + 99 others); Thu, 7 Dec 2023 17:27:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232369AbjLGW04 (ORCPT ); Thu, 7 Dec 2023 17:26:56 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7C1F170C; Thu, 7 Dec 2023 14:27:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1701988008; x=1702592808; i=w_armin@gmx.de; bh=y2EiVsoHmyaZo5EWEuzoKsphmINyUOYwfn7EMnwuLU0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=Yj+srHueQQUZbBmN77rZ2/c3CPtuEnYClCHxzkl6trWoSymWU5Mr03g3aIoUcxLB uiIqDD7+mtS36KH1x0S6Cxj3wbzLQF6kMaUJA9ZkIyAhc8QyqPKR0qHYSELS0OriS 5CScQo/lLKODJGpASISe+fiYliDcw2l1hCwB75znrZLELEZVcwiAKYMrO10njtBsx KSnGh2+cUK75JPaz4OkEQAEjhdWzQUWRicg1ftgHqccmxEIGvkFp9hpuSGMIGtWs+ plFPh7wLpdtjiM9ouRKQ4c45ducIP6ZsYo/+5anyMJLQOWTtx+O4miCn/UwlGPyFB HQih1FcinZYC1HaYAg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mg6Zw-1rj4UQ2FIM-00hgNB; Thu, 07 Dec 2023 23:26:48 +0100 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, corbet@lwn.net Cc: Dell.Client.Kernel@dell.com, linux-doc@vger.kernel.org, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/5] platform/x86: wmi: Remove chardev interface Date: Thu, 7 Dec 2023 23:26:22 +0100 Message-Id: <20231207222623.232074-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231207222623.232074-1-W_Armin@gmx.de> References: <20231207222623.232074-1-W_Armin@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:WQ9UYDFhnYuYZY2U6JeHfGozqpr2BYf08f6ZRM2dq5zgwIBVrgS 94JDOsPJlXyD22SApQEwMw/NsHWUg7hN0eJLtjUp+p599yImgw1BzNpHclSoZivB2yBFE9K RH5XA3Zx02xwZMNn+Il7u9/382ze1mD/5y5b0/T7QZE7TGxUGgFKRMCUhdZFyeXH/3ypyOx 3zTkxB1/FqmvK81nQYw+g== UI-OutboundReport: notjunk:1;M01:P0:oCtkFgIGYMc=;IWDCxZdV9V6XU83HaYvD7N4J9MV 5WUIVL1zHlmo0ofZP0/uXUhKhl5P3joTMmbKoraEttlb8DC4LFFj+r19xxejyKqWa9OQcT8Sj u+Wyyhml8y68KrNrKjMMnjjruCiMJCAT9QFwZfSBaeEGW3XZ92jhDvcXfSt1POT/ZgUr3OvBt eqzpaPbLcHkqDm1MdXfhR6j5Acd/pnpXuZE+nFnXOrDh36sMuDA/HyLgLtDf3Qde99mh2vwjv 2rAMpEvbkWwY6NarHX0kkHZlIRmViKOpL4Z0NgaFrBx/caDRd+rjrZ8L2CoTNj3Qmc7k4EGrL W2UoqvwUOUCMqkXv8It9rbkNTfDrVKJB/q3LyYnti+2+7IGUJWLjpRf/fDXTMe1btblAVoXAG fA5ZLCc2tuK1U08lBHsE6PjhmCrEGPJMDPCKkDmUiaq7DljlSYNj9y0Bw8WNuhCRiedtlffjY Al9oo4YOw/1jxJ2sCybN/PVQ+EAMZ6bgo1cqGozLrxKSCkvjXTONDILZ5xbMdejJmbLZfRh0Y qK/zLwYKB0uxLQMvHfOR9pq0hq0I4DXHxBrSbWYdthFlzL3KvbFKzW9u0sqRtqMeQKn4vdDJ+ YIw9zxoqi64+smcx1ii+UnuoRZl3diAoelA/ggP8Quk1hcE/7qWVxvuEy4zXukDWvs8IT5aRy 2RRurZ4A1dOTa3FrudayEz7jo3YbmsOhDanFx2vYcBrfTIBjyl+SCZzMy1KEQqSmf+aHxZyXg JPn5yvB3a7QRlwuKrZ5Ru9oPv451kSIhyjmRkhoEPTtrAwzbLYJzT4znB4/tO9LOpqn311z4A iGrRrbzUSRvi+m2LrQwyxlAGWxAZaSaNHPyNdM402ApcZ6SZLbdRdcfQUX0gBdtsTQ9/UdBnV vFH+oKLZ9ynf8w1CjC3NBgQxnHb433do7Te55kJETsm68ZRPT4wGD3v3LB8HiWNiKsM4+c4mD 7d2sDUbOdWLyvGx1gPNtbZCmRB8= X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Thu, 07 Dec 2023 14:27:55 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1784663850470366978 X-GMAIL-MSGID: 1784663850470366978 The design of the WMI chardev interface is broken: - it assumes that WMI drivers are not instantiated twice - it offers next to no abstractions, the WMI driver gets a raw byte buffer - it is only used by a single driver, something which is unlikely to change Since the only user (dell-smbios-wmi) has been migrated to his own ioctl interface, remove it. Signed-off-by: Armin Wolf Reviewed-by: Ilpo Järvinen --- drivers/platform/x86/wmi.c | 180 ++----------------------------------- include/linux/wmi.h | 8 -- 2 files changed, 5 insertions(+), 183 deletions(-) -- 2.39.2 diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 7df5b5ee7983..7303702290e5 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -23,17 +23,14 @@ #include #include #include -#include #include #include #include #include #include -#include #include #include #include -#include MODULE_AUTHOR("Carlos Corbacho"); MODULE_DESCRIPTION("ACPI-WMI Mapping Driver"); @@ -66,12 +63,9 @@ struct wmi_block { struct wmi_device dev; struct list_head list; struct guid_block gblock; - struct miscdevice char_dev; - struct mutex char_mutex; struct acpi_device *acpi_device; wmi_notify_handler handler; void *handler_data; - u64 req_buf_size; unsigned long flags; }; @@ -256,26 +250,6 @@ static void wmi_device_put(struct wmi_device *wdev) * Exported WMI functions */ -/** - * set_required_buffer_size - Sets the buffer size needed for performing IOCTL - * @wdev: A wmi bus device from a driver - * @length: Required buffer size - * - * Allocates memory needed for buffer, stores the buffer size in that memory. - * - * Return: 0 on success or a negative error code for failure. - */ -int set_required_buffer_size(struct wmi_device *wdev, u64 length) -{ - struct wmi_block *wblock; - - wblock = container_of(wdev, struct wmi_block, dev); - wblock->req_buf_size = length; - - return 0; -} -EXPORT_SYMBOL_GPL(set_required_buffer_size); - /** * wmi_instance_count - Get number of WMI object instances * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba @@ -884,111 +858,12 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) return 0; } -static int wmi_char_open(struct inode *inode, struct file *filp) -{ - /* - * The miscdevice already stores a pointer to itself - * inside filp->private_data - */ - struct wmi_block *wblock = container_of(filp->private_data, struct wmi_block, char_dev); - - filp->private_data = wblock; - - return nonseekable_open(inode, filp); -} - -static ssize_t wmi_char_read(struct file *filp, char __user *buffer, - size_t length, loff_t *offset) -{ - struct wmi_block *wblock = filp->private_data; - - return simple_read_from_buffer(buffer, length, offset, - &wblock->req_buf_size, - sizeof(wblock->req_buf_size)); -} - -static long wmi_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) -{ - struct wmi_ioctl_buffer __user *input = - (struct wmi_ioctl_buffer __user *) arg; - struct wmi_block *wblock = filp->private_data; - struct wmi_ioctl_buffer *buf; - struct wmi_driver *wdriver; - int ret; - - if (_IOC_TYPE(cmd) != WMI_IOC) - return -ENOTTY; - - /* make sure we're not calling a higher instance than exists*/ - if (_IOC_NR(cmd) >= wblock->gblock.instance_count) - return -EINVAL; - - mutex_lock(&wblock->char_mutex); - buf = wblock->handler_data; - if (get_user(buf->length, &input->length)) { - dev_dbg(&wblock->dev.dev, "Read length from user failed\n"); - ret = -EFAULT; - goto out_ioctl; - } - /* if it's too small, abort */ - if (buf->length < wblock->req_buf_size) { - dev_err(&wblock->dev.dev, - "Buffer %lld too small, need at least %lld\n", - buf->length, wblock->req_buf_size); - ret = -EINVAL; - goto out_ioctl; - } - /* if it's too big, warn, driver will only use what is needed */ - if (buf->length > wblock->req_buf_size) - dev_warn(&wblock->dev.dev, - "Buffer %lld is bigger than required %lld\n", - buf->length, wblock->req_buf_size); - - /* copy the structure from userspace */ - if (copy_from_user(buf, input, wblock->req_buf_size)) { - dev_dbg(&wblock->dev.dev, "Copy %llu from user failed\n", - wblock->req_buf_size); - ret = -EFAULT; - goto out_ioctl; - } - - /* let the driver do any filtering and do the call */ - wdriver = drv_to_wdrv(wblock->dev.dev.driver); - if (!try_module_get(wdriver->driver.owner)) { - ret = -EBUSY; - goto out_ioctl; - } - ret = wdriver->filter_callback(&wblock->dev, cmd, buf); - module_put(wdriver->driver.owner); - if (ret) - goto out_ioctl; - - /* return the result (only up to our internal buffer size) */ - if (copy_to_user(input, buf, wblock->req_buf_size)) { - dev_dbg(&wblock->dev.dev, "Copy %llu to user failed\n", - wblock->req_buf_size); - ret = -EFAULT; - } - -out_ioctl: - mutex_unlock(&wblock->char_mutex); - return ret; -} - -static const struct file_operations wmi_fops = { - .owner = THIS_MODULE, - .read = wmi_char_read, - .open = wmi_char_open, - .unlocked_ioctl = wmi_ioctl, - .compat_ioctl = compat_ptr_ioctl, -}; static int wmi_dev_probe(struct device *dev) { struct wmi_block *wblock = dev_to_wblock(dev); struct wmi_driver *wdriver = drv_to_wdrv(dev->driver); int ret = 0; - char *buf; if (ACPI_FAILURE(wmi_method_enable(wblock, true))) dev_warn(dev, "failed to enable device -- probing anyway\n"); @@ -996,55 +871,17 @@ static int wmi_dev_probe(struct device *dev) if (wdriver->probe) { ret = wdriver->probe(dev_to_wdev(dev), find_guid_context(wblock, wdriver)); - if (ret != 0) - goto probe_failure; - } - - /* driver wants a character device made */ - if (wdriver->filter_callback) { - /* check that required buffer size declared by driver or MOF */ - if (!wblock->req_buf_size) { - dev_err(&wblock->dev.dev, - "Required buffer size not set\n"); - ret = -EINVAL; - goto probe_failure; - } + if (!ret) { + if (ACPI_FAILURE(wmi_method_enable(wblock, false))) + dev_warn(dev, "Failed to disable device\n"); - wblock->handler_data = kmalloc(wblock->req_buf_size, - GFP_KERNEL); - if (!wblock->handler_data) { - ret = -ENOMEM; - goto probe_failure; - } - - buf = kasprintf(GFP_KERNEL, "wmi/%s", wdriver->driver.name); - if (!buf) { - ret = -ENOMEM; - goto probe_string_failure; - } - wblock->char_dev.minor = MISC_DYNAMIC_MINOR; - wblock->char_dev.name = buf; - wblock->char_dev.fops = &wmi_fops; - wblock->char_dev.mode = 0444; - ret = misc_register(&wblock->char_dev); - if (ret) { - dev_warn(dev, "failed to register char dev: %d\n", ret); - ret = -ENOMEM; - goto probe_misc_failure; + return ret; } } set_bit(WMI_PROBED, &wblock->flags); - return 0; -probe_misc_failure: - kfree(buf); -probe_string_failure: - kfree(wblock->handler_data); -probe_failure: - if (ACPI_FAILURE(wmi_method_enable(wblock, false))) - dev_warn(dev, "failed to disable device\n"); - return ret; + return 0; } static void wmi_dev_remove(struct device *dev) @@ -1054,12 +891,6 @@ static void wmi_dev_remove(struct device *dev) clear_bit(WMI_PROBED, &wblock->flags); - if (wdriver->filter_callback) { - misc_deregister(&wblock->char_dev); - kfree(wblock->char_dev.name); - kfree(wblock->handler_data); - } - if (wdriver->remove) wdriver->remove(dev_to_wdev(dev)); @@ -1131,7 +962,6 @@ static int wmi_create_device(struct device *wmi_bus_dev, if (wblock->gblock.flags & ACPI_WMI_METHOD) { wblock->dev.dev.type = &wmi_type_method; - mutex_init(&wblock->char_mutex); goto out_init; } diff --git a/include/linux/wmi.h b/include/linux/wmi.h index 8a643c39fcce..50f7f1e4fd4f 100644 --- a/include/linux/wmi.h +++ b/include/linux/wmi.h @@ -11,7 +11,6 @@ #include #include #include -#include /** * struct wmi_device - WMI device structure @@ -47,8 +46,6 @@ acpi_status wmidev_block_set(struct wmi_device *wdev, u8 instance, const struct u8 wmidev_instance_count(struct wmi_device *wdev); -extern int set_required_buffer_size(struct wmi_device *wdev, u64 length); - /** * struct wmi_driver - WMI driver structure * @driver: Driver model structure @@ -57,11 +54,8 @@ extern int set_required_buffer_size(struct wmi_device *wdev, u64 length); * @probe: Callback for device binding * @remove: Callback for device unbinding * @notify: Callback for receiving WMI events - * @filter_callback: Callback for filtering device IOCTLs * * This represents WMI drivers which handle WMI devices. - * @filter_callback is only necessary for drivers which - * want to set up a WMI IOCTL interface. */ struct wmi_driver { struct device_driver driver; @@ -71,8 +65,6 @@ struct wmi_driver { int (*probe)(struct wmi_device *wdev, const void *context); void (*remove)(struct wmi_device *wdev); void (*notify)(struct wmi_device *device, union acpi_object *data); - long (*filter_callback)(struct wmi_device *wdev, unsigned int cmd, - struct wmi_ioctl_buffer *arg); }; extern int __must_check __wmi_driver_register(struct wmi_driver *driver,