Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for_linus-4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb

Pull kdb updates from Jason Wessel:

- fix 2032 time access issues and new compiler warnings

- minor regression test cleanup

- formatting fixes for end user use of kdb

* tag 'for_linus-4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb:
kdb: use memmove instead of overlapping memcpy
kdb: use ktime_get_mono_fast_ns() instead of ktime_get_ts()
kdb: bl: don't use tab character in output
kdb: drop newline in unknown command output
kdb: make "mdr" command repeat
kdb: use __ktime_get_real_seconds instead of __current_kernel_time
misc: kgdbts: Display progress of asynchronous tests

+51 -57
+6 -2
drivers/misc/kgdbts.c
··· 400 400 int go_back = simple_strtol(arg, NULL, 10); 401 401 402 402 repeat_test--; 403 - if (repeat_test <= 0) 403 + if (repeat_test <= 0) { 404 404 ts.idx++; 405 - else 405 + } else { 406 + if (repeat_test % 100 == 0) 407 + v1printk("kgdbts:RUN ... %d remaining\n", repeat_test); 408 + 406 409 ts.idx -= go_back; 410 + } 407 411 fill_get_buf(ts.tst[ts.idx].get); 408 412 } 409 413
+1
include/linux/timekeeping.h
··· 31 31 extern void getrawmonotonic64(struct timespec64 *ts); 32 32 extern void ktime_get_ts64(struct timespec64 *ts); 33 33 extern time64_t ktime_get_seconds(void); 34 + extern time64_t __ktime_get_real_seconds(void); 34 35 extern time64_t ktime_get_real_seconds(void); 35 36 extern void ktime_get_active_ts64(struct timespec64 *ts); 36 37
+2 -2
kernel/debug/kdb/kdb_bp.c
··· 242 242 kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT); 243 243 244 244 if (bp->bp_enabled) 245 - kdb_printf("\n is enabled"); 245 + kdb_printf("\n is enabled "); 246 246 else 247 247 kdb_printf("\n is disabled"); 248 248 249 - kdb_printf("\taddr at %016lx, hardtype=%d installed=%d\n", 249 + kdb_printf(" addr at %016lx, hardtype=%d installed=%d\n", 250 250 bp->bp_addr, bp->bp_type, bp->bp_installed); 251 251 252 252 kdb_printf("\n");
+40 -49
kernel/debug/kdb/kdb_main.c
··· 1150 1150 kdb_current_regs = NULL; 1151 1151 } 1152 1152 1153 + static void drop_newline(char *buf) 1154 + { 1155 + size_t len = strlen(buf); 1156 + 1157 + if (len == 0) 1158 + return; 1159 + if (*(buf + len - 1) == '\n') 1160 + *(buf + len - 1) = '\0'; 1161 + } 1162 + 1153 1163 /* 1154 1164 * kdb_local - The main code for kdb. This routine is invoked on a 1155 1165 * specific processor, it is not global. The main kdb() routine ··· 1337 1327 cmdptr = cmd_head; 1338 1328 diag = kdb_parse(cmdbuf); 1339 1329 if (diag == KDB_NOTFOUND) { 1330 + drop_newline(cmdbuf); 1340 1331 kdb_printf("Unknown kdb command: '%s'\n", cmdbuf); 1341 1332 diag = 0; 1342 1333 } ··· 1577 1566 int symbolic = 0; 1578 1567 int valid = 0; 1579 1568 int phys = 0; 1569 + int raw = 0; 1580 1570 1581 1571 kdbgetintenv("MDCOUNT", &mdcount); 1582 1572 kdbgetintenv("RADIX", &radix); ··· 1587 1575 repeat = mdcount * 16 / bytesperword; 1588 1576 1589 1577 if (strcmp(argv[0], "mdr") == 0) { 1590 - if (argc != 2) 1578 + if (argc == 2 || (argc == 0 && last_addr != 0)) 1579 + valid = raw = 1; 1580 + else 1591 1581 return KDB_ARGCOUNT; 1592 - valid = 1; 1593 1582 } else if (isdigit(argv[0][2])) { 1594 1583 bytesperword = (int)(argv[0][2] - '0'); 1595 1584 if (bytesperword == 0) { ··· 1626 1613 radix = last_radix; 1627 1614 bytesperword = last_bytesperword; 1628 1615 repeat = last_repeat; 1629 - mdcount = ((repeat * bytesperword) + 15) / 16; 1616 + if (raw) 1617 + mdcount = repeat; 1618 + else 1619 + mdcount = ((repeat * bytesperword) + 15) / 16; 1630 1620 } 1631 1621 1632 1622 if (argc) { ··· 1646 1630 diag = kdbgetularg(argv[nextarg], &val); 1647 1631 if (!diag) { 1648 1632 mdcount = (int) val; 1649 - repeat = mdcount * 16 / bytesperword; 1633 + if (raw) 1634 + repeat = mdcount; 1635 + else 1636 + repeat = mdcount * 16 / bytesperword; 1650 1637 } 1651 1638 } 1652 1639 if (argc >= nextarg+1) { ··· 1659 1640 } 1660 1641 } 1661 1642 1662 - if (strcmp(argv[0], "mdr") == 0) 1663 - return kdb_mdr(addr, mdcount); 1643 + if (strcmp(argv[0], "mdr") == 0) { 1644 + int ret; 1645 + last_addr = addr; 1646 + ret = kdb_mdr(addr, mdcount); 1647 + last_addr += mdcount; 1648 + last_repeat = mdcount; 1649 + last_bytesperword = bytesperword; // to make REPEAT happy 1650 + return ret; 1651 + } 1664 1652 1665 1653 switch (radix) { 1666 1654 case 10: ··· 2499 2473 return 0; 2500 2474 } 2501 2475 2502 - struct kdb_tm { 2503 - int tm_sec; /* seconds */ 2504 - int tm_min; /* minutes */ 2505 - int tm_hour; /* hours */ 2506 - int tm_mday; /* day of the month */ 2507 - int tm_mon; /* month */ 2508 - int tm_year; /* year */ 2509 - }; 2510 - 2511 - static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm) 2512 - { 2513 - /* This will work from 1970-2099, 2100 is not a leap year */ 2514 - static int mon_day[] = { 31, 29, 31, 30, 31, 30, 31, 2515 - 31, 30, 31, 30, 31 }; 2516 - memset(tm, 0, sizeof(*tm)); 2517 - tm->tm_sec = tv->tv_sec % (24 * 60 * 60); 2518 - tm->tm_mday = tv->tv_sec / (24 * 60 * 60) + 2519 - (2 * 365 + 1); /* shift base from 1970 to 1968 */ 2520 - tm->tm_min = tm->tm_sec / 60 % 60; 2521 - tm->tm_hour = tm->tm_sec / 60 / 60; 2522 - tm->tm_sec = tm->tm_sec % 60; 2523 - tm->tm_year = 68 + 4*(tm->tm_mday / (4*365+1)); 2524 - tm->tm_mday %= (4*365+1); 2525 - mon_day[1] = 29; 2526 - while (tm->tm_mday >= mon_day[tm->tm_mon]) { 2527 - tm->tm_mday -= mon_day[tm->tm_mon]; 2528 - if (++tm->tm_mon == 12) { 2529 - tm->tm_mon = 0; 2530 - ++tm->tm_year; 2531 - mon_day[1] = 28; 2532 - } 2533 - } 2534 - ++tm->tm_mday; 2535 - } 2536 - 2537 2476 /* 2538 2477 * Most of this code has been lifted from kernel/timer.c::sys_sysinfo(). 2539 2478 * I cannot call that code directly from kdb, it has an unconditional ··· 2506 2515 */ 2507 2516 static void kdb_sysinfo(struct sysinfo *val) 2508 2517 { 2509 - struct timespec uptime; 2510 - ktime_get_ts(&uptime); 2518 + u64 uptime = ktime_get_mono_fast_ns(); 2519 + 2511 2520 memset(val, 0, sizeof(*val)); 2512 - val->uptime = uptime.tv_sec; 2521 + val->uptime = div_u64(uptime, NSEC_PER_SEC); 2513 2522 val->loads[0] = avenrun[0]; 2514 2523 val->loads[1] = avenrun[1]; 2515 2524 val->loads[2] = avenrun[2]; ··· 2524 2533 */ 2525 2534 static int kdb_summary(int argc, const char **argv) 2526 2535 { 2527 - struct timespec now; 2528 - struct kdb_tm tm; 2536 + time64_t now; 2537 + struct tm tm; 2529 2538 struct sysinfo val; 2530 2539 2531 2540 if (argc) ··· 2539 2548 kdb_printf("domainname %s\n", init_uts_ns.name.domainname); 2540 2549 kdb_printf("ccversion %s\n", __stringify(CCVERSION)); 2541 2550 2542 - now = __current_kernel_time(); 2543 - kdb_gmtime(&now, &tm); 2544 - kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d " 2551 + now = __ktime_get_real_seconds(); 2552 + time64_to_tm(now, 0, &tm); 2553 + kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d " 2545 2554 "tz_minuteswest %d\n", 2546 2555 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, 2547 2556 tm.tm_hour, tm.tm_min, tm.tm_sec,
+2 -2
kernel/debug/kdb/kdb_support.c
··· 129 129 } 130 130 if (i >= ARRAY_SIZE(kdb_name_table)) { 131 131 debug_kfree(kdb_name_table[0]); 132 - memcpy(kdb_name_table, kdb_name_table+1, 132 + memmove(kdb_name_table, kdb_name_table+1, 133 133 sizeof(kdb_name_table[0]) * 134 134 (ARRAY_SIZE(kdb_name_table)-1)); 135 135 } else { 136 136 debug_kfree(knt1); 137 137 knt1 = kdb_name_table[i]; 138 - memcpy(kdb_name_table+i, kdb_name_table+i+1, 138 + memmove(kdb_name_table+i, kdb_name_table+i+1, 139 139 sizeof(kdb_name_table[0]) * 140 140 (ARRAY_SIZE(kdb_name_table)-i-1)); 141 141 }
-2
kernel/time/timekeeping_internal.h
··· 31 31 } 32 32 #endif 33 33 34 - extern time64_t __ktime_get_real_seconds(void); 35 - 36 34 #endif /* _TIMEKEEPING_INTERNAL_H */