Skip to contentSkip to conversation

SysV IPC loop speedups, kernel 2.4.3

PATCH New Scott Maxwell 1 participant 1 message Apr 18, 2001

lore
Share & tools
lore
#0 lore raw

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
diff -urN linux-2.4.3/ipc/msg.c linux/ipc/msg.c
@@ -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;
 }