[PATCH] SysV IPC loop speedups, kernel 2.4.3

Scott Maxwell (maxwell@ScottMaxwell.org)
Tue, 17 Apr 2001 23:00:59 -0700


This is a multi-part message in MIME format.
--------------1823B5F00D0D214EF46A04BE
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

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
--------------1823B5F00D0D214EF46A04BE
Content-Type: text/plain; charset=us-ascii;
 name="ipc-msg-loop.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="ipc-msg-loop.patch"

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; }

--------------1823B5F00D0D214EF46A04BE--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/