lkml.org 
[lkml]   [2005]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 24/25] NTFS: Improve scalability by changing the driver global spin lock in
    [PATCH 24/25] NTFS: Improve scalability by changing the driver global spin lock in
    fs/ntfs/aops.c::ntfs_end_buffer_async_read() to a bit spin lock
    in the first buffer head of a page.

    Signed-off-by: Anton Altaparmakov <aia21@cantab.net>

    ---

    fs/ntfs/ChangeLog | 3 +++
    fs/ntfs/aops.c | 15 +++++++++------
    2 files changed, 12 insertions(+), 6 deletions(-)

    e604635c8bea16f6177e6133eb3efbfb4a029ef6
    diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog
    --- a/fs/ntfs/ChangeLog
    +++ b/fs/ntfs/ChangeLog
    @@ -86,6 +86,9 @@ ToDo/Notes:
    - Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
    where a concurrent truncate has truncated the runlist under our feet.
    - Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
    + - In fs/ntfs/aops.c::ntfs_end_buffer_async_read(), use a bit spin lock
    + in the first buffer head instead of a driver global spin lock to
    + improve scalability.

    2.1.23 - Implement extension of resident files and make writing safe as well as
    many bug fixes, cleanups, and enhancements...
    diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
    --- a/fs/ntfs/aops.c
    +++ b/fs/ntfs/aops.c
    @@ -55,9 +55,8 @@
    */
    static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
    {
    - static DEFINE_SPINLOCK(page_uptodate_lock);
    unsigned long flags;
    - struct buffer_head *tmp;
    + struct buffer_head *first, *tmp;
    struct page *page;
    ntfs_inode *ni;
    int page_uptodate = 1;
    @@ -89,11 +88,13 @@ static void ntfs_end_buffer_async_read(s
    }
    } else {
    clear_buffer_uptodate(bh);
    + SetPageError(page);
    ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.",
    (unsigned long long)bh->b_blocknr);
    - SetPageError(page);
    }
    - spin_lock_irqsave(&page_uptodate_lock, flags);
    + first = page_buffers(page);
    + local_irq_save(flags);
    + bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
    clear_buffer_async_read(bh);
    unlock_buffer(bh);
    tmp = bh;
    @@ -108,7 +109,8 @@ static void ntfs_end_buffer_async_read(s
    }
    tmp = tmp->b_this_page;
    } while (tmp != bh);
    - spin_unlock_irqrestore(&page_uptodate_lock, flags);
    + bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
    + local_irq_restore(flags);
    /*
    * If none of the buffers had errors then we can set the page uptodate,
    * but we first have to perform the post read mst fixups, if the
    @@ -141,7 +143,8 @@ static void ntfs_end_buffer_async_read(s
    unlock_page(page);
    return;
    still_busy:
    - spin_unlock_irqrestore(&page_uptodate_lock, flags);
    + bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
    + local_irq_restore(flags);
    return;
    }

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-09-09 11:35    [W:0.022 / U:59.248 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site