Whamcloud - gitweb
LU-4933 osc: Automatically tune the max_dirty_mb 34/10034/3
authorLi Xi <lixi@ddn.com>
Mon, 21 Apr 2014 14:20:27 +0000 (22:20 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 20 May 2014 04:15:50 +0000 (04:15 +0000)
When RPC size or the max RPCs in flight is increased, the actual
limit might be max_dirty_mb value. This patch automatically set
that max_dirty_mb value at connection time and when the related
values are tuned manually by proc file system.

Signed-off-by: Li Xi <lixi@ddn.com>
Change-Id: I95e3e32294a96c4022bcefe392d375583f879b2e
Reviewed-on: http://review.whamcloud.com/10034
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
lustre/include/obd.h
lustre/ldlm/ldlm_lib.c
lustre/osc/lproc_osc.c
lustre/ptlrpc/import.c

index b161c11..3abcc4d 100644 (file)
@@ -1450,4 +1450,16 @@ static inline int cli_brw_size(struct obd_device *obd)
        return obd->u.cli.cl_max_pages_per_rpc << PAGE_CACHE_SHIFT;
 }
 
        return obd->u.cli.cl_max_pages_per_rpc << PAGE_CACHE_SHIFT;
 }
 
+static inline void client_adjust_max_dirty(struct client_obd *cli)
+{
+        /* initializing */
+       if (cli->cl_dirty_max <= 0)
+               cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024;
+       else
+               cli->cl_dirty_max = cli->cl_max_rpcs_in_flight *
+                       (cli->cl_max_pages_per_rpc << PAGE_CACHE_SHIFT);
+       if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > totalram_pages / 8)
+               cli->cl_dirty_max = totalram_pages << (PAGE_CACHE_SHIFT - 3);
+}
+
 #endif /* __OBD_H */
 #endif /* __OBD_H */
index a3769d5..94e4020 100644 (file)
@@ -349,9 +349,9 @@ int client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg)
         cli->cl_dirty = 0;
         cli->cl_avail_grant = 0;
        /* FIXME: Should limit this for the sum of all cl_dirty_max. */
         cli->cl_dirty = 0;
         cli->cl_avail_grant = 0;
        /* FIXME: Should limit this for the sum of all cl_dirty_max. */
-       cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024;
-       if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > totalram_pages / 8)
-               cli->cl_dirty_max = totalram_pages << (PAGE_CACHE_SHIFT - 3);
+       /* cl_dirty_max may be changed at connect time in
+        * ptlrpc_connect_interpret(). */
+       client_adjust_max_dirty(cli);
        CFS_INIT_LIST_HEAD(&cli->cl_cache_waiters);
        CFS_INIT_LIST_HEAD(&cli->cl_loi_ready_list);
        CFS_INIT_LIST_HEAD(&cli->cl_loi_hp_ready_list);
        CFS_INIT_LIST_HEAD(&cli->cl_cache_waiters);
        CFS_INIT_LIST_HEAD(&cli->cl_loi_ready_list);
        CFS_INIT_LIST_HEAD(&cli->cl_loi_hp_ready_list);
index 2f8da8c..1dae975 100644 (file)
@@ -111,6 +111,7 @@ static ssize_t osc_max_rpcs_in_flight_seq_write(struct file *file,
 
         client_obd_list_lock(&cli->cl_loi_list_lock);
         cli->cl_max_rpcs_in_flight = val;
 
         client_obd_list_lock(&cli->cl_loi_list_lock);
         cli->cl_max_rpcs_in_flight = val;
+       client_adjust_max_dirty(cli);
         client_obd_list_unlock(&cli->cl_loi_list_lock);
 
         LPROCFS_CLIMP_EXIT(dev);
         client_obd_list_unlock(&cli->cl_loi_list_lock);
 
         LPROCFS_CLIMP_EXIT(dev);
@@ -511,6 +512,7 @@ static ssize_t osc_obd_max_pages_per_rpc_seq_write(struct file *file,
        }
        client_obd_list_lock(&cli->cl_loi_list_lock);
        cli->cl_max_pages_per_rpc = val;
        }
        client_obd_list_lock(&cli->cl_loi_list_lock);
        cli->cl_max_pages_per_rpc = val;
+       client_adjust_max_dirty(cli);
        client_obd_list_unlock(&cli->cl_loi_list_lock);
 
        LPROCFS_CLIMP_EXIT(dev);
        client_obd_list_unlock(&cli->cl_loi_list_lock);
 
        LPROCFS_CLIMP_EXIT(dev);
index 81cf710..19de797 100644 (file)
@@ -1148,6 +1148,7 @@ finish:
 
                 LASSERT((cli->cl_max_pages_per_rpc <= PTLRPC_MAX_BRW_PAGES) &&
                         (cli->cl_max_pages_per_rpc > 0));
 
                 LASSERT((cli->cl_max_pages_per_rpc <= PTLRPC_MAX_BRW_PAGES) &&
                         (cli->cl_max_pages_per_rpc > 0));
+               client_adjust_max_dirty(cli);
         }
 
 out:
         }
 
 out: