Skip to content

Commit

Permalink
[GFS2] Reorganize function gfs2_glmutex_lock
Browse files Browse the repository at this point in the history
This patch optimizes the function gfs2_glmutex_lock.
The basic theory is: Why bother initializing a holder, setting up
wait bits and then waiting on them, if you know the glock can be
yours.  So the holder stuff is placed inside the if checking if the
glock is locked.  This one needs careful scrutiny because changing
anything to do with locking should strike terror into one's heart.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Bob Peterson authored and Steven Whitehouse committed Jan 25, 2008
1 parent 5fdc2ee commit 398bbe6
Showing 1 changed file with 9 additions and 14 deletions.
23 changes: 9 additions & 14 deletions fs/gfs2/glock.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
* Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
* Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
Expand Down Expand Up @@ -620,26 +620,21 @@ static void run_queue(struct gfs2_glock *gl)

static void gfs2_glmutex_lock(struct gfs2_glock *gl)
{
struct gfs2_holder gh;

gfs2_holder_init(gl, 0, 0, &gh);
if (test_and_set_bit(HIF_WAIT, &gh.gh_iflags))
BUG();

spin_lock(&gl->gl_spin);
if (test_and_set_bit(GLF_LOCK, &gl->gl_flags)) {
struct gfs2_holder gh;

gfs2_holder_init(gl, 0, 0, &gh);
set_bit(HIF_WAIT, &gh.gh_iflags);
list_add_tail(&gh.gh_list, &gl->gl_waiters1);
spin_unlock(&gl->gl_spin);
wait_on_holder(&gh);
gfs2_holder_uninit(&gh);
} else {
gl->gl_owner_pid = current->pid;
gl->gl_ip = (unsigned long)__builtin_return_address(0);
clear_bit(HIF_WAIT, &gh.gh_iflags);
smp_mb();
wake_up_bit(&gh.gh_iflags, HIF_WAIT);
spin_unlock(&gl->gl_spin);
}
spin_unlock(&gl->gl_spin);

wait_on_holder(&gh);
gfs2_holder_uninit(&gh);
}

/**
Expand Down

0 comments on commit 398bbe6

Please sign in to comment.