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/