From: Alexander Boyko Date: Thu, 1 Jun 2017 11:31:37 +0000 (+0300) Subject: LU-9579 osc: adds radix_tree_preload X-Git-Tag: 2.10.0-RC1~33 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=39ea3031dc6794cf8eb7e183a4412b124289c112 LU-9579 osc: adds radix_tree_preload The client fail with next error osc_page_init()) ASSERTION( result == 0 ) in low memory conditions. The patch fixes the problem above by adding radix_tree_preload. Signed-off-by: Alexander Boyko Seagate-bug-id: MRP-4424 Change-Id: I0a87366f8483fce4d2b3bcca449becce2a8262cb Reviewed-on: https://review.whamcloud.com/27372 Reviewed-by: Jinshan Xiong Reviewed-by: Bobi Jam Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/osc/osc_page.c b/lustre/osc/osc_page.c index 50d8ecd..949d370 100644 --- a/lustre/osc/osc_page.c +++ b/lustre/osc/osc_page.c @@ -262,31 +262,39 @@ int osc_page_init(const struct lu_env *env, struct cl_object *obj, { struct osc_object *osc = cl2osc(obj); struct osc_page *opg = cl_object_page_slice(obj, page); + struct osc_io *oio = osc_env_io(env); int result; opg->ops_from = 0; opg->ops_to = PAGE_SIZE; + INIT_LIST_HEAD(&opg->ops_lru); + result = osc_prep_async_page(osc, opg, page->cp_vmpage, cl_offset(obj, index)); - if (result == 0) { - struct osc_io *oio = osc_env_io(env); - opg->ops_srvlock = osc_io_srvlock(oio); - cl_page_slice_add(page, &opg->ops_cl, obj, index, - &osc_page_ops); - } - INIT_LIST_HEAD(&opg->ops_lru); + if (result != 0) + return result; + + opg->ops_srvlock = osc_io_srvlock(oio); + cl_page_slice_add(page, &opg->ops_cl, obj, index, + &osc_page_ops); + /* reserve an LRU space for this page */ - if (page->cp_type == CPT_CACHEABLE && result == 0) { + if (page->cp_type == CPT_CACHEABLE) { result = osc_lru_alloc(env, osc_cli(osc), opg); if (result == 0) { - spin_lock(&osc->oo_tree_lock); - result = radix_tree_insert(&osc->oo_tree, index, opg); - if (result == 0) - ++osc->oo_npages; - spin_unlock(&osc->oo_tree_lock); - LASSERT(result == 0); + result = radix_tree_preload(GFP_NOFS); + if (result == 0) { + spin_lock(&osc->oo_tree_lock); + result = radix_tree_insert(&osc->oo_tree, + index, opg); + if (result == 0) + ++osc->oo_npages; + spin_unlock(&osc->oo_tree_lock); + + radix_tree_preload_end(); + } } }