-----Original Message----- > 1.) The bitmap of vmcore file can be very big in the server kernel panic, > such as over 256M. > > This patch uses mmap/madvise to improve the read speed > of the bitmap in the non-FLAT_FORMAT code path. > > Use MADV_WILLNEED for madvise, it will trigger read ahead for > reading the bitmap. Thanks for the update. With removing the unused variables (will be fixed when merging), Acked-by: Kazuhito Hagio <k-hagio-ab@xxxxxxx> $ make clean ; make warn diskdump.c: In function ‘read_dump_header’: diskdump.c:543:10: warning: unused variable ‘bytes_read’ [-Wunused-variable] ssize_t bytes_read; ^~~~~~~~~~ diskdump.c:542:9: warning: unused variable ‘len’ [-Wunused-variable] size_t len; ^~~ diskdump.c:541:8: warning: unused variable ‘bufptr’ [-Wunused-variable] char *bufptr; ^~~~~~ As for a second ack, please wait for a while. Lianbo is taking a leave and will be back soon. Thanks, Kazu > > 2.) Test. > > The files: > vmlinux: 272M > vmcore : 23G (bitmap_len: 4575985664) > > #cat ./commands.txt > quit > > Before this patch: > #echo 3 > /proc/sys/vm/drop_caches; > #time ./crash -i ./commands.txt /root/t/vmlinux /root/t/vmcore > /dev/null 2>&1 > ............................ > real 0m55.217s > user 0m15.114s > sys 0m3.560s > ............................ > > After this patch: > #echo 3 > /proc/sys/vm/drop_caches; > #time ./crash -i ./commands.txt /root/t/vmlinux /root/t/vmcore > /dev/null 2>&1 > ............................ > real 0m44.097s > user 0m19.031s > sys 0m1.620s > ............................ > > Signed-off-by: Huang Shijie <shijie@xxxxxxxxxxxxxxxxxxxxxx> > --- > v1 --> v2: > Use MADV_WILLNEED for mmap, not MADV_SEQUENTIAL. > > --- > diskdump.c | 39 ++++++++++++++++----------------------- > 1 file changed, 16 insertions(+), 23 deletions(-) > > diff --git a/diskdump.c b/diskdump.c > index ff1e9a3..102062b 100644 > --- a/diskdump.c > +++ b/diskdump.c > @@ -724,10 +724,6 @@ restart: > > offset = (off_t)block_size * (1 + header->sub_hdr_size); > > - if ((dd->bitmap = malloc(bitmap_len)) == NULL) > - error(FATAL, "%s: cannot malloc bitmap buffer\n", > - DISKDUMP_VALID() ? "diskdump" : "compressed kdump"); > - > dd->dumpable_bitmap = calloc(bitmap_len, 1); > > if (CRASHDEBUG(8)) > @@ -736,30 +732,23 @@ restart: > (ulonglong)offset); > > if (FLAT_FORMAT()) { > + if ((dd->bitmap = malloc(bitmap_len)) == NULL) > + error(FATAL, "%s: cannot malloc bitmap buffer\n", > + DISKDUMP_VALID() ? "diskdump" : "compressed kdump"); > + > if (!read_flattened_format(dd->dfd, offset, dd->bitmap, bitmap_len)) { > error(INFO, "%s: cannot read memory bitmap\n", > DISKDUMP_VALID() ? "diskdump" : "compressed kdump"); > goto err; > } > } else { > - if (lseek(dd->dfd, offset, SEEK_SET) == failed) { > - error(INFO, "%s: cannot lseek memory bitmap\n", > + dd->bitmap = mmap(NULL, bitmap_len, PROT_READ, > + MAP_SHARED, dd->dfd, offset); > + if (dd->bitmap == MAP_FAILED) > + error(FATAL, "%s: cannot mmap bitmap buffer\n", > DISKDUMP_VALID() ? "diskdump" : "compressed kdump"); > - goto err; > - } > - bufptr = dd->bitmap; > - len = bitmap_len; > - while (len) { > - bytes_read = read(dd->dfd, bufptr, len); > - if (bytes_read <= 0) { > - error(INFO, "%s: cannot read memory bitmap\n", > - DISKDUMP_VALID() ? "diskdump" > - : "compressed kdump"); > - goto err; > - } > - len -= bytes_read; > - bufptr += bytes_read; > - } > + > + madvise(dd->bitmap, bitmap_len, MADV_WILLNEED); > } > > if (dump_is_partial(header)) > @@ -920,8 +909,12 @@ err: > free(sub_header); > if (sub_header_kdump) > free(sub_header_kdump); > - if (dd->bitmap) > - free(dd->bitmap); > + if (dd->bitmap) { > + if (FLAT_FORMAT()) > + free(dd->bitmap); > + else > + munmap(dd->bitmap, dd->bitmap_len); > + } > if (dd->dumpable_bitmap) > free(dd->dumpable_bitmap); > if (dd->notes_buf) > -- > 2.30.2 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/crash-utility Contribution Guidelines: https://github.com/crash-utility/crash/wiki