svn commit: r332881 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Mon Apr 23 07:54:03 UTC 2018
Author: mjg
Date: Mon Apr 23 07:54:02 2018
New Revision: 332881
URL: https://svnweb.freebsd.org/changeset/base/332881
Log:
lockf: skip locking the graph if not necessary (common case)
Tested by: pho
Modified:
head/sys/kern/kern_lockf.c
Modified: head/sys/kern/kern_lockf.c
==============================================================================
--- head/sys/kern/kern_lockf.c Mon Apr 23 07:52:56 2018 (r332880)
+++ head/sys/kern/kern_lockf.c Mon Apr 23 07:54:02 2018 (r332881)
@@ -1053,6 +1053,12 @@ lf_add_incoming(struct lockf *state, struct lockf_entr
struct lockf_entry *overlap;
int error;
+ sx_assert(&state->ls_lock, SX_XLOCKED);
+ if (LIST_EMPTY(&state->ls_pending))
+ return (0);
+
+ error = 0;
+ sx_xlock(&lf_owner_graph_lock);
LIST_FOREACH(overlap, &state->ls_pending, lf_link) {
if (!lf_blocks(lock, overlap))
continue;
@@ -1070,10 +1076,11 @@ lf_add_incoming(struct lockf *state, struct lockf_entr
*/
if (error) {
lf_remove_incoming(lock);
- return (error);
+ break;
}
}
- return (0);
+ sx_xunlock(&lf_owner_graph_lock);
+ return (error);
}
/*
@@ -1509,9 +1516,7 @@ lf_setlock(struct lockf *state, struct lockf_entry *lo
* edges from any currently pending lock that the new lock
* would block.
*/
- sx_xlock(&lf_owner_graph_lock);
error = lf_add_incoming(state, lock);
- sx_xunlock(&lf_owner_graph_lock);
if (error) {
#ifdef LOCKF_DEBUG
if (lockf_debug & 1)
@@ -1840,9 +1845,7 @@ lf_split(struct lockf *state, struct lockf_entry *lock
splitlock->lf_start = lock2->lf_end + 1;
LIST_INIT(&splitlock->lf_outedges);
LIST_INIT(&splitlock->lf_inedges);
- sx_xlock(&lf_owner_graph_lock);
lf_add_incoming(state, splitlock);
- sx_xunlock(&lf_owner_graph_lock);
lf_set_end(state, lock1, lock2->lf_start - 1, granted);
More information about the svn-src-all
mailing list