LWN.net Logo

user-vm-unlock-2.5.31-A2

From:  Ingo Molnar <mingo@elte.hu>
To:  Linus Torvalds <torvalds@transmeta.com>
Subject:  [patch] user-vm-unlock-2.5.31-A2
Date:  Tue, 13 Aug 2002 23:23:30 +0200 (CEST)
Cc:  linux-kernel@vger.kernel.org


and here's a merged CLONE_VM_RELEASE patch against the previous
clone-detached patch. (the sched.h reorganization broke it.)

I've tested it and userspace VM-release still works (after fixing the test
tool to use the repositioned clone flag bit):

  [mingo@a mingo]$ ./start-detached 1000 1 0
  stack end: 0x12341234
  started up 1000 threads!
  stack end after all threads exited: 0x00000000.

	Ingo

--- linux/arch/i386/kernel/process.c.orig	Tue Aug 13 23:14:39 2002
+++ linux/arch/i386/kernel/process.c	Tue Aug 13 23:20:48 2002
@@ -566,6 +566,7 @@
 	struct_cpy(childregs, regs);
 	childregs->eax = 0;
 	childregs->esp = esp;
+	p->user_vm_lock = NULL;
 
 	p->thread.esp = (unsigned long) childregs;
 	p->thread.esp0 = (unsigned long) (childregs+1);
@@ -579,6 +580,19 @@
 	unlazy_fpu(tsk);
 	struct_cpy(&p->thread.i387, &tsk->thread.i387);
 
+	if (unlikely(NULL != tsk->thread.ts_io_bitmap)) {
+		p->thread.ts_io_bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
+		if (!p->thread.ts_io_bitmap)
+			return -ENOMEM;
+		memcpy(p->thread.ts_io_bitmap, tsk->thread.ts_io_bitmap,
+			IO_BITMAP_BYTES);
+	}
+
+	/*
+	 * The common fastpath:
+	 */
+	if (!(clone_flags & (CLONE_SETTLS | CLONE_SETTID | CLONE_RELEASE_VM)))
+		return 0;
 	/*
 	 * Set a new TLS for the child thread?
 	 */
@@ -608,14 +622,13 @@
 		if (put_user(p->pid, (pid_t *)childregs->edx))
 			return -EFAULT;
 
-	if (unlikely(NULL != tsk->thread.ts_io_bitmap)) {
-		p->thread.ts_io_bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-		if (!p->thread.ts_io_bitmap)
-			return -ENOMEM;
-		memcpy(p->thread.ts_io_bitmap, tsk->thread.ts_io_bitmap,
-			IO_BITMAP_BYTES);
+	/*
+	 * Does the userspace VM want any unlock on mm_release()?
+	 */
+	if (clone_flags & CLONE_RELEASE_VM) {
+		childregs->esp -= sizeof(0UL);
+		p->user_vm_lock = (long *) esp;
 	}
-
 	return 0;
 }
 
--- linux/include/linux/sched.h.orig	Tue Aug 13 23:14:51 2002
+++ linux/include/linux/sched.h	Tue Aug 13 23:21:21 2002
@@ -48,6 +48,7 @@
 #define CLONE_SETTLS	0x00080000	/* create a new TLS for the child */
 #define CLONE_SETTID	0x00100000	/* write the TID back to userspace */
 #define CLONE_DETACHED	0x00200000	/* parent wants no child-exit signal */
+#define CLONE_RELEASE_VM 0x00400000	/* release the userspace VM */
 
 #define CLONE_SIGNAL	(CLONE_SIGHAND | CLONE_THREAD)
 
@@ -306,6 +307,7 @@
 
 	wait_queue_head_t wait_chldexit;	/* for wait4() */
 	struct completion *vfork_done;		/* for vfork() */
+	long *user_vm_lock;			/* for CLONE_RELEASE_VM */
 
 	unsigned long rt_priority;
 	unsigned long it_real_value, it_prof_value, it_virt_value;
--- linux/kernel/fork.c.orig	Tue Aug 13 23:14:51 2002
+++ linux/kernel/fork.c	Tue Aug 13 23:20:48 2002
@@ -367,6 +367,12 @@
 		tsk->vfork_done = NULL;
 		complete(vfork_done);
 	}
+	if (tsk->user_vm_lock)
+		/*
+		 * We dont check the error code - if userspace has
+		 * not set up a proper pointer then tough luck.
+		 */
+		put_user(0UL, tsk->user_vm_lock);
 }
 
 static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)

-
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/

Copyright © 2002, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds