Received: by 10.223.164.221 with SMTP id h29csp2526965wrb; Mon, 23 Oct 2017 08:57:52 -0700 (PDT) X-Received: by 10.98.71.13 with SMTP id u13mr13564279pfa.302.1508774271898; Mon, 23 Oct 2017 08:57:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508774271; cv=none; d=google.com; s=arc-20160816; b=w0iYR0Nc87P0iDODCuJ7nsFh0rWZrohFS7ciWhbghSNhw0d6++YKrlNZs5cWHgmcnY UlmMP9uL3emaYIGnkH+OOagXnDQ60BPeS3Y37tM3+ri1ajyZAw6ZzmE8xocHOO+W5ktx 0acyxS/k5oVi9ysrI7/gHXNZOAEUdyR42Gi2wqftOK8aE1jWeiiQO5vvna0AkHPLn6Ap 9uXD1JB577X0gvlSNYgEDtZxHOM0yypLr0roElRw0y+rAQ9rr5jXseXt3YncEeqwZvUB 5sULemfW9b8y5Co9pKvYOfyNPUTfEqsganUCVYE8y3e2PKJHksYShu2sgw5fTwWyhYRq ttSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=b3B8+NodwSF5+AWawh2zlq4vCD9imKVO0eKJ6unWqks=; b=0rBOcEnF57+bM+bIEb4uklWuu6oUnnrn98KWQ/ZOxn7A5U2v6pBy2Qay9qtRftJptC 2DRY3mmH8drNYxVwBV9PciHP5clmmwYEcIwrr8FA9sc56EhhbiKzg78tZPOMrits3Bav +JeEPlWVEkOhmCrXp/Iw9Bn82YdzF5IxyL8kD+Q9LVFsrqyNDuXBhZSro0RioRJsG0n+ 2xj9vFUDmhjcSDj0cyiEse0ci1rZCQ9w2LQ01IPdj+whz3fQ8CHWFsA0noa+/Wu06k/h RpJ/JWvZF0bcX6iinUhfwa/yVEGBnYWTH/9avTFXZICJfX6YvCNT9lMrKuaCi9BKxV9z u95w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=TpyCFB/G; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n13si5531185pfb.79.2017.10.23.08.57.37; Mon, 23 Oct 2017 08:57:51 -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=@linaro.org header.s=google header.b=TpyCFB/G; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932377AbdJWP5F (ORCPT + 99 others); Mon, 23 Oct 2017 11:57:05 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:48882 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932366AbdJWP5C (ORCPT ); Mon, 23 Oct 2017 11:57:02 -0400 Received: by mail-wm0-f65.google.com with SMTP id p75so10477546wmg.3 for ; Mon, 23 Oct 2017 08:57:01 -0700 (PDT) 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=b3B8+NodwSF5+AWawh2zlq4vCD9imKVO0eKJ6unWqks=; b=TpyCFB/GTwtCZS9JrJ4/PCh2gDTnp+8YQaVEkMaDHxt2cNvtD13csXaKWXxBR2ukaP tgDSqEC/siBNIconvxfbIYZ7iHKtzFe7+Z8OwVIV6l0Tp6NOpP7GQ0Co3jys++hL4n/s a0NwLaJ4hzDCm7xUSUxDAdsyWLVJAC5kn41+g= 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=b3B8+NodwSF5+AWawh2zlq4vCD9imKVO0eKJ6unWqks=; b=oU/dg9wUAmZ7APNXvqMHaovARMMH/X+c3VGUsCE4WDjt9YEPbwXJL3VFxh/KK6Wqp7 /p+Y7XVwW0GHN67bfAZzsOk1ZwRurNAli0GpTrMeG292xYOXYi1bQOCwY0M/TNlZf7+j gQ/ZjfXrhCxf2y0BhKFKlBEVRRgAN1USFIgb1o+ZLifFAG35XzR1lthI6gLXBSXd/sEV 3x0Z5qYBefQHvCK21crqaGI8u8bC7lqXdcFM/SEKGsy5Ufp+b6hwpwqN3P8D+P6MpXDA bhrqJEK0s0XK0QAq/NLalceM8EcNcdT6EU//aAhhXqfKjzGYGK1SJJN0pE3y9Fs2+1HE RPlg== X-Gm-Message-State: AMCzsaW1y/RJM0eyVJufPv8ngW9T1XbJHysLDL+cXxRYqd4lHgTJYZcU N030n9AAuQRq1AYVMpZICVxBmw== X-Google-Smtp-Source: ABhQp+Sb7dbZFWXgwe3pDjqAouLKO50vplixeLjtTIi8z1G+wplbnRfVCgx1Xb+P9V2a8sJQy6t/tQ== X-Received: by 10.28.197.65 with SMTP id v62mr5431577wmf.9.1508774220847; Mon, 23 Oct 2017 08:57:00 -0700 (PDT) Received: from lmecxl0911.lme.st.com ([80.214.19.18]) by smtp.gmail.com with ESMTPSA id 55sm8717335wrw.60.2017.10.23.08.56.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 23 Oct 2017 08:57:00 -0700 (PDT) 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 Cc: devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-api@vger.kernel.org, Benjamin Gaignard Subject: [PATCH v6 2/2] staging: ion: create one device entry per heap Date: Mon, 23 Oct 2017 17:55:37 +0200 Message-Id: <1508774137-13835-3-git-send-email-benjamin.gaignard@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1508774137-13835-1-git-send-email-benjamin.gaignard@linaro.org> References: <1508774137-13835-1-git-send-email-benjamin.gaignard@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Ion devices are parentless so it is need to add platform_bus as parent and platform_bus_type as bus to be put in /sys/device/paltform. Those two parameters need platform_device.h to be included but include files weren't in alphabetic order so I reorder them correctly. Signed-off-by: Benjamin Gaignard --- 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 | 53 ++++++++++++++++++++++++++------- drivers/staging/android/ion/ion.h | 15 ++++++++-- 5 files changed, 79 insertions(+), 15 deletions(-) diff --git a/drivers/staging/android/TODO b/drivers/staging/android/TODO index 5f14247..d770ffa 100644 --- a/drivers/staging/android/TODO +++ b/drivers/staging/android/TODO @@ -9,7 +9,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 93e2c90..dd66f55 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -15,31 +15,35 @@ * */ +#include +#include #include +#include #include +#include #include #include #include -#include +#include #include #include #include #include -#include #include #include +#include #include -#include +#include #include +#include #include #include -#include -#include -#include -#include #include "ion.h" +#define ION_DEV_MAX 32 +#define ION_NAME "ion" + static struct ion_device *internal_dev; static int heap_id; @@ -537,15 +541,30 @@ 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) +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 = &platform_bus; + heap->ddev.bus = &platform_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; @@ -583,6 +602,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); @@ -595,8 +616,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); @@ -605,8 +627,19 @@ static int ion_device_create(void) kfree(idev); return ret; } +#endif + + ret = alloc_chrdev_region(&idev->devt, 0, ION_DEV_MAX, ION_NAME); + if (ret) { + pr_err("ion: unable to allocate device\n"); +#ifdef CONFIG_ION_LEGACY_DEVICE_API + misc_deregister(&idev->dev); +#endif + kfree(idev); + return ret; + } - idev->debug_root = debugfs_create_dir("ion", NULL); + 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; diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h index 621e5f7..2b00ccb 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" @@ -91,12 +94,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; @@ -152,6 +159,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 @@ -176,6 +185,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; @@ -212,7 +223,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 -- 2.7.4 From 1582062114508448904@xxx Mon Oct 23 15:20:05 +0000 2017 X-GM-THRID: 1579699119100728687 X-Gmail-Labels: Inbox,Category Forums