From f6ef9d5b50bb879c0d2ebc2b305568669a9fb958 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 18 Jan 2004 18:29:54 -0800 Subject: [PATCH] [PATCH] kill_fasync speedup From: Manfred Spraul fasync_helper and kill_fasync are helpers for managing F_SETFL fcntl calls that change FASYNC and sending the necessary signals. The locking uses one global rwlock that's acquired for read in all kill_fasync calls, and that causes cache line trashing. This is not necessary: if the fasync list is empty, then there is no need to acquire the rwlock. Tests with reaim on a 4-way pIII on STP showed an 80% reduction of the time within kill_fasync. --- fs/fcntl.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fs/fcntl.c b/fs/fcntl.c index d4d43638b1539..7e824087e71f9 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -609,9 +609,15 @@ EXPORT_SYMBOL(__kill_fasync); void kill_fasync(struct fasync_struct **fp, int sig, int band) { - read_lock(&fasync_lock); - __kill_fasync(*fp, sig, band); - read_unlock(&fasync_lock); + /* First a quick test without locking: usually + * the list is empty. + */ + if (*fp) { + read_lock(&fasync_lock); + /* reread *fp after obtaining the lock */ + __kill_fasync(*fp, sig, band); + read_unlock(&fasync_lock); + } } EXPORT_SYMBOL(kill_fasync); -- 2.53.0