From: Qiao Nuohan <[email protected]>

This patch is used to initial/free data for parallel process and
the memory limit is concerned in this function.

Signed-off-by: Qiao Nuohan <[email protected]>
---
 makedumpfile.c |  202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 makedumpfile.h |    1 +
 2 files changed, 203 insertions(+), 0 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 86426d8..04a6c45 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1426,6 +1426,23 @@ open_dump_bitmap(void)
                        SPLITTING_FD_BITMAP(i) = fd;
                }
        }
+
+       if (info->num_threads) {
+               /*
+                * Reserve file descriptors of bitmap for creating dumpfiles
+                * parallelly, because a bitmap file will be unlinked just after
+                * this and it is not possible to open a bitmap file later.
+                */
+               for (i = 0; i < info->num_threads; i++) {
+                       if ((fd = open(info->name_bitmap, O_RDONLY)) < 0) {
+                               ERRMSG("Can't open the bitmap file(%s). %s\n",
+                                   info->name_bitmap, strerror(errno));
+                               return FALSE;
+                       }
+                       FD_BITMAP_PARALLEL(i) = fd;
+               }
+       }
+
        unlink(info->name_bitmap);
 
        return TRUE;
@@ -3446,6 +3463,191 @@ calibrate_machdep_info(void)
 }
 
 int
+initial_for_parallel()
+{
+       unsigned long len_buf_out;
+       unsigned long page_data_buf_size;
+       unsigned long limit_size;
+       int page_data_num;
+       int i;
+
+       len_buf_out = calculate_len_buf_out(info->page_size);
+
+       /*
+        * allocate memory for threads
+        */
+       if ((info->threads = malloc(sizeof(pthread_t *) * info->num_threads))
+           == NULL) {
+               MSG("Can't allocate memory for threads. %s\n",
+                               strerror(errno));
+               return FALSE;
+       }
+       memset(info->threads, 0, sizeof(pthread_t *) * info->num_threads);
+
+       if ((info->kdump_thread_args =
+                       malloc(sizeof(struct thread_args) * info->num_threads))
+           == NULL) {
+               MSG("Can't allocate memory for arguments of threads. %s\n",
+                               strerror(errno));
+               return FALSE;
+       }
+       memset(info->kdump_thread_args, 0, sizeof(struct thread_args) * 
info->num_threads);
+
+       for (i = 0; i < info->num_threads; i++) {
+               if ((info->threads[i] = malloc(sizeof(pthread_t))) == NULL) {
+                       MSG("Can't allocate memory for thread %d. %s",
+                                       i, strerror(errno));
+                       return FALSE;
+               }
+
+               if ((BUF_PARALLEL(i) = malloc(info->page_size)) == NULL) {
+                       MSG("Can't allocate memory for the memory buffer. %s\n",
+                                       strerror(errno));
+                       return FALSE;
+               }
+
+               if ((BUF_OUT_PARALLEL(i) = malloc(len_buf_out)) == NULL) {
+                       MSG("Can't allocate memory for the compression buffer. 
%s\n",
+                                       strerror(errno));
+                       return FALSE;
+               }
+
+               if ((MMAP_CACHE_PARALLEL(i) = malloc(sizeof(struct 
mmap_cache))) == NULL) {
+                       MSG("Can't allocate memory for mmap_cache. %s\n",
+                                       strerror(errno));
+                       return FALSE;
+               }
+
+               /*
+                * initial for mmap_cache
+                */
+               MMAP_CACHE_PARALLEL(i)->mmap_buf = MAP_FAILED;
+               MMAP_CACHE_PARALLEL(i)->mmap_start_offset = 0;
+               MMAP_CACHE_PARALLEL(i)->mmap_end_offset = 0;
+
+#ifdef USELZO
+               if ((WRKMEM_PARALLEL(i) = malloc(LZO1X_1_MEM_COMPRESS)) == 
NULL) {
+                       MSG("Can't allocate memory for the working memory. 
%s\n",
+                                       strerror(errno));
+                       return FALSE;
+               }
+#endif
+       }
+
+       /*
+        * get a safe number of page_data
+        */
+       page_data_buf_size = MAX(len_buf_out, info->page_size);
+
+       limit_size = (get_free_memory_size()
+                     - MAP_REGION * info->num_threads) * 0.6;
+
+       page_data_num = limit_size / page_data_buf_size;
+
+       if (info->num_buffers != 0)
+               info->num_buffers = MIN(info->num_buffers, page_data_num);
+       else
+               info->num_buffers = MIN(PAGE_DATA_NUM, page_data_num);
+
+       DEBUG_MSG("Number of struct page_data for produce/consume: %d\n",
+                       info->num_buffers);
+
+       /*
+        * allocate memory for page_data
+        */
+       if ((info->page_data_buf = malloc(sizeof(struct page_data) * 
info->num_buffers))
+           == NULL) {
+               MSG("Can't allocate memory for page_data_buf. %s\n",
+                               strerror(errno));
+               return FALSE;
+       }
+       memset(info->page_data_buf, 0, sizeof(struct page_data) * 
info->num_buffers);
+
+       for (i = 0; i < info->num_buffers; i++) {
+               if ((info->page_data_buf[i].buf = malloc(page_data_buf_size)) 
== NULL) {
+                       MSG("Can't allocate memory for buf of page_data_buf. 
%s\n",
+                                       strerror(errno));
+                       return FALSE;
+               }
+       }
+
+       /*
+        * initial fd_memory for threads
+        */
+       for (i = 0; i < info->num_threads; i++) {
+               if ((FD_MEMORY_PARALLEL(i) = open(info->name_memory, O_RDONLY))
+                                                                       < 0) {
+                       ERRMSG("Can't open the dump memory(%s). %s\n",
+                                       info->name_memory, strerror(errno));
+                       return FALSE;
+               }
+
+               if ((FD_BITMAP_MEMORY_PARALLEL(i) =
+                               open(info->name_memory, O_RDONLY)) < 0) {
+                       ERRMSG("Can't open the dump memory(%s). %s\n",
+                                       info->name_memory, strerror(errno));
+                       return FALSE;
+               }
+       }
+
+       return TRUE;
+}
+
+void
+free_for_parallel()
+{
+       int i;
+
+       if (info->threads != NULL) {
+               for (i = 0; i < info->num_threads; i++) {
+                       if (info->threads[i] != NULL)
+                               free(info->threads[i]);
+
+                       if (BUF_PARALLEL(i) != NULL)
+                               free(BUF_PARALLEL(i));
+
+                       if (BUF_OUT_PARALLEL(i) != NULL)
+                               free(BUF_OUT_PARALLEL(i));
+
+                       if (MMAP_CACHE_PARALLEL(i) != NULL) {
+                               if (MMAP_CACHE_PARALLEL(i)->mmap_buf !=
+                                                               MAP_FAILED)
+                                       munmap(MMAP_CACHE_PARALLEL(i)->mmap_buf,
+                                              
MMAP_CACHE_PARALLEL(i)->mmap_end_offset
+                                              - 
MMAP_CACHE_PARALLEL(i)->mmap_start_offset);
+
+                               free(MMAP_CACHE_PARALLEL(i));
+                       }
+#ifdef USELZO
+                       if (WRKMEM_PARALLEL(i) != NULL)
+                               free(WRKMEM_PARALLEL(i));
+#endif
+
+               }
+               free(info->threads);
+       }
+
+       if (info->kdump_thread_args != NULL)
+               free(info->kdump_thread_args);
+
+       if (info->page_data_buf != NULL) {
+               for (i = 0; i < info->num_buffers; i++) {
+                       if (info->page_data_buf[i].buf != NULL)
+                               free(info->page_data_buf[i].buf);
+               }
+               free(info->page_data_buf);
+       }
+
+       for (i = 0; i < info->num_threads; i++) {
+               if (FD_MEMORY_PARALLEL(i) > 0)
+                       close(FD_MEMORY_PARALLEL(i));
+
+               if (FD_BITMAP_MEMORY_PARALLEL(i) > 0)
+                       close(FD_BITMAP_MEMORY_PARALLEL(i));
+       }
+}
+
+int
 initial(void)
 {
        off_t offset;
diff --git a/makedumpfile.h b/makedumpfile.h
index bca3d56..67c2a38 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -929,6 +929,7 @@ typedef unsigned long long int ulonglong;
  * for parallel process
  */
 
+#define PAGE_DATA_NUM  (50)
 #define WAIT_TIME      (60 * 10)
 #define PTHREAD_FAIL   ((void *)-2)
 
-- 
1.7.1


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to