From: Li Dongyang Date: Fri, 14 Dec 2018 01:19:09 +0000 (+1100) Subject: LU-11775 osc: reduce lock contention in osc_unreserve_grant X-Git-Tag: 2.12.56~85 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=8a1ae45a3e4f828346c890bf4ccacbd68ea6752c LU-11775 osc: reduce lock contention in osc_unreserve_grant In osc_queue_async_io() the cl_loi_list_lock is acquired to reserve and consume the grant and released, right after we expand the extent the same lock is used to unreserve the grant. We can keep the spinlock when we are done with the grant to improve the throughput. mpirun -np 32 /root/ior-openmpi/src/ior -w -t 1m -b 8g -F -e -vv -o /scratch0/file -i 1 master: Max Write: 13799.70 MiB/sec (14470.04 MB/sec) master with 33858: Max Write: 14339.57 MiB/sec (15036.13 MB/sec) Signed-off-by: Li Dongyang Change-Id: Ic61af84c7b98b5a189d7adabe33ae687954b2ed4 Reviewed-on: https://review.whamcloud.com/33858 Tested-by: Jenkins Reviewed-by: Patrick Farrell Reviewed-by: Alexey Lyashkov Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index ea721ba..ef3b2c0 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -584,6 +584,7 @@ int osc_extent_release(const struct lu_env *env, struct osc_extent *ext) * osc_cache_truncate_start(). */ osc_extent_state_set(ext, OES_TRUNC); ext->oe_trunc_pending = 0; + osc_object_unlock(obj); } else { int grant = 0; @@ -596,8 +597,6 @@ int osc_extent_release(const struct lu_env *env, struct osc_extent *ext) grant += cli->cl_grant_extent_tax; if (osc_extent_merge(env, ext, next_extent(ext)) == 0) grant += cli->cl_grant_extent_tax; - if (grant > 0) - osc_unreserve_grant(cli, 0, grant); if (ext->oe_urgent) list_move_tail(&ext->oe_link, @@ -606,8 +605,10 @@ int osc_extent_release(const struct lu_env *env, struct osc_extent *ext) list_move_tail(&ext->oe_link, &obj->oo_full_exts); } + osc_object_unlock(obj); + if (grant > 0) + osc_unreserve_grant(cli, 0, grant); } - osc_object_unlock(obj); osc_io_unplug_async(env, cli, obj); } @@ -1470,13 +1471,20 @@ static void __osc_unreserve_grant(struct client_obd *cli, } } -static void osc_unreserve_grant(struct client_obd *cli, - unsigned int reserved, unsigned int unused) +static void osc_unreserve_grant_nolock(struct client_obd *cli, + unsigned int reserved, + unsigned int unused) { - spin_lock(&cli->cl_loi_list_lock); __osc_unreserve_grant(cli, reserved, unused); if (unused > 0) osc_wake_cache_waiters(cli); +} + +static void osc_unreserve_grant(struct client_obd *cli, + unsigned int reserved, unsigned int unused) +{ + spin_lock(&cli->cl_loi_list_lock); + osc_unreserve_grant_nolock(cli, reserved, unused); spin_unlock(&cli->cl_loi_list_lock); } @@ -2432,7 +2440,6 @@ int osc_queue_async_io(const struct lu_env *env, struct cl_io *io, /* it doesn't need any grant to dirty this page */ spin_lock(&cli->cl_loi_list_lock); rc = osc_enter_cache_try(cli, oap, grants, 0); - spin_unlock(&cli->cl_loi_list_lock); if (rc == 0) { /* try failed */ grants = 0; need_release = 1; @@ -2446,10 +2453,11 @@ int osc_queue_async_io(const struct lu_env *env, struct cl_io *io, } else { OSC_EXTENT_DUMP(D_CACHE, ext, "expanded for %lu.\n", index); - osc_unreserve_grant(cli, grants, tmp); + osc_unreserve_grant_nolock(cli, grants, tmp); grants = 0; } } + spin_unlock(&cli->cl_loi_list_lock); rc = 0; } else if (ext != NULL) { /* index is located outside of active extent */