>v7: > 1. fix a bug pointed by Minfei Huang >v6: > 1. address Atsushi Kumagai's comments about calculating and reserving memory >v5: > 1. remove unused variable check_out > 2. reset num_threads if memory is not enough >v4: > 1. fix a bug caused by the logic >v3: > 1. remove some unused variables > 2. fix a bug caused by the wrong logic > 3. fix a bug caused by optimising > 4. improve more performance by using Minoru Usui's code I have just one comment for this version: [snip] >@@ -10223,6 +10263,26 @@ calculate_cyclic_buffer_size(void) { > * free memory for safety. > */ > limit_size = get_free_memory_size() * 0.6; >+ >+ /* >+ * Recalculate the limit_size according to num_threads. >+ * And reset num_threads if there is not enough memory. >+ */ >+ if (limit_size < maximun_size) { >+ if (info->num_threads > 0) { >+ MSG("There isn't enough memory for multi-threads.\n"); >+ info->num_threads = 0; >+ } >+ } This condition should be "limit_size <= maximun_size", otherwise division by zero can occur below: >+ else if ((limit_size - maximum_size) / info->num_threads < THREAD_REGION) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Thanks, Atsushi Kumagai >+ MSG("There isn't enough memory for %d threads.\n", info->num_threads); >+ >+ info->num_threads = (limit_size - maximum_size) / THREAD_REGION; >+ MSG("--num_threads is set to %d.\n", info->num_threads); >+ } >+ >+ limit_size = limit_size - THREAD_REGION * info->num_threads; >+ > /* Try to keep both 1st and 2nd bitmap at the same time. */ > bitmap_size = info->max_mapnr * 2 / BITPERBYTE; > >diff --git a/makedumpfile.h b/makedumpfile.h >index e0b5bbf..322d31b 100644 >--- a/makedumpfile.h >+++ b/makedumpfile.h >@@ -44,6 +44,7 @@ > #include "print_info.h" > #include "sadump_mod.h" > #include <pthread.h> >+#include <semaphore.h> > > /* > * Result of command >@@ -974,10 +975,11 @@ typedef unsigned long long int ulonglong; > * for parallel process > */ > >-#define PAGE_DATA_NUM (50) >+#define PAGE_FLAG_NUM (20) >+#define PAGE_DATA_NUM (5) > #define WAIT_TIME (60 * 10) > #define PTHREAD_FAIL ((void *)-2) >-#define NUM_BUFFERS (50) >+#define THREAD_REGION (200 * 1024) > > struct mmap_cache { > char *mmap_buf; >@@ -985,28 +987,33 @@ struct mmap_cache { > off_t mmap_end_offset; > }; > >+enum { >+ FLAG_UNUSED, >+ FLAG_READY, >+ FLAG_FILLING >+}; >+struct page_flag { >+ mdf_pfn_t pfn; >+ char zero; >+ char ready; >+ short index; >+ struct page_flag *next; >+}; >+ > struct page_data > { >- mdf_pfn_t pfn; >- int dumpable; >- int zero; >- unsigned int flags; > long size; > unsigned char *buf; >- pthread_mutex_t mutex; >- /* >- * whether the page_data is ready to be consumed >- */ >- int ready; >+ int flags; >+ int used; > }; > > struct thread_args { > int thread_num; > unsigned long len_buf_out; >- mdf_pfn_t start_pfn, end_pfn; >- int page_data_num; > struct cycle *cycle; > struct page_data *page_data_buf; >+ struct page_flag *page_flag_buf; > }; > > /* >@@ -1295,11 +1302,12 @@ struct DumpInfo { > pthread_t **threads; > struct thread_args *kdump_thread_args; > struct page_data *page_data_buf; >+ struct page_flag **page_flag_buf; >+ sem_t page_flag_buf_sem; > pthread_rwlock_t usemmap_rwlock; > mdf_pfn_t current_pfn; > pthread_mutex_t current_pfn_mutex; >- mdf_pfn_t consumed_pfn; >- pthread_mutex_t consumed_pfn_mutex; >+ pthread_mutex_t page_data_mutex; > pthread_mutex_t filter_mutex; > }; > extern struct DumpInfo *info; >-- >1.8.3.1 > > > > >_______________________________________________ >kexec mailing list >kexec at lists.infradead.org >http://lists.infradead.org/mailman/listinfo/kexec