Several small fixes for the amd64 minidump code.

In report_progress(), use nitems(progress_track) instead of manually
hard-coding array size.  Wrap long line.

In blk_write(), code verifies that ptr and pa cannot be non-zero
simultaneously.  The later check for the page-alignment of the ptr
argument never triggers due to pa != 0 always implying ptr == NULL.  I
believe that the intent was to ensure that physicall address passed is
page-aligned, since the address is (temporary) mapped for the duration
of the page write.

Clear the progress_track.visited fields when starting minidump.  If
minidump is restarted or taken second time during the system lifetime,
progress is not printed otherwise, making operator suspectible to the
dump status.

Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2013-10-27 16:31:12 +00:00
parent 75bf2db380
commit e20f049b87

View File

@ -127,8 +127,9 @@ report_progress(size_t progress, size_t dumpsize)
int sofar, i;
sofar = 100 - ((progress * 100) / dumpsize);
for (i = 0; i < 10; i++) {
if (sofar < progress_track[i].min_per || sofar > progress_track[i].max_per)
for (i = 0; i < nitems(progress_track); i++) {
if (sofar < progress_track[i].min_per ||
sofar > progress_track[i].max_per)
continue;
if (progress_track[i].visited)
return;
@ -157,8 +158,8 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz)
printf("cant have both va and pa!\n");
return (EINVAL);
}
if (pa != 0 && (((uintptr_t)ptr) % PAGE_SIZE) != 0) {
printf("address not page aligned\n");
if ((((uintptr_t)pa) % PAGE_SIZE) != 0) {
printf("address not page aligned %p\n", ptr);
return (EINVAL);
}
if (ptr != NULL) {
@ -230,6 +231,8 @@ minidumpsys(struct dumperinfo *di)
retry:
retry_count++;
counter = 0;
for (i = 0; i < nitems(progress_track); i++)
progress_track[i].visited = 0;
/* Walk page table pages, set bits in vm_page_dump */
pmapsize = 0;
for (va = VM_MIN_KERNEL_ADDRESS; va < MAX(KERNBASE + nkpt * NBPDR,