From patchwork Tue Sep 17 12:23:36 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inki Dae X-Patchwork-Id: 2901991 Return-Path: X-Original-To: patchwork-linux-fbdev@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 11E28BFF05 for ; Tue, 17 Sep 2013 12:24:14 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2ECF220377 for ; Tue, 17 Sep 2013 12:24:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5146520360 for ; Tue, 17 Sep 2013 12:24:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752722Ab3IQMXp (ORCPT ); Tue, 17 Sep 2013 08:23:45 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:29378 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752340Ab3IQMXk (ORCPT ); Tue, 17 Sep 2013 08:23:40 -0400 Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MT900A13RRED1V0@mailout3.samsung.com>; Tue, 17 Sep 2013 21:23:38 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 52.63.29948.AC948325; Tue, 17 Sep 2013 21:23:38 +0900 (KST) X-AuditID: cbfee691-b7f4a6d0000074fc-cb-523849cacdd2 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id AA.6C.05832.AC948325; Tue, 17 Sep 2013 21:23:38 +0900 (KST) Received: from daeinki-desktop.10.32.193.11 ([10.252.75.62]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0MT900JZHRRD0240@mmp1.samsung.com>; Tue, 17 Sep 2013 21:23:38 +0900 (KST) From: Inki Dae To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linaro-kernel@lists.linaro.org Cc: Roger.Teague@arm.com, jesse.barker@arm.com, jesse.barker@linaro.org, maarten.lankhorst@canonical.com, sumit.semwal@linaro.org, kyungmin.park@samsung.com, myungjoo.ham@samsung.com, Inki Dae Subject: [PATCH v2 2/2] dma-buf: Add user interfaces for dmabuf sync support Date: Tue, 17 Sep 2013 21:23:36 +0900 Message-id: <1379420616-9194-3-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1379420616-9194-1-git-send-email-inki.dae@samsung.com> References: <1379420616-9194-1-git-send-email-inki.dae@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCIsWRmVeSWpSXmKPExsWyRsSkWPeUp0WQweID2hZXvr5ns5h0fwKL xZSOy2wWuw+tYbQ42/SG3eL9oWfMFpseX2O1ONH3gdWiZ8NWVounTy+wWdxuXMFmcW/6flaL U3c/szvweqyZt4bRY1ZDL5vHnWt72Dzudx9n8ti8pN7j9r/HzB59W1YxenzeJBfAEcVlk5Ka k1mWWqRvl8CVsfz4bfaC2zIVTdf3MDUwPhbrYuTkkBAwkbiwpIsNwhaTuHBvPZDNxSEksJRR YlXnemaYoobD9xkhEosYJWbMP8cE4XQzSfyY0s0IUsUmoCoxccV9sHYRgeWMEh9Pv2UHcZgF 7jJKXO06AFYlLOAjcfLZT1YQmwWoY8fMF2A2r4CzxM4vc4DGcgDtU5CYM8kGJMwp4CJx5+V9 sFYhoJLGH/tZQWZKCNxilzh+sJ8RYo6AxLfJh1ggemUlNh2AOltS4uCKGywTGIUXMDKsYhRN LUguKE5KLzLVK07MLS7NS9dLzs/dxAiModP/nk3cwXj/gPUhxmSgcROZpUST84ExmFcSb2hs ZmRhamJqbGRuaUaasJI4r3qLdaCQQHpiSWp2ampBalF8UWlOavEhRiYOTqkGxkWHD+RP/MMk Oa9HV3zpq+ia1IQjWww4kreoZ+iuK5l3gKVtXbzrhpMRC38uf7e5/axrzsui01qlOVVvntw3 v6vtuu7q7JDVBjtnWnf8yLqyp+9JcrDss4/LS7seqDCv5vhVt+EOh4DV8TuZssLfZJIuvbyr pyU2x32ldmy6x5cX10Syapks3yuxFGckGmoxFxUnAgCsxWLFtwIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpkleLIzCtJLcpLzFFi42I5/e+xgO4pT4sgg43/lCyufH3PZjHp/gQW iykdl9ksdh9aw2hxtukNu8X7Q8+YLTY9vsZqcaLvA6tFz4atrBZPn15gs7jduILN4t70/awW p+5+Znfg9Vgzbw2jx6yGXjaPO9f2sHnc7z7O5LF5Sb3H7X+PmT36tqxi9Pi8SS6AI6qB0SYj NTEltUghNS85PyUzL91WyTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMH6GYlhbLEnFKg UEBicbGSvh2mCaEhbroWMI0Rur4hQXA9RgZoIGENY8by47fZC27LVDRd38PUwPhYrIuRk0NC wESi4fB9RghbTOLCvfVsXYxcHEICixglZsw/xwThdDNJ/JjSDVbFJqAqMXHFfbAqEYHljBIf T79lB3GYBe4ySlztOgBWJSzgI3Hy2U9WEJsFqGPHzBdgNq+As8TOL3OAxnIA7VOQmDPJBiTM KeAiceclxBlCQCWNP/azTmDkXcDIsIpRNLUguaA4KT3XSK84Mbe4NC9dLzk/dxMjOEKfSe9g XNVgcYhRgINRiYd3hpR5kBBrYllxZe4hRgkOZiUR3lAWiyAh3pTEyqrUovz4otKc1OJDjMlA R01klhJNzgcmj7ySeENjEzMjSyNzQwsjY3PShJXEeQ+2WgcKCaQnlqRmp6YWpBbBbGHi4JRq YLQSeCafr/kveVYjt7NQZ57475h23XkKTT78/jc/llvIfBVW0tzH9XnOv7mVKdd147pvrDCv emi6dmma42Kfh20f17ALTNz8uodpvpxq3hmWN+buDQqtvqb7PQ1X/L4k8ePVX43PF0tdoy6E J12fqXTENeGrb4Ol4p31MksYGztSbN6wPZ8irsRSnJFoqMVcVJwIAA1qCzkUAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Spam-Status: No, score=-4.0 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch adds lock and poll callbacks to dma buf file operations, and these callbacks will be called by fcntl and select system calls. fcntl and select system calls can be used to wait for the completion of DMA or CPU access to a shared dmabuf. The difference of them is fcntl system call takes a lock after the completion but select system call doesn't. So in case of fcntl system call, it's useful when a task wants to access a shared dmabuf without any broken. On the other hand, it's useful when a task wants to just wait for the completion. Changelog v2: - Add select system call support. . The purpose of this feature is to wait for the completion of DMA or CPU access to a dmabuf without that caller locks the dmabuf again after the completion. That is useful when caller wants to be aware of the completion of DMA access to the dmabuf, and the caller doesn't use intefaces for the DMA device driver. Signed-off-by: Inki Dae Signed-off-by: Kyungmin Park --- drivers/base/dma-buf.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/base/dma-buf.c b/drivers/base/dma-buf.c index 3985751..73234ba 100644 --- a/drivers/base/dma-buf.c +++ b/drivers/base/dma-buf.c @@ -29,6 +29,7 @@ #include #include #include +#include #include static inline int is_dma_buf_file(struct file *); @@ -106,10 +107,90 @@ static loff_t dma_buf_llseek(struct file *file, loff_t offset, int whence) return base + offset; } +static unsigned int dma_buf_poll(struct file *filp, + struct poll_table_struct *poll) +{ + struct dma_buf *dmabuf; + struct dmabuf_sync_reservation *robj; + int ret = 0; + + if (!is_dma_buf_file(filp)) + return POLLERR; + + dmabuf = filp->private_data; + if (!dmabuf || !dmabuf->sync) + return POLLERR; + + robj = dmabuf->sync; + + mutex_lock(&robj->lock); + + robj->polled = true; + + /* + * CPU or DMA access to this buffer has been completed, and + * the blocked task has been waked up. Return poll event + * so that the task can get out of select(). + */ + if (robj->poll_event) { + robj->poll_event = false; + mutex_unlock(&robj->lock); + return POLLIN | POLLOUT; + } + + /* + * There is no anyone accessing this buffer so just return. + */ + if (!robj->locked) { + mutex_unlock(&robj->lock); + return POLLIN | POLLOUT; + } + + poll_wait(filp, &robj->poll_wait, poll); + + mutex_unlock(&robj->lock); + + return ret; +} + +static int dma_buf_lock(struct file *file, int cmd, struct file_lock *fl) +{ + struct dma_buf *dmabuf; + unsigned int type; + bool wait = false; + + if (!is_dma_buf_file(file)) + return -EINVAL; + + dmabuf = file->private_data; + + if ((fl->fl_type & F_UNLCK) == F_UNLCK) { + dmabuf_sync_single_unlock(dmabuf); + return 0; + } + + /* convert flock type to dmabuf sync type. */ + if ((fl->fl_type & F_WRLCK) == F_WRLCK) + type = DMA_BUF_ACCESS_W; + else if ((fl->fl_type & F_RDLCK) == F_RDLCK) + type = DMA_BUF_ACCESS_R; + else + return -EINVAL; + + if (fl->fl_flags & FL_SLEEP) + wait = true; + + /* TODO. the locking to certain region should also be considered. */ + + return dmabuf_sync_single_lock(dmabuf, type, wait); +} + static const struct file_operations dma_buf_fops = { .release = dma_buf_release, .mmap = dma_buf_mmap_internal, .llseek = dma_buf_llseek, + .poll = dma_buf_poll, + .lock = dma_buf_lock, }; /*