Skip to content

Commit

Permalink
Convert uid hash to hlist
Browse files Browse the repository at this point in the history
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: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: Alexey Dobriyan <adobriyan@openvz.org>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Pavel Emelyanov authored and Linus Torvalds committed Sep 19, 2007
1 parent d8a4821 commit 735de22
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 10 deletions.
2 changes: 1 addition & 1 deletion include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
2 changes: 1 addition & 1 deletion include/linux/user_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
15 changes: 8 additions & 7 deletions kernel/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion kernel/user_namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 735de22

Please sign in to comment.