This patch contains a couple of micro-optimizations for the loops in
ipc/msg.c's load_msg() and store_msg().  It works fine for me under
2.4.3.

-- 
-------------------------+--------------------------------------------
R H L U  Scott Maxwell:  | ``Life results from the non-random survival
E A I X     maxwell@     |   of randomly varying replicators.''
D T N 6 ScottMaxwell.org |     -- Richard Dawkins
diff -urN linux-2.4.3/ipc/msg.c linux/ipc/msg.c
--- linux-2.4.3/ipc/msg.c       Mon Feb 19 10:18:18 2001
+++ linux/ipc/msg.c     Tue Apr 17 22:34:36 2001
@@ -177,28 +177,30 @@
                goto out_err;
        }
 
-       len -= alen;
-       src = ((char*)src)+alen;
-       pseg = &msg->next;
-       while(len > 0) {
-               struct msg_msgseg* seg;
-               alen = len;
-               if(alen > DATALEN_SEG)
-                       alen = DATALEN_SEG;
-               seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
-               if(seg==NULL) {
-                       err=-ENOMEM;
-                       goto out_err;
-               }
-               *pseg = seg;
-               seg->next = NULL;
-               if(copy_from_user (seg+1, src, alen)) {
-                       err = -EFAULT;
-                       goto out_err;
+       if (len > DATALEN_MSG) {
+               pseg = &msg->next;
+               while(len > alen) {
+                       struct msg_msgseg* seg;
+
+                       len -= alen;
+                       src = ((char*)src)+alen;
+
+                       alen = len;
+                       if(alen > DATALEN_SEG)
+                               alen = DATALEN_SEG;
+                       seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, 
+GFP_KERNEL);
+                       if(seg==NULL) {
+                               err=-ENOMEM;
+                               goto out_err;
+                       }
+                       *pseg = seg;
+                       seg->next = NULL;
+                       if(copy_from_user (seg+1, src, alen)) {
+                               err = -EFAULT;
+                               goto out_err;
+                       }
+                       pseg = &seg->next;
                }
-               pseg = &seg->next;
-               len -= alen;
-               src = ((char*)src)+alen;
        }
        return msg;
 
@@ -218,18 +220,20 @@
        if(copy_to_user (dest, msg+1, alen))
                return -1;
 
-       len -= alen;
-       dest = ((char*)dest)+alen;
-       seg = msg->next;
-       while(len > 0) {
-               alen = len;
-               if(alen > DATALEN_SEG)
-                       alen = DATALEN_SEG;
-               if(copy_to_user (dest, seg+1, alen))
-                       return -1;
-               len -= alen;
-               dest = ((char*)dest)+alen;
-               seg=seg->next;
+       if (len > DATALEN_MSG) {
+               seg = msg->next;
+               while(len > alen) {
+                       len -= alen;
+                       dest = ((char*)dest)+alen;
+
+                       alen = len;
+                       if(alen > DATALEN_SEG)
+                               alen = DATALEN_SEG;
+                       if(copy_to_user (dest, seg+1, alen))
+                               return -1;
+
+                       seg=seg->next;
+               }
        }
        return 0;
 }

Reply via email to