From: Roland Dreier <roland@topspin.com>
To: jakub@redhat.com, ak@suse.de, ecd@skynet.be, pavel@suse.cz
Cc: discuss@x86-64.org, linux-kernel@vger.kernel.org
Subject: [PATCH] fs/compat.c: rwsem instead of BKL around ioctl32_hash_table
Date: Wed, 01 Sep 2004 08:40:15 -0700 [thread overview]
Message-ID: <524qmi2e1s.fsf@topspin.com> (raw)
In-Reply-To: <20040901072245.GF13749@mellanox.co.il> (Michael S. Tsirkin's message of "Wed, 1 Sep 2004 10:22:45 +0300")
Currently the BKL is used to synchronize access to ioctl32_hash_table
in fs/compat.c. It seems that an rwsem would be more appropriate,
since this would allow multiple lookups to occur in parallel (and also
serve the general good of minimizing use of the BKL).
I added lock_kernel()/unlock_kernel() around the call to t->handler
when a compatibility handler is found in compat_sys_ioctl() to
preserve the expectation that the BKL will be held during driver ioctl
operations. It should be safe to do lock_kernel() while holding
ioctl32_sem because of the magic BKL sleep semantics.
I have booted this and run some basic 32-bit userspace on ppc64, and
also compile tested this for x86_64 and sparc64.
Thanks,
Roland
Signed-off-by: Roland Dreier <roland@topspin.com>
Index: linux-bk/fs/compat.c
===================================================================
--- linux-bk.orig/fs/compat.c 2004-09-01 00:57:03.000000000 -0700
+++ linux-bk/fs/compat.c 2004-09-01 07:21:20.000000000 -0700
@@ -41,6 +41,7 @@
#include <linux/nfsd/nfsd.h>
#include <linux/nfsd/syscall.h>
#include <linux/personality.h>
+#include <linux/rwsem.h>
#include <net/sock.h> /* siocdevprivate_ioctl */
@@ -247,7 +248,8 @@
/* ioctl32 stuff, used by sparc64, parisc, s390x, ppc64, x86_64, MIPS */
#define IOCTL_HASHSIZE 256
-struct ioctl_trans *ioctl32_hash_table[IOCTL_HASHSIZE];
+static struct ioctl_trans *ioctl32_hash_table[IOCTL_HASHSIZE];
+static DECLARE_RWSEM(ioctl32_sem);
extern struct ioctl_trans ioctl_start[];
extern int ioctl_table_size;
@@ -302,12 +304,12 @@
if (!new_t)
return -ENOMEM;
- lock_kernel();
+ down_write(&ioctl32_sem);
for (t = ioctl32_hash_table[hash]; t; t = t->next) {
if (t->cmd == cmd) {
printk(KERN_ERR "Trying to register duplicated ioctl32 "
"handler %x\n", cmd);
- unlock_kernel();
+ up_write(&ioctl32_sem);
kfree(new_t);
return -EINVAL;
}
@@ -317,7 +319,7 @@
new_t->handler = handler;
ioctl32_insert_translation(new_t);
- unlock_kernel();
+ up_write(&ioctl32_sem);
return 0;
}
EXPORT_SYMBOL(register_ioctl32_conversion);
@@ -337,11 +339,11 @@
unsigned long hash = ioctl32_hash(cmd);
struct ioctl_trans *t, *t1;
- lock_kernel();
+ down_write(&ioctl32_sem);
t = ioctl32_hash_table[hash];
if (!t) {
- unlock_kernel();
+ up_write(&ioctl32_sem);
return -EINVAL;
}
@@ -351,7 +353,7 @@
__builtin_return_address(0), cmd);
} else {
ioctl32_hash_table[hash] = t->next;
- unlock_kernel();
+ up_write(&ioctl32_sem);
kfree(t);
return 0;
}
@@ -366,7 +368,7 @@
goto out;
} else {
t->next = t1->next;
- unlock_kernel();
+ up_write(&ioctl32_sem);
kfree(t1);
return 0;
}
@@ -376,7 +378,7 @@
printk(KERN_ERR "Trying to free unknown 32bit ioctl handler %x\n",
cmd);
out:
- unlock_kernel();
+ up_write(&ioctl32_sem);
return -EINVAL;
}
EXPORT_SYMBOL(unregister_ioctl32_conversion);
@@ -397,7 +399,7 @@
goto out;
}
- lock_kernel();
+ down_read(&ioctl32_sem);
t = ioctl32_hash_table[ioctl32_hash (cmd)];
@@ -405,14 +407,16 @@
t = t->next;
if (t) {
if (t->handler) {
+ lock_kernel();
error = t->handler(fd, cmd, arg, filp);
unlock_kernel();
+ up_read(&ioctl32_sem);
} else {
- unlock_kernel();
+ up_read(&ioctl32_sem);
error = sys_ioctl(fd, cmd, arg);
}
} else {
- unlock_kernel();
+ up_read(&ioctl32_sem);
if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
error = siocdevprivate_ioctl(fd, cmd, arg);
} else {
next prev parent reply other threads:[~2004-09-01 15:47 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-01 7:22 f_ops flag to speed up compatible ioctls in linux kernel Michael S. Tsirkin
2004-09-01 7:32 ` viro
2004-09-01 7:44 ` Michael S. Tsirkin
2004-09-01 7:47 ` Lee Revell
2004-09-01 8:19 ` Michael S. Tsirkin
2004-09-01 15:55 ` Roland Dreier
2004-09-01 18:02 ` Chris Wright
2004-09-01 18:12 ` Roland Dreier
2004-09-01 18:31 ` viro
2004-09-01 20:54 ` Roland Dreier
[not found] ` <20040901170800.K1924@build.pdx.osdl.net>
[not found] ` <20040901190122.L1924@build.pdx.osdl.net>
2004-09-02 3:46 ` Roland Dreier
2004-09-01 18:06 ` Bill Davidsen
2004-09-01 8:30 ` Arjan van de Ven
2004-09-01 15:40 ` Roland Dreier [this message]
2004-09-01 23:27 ` [PATCH] fs/compat.c: rwsem instead of BKL around ioctl32_hash_table Andrew Morton
2004-09-02 21:14 ` Andi Kleen
2004-09-02 22:26 ` Roland Dreier
2004-09-03 14:37 ` [discuss] " Andi Kleen
2004-09-03 14:55 ` Roland Dreier
2004-09-03 15:02 ` Andi Kleen
2004-09-03 8:00 ` [discuss] f_ops flag to speed up compatible ioctls in linux kernel Andi Kleen
2004-09-07 10:40 ` Michael S. Tsirkin
2004-09-07 12:14 ` Andi Kleen
2004-09-07 13:45 ` Michael S. Tsirkin
2004-09-07 14:15 ` Andi Kleen
2004-09-07 14:25 ` Michael S. Tsirkin
2004-09-07 14:29 ` Andi Kleen
2004-09-07 14:37 ` Michael S. Tsirkin
2004-09-07 14:44 ` Andi Kleen
2004-09-07 14:45 ` Michael S. Tsirkin
2004-09-07 15:10 ` Andi Kleen
2004-09-07 18:16 ` Michael S. Tsirkin
2004-09-08 6:55 ` Andi Kleen
2004-09-08 14:28 ` [patch] " Michael S. Tsirkin
2004-09-08 14:38 ` Andi Kleen
2004-09-08 14:54 ` Michael S. Tsirkin
2004-09-08 14:58 ` Andi Kleen
2004-09-12 20:05 ` Michael S. Tsirkin
2004-09-15 13:19 ` [patch] Re: [discuss] " Michael S. Tsirkin
2004-09-07 21:36 ` Is FIOQSIZE compatible? ( was Re: f_ops flag to speed up compatible ioctls in linux kernel) Michael S. Tsirkin
2004-09-08 6:54 ` Andi Kleen
2004-09-07 15:03 ` [discuss] f_ops flag to speed up compatible ioctls in linux kernel Herbert Poetzl
2004-09-07 18:07 ` Michael S. Tsirkin
2004-09-09 13:54 ` Herbert Poetzl
2004-12-12 21:51 ` how to detect a 32 bit process on 64 bit kernel Michael S. Tsirkin
2004-12-12 22:01 ` Jan Engelhardt
2004-12-12 22:23 ` Christoph Hellwig
2004-12-13 19:50 ` Michael S. Tsirkin
2004-12-13 21:01 ` Jan Engelhardt
2004-12-13 21:32 ` Brian Gerst
2004-12-13 21:37 ` Michael S. Tsirkin
2004-12-12 22:37 ` Willy Tarreau
2004-12-12 23:30 ` Bongani Hlope
2004-12-14 7:28 ` Andi Kleen
2004-09-20 14:49 ` [patch] speed up ioctls in linux kernel Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=524qmi2e1s.fsf@topspin.com \
--to=roland@topspin.com \
--cc=ak@suse.de \
--cc=discuss@x86-64.org \
--cc=ecd@skynet.be \
--cc=jakub@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.