diff --git a/lnet/libcfs/debug.c b/lnet/libcfs/debug.c
index f4cfa63b93e8997ca5fd8e2fffae1c70716ee3e4..bf108bbc410fe160be72befe408ee1375b57b104 100644
--- a/lnet/libcfs/debug.c
+++ b/lnet/libcfs/debug.c
@@ -41,6 +41,10 @@ unsigned int libcfs_debug = (D_EMERG | D_ERROR | D_WARNING | D_CONSOLE |
                              D_NETERROR | D_HA | D_CONFIG | D_IOCTL);
 EXPORT_SYMBOL(libcfs_debug);
 
+int libcfs_debug_mb = -1;
+EXPORT_SYMBOL(libcfs_debug_mb);
+CFS_MODULE_PARM(libcfs_debug_mb, "i", int, 0644, "Total debug buffer size.");
+
 unsigned int libcfs_printk = D_CANTMASK;
 EXPORT_SYMBOL(libcfs_printk);
 
@@ -426,12 +430,21 @@ void libcfs_debug_dumplog(void)
 
 int libcfs_debug_init(unsigned long bufsize)
 {
-        int    rc;
+        int    rc = 0;
+        int    max = libcfs_debug_mb;
 
         cfs_waitq_init(&debug_ctlwq);
         libcfs_console_max_delay = CDEBUG_DEFAULT_MAX_DELAY;
         libcfs_console_min_delay = CDEBUG_DEFAULT_MIN_DELAY;
-        rc = tracefile_init();
+        /* If libcfs_debug_mb is set to an invalid value or uninitialized
+         * then just make the total buffers smp_num_cpus * TCD_MAX_PAGES */
+        if (max > trace_max_debug_mb() || max < num_possible_cpus()) {
+                max = TCD_MAX_PAGES;
+        } else {
+                max = (max / num_possible_cpus());
+                max = (max << (20 - CFS_PAGE_SHIFT));
+        }
+        rc = tracefile_init(max);
 
         if (rc == 0)
                 libcfs_register_panic_notifier();
diff --git a/lnet/libcfs/tracefile.c b/lnet/libcfs/tracefile.c
index a0b61ab3b2804a6fcdfd4acc54f6ec5e6e6a6800..4a5cf5245d023d2ead23c3f17c36ec28253fb83d 100644
--- a/lnet/libcfs/tracefile.c
+++ b/lnet/libcfs/tracefile.c
@@ -1046,7 +1046,7 @@ void trace_stop_thread(void)
         mutex_up(&trace_thread_sem);
 }
 
-int tracefile_init(void)
+int tracefile_init(int max_pages)
 {
         struct trace_cpu_data *tcd;
         int                    i;
@@ -1067,7 +1067,7 @@ int tracefile_init(void)
                 tcd->tcd_cur_pages = 0;
                 tcd->tcd_cur_stock_pages = 0;
                 tcd->tcd_cur_daemon_pages = 0;
-                tcd->tcd_max_pages = (TCD_MAX_PAGES * factor) / 100;
+                tcd->tcd_max_pages = (max_pages * factor) / 100;
                 LASSERT(tcd->tcd_max_pages > 0);
                 tcd->tcd_shutting_down = 0;
         }
diff --git a/lnet/libcfs/tracefile.h b/lnet/libcfs/tracefile.h
index a9965d1cd00cb84d7de7f6e4a2f7b03863bbcd18..a9f534f95242748aad6ffac95387c30bbe0af74b 100644
--- a/lnet/libcfs/tracefile.h
+++ b/lnet/libcfs/tracefile.h
@@ -22,7 +22,7 @@ void trace_debug_print(void);
 void trace_flush_pages(void);
 int trace_start_thread(void);
 void trace_stop_thread(void);
-int tracefile_init(void);
+int tracefile_init(int max_pages);
 void tracefile_exit(void);
 
 
@@ -45,6 +45,10 @@ extern void libcfs_register_panic_notifier(void);
 extern void libcfs_unregister_panic_notifier(void);
 extern int  libcfs_panic_in_progress;
 
+#define TCD_MAX_PAGES (5 << (20 - CFS_PAGE_SHIFT))
+#define TCD_STOCK_PAGES (TCD_MAX_PAGES)
+#define TRACEFILE_SIZE (500 << 20)
+
 #ifdef LUSTRE_TRACEFILE_PRIVATE
 
 /*