[Cluster-devel] [GFS2] Remove useless i_cache from inodes

Wendy Cheng wcheng at redhat.com
Tue Oct 16 20:25:56 UTC 2007


Steven Whitehouse wrote:

>>From aa974896eb5c1a70d4be6df1e3f9f5e12b8887f9 Mon Sep 17 00:00:00 2001
>From: Steven Whitehouse <swhiteho at redhat.com>
>Date: Mon, 15 Oct 2007 16:29:05 +0100
>Subject: [PATCH] [GFS2] Remove useless i_cache from inodes
>
>The i_cache was designed to keep references to the indirect blocks
>used during block mapping so that they didn't have to be looked
>up continually. The idea failed because there are too many places
>where the i_cache needs to be freed, and this has in the past been
>the cause of many bugs.
>  
>
There are not many places where this cache needs to be flushed. In GFS1 
and earlier versions of GFS2, it is done in glock transition and/or page 
releasing logic. These are places where the meta buffer could get 
altered by another nodes so the flush is required.

It is not clear to me why i_cache needs to be flushed in 
gfs2_remove_from_ail(). The added logic started from this patch:
http://lkml.org/lkml/2007/10/4/103 . I have doubts what this patch could 
fix. This is the place where gfs2 completes its journal entry 
processing. There is no reason to flush meta buffer cache since journal 
transaction doesn't seem to have anything to do with other node altering 
the meta buffer. If we want to remove anything, this is the logic that I 
would agree to get removed.

>In addition there was no performance benefit being gained since the
>disk blocks in question were cached anyway. So this patch removes
>it in order to simplify the code to prepare for other changes which
>would otherwise have had to add further support for this feature.
>  
>

I don't have performance data at this moment to back up my objection to 
this patch (but you don't have that either). However, intuitively, 
i_cache is part of the gfs2 inode struct. Accessing it is quick from 
latency point of view since we already have gfs2 inode on hand when this 
logic is involved. Be aware that all we care here is buffer head, not 
the page itself. But this new patch needs to parse thru VFS global page 
cache radix tree, including read_lock_irq() with the tree_lock, then get 
the page, then find the buffer head. It is hard to be convinced that it 
will help performance. And remember GFS2_MAX_META_HEIGHT is 10, way too 
small comparing to the page cache radix tree.

In reality, this is probably a trivial issue and would not worth our 
time to have heated debates on this. However, my gut feeling is that I 
woud prefer to keeping the i_cache. On the other hand, I do think the 
i_cache flushing needs to get removed from gfs2_remove_from_ail() - i.e. 
the original patch needs to get reverted (but need some testing time on 
this). 

So the important question here is why and how we need to mess with 
i_cache to "prepare for other changes"  ?

-- Wendy




More information about the Cluster-devel mailing list