[PATCH v7] Improve the performance of --num-threads -d 31
Atsushi Kumagai
ats-kumagai at wm.jp.nec.com
Thu Apr 14 22:46:49 PDT 2016
>>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
More information about the kexec
mailing list