From patchwork Wed Jul 10 23:45:29 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Herrmann X-Patchwork-Id: 2825950 Return-Path: X-Original-To: patchwork-dri-devel@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 0CF0DC0AB2 for ; Wed, 10 Jul 2013 23:47:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1BCAF20115 for ; Wed, 10 Jul 2013 23:47:18 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 2E14020113 for ; Wed, 10 Jul 2013 23:47:17 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 36E76E6461 for ; Wed, 10 Jul 2013 16:47:17 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-ea0-f179.google.com (mail-ea0-f179.google.com [209.85.215.179]) by gabe.freedesktop.org (Postfix) with ESMTP id 90E64E5D0F for ; Wed, 10 Jul 2013 16:46:15 -0700 (PDT) Received: by mail-ea0-f179.google.com with SMTP id b15so5371770eae.10 for ; Wed, 10 Jul 2013 16:46:14 -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:x-mailer:in-reply-to:references; bh=i3yUuq7raBfjf6Dgh+wVkBnCxROhVtAcCcMUxst1i3c=; b=wbixbmsb8JFCKka7N9btiRjEgxtmzvMYf73oQJtlzXPFzRlxfyVNR+jPZDDCv9bQ9e uqRoje23GyJgHqf52Izp+r4XzD+ENM9TOslKbUmiRhtiEz1xOCAKjLGyBpIhMHuFleE9 nXyU+leMysmzxg4Ul+Omtm93qi/F9N/UkAe119nGQx9T/uTPwDJMDACxdCWuEdNIrH+e k1t39FVU6mpxT7FTi58PujMtg1xBqhh7iWW2Uuz4MztZLVV8EM5+i22pSAR05/MmDLMN +sSP3NCDyqOhwu+agRqrtZko2yieSqhSMF1AgC0cQU2bnjU5ymSP0Hr4gkx+BPHHD0Fs 7WhQ== X-Received: by 10.15.36.72 with SMTP id h48mr16811549eev.33.1373499974730; Wed, 10 Jul 2013 16:46:14 -0700 (PDT) Received: from localhost.localdomain (stgt-5f718d7b.pool.mediaWays.net. [95.113.141.123]) by mx.google.com with ESMTPSA id p49sm64257668eeu.2.2013.07.10.16.46.13 for (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 10 Jul 2013 16:46:14 -0700 (PDT) From: David Herrmann To: linux-kernel@vger.kernel.org Subject: [PATCH 1/2] anon_inodes: allow external inode allocations Date: Thu, 11 Jul 2013 01:45:29 +0200 Message-Id: <1373499930-5055-2-git-send-email-dh.herrmann@gmail.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1373499930-5055-1-git-send-email-dh.herrmann@gmail.com> References: <1373499930-5055-1-git-send-email-dh.herrmann@gmail.com> Cc: Daniel Vetter , dri-devel@lists.freedesktop.org, Alexander 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=-4.4 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 destruction. 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 --- 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 */