From: Jan Kara <jack@suse.cz>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Jan Kara <jack@suse.cz>, Christoph Hellwig <hch@infradead.org>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH] BKL: Remove BKL from isofs
Date: Mon, 20 Sep 2010 17:18:34 +0200 [thread overview]
Message-ID: <20100920151834.GF3390@quack.suse.cz> (raw)
In-Reply-To: <201009201313.11526.arnd@arndb.de>
[-- Attachment #1: Type: text/plain, Size: 1605 bytes --]
On Mon 20-09-10 13:13:11, Arnd Bergmann wrote:
> On Monday 20 September 2010, Jan Kara wrote:
> > Hmm, looking through the code, I actually don't see a reason
> > why we should need any per-sb lock at all. The filesystem is always
> > read-only and we don't seem to have any global data structures that
> > change. But that needs some testing I guess - I'll try to do that.
>
> Ok, great! The BKL was basically as wrong as the global mutex protecting
> the operations anyway, because it does not document what data is
> actually getting protected in any of all the drivers that I'm converting
> to a private mutex.
>
> Given more time for code inspection and some testing, you can probably
> come up with a good explanation why the BKL is not needed in all those
> places, but since nobody ever bothered to do this for the last decade
> for all these drivers, my approach was to simply prove (in a rather lose
> sense) that I can't make it worse by converting to a mutex.
Attached is an obvious patch with some reasoning. I've also run for about
half an hour 10 parallel tar processes continuously reading the isofs image
in a loop. In parallel was running an infinite loop with "echo 2
>/proc/sys/vm/drop_caches" so directory entries were constantly reread from
the filesystem. The whole thing was running inside KVM so the fs image was
actually cached in memory. The machine has 8 CPUs so I think reasonable
paralelism has happened and all seemed happy. So I think the patch should
be safe to put into some tree for testing in inclusion...
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
[-- Attachment #2: 0001-isofs-Remove-BKL.patch --]
[-- Type: text/x-patch, Size: 4026 bytes --]
>From 95263e60835707d394f4a4daa6b916737b569f01 Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Mon, 20 Sep 2010 15:11:54 +0200
Subject: [PATCH] isofs: Remove BKL
BKL isn't needed for isofs at all so we can just remove it. Generally, since
isofs is always mounted read-only, filesystem structure cannot change under us.
So buffer_head contents stays constant after it's filled in. That leaves us
with possible changes of global data structures. Superblock changes only during
filesystem mount (even remount does not change it), inodes are only filled in
during reading from disk. So there are no changes of these structures to
bother about.
Arguments why BKL can be removed at each place:
isofs_readdir: Accesses sb, inode, filp, local variables => no BKL needed
isofs_put_super: VFS guards us against races with mount (for sb access).
Otherwise BKL not needed.
isofs_get_blocks: Accesses sb, inode, local variables (filled in buffer heads
are local) => no BLK needed
isofs_lookup: Protected by directory's i_mutex. Accesses sb, inode, dentry,
local variables => no BKL needed
rock_ridge_symlink_readpage: Protected by page lock. Accesses sb, inode,
local variables => no BKL needed.
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/isofs/dir.c | 2 --
fs/isofs/inode.c | 7 -------
fs/isofs/namei.c | 3 ---
fs/isofs/rock.c | 3 ---
4 files changed, 0 insertions(+), 15 deletions(-)
diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c
index e0aca9a..b29d48e 100644
--- a/fs/isofs/dir.c
+++ b/fs/isofs/dir.c
@@ -260,13 +260,11 @@ static int isofs_readdir(struct file *filp,
if (tmpname == NULL)
return -ENOMEM;
- lock_kernel();
tmpde = (struct iso_directory_record *) (tmpname+1024);
result = do_isofs_readdir(inode, filp, dirent, filldir, tmpname, tmpde);
free_page((unsigned long) tmpname);
- unlock_kernel();
return result;
}
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 5a44811..d8a68e7 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -44,11 +44,7 @@ static void isofs_put_super(struct super_block *sb)
struct isofs_sb_info *sbi = ISOFS_SB(sb);
#ifdef CONFIG_JOLIET
- lock_kernel();
-
unload_nls(sbi->s_nls_iocharset);
-
- unlock_kernel();
#endif
kfree(sbi);
@@ -977,8 +973,6 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
int section, rv, error;
struct iso_inode_info *ei = ISOFS_I(inode);
- lock_kernel();
-
error = -EIO;
rv = 0;
if (iblock < 0 || iblock != iblock_s) {
@@ -1054,7 +1048,6 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
error = 0;
abort:
- unlock_kernel();
return rv != 0 ? rv : error;
}
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c
index ab438be..c9c7498 100644
--- a/fs/isofs/namei.c
+++ b/fs/isofs/namei.c
@@ -177,7 +177,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
if (!page)
return ERR_PTR(-ENOMEM);
- lock_kernel();
found = isofs_find_entry(dir, dentry,
&block, &offset,
page_address(page),
@@ -188,10 +187,8 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
if (found) {
inode = isofs_iget(dir->i_sb, block, offset);
if (IS_ERR(inode)) {
- unlock_kernel();
return ERR_CAST(inode);
}
}
- unlock_kernel();
return d_splice_alias(inode, dentry);
}
diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
index 96a685c..a679b55 100644
--- a/fs/isofs/rock.c
+++ b/fs/isofs/rock.c
@@ -678,7 +678,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
init_rock_state(&rs, inode);
block = ei->i_iget5_block;
- lock_kernel();
bh = sb_bread(inode->i_sb, block);
if (!bh)
goto out_noread;
@@ -748,7 +747,6 @@ repeat:
goto fail;
brelse(bh);
*rpnt = '\0';
- unlock_kernel();
SetPageUptodate(page);
kunmap(page);
unlock_page(page);
@@ -765,7 +763,6 @@ out_bad_span:
printk("symlink spans iso9660 blocks\n");
fail:
brelse(bh);
- unlock_kernel();
error:
SetPageError(page);
kunmap(page);
--
1.6.4.2
next prev parent reply other threads:[~2010-09-20 15:18 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-16 14:32 Remaining BKL users, what to do Arnd Bergmann
2010-09-16 14:49 ` Steven Rostedt
2010-09-16 18:32 ` Jens Axboe
2010-09-17 18:46 ` Arnd Bergmann
2010-09-16 15:04 ` Jan Kara
2010-09-16 21:26 ` Anton Altaparmakov
2010-09-17 10:45 ` Arnd Bergmann
2010-09-17 13:32 ` Christoph Hellwig
2010-09-17 13:50 ` Arnd Bergmann
2010-09-17 14:02 ` Christoph Hellwig
2010-09-17 14:56 ` Arnd Bergmann
2010-09-17 19:00 ` [PATCH] BKL: Remove BKL from isofs Arnd Bergmann
2010-09-20 10:58 ` Jan Kara
2010-09-20 11:13 ` Arnd Bergmann
2010-09-20 15:18 ` Jan Kara [this message]
2010-09-20 15:40 ` Alexander E. Patrakov
2010-09-20 15:50 ` Jan Kara
2010-09-16 15:07 ` Remaining BKL users, what to do Alan Cox
2010-09-16 20:08 ` David Miller
2010-09-16 16:09 ` Anders Larsen
2010-09-16 16:57 ` Samuel Ortiz
2010-09-16 20:08 ` David Miller
2010-09-16 19:00 ` Jan Harkes
2010-09-16 19:26 ` Arnd Bergmann
2010-09-20 1:25 ` [autofs] " Ian Kent
2010-10-18 15:42 ` [v2] " Arnd Bergmann
2010-10-18 16:19 ` Christoph Hellwig
2010-10-18 17:38 ` Arnd Bergmann
2010-10-18 18:43 ` [Ksummit-2010-discuss] " Greg KH
2010-10-18 23:00 ` Dave Airlie
2010-10-19 0:40 ` Greg KH
2010-10-19 0:57 ` Dave Airlie
2010-10-19 2:24 ` Greg KH
2010-10-19 2:45 ` Dave Airlie
2010-10-19 3:33 ` Steven Rostedt
2010-10-19 4:03 ` Dave Airlie
2010-10-19 5:00 ` Theodore Kilgore
2010-10-19 4:52 ` Dave Airlie
2010-10-19 7:26 ` Arnd Bergmann
2010-10-19 12:39 ` Steven Rostedt
2010-10-19 13:54 ` Paul Mundt
2010-10-19 13:26 ` Arnd Bergmann
2010-10-19 20:50 ` Dave Airlie
2010-10-20 16:14 ` Ville Syrjälä
2010-10-19 18:24 ` Valdis.Kletnieks
2010-10-19 19:37 ` Greg KH
2010-10-19 19:40 ` Oliver Neukum
2010-10-19 20:29 ` Greg KH
2010-10-19 20:38 ` Jiri Kosina
2010-10-19 20:41 ` Alan Cox
2010-10-19 20:48 ` Arnd Bergmann
2010-10-19 20:44 ` Arnd Bergmann
2010-10-20 4:43 ` Dave Young
2010-10-20 6:50 ` Arnd Bergmann
2010-11-02 1:21 ` Pavel Machek
2010-11-03 6:58 ` Pekka Enberg
2010-10-21 12:47 ` Christoph Hellwig
2010-10-21 13:38 ` Arnd Bergmann
2010-10-21 13:50 ` [PATCH 1/2] BKL: remove BKL from qnx4 Arnd Bergmann
2010-10-21 15:22 ` Anders Larsen
2010-10-21 13:51 ` [PATCH 2/2] BKL: remove BKL from freevxfs Arnd Bergmann
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=20100920151834.GF3390@quack.suse.cz \
--to=jack@suse.cz \
--cc=arnd@arndb.de \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).