From: "\"Zhou, Wenjian/周文?\"" <zhouwj-fnst@cn.fujitsu.com>
To: Atsushi Kumagai <ats-kumagai@wm.jp.nec.com>
Cc: "kexec@lists.infradead.org" <kexec@lists.infradead.org>
Subject: Re: [PATCH v7] Improve the performance of --num-threads -d 31
Date: Fri, 15 Apr 2016 18:13:10 +0800 [thread overview]
Message-ID: <5710BEB6.6020503@cn.fujitsu.com> (raw)
In-Reply-To: <0910DD04CBD6DE4193FCF86B9C00BE9701E3AD43@BPXM01GP.gisp.nec.co.jp>
On 04/15/2016 01:46 PM, Atsushi Kumagai wrote:
>>> 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.
>
I see.
--
Thanks
Zhou
>
> 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@lists.infradead.org
>>> http://lists.infradead.org/mailman/listinfo/kexec
>>
>> _______________________________________________
>> kexec mailing list
>> kexec@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/kexec
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
prev parent reply other threads:[~2016-04-15 10:15 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-15 2:59 [PATCH v7] Improve the performance of --num-threads -d 31 Zhou Wenjian
2016-04-15 5:25 ` Atsushi Kumagai
2016-04-15 5:46 ` Atsushi Kumagai
2016-04-15 10:13 ` "Zhou, Wenjian/周文?" [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5710BEB6.6020503@cn.fujitsu.com \
--to=zhouwj-fnst@cn.fujitsu.com \
--cc=ats-kumagai@wm.jp.nec.com \
--cc=kexec@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox