From patchwork Mon Nov 6 15:59:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Gaignard X-Patchwork-Id: 10043775 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 318B7603FF for ; Mon, 6 Nov 2017 16:00:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1BE5429D81 for ; Mon, 6 Nov 2017 16:00:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0D43129E0C; Mon, 6 Nov 2017 16:00:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 64EE829D81 for ; Mon, 6 Nov 2017 16:00:03 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 640096E23B; Mon, 6 Nov 2017 16:00:02 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 146D26E23B for ; Mon, 6 Nov 2017 16:00:01 +0000 (UTC) Received: by mail-wr0-x244.google.com with SMTP id j23so4881359wra.9 for ; Mon, 06 Nov 2017 08:00:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=82wSscWDk5v9abSbkwSg1Ujf04lUUcRbwpz35s3Sk/A=; b=QYADl11AsOcJ9mcoLYTU9gnGl6vHXkttg+UIxHBTUYZ4RA7ORw7I4EEVaRcBF7dUDz 8DvxLUfdk5M8sxbzF8rdJBm0i6U0816UsXiWZu1alNj6lAEsJubrJjkxmeRSsZlMAUFB LVwzU1JZAjfRocPsA1Hjm9ZwpNcOKdok2wFso= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=82wSscWDk5v9abSbkwSg1Ujf04lUUcRbwpz35s3Sk/A=; b=lUKG9nyHkr7dGsa1bQkAZoKHwCA2iUn+dH7OUoxfDys9z8q4YtIpjnOJOUfH7SCNgU xk0A9o2qQz0yzANg5q+qNMWvpBx5/DwtENGPSoQ3H3SICPfkLXvQJDPnSEHZtrIzyqqr YFc9ddTjskim9fD+zeq9/QAP5dh8fvJP+kIAyASbhhgecmtidQYhK0bebJDfnoNRAXO5 cbd8y705CvIDH/REH2/K+0SxktTB4q6Jp4EdCX3GAxVepxuPmacVWlP9r74Y/B0m+32B lJ8qgPq0d5ZQ7k93cV1FKObWUOS62+4d47Pu+6LxmCOLC6CTuI+sPG6xbhoCL6hLRu4Y mwPg== X-Gm-Message-State: AMCzsaWcLq92oRjHy8Rl4WOQZv4ZT60LtRjYq0kB8qsW1BAE3NfSXMOT L5EGfEDfSJR95tQCIX/VN/V6eA== X-Google-Smtp-Source: ABhQp+Q3UbW1PTJTVl0cspZYX8z2ZhIAYhFAlLfGzw3APbvsOuNmM3eeATZYf17yGSXoThr3pscq4g== X-Received: by 10.223.183.7 with SMTP id l7mr12268827wre.139.1509983999641; Mon, 06 Nov 2017 07:59:59 -0800 (PST) Received: from lmecxl0911.lme.st.com ([80.215.204.172]) by smtp.gmail.com with ESMTPSA id x63sm9601003wma.39.2017.11.06.07.59.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 06 Nov 2017 07:59:58 -0800 (PST) From: Benjamin Gaignard To: labbott@redhat.com, sumit.semwal@linaro.org, gregkh@linuxfoundation.org, arve@android.com, riandrews@android.com, broonie@kernel.org, dan.carpenter@oracle.com Subject: [PATCH v6 2/2] staging: ion: create one device entry per heap Date: Mon, 6 Nov 2017 16:59:45 +0100 Message-Id: <1509983985-20950-3-git-send-email-benjamin.gaignard@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1509983985-20950-1-git-send-email-benjamin.gaignard@linaro.org> References: <1509983985-20950-1-git-send-email-benjamin.gaignard@linaro.org> Cc: devel@driverdev.osuosl.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Instead a getting only one common device "/dev/ion" for all the heaps this patch allow to create one device entry ("/dev/ionX") per heap. Getting an entry per heap could allow to set security rules per heap and global ones for all heaps. Allocation requests will be only allowed if the mask_id match with device minor. Query request could be done on any of the devices. Signed-off-by: Benjamin Gaignard Acked-by: Laura Abbott --- drivers/staging/android/TODO | 1 - drivers/staging/android/ion/Kconfig | 7 ++++ drivers/staging/android/ion/ion-ioctl.c | 18 ++++++++-- drivers/staging/android/ion/ion.c | 62 +++++++++++++++++++++++++++++---- drivers/staging/android/ion/ion.h | 15 ++++++-- 5 files changed, 91 insertions(+), 12 deletions(-) diff --git a/drivers/staging/android/TODO b/drivers/staging/android/TODO index 687e0ea..8a11931 100644 --- a/drivers/staging/android/TODO +++ b/drivers/staging/android/TODO @@ -8,7 +8,6 @@ TODO: ion/ - Add dt-bindings for remaining heaps (chunk and carveout heaps). This would involve putting appropriate bindings in a memory node for Ion to find. - - Split /dev/ion up into multiple nodes (e.g. /dev/ion/heap0) - Better test framework (integration with VGEM was suggested) Please send patches to Greg Kroah-Hartman and Cc: diff --git a/drivers/staging/android/ion/Kconfig b/drivers/staging/android/ion/Kconfig index a517b2d..cb4666e 100644 --- a/drivers/staging/android/ion/Kconfig +++ b/drivers/staging/android/ion/Kconfig @@ -10,6 +10,13 @@ menuconfig ION If you're not using Android its probably safe to say N here. +config ION_LEGACY_DEVICE_API + bool "Keep using Ion legacy misc device API" + depends on ION + help + Choose this option to keep using Ion legacy misc device API + i.e. /dev/ion + config ION_SYSTEM_HEAP bool "Ion system heap" depends on ION diff --git a/drivers/staging/android/ion/ion-ioctl.c b/drivers/staging/android/ion/ion-ioctl.c index e26b786..bb5c77b 100644 --- a/drivers/staging/android/ion/ion-ioctl.c +++ b/drivers/staging/android/ion/ion-ioctl.c @@ -25,7 +25,8 @@ union ion_ioctl_arg { struct ion_heap_query query; }; -static int validate_ioctl_arg(unsigned int cmd, union ion_ioctl_arg *arg) +static int validate_ioctl_arg(struct file *filp, + unsigned int cmd, union ion_ioctl_arg *arg) { switch (cmd) { case ION_IOC_HEAP_QUERY: @@ -34,6 +35,19 @@ static int validate_ioctl_arg(unsigned int cmd, union ion_ioctl_arg *arg) arg->query.reserved2 ) return -EINVAL; break; + + case ION_IOC_ALLOC: + { + int mask = 1 << iminor(filp->f_inode); + +#ifdef CONFIG_ION_LEGACY_DEVICE_API + if (imajor(filp->f_inode) == MISC_MAJOR) + return 0; +#endif + if (!(arg->allocation.heap_id_mask & mask)) + return -EINVAL; + break; + } default: break; } @@ -69,7 +83,7 @@ long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (copy_from_user(&data, (void __user *)arg, _IOC_SIZE(cmd))) return -EFAULT; - ret = validate_ioctl_arg(cmd, &data); + ret = validate_ioctl_arg(filp, cmd, &data); if (WARN_ON_ONCE(ret)) return ret; diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index fda9756..2c2568b 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -40,6 +40,9 @@ #include "ion.h" +#define ION_DEV_MAX 32 +#define ION_NAME "ion" + static struct ion_device *internal_dev; static int heap_id; @@ -535,15 +538,38 @@ static int debug_shrink_get(void *data, u64 *val) DEFINE_SIMPLE_ATTRIBUTE(debug_shrink_fops, debug_shrink_get, debug_shrink_set, "%llu\n"); -void ion_device_add_heap(struct ion_heap *heap) +static struct device ion_bus = { + .init_name = ION_NAME, +}; + +static struct bus_type ion_bus_type = { + .name = ION_NAME, +}; + +int ion_device_add_heap(struct ion_heap *heap) { struct dentry *debug_file; struct ion_device *dev = internal_dev; + int ret = 0; if (!heap->ops->allocate || !heap->ops->free) pr_err("%s: can not add heap with invalid ops struct.\n", __func__); + if (heap_id >= ION_DEV_MAX) + return -EBUSY; + + heap->ddev.parent = &ion_bus; + heap->ddev.bus = &ion_bus_type; + heap->ddev.devt = MKDEV(MAJOR(internal_dev->devt), heap_id); + dev_set_name(&heap->ddev, ION_NAME"%d", heap_id); + device_initialize(&heap->ddev); + cdev_init(&heap->chrdev, &ion_fops); + heap->chrdev.owner = THIS_MODULE; + ret = cdev_device_add(&heap->chrdev, &heap->ddev); + if (ret < 0) + return ret; + spin_lock_init(&heap->free_lock); heap->free_list_size = 0; @@ -581,6 +607,8 @@ void ion_device_add_heap(struct ion_heap *heap) dev->heap_cnt++; up_write(&dev->lock); + + return ret; } EXPORT_SYMBOL(ion_device_add_heap); @@ -593,8 +621,9 @@ static int ion_device_create(void) if (!idev) return -ENOMEM; +#ifdef CONFIG_ION_LEGACY_DEVICE_API idev->dev.minor = MISC_DYNAMIC_MINOR; - idev->dev.name = "ion"; + idev->dev.name = ION_NAME; idev->dev.fops = &ion_fops; idev->dev.parent = NULL; ret = misc_register(&idev->dev); @@ -603,19 +632,38 @@ static int ion_device_create(void) kfree(idev); return ret; } +#endif - idev->debug_root = debugfs_create_dir("ion", NULL); - if (!idev->debug_root) { + ret = device_register(&ion_bus); + if (ret) + goto clean_misc; + + ret = bus_register(&ion_bus_type); + if (ret) + goto clean_device; + + ret = alloc_chrdev_region(&idev->devt, 0, ION_DEV_MAX, ION_NAME); + if (ret) + goto clean_device; + + idev->debug_root = debugfs_create_dir(ION_NAME, NULL); + if (!idev->debug_root) pr_err("ion: failed to create debugfs root directory.\n"); - goto debugfs_done; - } -debugfs_done: idev->buffers = RB_ROOT; mutex_init(&idev->buffer_lock); init_rwsem(&idev->lock); plist_head_init(&idev->heaps); internal_dev = idev; return 0; + +clean_device: + device_unregister(&ion_bus); +clean_misc: +#ifdef CONFIG_ION_LEGACY_DEVICE_API + misc_deregister(&idev->dev); +#endif + kfree(idev); + return ret; } subsys_initcall(ion_device_create); diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h index f5f9cd6..4869e96 100644 --- a/drivers/staging/android/ion/ion.h +++ b/drivers/staging/android/ion/ion.h @@ -17,16 +17,19 @@ #ifndef _ION_H #define _ION_H +#include #include #include #include +#ifdef CONFIG_ION_LEGACY_DEVICE_API +#include +#endif #include #include #include #include #include #include -#include #include "../uapi/ion.h" @@ -92,12 +95,16 @@ void ion_buffer_destroy(struct ion_buffer *buffer); /** * struct ion_device - the metadata of the ion device node * @dev: the actual misc device + * @devt: Ion device * @buffers: an rb tree of all the existing buffers * @buffer_lock: lock protecting the tree of buffers * @lock: rwsem protecting the tree of heaps and clients */ struct ion_device { +#ifdef CONFIG_ION_LEGACY_DEVICE_API struct miscdevice dev; +#endif + dev_t devt; struct rb_root buffers; struct mutex buffer_lock; struct rw_semaphore lock; @@ -153,6 +160,8 @@ struct ion_heap_ops { * struct ion_heap - represents a heap in the system * @node: rb node to put the heap on the device's tree of heaps * @dev: back pointer to the ion_device + * @ddev: device structure + * @chrdev: associated character device * @type: type of heap * @ops: ops struct as above * @flags: flags @@ -177,6 +186,8 @@ struct ion_heap_ops { struct ion_heap { struct plist_node node; struct ion_device *dev; + struct device ddev; + struct cdev chrdev; enum ion_heap_type type; struct ion_heap_ops *ops; unsigned long flags; @@ -213,7 +224,7 @@ bool ion_buffer_fault_user_mappings(struct ion_buffer *buffer); * ion_device_add_heap - adds a heap to the ion device * @heap: the heap to add */ -void ion_device_add_heap(struct ion_heap *heap); +int ion_device_add_heap(struct ion_heap *heap); /** * some helpers for common operations on buffers using the sg_table