From patchwork Tue Aug 13 09:19: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: 2843513 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 46BDCBF546 for ; Tue, 13 Aug 2013 09:19:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 17C252045B for ; Tue, 13 Aug 2013 09:19:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BA0D820436 for ; Tue, 13 Aug 2013 09:19:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756172Ab3HMJTs (ORCPT ); Tue, 13 Aug 2013 05:19:48 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:62060 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756513Ab3HMJTo (ORCPT ); Tue, 13 Aug 2013 05:19:44 -0400 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MRG003ZUPWQ00Q0@mailout3.samsung.com>; Tue, 13 Aug 2013 18:19:38 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id AF.B8.08825.A2AF9025; Tue, 13 Aug 2013 18:19:38 +0900 (KST) X-AuditID: cbfee68e-b7f276d000002279-35-5209fa2ae7a9 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id B2.4F.32250.A2AF9025; Tue, 13 Aug 2013 18:19: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 <0MRG003MLPWOEO50@mmp1.samsung.com>; Tue, 13 Aug 2013 18:19: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: maarten.lankhorst@canonical.com, sumit.semwal@linaro.org, kyungmin.park@samsung.com, myungjoo.ham@samsung.com, Inki Dae Subject: [PATCH 2/2] [RFC PATCH v2] dma-buf: Add user interfaces for dmabuf sync support. Date: Tue, 13 Aug 2013 18:19:36 +0900 Message-id: <1376385576-9039-3-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.7.5.4 In-reply-to: <1376385576-9039-1-git-send-email-inki.dae@samsung.com> References: <1376385576-9039-1-git-send-email-inki.dae@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprAIsWRmVeSWpSXmKPExsWyRsSkRFfrF2eQwbsN4hZXvr5ns5h0fwKL xdmmN+wW7w89Y7bY9Pgaq8WJvg+sFj0btrJaPH16gc3iduMKNotTdz+zO3B5zGroZfO4c20P m8f97uNMHpuX1Hvc/veY2aNvyypGj8+b5ALYo7hsUlJzMstSi/TtErgyrh3ew1RwVL6if+5y xgbGmZJdjJwcEgImEh8+vmOEsMUkLtxbz9bFyMUhJLCUUWL++gVMMEXnrl1kgkgsYpTYsPI/ I4TTzSQx+8pONpAqNgFViYkr7oO1iwgsZ5T4ePotO4jDLDCNUeJt0wYWkCphgWiJw18ngi1k Aeq4vXIXWDevgLPE44Z1UPsUJH4dWcUKYnMKuEgcO/qQGcQWAqp5+bCFHaLmELvEpM5AiDkC Et8mHwKazwEUl5XYdIAZokRS4uCKGywTGIUXMDKsYhRNLUguKE5KLzLSK07MLS7NS9dLzs/d xAiMjdP/nvXtYLx5wPoQYzLQuInMUqLJ+cDYyiuJNzQ2M7IwNTE1NjK3NCNNWEmcV63FOlBI ID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDY3Hanxdp9zP2bLs+W/8f84fZDB7LT3F4bXl5fdJz 62PL96tMKpYNlj7xIfW9xt0FV6S4FeQWaG197Lyc16VKwPPRWvnY4MD05AlNBe8FPN8tP/x7 BqfCLoGD7vc/WTIUvO5WUeDedO/64kJVW9Ez6RUlWffvp29Nu5W4gtXhx8Ur15osL2fGxCix FGckGmoxFxUnAgAdebqWowIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHIsWRmVeSWpSXmKPExsVy+t9jAV2tX5xBBnNW8Ftc+fqezWLS/Qks Fmeb3rBbvD/0jNli0+NrrBYn+j6wWvRs2Mpq8fTpBTaL240r2CxO3f3M7sDlMauhl83jzrU9 bB73u48zeWxeUu9x+99jZo++LasYPT5vkgtgj2pgtMlITUxJLVJIzUvOT8nMS7dV8g6Od443 NTMw1DW0tDBXUshLzE21VXLxCdB1y8wBuk9JoSwxpxQoFJBYXKykb4dpQmiIm64FTGOErm9I EFyPkQEaSFjDmHHt8B6mgqPyFf1zlzM2MM6U7GLk5JAQMJE4d+0iE4QtJnHh3nq2LkYuDiGB RYwSG1b+Z4RwupkkZl/ZyQZSxSagKjFxxX2wKhGB5YwSH0+/ZQdxmAWmMUq8bdrAAlIlLBAt cfjrREYQmwWo4/bKXWDdvALOEo8b1kHtU5D4dWQVK4jNKeAicezoQ2YQWwio5uXDFvYJjLwL GBlWMYqmFiQXFCel5xrqFSfmFpfmpesl5+duYgTH3jOpHYwrGywOMQpwMCrx8Aq85wgSYk0s K67MPcQowcGsJMIb/pYzSIg3JbGyKrUoP76oNCe1+BBjMtBVE5mlRJPzgWkhryTe0NjEzMjS yNzQwsjYnDRhJXHeA63WgUIC6YklqdmpqQWpRTBbmDg4pRoYNTSV2qb+MXhUljaj6UbXecno E7c4gmtfCfzR4BdPnPxySaqUl0iFofPXzHOmn24vE1vfeXnXpdlyhl6ayV3TfSX3r1Ju1ePl f5glkR71rXfnPNnUktP/nysvUUmMkrCdv6Kcq9Ri4j2Xm2kfmZtPRVw/vSyb9eGG0D9XmVy8 bWf4K68sZPulxFKckWioxVxUnAgAAIzVlAEDAAA= 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=-9.7 required=5.0 tests=BAYES_00, 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 +++++++++++++++++++++++++++++++++++++++++++ include/linux/dmabuf-sync.h | 1 + 2 files changed, 82 insertions(+), 0 deletions(-) diff --git a/drivers/base/dma-buf.c b/drivers/base/dma-buf.c index 4aca57a..f16a396 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 *); @@ -80,9 +81,89 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma) return dmabuf->ops->mmap(dmabuf, vma); } +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, + .poll = dma_buf_poll, + .lock = dma_buf_lock, }; /* diff --git a/include/linux/dmabuf-sync.h b/include/linux/dmabuf-sync.h index 9a3afc4..0316f68 100644 --- a/include/linux/dmabuf-sync.h +++ b/include/linux/dmabuf-sync.h @@ -11,6 +11,7 @@ */ #include +#include #include #include