From patchwork Tue Aug 13 17:42:16 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Herrmann X-Patchwork-Id: 2843928 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id DE68B9F294 for ; Tue, 13 Aug 2013 17:47:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A5C41205D2 for ; Tue, 13 Aug 2013 17:47:16 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 9FD06205D0 for ; Tue, 13 Aug 2013 17:47:15 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A1505E7AD9 for ; Tue, 13 Aug 2013 10:47:15 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-ea0-f172.google.com (mail-ea0-f172.google.com [209.85.215.172]) by gabe.freedesktop.org (Postfix) with ESMTP id B13DBE7ACB for ; Tue, 13 Aug 2013 10:43:13 -0700 (PDT) Received: by mail-ea0-f172.google.com with SMTP id r16so4326477ead.3 for ; Tue, 13 Aug 2013 10:43:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iyT4t1M3BigszeoaEfBhFD5ZGaT/1m7v9PMifWubWOE=; b=qwAQ+sSgTX3dIP086wVHdqaBM+ZGcThD/5/07ZmyoxiXnP/Nec/mMuTX0EZgIVVdl+ 5Gp6yKi3nbERaeHXWrDmPvj/vleKFDpCwe5QvFIhbnPvLTuGr7IsFV1eIbBuTrMM2iZY deAUgqS032gIJ0J6tNwBt6M2/x+M+GGDxILg5Q/gcON1hCpdY+nA6PT395ZSvt6bL1n3 oUmq8BHEZvKuQH6feRC+Inen9s9aPMX5NKU6DX0TNu+70lDDQ21qePv/4bHwti6/y+Gc YGFR+ZhH9ZJ0XIyGECnqAl21denV0Ixrl7/07LFwdN1fOUoDQbAwdrRSGhgSsrD5Y+6q irgw== X-Received: by 10.14.209.4 with SMTP id r4mr15728eeo.131.1376415792832; Tue, 13 Aug 2013 10:43:12 -0700 (PDT) Received: from localhost.localdomain (stgt-5f71b8eb.pool.mediaWays.net. [95.113.184.235]) by mx.google.com with ESMTPSA id l47sm23432867eex.15.2013.08.13.10.43.10 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 13 Aug 2013 10:43:11 -0700 (PDT) From: David Herrmann To: dri-devel@lists.freedesktop.org Subject: [PATCH v2 1/4] anon_inodes: allow external inode allocations Date: Tue, 13 Aug 2013 19:42:16 +0200 Message-Id: <1376415739-11685-2-git-send-email-dh.herrmann@gmail.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1376415739-11685-1-git-send-email-dh.herrmann@gmail.com> References: <1373499930-5055-1-git-send-email-dh.herrmann@gmail.com> <1376415739-11685-1-git-send-email-dh.herrmann@gmail.com> Cc: Daniel Vetter , linux-kernel@vger.kernel.org, Al Viro , linux-fsdevel@vger.kernel.org, Dave Airlie , Andrew Morton X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, 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 DRM core shares a single address_space across all inodes that belong to the same DRM device. This allows efficient unmapping of user-space mappings during buffer eviction. However, there is no easy way to get a shared address_space for DRM devices during initialization. Therefore, we currently delay this step until the first ->open() and save the given inode for future use. This causes ugly delayed initialization throughout the DRM core. TTM devices end up without a dev_mapping pointer and we have to carefully respect any underlying filesystem implementation so we don't corrupt the inode->i_mapping and inode->i_data fields. We can avoid this if we were allowed to allocate an anonymous inode for each DRM device. We only have to set file->f_mapping during ->open() and no longer need to adjust inode mappings. As fs/anon_inodes.c already provides a minimal internal FS mount, we extend it to also provide anonymous inodes for use in drivers like DRM. Signed-off-by: David Herrmann Wanted-by: Daniel Vetter --- fs/anon_inodes.c | 36 +++++++++++++++++++++++++++++------- include/linux/anon_inodes.h | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 47a65df..7d8a80a 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -25,6 +25,7 @@ static struct vfsmount *anon_inode_mnt __read_mostly; static struct inode *anon_inode_inode; static const struct file_operations anon_inode_fops; +static struct dentry *anon_inode_root; /* * anon_inodefs_dname() is called from d_path(). @@ -87,19 +88,18 @@ static struct inode *anon_inode_mkinode(struct super_block *s) static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { - struct dentry *root; - root = mount_pseudo(fs_type, "anon_inode:", NULL, + anon_inode_root = mount_pseudo(fs_type, "anon_inode:", NULL, &anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); - if (!IS_ERR(root)) { - struct super_block *s = root->d_sb; + if (!IS_ERR(anon_inode_root)) { + struct super_block *s = anon_inode_root->d_sb; anon_inode_inode = anon_inode_mkinode(s); if (IS_ERR(anon_inode_inode)) { - dput(root); + dput(anon_inode_root); deactivate_locked_super(s); - root = ERR_CAST(anon_inode_inode); + anon_inode_root = ERR_CAST(anon_inode_inode); } } - return root; + return anon_inode_root; } static struct file_system_type anon_inode_fs_type = { @@ -219,6 +219,28 @@ err_put_unused_fd: } EXPORT_SYMBOL_GPL(anon_inode_getfd); +/** + * anon_inode_new - create private anonymous inode + * + * Creates a new inode on the anonymous inode FS for driver's use. The inode has + * it's own address_space compared to the shared anon_inode_inode. It can be + * used in situations where user-space mappings have to be shared across + * different files but no backing inode is available. + * + * Call iput(inode) to release the inode. + * + * RETURNS: + * New inode on success, error pointer on failure. + */ +struct inode *anon_inode_new(void) +{ + if (IS_ERR(anon_inode_root)) + return ERR_CAST(anon_inode_root); + + return anon_inode_mkinode(anon_inode_root->d_sb); +} +EXPORT_SYMBOL_GPL(anon_inode_new); + static int __init anon_inode_init(void) { int error; diff --git a/include/linux/anon_inodes.h b/include/linux/anon_inodes.h index 8013a45..ddbd67f 100644 --- a/include/linux/anon_inodes.h +++ b/include/linux/anon_inodes.h @@ -15,6 +15,7 @@ struct file *anon_inode_getfile(const char *name, void *priv, int flags); int anon_inode_getfd(const char *name, const struct file_operations *fops, void *priv, int flags); +struct inode *anon_inode_new(void); #endif /* _LINUX_ANON_INODES_H */