Chuck Ebbert f63cfaf
From: Roland McGrath <roland@redhat.com>
Chuck Ebbert f63cfaf
Date: Wed, 8 Sep 2010 02:36:28 +0000 (-0700)
Chuck Ebbert f63cfaf
Subject: execve: improve interactivity with large arguments
Chuck Ebbert f63cfaf
X-Git-Tag: v2.6.36-rc4~13
Chuck Ebbert f63cfaf
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=7993bc1f4663c0db67bb8f0d98e6678145b387cd
Chuck Ebbert f63cfaf
Chuck Ebbert f63cfaf
execve: improve interactivity with large arguments
Chuck Ebbert f63cfaf
Chuck Ebbert f63cfaf
This adds a preemption point during the copying of the argument and
Chuck Ebbert f63cfaf
environment strings for execve, in copy_strings().  There is already
Chuck Ebbert f63cfaf
a preemption point in the count() loop, so this doesn't add any new
Chuck Ebbert f63cfaf
points in the abstract sense.
Chuck Ebbert f63cfaf
Chuck Ebbert f63cfaf
When the total argument+environment strings are very large, the time
Chuck Ebbert f63cfaf
spent copying them can be much more than a normal user time slice.
Chuck Ebbert f63cfaf
So this change improves the interactivity of the rest of the system
Chuck Ebbert f63cfaf
when one process is doing an execve with very large arguments.
Chuck Ebbert f63cfaf
Chuck Ebbert f63cfaf
Signed-off-by: Roland McGrath <roland@redhat.com>
Chuck Ebbert f63cfaf
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Chuck Ebbert f63cfaf
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Chuck Ebbert f63cfaf
---
Chuck Ebbert f63cfaf
Chuck Ebbert f63cfaf
diff --git a/fs/exec.c b/fs/exec.c
Chuck Ebbert f63cfaf
index 1b63237..6f2d777 100644
Chuck Ebbert f63cfaf
--- a/fs/exec.c
Chuck Ebbert f63cfaf
+++ b/fs/exec.c
Chuck Ebbert f63cfaf
@@ -419,6 +419,8 @@ static int copy_strings(int argc, const char __user *const __user *argv,
Chuck Ebbert f63cfaf
 		while (len > 0) {
Chuck Ebbert f63cfaf
 			int offset, bytes_to_copy;
Chuck Ebbert f63cfaf
 
Chuck Ebbert f63cfaf
+			cond_resched();
Chuck Ebbert f63cfaf
+
Chuck Ebbert f63cfaf
 			offset = pos % PAGE_SIZE;
Chuck Ebbert f63cfaf
 			if (offset == 0)
Chuck Ebbert f63cfaf
 				offset = PAGE_SIZE;