Whamcloud - gitweb
LU-9579 osc: adds radix_tree_preload 72/27372/4
authorAlexander Boyko <alexander.boyko@seagate.com>
Thu, 1 Jun 2017 11:31:37 +0000 (14:31 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 13 Jun 2017 16:54:41 +0000 (16:54 +0000)
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 <alexander.boyko@seagate.com>
Seagate-bug-id: MRP-4424
Change-Id: I0a87366f8483fce4d2b3bcca449becce2a8262cb
Reviewed-on: https://review.whamcloud.com/27372
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osc/osc_page.c

index 50d8ecd..949d370 100644 (file)
@@ -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();
+                       }
                }
        }