>>>> + } >>>> + >>>> + limit_size = limit_size - MAP_REGION * info->num_threads; >>>> + >> >> This patch prioritizes the memory for multi thread since it is reserved first, >> but I think enough cyclic buffer should be reserved first because it's for more >> fundamental feature than multi-threading. >> > >I'm not sure what is the proper value of cyclic buffer size. >Should we leave 4MB for it? >Or calculate according to the bitmap_size? In commit:0b7328280, we decided 4MB is enough, please leave it. BTW, mmap() in 2nd kernel doesn't consume MAP_REGION(4MB) of physical memory since the target region is mapped directly to the old memory(/proc/vmcore). If 4MB region is mapped, 8KB of page table for the region will be created, *this* is the memory footprint of mmap(). OTOH, mmap() in 1st kernel will consume physical memory to copy file data from disk to memory by page fault. However, 1st kernel environment must have enough free memory, we don't need to worry too much about it. So now I don't think MAP_REGION should be considered as memory footprint. How about you ? Thanks, Atsushi Kumagai >-- >Thanks >Zhou >> >> Thanks, >> Atsushi Kumagai >> >>>> /* 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..4b315c0 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 >>>> @@ -977,7 +978,7 @@ typedef unsigned long long int ulonglong; >>>> #define PAGE_DATA_NUM (50) >>>> #define WAIT_TIME (60 * 10) >>>> #define PTHREAD_FAIL ((void *)-2) >>>> -#define NUM_BUFFERS (50) >>>> +#define NUM_BUFFERS (20) >>>> >>>> struct mmap_cache { >>>> char *mmap_buf; >>>> @@ -985,28 +986,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 +1301,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; >>>> >>> >>> >>> >>> _______________________________________________ >>> kexec mailing list >>> kexec at lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/kexec > >