[LWN Logo]

Date:	Fri, 21 Apr 2000 20:03:42 +0200
From:	Manfred Spraul <manfreds@colorfullife.com>
To:	torvalds@transmeta.com, linux-kernel@vger.rutgers.edu,
Subject: [PATCH] f_op->poll() without lock_kernel()

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

kumon@flab.fujitsu.co.jp noticed that select() caused a high contention
for the kernel lock, so here is a patch that removes lock_kernel() from
poll().

I tested that patch with 2.3.99-pre5.
--
	Manfred
--------------AA572FAC1602050C686A1F55
Content-Type: text/plain; charset=us-ascii;
 name="patch-lockkernel"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch-lockkernel"

// $Header$
// Kernel Version:
//  VERSION = 2
//  PATCHLEVEL = 3
//  SUBLEVEL = 99
//  EXTRAVERSION = -pre5
--- 2.3/net/socket.c	Wed Apr 12 15:00:35 2000
+++ build-2.3/net/socket.c	Fri Apr 21 19:27:24 2000
@@ -566,7 +566,6 @@
 	struct socket *sock;
 	int err;
 
-	unlock_kernel();
 	sock = socki_lookup(file->f_dentry->d_inode);
 
 	/*
@@ -574,7 +573,6 @@
 	 */
 
 	err = sock->ops->poll(file, sock, wait);
-	lock_kernel();
 	return err;
 }
 
--- 2.3/fs/select.c	Thu Feb 10 22:39:09 2000
+++ build-2.3/fs/select.c	Fri Apr 21 19:27:48 2000
@@ -194,7 +194,6 @@
 	retval = 0;
 	for (;;) {
 		set_current_state(TASK_INTERRUPTIBLE);
-		lock_kernel();
 		for (i = 0 ; i < n; i++) {
 			unsigned long bit = BIT(i);
 			unsigned long mask;
@@ -227,7 +226,6 @@
 				wait = NULL;
 			}
 		}
-		unlock_kernel();
 		wait = NULL;
 		if (retval || !__timeout || signal_pending(current))
 			break;
@@ -462,9 +460,7 @@
 			goto out_fds1;
 	}
 
-	lock_kernel();
 	fdcount = do_poll(nfds, nchunks, nleft, fds, wait, timeout);
-	unlock_kernel();
 
 	/* OK, now copy the revents fields back to user space. */
 	for(i=0; i < nchunks; i++)
--- 2.3/include/linux/fs.h	Wed Apr 12 15:00:31 2000
+++ build-2.3/include/linux/fs.h	Fri Apr 21 19:40:12 2000
@@ -689,6 +689,12 @@
 	int (*revalidate) (kdev_t);
 };
 
+/*
+ * NOTE:
+ * read, write, poll, fsync, readv, writev can be called
+ *   without the big kernel lock held in all filesystems.
+ * fasync can be called at interrupt time.
+ */
 struct file_operations {
 	loff_t (*llseek) (struct file *, loff_t, int);
 	ssize_t (*read) (struct file *, char *, size_t, loff_t *);

--------------AA572FAC1602050C686A1F55--



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