forked from mirrors/linux
		
	Currently on 64-bit arch the user_namespace is 2096 and when being kmalloc-ed it resides on a 4k slab wasting 2003 bytes. If we allocate a separate cache for it and reduce the hash size from 128 to 64 chains the packaging becomes *much* better - the struct is 1072 bytes and the hole between is 98 bytes. [akpm@linux-foundation.org: s/__initcall/module_init/] Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Acked-by: Serge E. Hallyn <serge@hallyn.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _LINUX_USER_NAMESPACE_H
 | 
						|
#define _LINUX_USER_NAMESPACE_H
 | 
						|
 | 
						|
#include <linux/kref.h>
 | 
						|
#include <linux/nsproxy.h>
 | 
						|
#include <linux/sched.h>
 | 
						|
#include <linux/err.h>
 | 
						|
 | 
						|
#define UIDHASH_BITS	(CONFIG_BASE_SMALL ? 3 : 7)
 | 
						|
#define UIDHASH_SZ	(1 << UIDHASH_BITS)
 | 
						|
 | 
						|
struct user_namespace {
 | 
						|
	struct kref		kref;
 | 
						|
	struct hlist_head	uidhash_table[UIDHASH_SZ];
 | 
						|
	struct user_struct	*creator;
 | 
						|
	struct work_struct	destroyer;
 | 
						|
};
 | 
						|
 | 
						|
extern struct user_namespace init_user_ns;
 | 
						|
 | 
						|
#ifdef CONFIG_USER_NS
 | 
						|
 | 
						|
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
 | 
						|
{
 | 
						|
	if (ns)
 | 
						|
		kref_get(&ns->kref);
 | 
						|
	return ns;
 | 
						|
}
 | 
						|
 | 
						|
extern int create_user_ns(struct cred *new);
 | 
						|
extern void free_user_ns(struct kref *kref);
 | 
						|
 | 
						|
static inline void put_user_ns(struct user_namespace *ns)
 | 
						|
{
 | 
						|
	if (ns)
 | 
						|
		kref_put(&ns->kref, free_user_ns);
 | 
						|
}
 | 
						|
 | 
						|
uid_t user_ns_map_uid(struct user_namespace *to, const struct cred *cred, uid_t uid);
 | 
						|
gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t gid);
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
 | 
						|
{
 | 
						|
	return &init_user_ns;
 | 
						|
}
 | 
						|
 | 
						|
static inline int create_user_ns(struct cred *new)
 | 
						|
{
 | 
						|
	return -EINVAL;
 | 
						|
}
 | 
						|
 | 
						|
static inline void put_user_ns(struct user_namespace *ns)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
static inline uid_t user_ns_map_uid(struct user_namespace *to,
 | 
						|
	const struct cred *cred, uid_t uid)
 | 
						|
{
 | 
						|
	return uid;
 | 
						|
}
 | 
						|
static inline gid_t user_ns_map_gid(struct user_namespace *to,
 | 
						|
	const struct cred *cred, gid_t gid)
 | 
						|
{
 | 
						|
	return gid;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _LINUX_USER_H */
 |