I've been touring around the kernel sources when I stumbled
across the uid_hash_find() function (kernel/user.c):

static inline struct user_struct *uid_hash_find(unsigned short uid, unsigned int 
hashent)
{
        struct user_struct *up, *next;
 
        next = uidhash[hashent];
        for (;;) {
                up = next;
                if (next) {
                        next = up->next;
                        if (up->uid != uid)
                                continue;
                        atomic_inc(&up->__count);
                }
                break;
        }
        return up;
}

Now, it took me some time to figure out how this function 
behaves, and I came into conclusion that the implementation 
is not only an unreadable piece of code, but also inefficient. 

Give one reason why we shouldn't use this:

static inline struct user_struct *uid_hash_find(unsigned short uid, unsigned int 
hashent)
{
        struct user_struct *up;
 
        for (up = uidhash[hashent]; up ; up = up->next)
                if (up->uid == uid)
                {
                        atomic_inc(&up->__count);
                        return up;
                }

        return NULL;
}

[compiled, booted, and it works fine] 

The patch:

--- linux/kernel/user.c Sun Aug 13 16:36:42 2000
+++ linux.vanilla/kernel/user.c Sun Oct  8 19:34:07 2000
@@ -53,20 +53,16 @@
 
 static inline struct user_struct *uid_hash_find(unsigned short uid, unsigned int 
hashent)
 {
-       struct user_struct *up, *next;
+       struct user_struct *up;
 
-       next = uidhash[hashent];
-       for (;;) {
-               up = next;
-               if (next) {
-                       next = up->next;
-                       if (up->uid != uid)
-                               continue;
-                       atomic_inc(&up->__count);
+       for (up = uidhash[hashent]; up ; up = up->next)
+               if (up->uid == uid)
+               {
+                       atomic_inc(&up->__count);
+                       return up;
                }
-               break;
-       }
-       return up;
+
+       return NULL;
 }
 
 /*

-- 
Dan Aloni 
[EMAIL PROTECTED]


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to