Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 735de223 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Linus Torvalds
Browse files

Convert uid hash to hlist



Surprisingly, but (spotted by Alexey Dobriyan) the uid hash still uses
list_heads, thus occupying twice as much place as it could.  Convert it to
hlist_heads.

Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarAlexey Dobriyan <adobriyan@openvz.org>
Acked-by: default avatarSerge Hallyn <serue@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d8a4821d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -593,7 +593,7 @@ struct user_struct {
#endif

	/* Hash table maintenance information */
	struct list_head uidhash_list;
	struct hlist_node uidhash_node;
	uid_t uid;
};

+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@

struct user_namespace {
	struct kref		kref;
	struct list_head	uidhash_table[UIDHASH_SZ];
	struct hlist_head	uidhash_table[UIDHASH_SZ];
	struct user_struct	*root_user;
};

+8 −7
Original line number Diff line number Diff line
@@ -55,21 +55,22 @@ struct user_struct root_user = {
/*
 * These routines must be called with the uidhash spinlock held!
 */
static inline void uid_hash_insert(struct user_struct *up, struct list_head *hashent)
static inline void uid_hash_insert(struct user_struct *up, struct hlist_head *hashent)
{
	list_add(&up->uidhash_list, hashent);
	hlist_add_head(&up->uidhash_node, hashent);
}

static inline void uid_hash_remove(struct user_struct *up)
{
	list_del(&up->uidhash_list);
	hlist_del(&up->uidhash_node);
}

static inline struct user_struct *uid_hash_find(uid_t uid, struct list_head *hashent)
static inline struct user_struct *uid_hash_find(uid_t uid, struct hlist_head *hashent)
{
	struct user_struct *user;
	struct hlist_node *h;

	list_for_each_entry(user, hashent, uidhash_list) {
	hlist_for_each_entry(user, h, hashent, uidhash_node) {
		if(user->uid == uid) {
			atomic_inc(&user->__count);
			return user;
@@ -118,7 +119,7 @@ void free_uid(struct user_struct *up)

struct user_struct * alloc_uid(struct user_namespace *ns, uid_t uid)
{
	struct list_head *hashent = uidhashentry(ns, uid);
	struct hlist_head *hashent = uidhashentry(ns, uid);
	struct user_struct *up;

	spin_lock_irq(&uidhash_lock);
@@ -207,7 +208,7 @@ static int __init uid_cache_init(void)
			0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);

	for(n = 0; n < UIDHASH_SZ; ++n)
		INIT_LIST_HEAD(init_user_ns.uidhash_table + n);
		INIT_HLIST_HEAD(init_user_ns.uidhash_table + n);

	/* Insert the root user immediately (init already runs as root) */
	spin_lock_irq(&uidhash_lock);
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ static struct user_namespace *clone_user_ns(struct user_namespace *old_ns)
	kref_init(&ns->kref);

	for (n = 0; n < UIDHASH_SZ; ++n)
		INIT_LIST_HEAD(ns->uidhash_table + n);
		INIT_HLIST_HEAD(ns->uidhash_table + n);

	/* Insert new root user.  */
	ns->root_user = alloc_uid(ns, 0);