From: "Serge E. Hallyn" <serge@hallyn.com>
To: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
"Serge E. Hallyn" <serge.hallyn@canonical.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Daniel Lezcano <daniel.lezcano@free.fr>,
David Howells <dhowells@redhat.com>,
James Morris <jmorris@namei.org>,
Andrew Morton <akpm@linux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
containers@lists.linux-foundation.org,
Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: acl_permission_check: disgusting performance
Date: Thu, 12 May 2011 23:02:14 -0500 [thread overview]
Message-ID: <20110513040214.GA25270@mail.hallyn.com> (raw)
In-Reply-To: <20110513025013.GA13209@mail.hallyn.com>
I wonder how much this would help: (only compile-tested)
I will look into how to do some profiling tomorrow.
From: Serge E. Hallyn <serge.hallyn@canonical.com>
Date: Fri, 13 May 2011 04:27:54 +0100
Subject: [PATCH 1/1] Cache struct cred in acl_permission_check, and cache user_ns
in struct cred.
Signed-off-by: Serge E. Hallyn <serge.hallyn@canonical.com>
---
fs/namei.c | 5 +++--
include/linux/cred.h | 3 ++-
kernel/cred.c | 6 ++++++
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
index 54fc993..eb0f4ea 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -180,13 +180,14 @@ static int acl_permission_check(struct inode *inode, int mask, unsigned int flag
int (*check_acl)(struct inode *inode, int mask, unsigned int flags))
{
umode_t mode = inode->i_mode;
+ const struct cred *cred = current_cred();
mask &= MAY_READ | MAY_WRITE | MAY_EXEC;
- if (current_user_ns() != inode_userns(inode))
+ if (cred->user_ns != inode_userns(inode))
goto other_perms;
- if (current_fsuid() == inode->i_uid)
+ if (cred->fsuid == inode->i_uid)
mode >>= 6;
else {
if (IS_POSIXACL(inode) && (mode & S_IRWXG) && check_acl) {
diff --git a/include/linux/cred.h b/include/linux/cred.h
index 9aeeb0b..a2a892c 100644
--- a/include/linux/cred.h
+++ b/include/linux/cred.h
@@ -146,6 +146,7 @@ struct cred {
void *security; /* subjective LSM security */
#endif
struct user_struct *user; /* real user ID subscription */
+ struct user_namespace *user_ns; /* cached user->user_ns */
struct group_info *group_info; /* supplementary groups for euid/fsgid */
struct rcu_head rcu; /* RCU deletion hook */
};
@@ -354,7 +355,7 @@ static inline void put_cred(const struct cred *_cred)
#define current_fsgid() (current_cred_xxx(fsgid))
#define current_cap() (current_cred_xxx(cap_effective))
#define current_user() (current_cred_xxx(user))
-#define _current_user_ns() (current_cred_xxx(user)->user_ns)
+#define _current_user_ns() (current_cred_xxx(user_ns))
#define current_security() (current_cred_xxx(security))
extern struct user_namespace *current_user_ns(void);
diff --git a/kernel/cred.c b/kernel/cred.c
index 5557b55..a3dcf28 100644
--- a/kernel/cred.c
+++ b/kernel/cred.c
@@ -54,6 +54,7 @@ struct cred init_cred = {
.cap_effective = CAP_INIT_EFF_SET,
.cap_bset = CAP_INIT_BSET,
.user = INIT_USER,
+ .user_ns = &init_user_ns,
.group_info = &init_groups,
#ifdef CONFIG_KEYS
.tgcred = &init_tgcred,
@@ -410,6 +411,11 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
goto error_put;
}
+ /* cache user_ns in cred. Doesn't need a refcount because it will
+ * stay pinned by cred->user
+ */
+ new->user_ns = new->user->user_ns;
+
#ifdef CONFIG_KEYS
/* new threads get their own thread keyrings if their parent already
* had one */
--
1.7.0.4
next prev parent reply other threads:[~2011-05-13 4:02 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-13 0:29 acl_permission_check: disgusting performance Linus Torvalds
2011-05-13 2:50 ` Serge E. Hallyn
2011-05-13 3:52 ` Eric W. Biederman
2011-05-13 4:16 ` Linus Torvalds
[not found] ` <m1iptf1cm2.fsf-+imSwln9KH6u2/kzUuoCbdi2O/JbrIOy@public.gmane.org>
2011-05-13 4:16 ` Linus Torvalds
2011-05-13 4:02 ` Serge E. Hallyn [this message]
2011-05-13 4:26 ` Linus Torvalds
[not found] ` <BANLkTim3cy8Jf3URYTW+cbr3nrdWVbsmGw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-05-13 13:19 ` Serge E. Hallyn
2011-05-13 13:19 ` Serge E. Hallyn
[not found] ` <20110513131904.GA2519-7LNsyQBKDXoIagZqoN9o3w@public.gmane.org>
2011-05-13 16:16 ` Linus Torvalds
2011-05-13 16:16 ` Linus Torvalds
2011-05-13 16:29 ` Linus Torvalds
2011-05-13 18:30 ` Serge E. Hallyn
[not found] ` <BANLkTin-9SmqB=U7gmOFY2qkCLNd_Yn-sw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-05-13 18:30 ` Serge E. Hallyn
[not found] ` <BANLkTi=yyoMXNqGtVX9KxHjVaDVGW9uzdA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-05-13 16:29 ` Linus Torvalds
[not found] ` <20110513040214.GA25270-7LNsyQBKDXoIagZqoN9o3w@public.gmane.org>
2011-05-13 4:26 ` Linus Torvalds
[not found] ` <20110513025013.GA13209-7LNsyQBKDXoIagZqoN9o3w@public.gmane.org>
2011-05-13 3:52 ` Eric W. Biederman
2011-05-13 4:02 ` Serge E. Hallyn
[not found] ` <BANLkTi=nc3WGaASQm1Pc9byshLOmLf2bXQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-05-13 2:50 ` Serge E. Hallyn
-- strict thread matches above, loose matches on Subject: below --
2011-05-13 0:29 Linus Torvalds
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110513040214.GA25270@mail.hallyn.com \
--to=serge@hallyn.com \
--cc=akpm@linux-foundation.org \
--cc=containers@lists.linux-foundation.org \
--cc=daniel.lezcano@free.fr \
--cc=dhowells@redhat.com \
--cc=ebiederm@xmission.com \
--cc=jmorris@namei.org \
--cc=linux-kernel@vger.kernel.org \
--cc=serge.hallyn@canonical.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.