SysV IPC loop speedups, kernel 2.4.3
PATCH 1/1 SysV IPC loop speedups, kernel 2.4.3
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.
Signature · 4 lines
-------------------------+-------------------------------------------- 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
ipc/msg.c +37 -33
@@ -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 ; }