>>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) { ^ I found a typo. >>+ 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) { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sorry, I misunderstood that. However, you still should check info->num_threads, this patch causes division by zero by default. Thanks, Atsushi Kumagai >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 > >_______________________________________________ >kexec mailing list >kexec at lists.infradead.org >http://lists.infradead.org/mailman/listinfo/kexec