31 Mar, 2008

2 commits

  • Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     
  • This patch is performance related. When we're doing a log flush,
    I noticed we were calling buf_lo_incore_commit twice: once for
    data bufs and once for metadata bufs. Since this is the same
    function and does the same thing in both cases, there should be
    no reason to call it twice. Since we only need to call it once,
    we can also make it faster by removing it from the generic "lops"
    code and making it a stand-along static function.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     

25 Jan, 2008

2 commits

  • The only reason for adding glocks to the journal was to keep track
    of which locks required a log flush prior to release. We add a
    flag to the glock to allow this check to be made in a simpler way.

    This reduces the size of a glock (by 12 bytes on i386, 24 on x86_64)
    and means that we can avoid extra work during the journal flush.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This patch splits gfs2_writepage into separate functions for each of
    the three cases: writeback, ordered and journalled. As a result
    it becomes a lot easier to see what each one is doing. The common
    code is moved into gfs2_writepage_common.

    This fixes a performance bug where we were doing more work than
    strictly required in the ordered write case.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     

10 Oct, 2007

8 commits

  • This patch cleans up the code for writing journaled data into the log.
    It also removes the need to allocate a small "tag" structure for each
    block written into the log. Instead we just keep count of the outstanding
    I/O so that we can be sure that its all been written at the correct time.
    Another result of this patch is that a number of ll_rw_block() calls
    have become submit_bh() calls, closing some races at the same time.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The following alters gfs2_trans_add_revoke() to take a struct
    gfs2_bufdata as an argument. This eliminates the memory allocation which
    was previously required by making use of the already existing struct
    gfs2_bufdata. It makes some sanity checks to ensure that the
    gfs2_bufdata has been removed from all the lists before its recycled as
    a revoke structure. This saves one memory allocation and one free per
    revoke structure.

    Also as a result, and to simplify the locking, since there is no longer
    any blocking code in gfs2_trans_add_revoke() we must hold the log lock
    whenever this function is called. This reduces the amount of times we
    take and unlock the log lock.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The old revoke structure was allocated using kalloc/kfree but
    there is a slab cache for gfs2_bufdata, so we should use that
    now that the structures have been converted.

    This is part two of the patch series to merge the revoke
    and gfs2_bufdata structures.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • Both the revoke structure and the bufdata structure are quite similar.
    They are basically small tags which are put on lists. In addition to
    which the revoke structure is always allocated when there is a bufdata
    structure which is (or can be) freed. As such it should be possible to
    reduce the number of frees and allocations by using the same structure
    for both purposes.

    This patch is the first step along that path. It replaces existing uses
    of the revoke structure with the bufdata structure.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • The following patch removes the ordered write processing from
    databuf_lo_before_commit() and moves it to log.c. This has the effect of
    greatly simplyfying databuf_lo_before_commit() and well as potentially
    making the ordered write code more efficient.

    As a side effect of this, its now possible to remove ordered buffers
    from the ordered buffer list at any time, so we now make use of this in
    invalidatepage and releasepage to ensure timely release of these
    buffers.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • gfs2_pin and gfs2_unpin are only used in lops.c, despite being
    defined in meta_io.c, so this patch moves them into lops.c and
    makes them static. At the same time, its possible to clean up
    the locking in the buf and databuf _lo_add() functions so that
    we only need to grab the spinlock once. Also we have to move
    lock_buffer() around the _lo_add() functions since we can't
    do that in gfs2_pin() any more since we hold the spinlock
    for the duration of that function.

    As a result, the code shrinks by 12 lines and we do far fewer
    operations when adding buffers to the log. It also makes the
    code somewhat easier to read & understand.

    Signed-off-by: Steven Whitehouse

    Steven Whitehouse
     
  • This is a patch to GFS2 to protect sd_log_num_jdata with the
    gfs2_log_lock. Without this patch, there is a timing window
    where you can get hit the following assert from function
    gfs2_log_flush():

    gfs2_assert_withdraw(sdp,
    sdp->sd_log_num_buf + sdp->sd_log_num_jdata ==
    sdp->sd_log_commited_buf +
    sdp->sd_log_commited_databuf);

    I've tested it on my roth cluster and it fixes the problem.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     
  • This is the first of five patches for bug #248176:

    There were still some critical variables being manipulated outside
    the log_lock spinlock. That usually resulted in a hang.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson
     

14 Aug, 2007

1 commit

  • This is part 2 of the patch for bug #245832, part 1 of which is already
    in the git tree.

    The problem was that sdp->sd_log_num_databuf was not always being
    protected by the gfs2_log_lock spinlock, but the sd_log_le_databuf
    (which it is supposed to reflect) was protected. That meant there
    was a timing window during which gfs2_log_flush called
    databuf_lo_before_commit and the count didn't match what was
    really on the linked list in that window. So when it ran out of
    items on the linked list, it decremented total_dbuf from 0 to -1 and
    thus never left the "while(total_dbuf)" loop.

    The solution is to protect the variable sdp->sd_log_num_databuf so
    that the value will always match the contents of the linked list,
    and therefore the number will never go negative, and therefore, the
    loop will be exited properly.

    Signed-off-by: Bob Peterson
    Signed-off-by: Steven Whitehouse

    Bob Peterson