Merge tag 'for_linus-4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Apr 2018 17:21:19 +0000 (10:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Apr 2018 17:21:19 +0000 (10:21 -0700)
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

drivers/misc/kgdbts.c
include/linux/timekeeping.h
kernel/debug/kdb/kdb_bp.c
kernel/debug/kdb/kdb_main.c
kernel/debug/kdb/kdb_support.c
kernel/time/timekeeping_internal.h

index 24108bfad88982c0688de8d4bcef17def3750587..6193270e7b3dcabf9c4f2befac666678b5cdb00d 100644 (file)
@@ -400,10 +400,14 @@ static void skip_back_repeat_test(char *arg)
        int go_back = simple_strtol(arg, NULL, 10);
 
        repeat_test--;
-       if (repeat_test <= 0)
+       if (repeat_test <= 0) {
                ts.idx++;
-       else
+       } else {
+               if (repeat_test % 100 == 0)
+                       v1printk("kgdbts:RUN ... %d remaining\n", repeat_test);
+
                ts.idx -= go_back;
+       }
        fill_get_buf(ts.tst[ts.idx].get);
 }
 
index 82c219dfd3bbd6c79ad65163a1304faa9dc5d2a1..9737fbec7019bd02b9f6bf0ef9d34e1dc67fdaaa 100644 (file)
@@ -31,6 +31,7 @@ struct timespec64 get_monotonic_coarse64(void);
 extern void getrawmonotonic64(struct timespec64 *ts);
 extern void ktime_get_ts64(struct timespec64 *ts);
 extern time64_t ktime_get_seconds(void);
+extern time64_t __ktime_get_real_seconds(void);
 extern time64_t ktime_get_real_seconds(void);
 extern void ktime_get_active_ts64(struct timespec64 *ts);
 
index 90ff129c88a27c50e33be234be695650e7210494..62c301ad07735c8b5713aebe8980f8c61d44a83b 100644 (file)
@@ -242,11 +242,11 @@ static void kdb_printbp(kdb_bp_t *bp, int i)
        kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT);
 
        if (bp->bp_enabled)
-               kdb_printf("\n    is enabled");
+               kdb_printf("\n    is enabled ");
        else
                kdb_printf("\n    is disabled");
 
-       kdb_printf("\taddr at %016lx, hardtype=%d installed=%d\n",
+       kdb_printf("  addr at %016lx, hardtype=%d installed=%d\n",
                   bp->bp_addr, bp->bp_type, bp->bp_installed);
 
        kdb_printf("\n");
index dbb0781a053364824f5361d07cfc72cf9fe0a2e2..e405677ee08d6ae6b71c36afd2270d2ed806810d 100644 (file)
@@ -1150,6 +1150,16 @@ void kdb_set_current_task(struct task_struct *p)
        kdb_current_regs = NULL;
 }
 
+static void drop_newline(char *buf)
+{
+       size_t len = strlen(buf);
+
+       if (len == 0)
+               return;
+       if (*(buf + len - 1) == '\n')
+               *(buf + len - 1) = '\0';
+}
+
 /*
  * kdb_local - The main code for kdb.  This routine is invoked on a
  *     specific processor, it is not global.  The main kdb() routine
@@ -1327,6 +1337,7 @@ do_full_getstr:
                cmdptr = cmd_head;
                diag = kdb_parse(cmdbuf);
                if (diag == KDB_NOTFOUND) {
+                       drop_newline(cmdbuf);
                        kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
                        diag = 0;
                }
@@ -1566,6 +1577,7 @@ static int kdb_md(int argc, const char **argv)
        int symbolic = 0;
        int valid = 0;
        int phys = 0;
+       int raw = 0;
 
        kdbgetintenv("MDCOUNT", &mdcount);
        kdbgetintenv("RADIX", &radix);
@@ -1575,9 +1587,10 @@ static int kdb_md(int argc, const char **argv)
        repeat = mdcount * 16 / bytesperword;
 
        if (strcmp(argv[0], "mdr") == 0) {
-               if (argc != 2)
+               if (argc == 2 || (argc == 0 && last_addr != 0))
+                       valid = raw = 1;
+               else
                        return KDB_ARGCOUNT;
-               valid = 1;
        } else if (isdigit(argv[0][2])) {
                bytesperword = (int)(argv[0][2] - '0');
                if (bytesperword == 0) {
@@ -1613,7 +1626,10 @@ static int kdb_md(int argc, const char **argv)
                radix = last_radix;
                bytesperword = last_bytesperword;
                repeat = last_repeat;
-               mdcount = ((repeat * bytesperword) + 15) / 16;
+               if (raw)
+                       mdcount = repeat;
+               else
+                       mdcount = ((repeat * bytesperword) + 15) / 16;
        }
 
        if (argc) {
@@ -1630,7 +1646,10 @@ static int kdb_md(int argc, const char **argv)
                        diag = kdbgetularg(argv[nextarg], &val);
                        if (!diag) {
                                mdcount = (int) val;
-                               repeat = mdcount * 16 / bytesperword;
+                               if (raw)
+                                       repeat = mdcount;
+                               else
+                                       repeat = mdcount * 16 / bytesperword;
                        }
                }
                if (argc >= nextarg+1) {
@@ -1640,8 +1659,15 @@ static int kdb_md(int argc, const char **argv)
                }
        }
 
-       if (strcmp(argv[0], "mdr") == 0)
-               return kdb_mdr(addr, mdcount);
+       if (strcmp(argv[0], "mdr") == 0) {
+               int ret;
+               last_addr = addr;
+               ret = kdb_mdr(addr, mdcount);
+               last_addr += mdcount;
+               last_repeat = mdcount;
+               last_bytesperword = bytesperword; // to make REPEAT happy
+               return ret;
+       }
 
        switch (radix) {
        case 10:
@@ -2473,41 +2499,6 @@ static int kdb_kill(int argc, const char **argv)
        return 0;
 }
 
-struct kdb_tm {
-       int tm_sec;     /* seconds */
-       int tm_min;     /* minutes */
-       int tm_hour;    /* hours */
-       int tm_mday;    /* day of the month */
-       int tm_mon;     /* month */
-       int tm_year;    /* year */
-};
-
-static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
-{
-       /* This will work from 1970-2099, 2100 is not a leap year */
-       static int mon_day[] = { 31, 29, 31, 30, 31, 30, 31,
-                                31, 30, 31, 30, 31 };
-       memset(tm, 0, sizeof(*tm));
-       tm->tm_sec  = tv->tv_sec % (24 * 60 * 60);
-       tm->tm_mday = tv->tv_sec / (24 * 60 * 60) +
-               (2 * 365 + 1); /* shift base from 1970 to 1968 */
-       tm->tm_min =  tm->tm_sec / 60 % 60;
-       tm->tm_hour = tm->tm_sec / 60 / 60;
-       tm->tm_sec =  tm->tm_sec % 60;
-       tm->tm_year = 68 + 4*(tm->tm_mday / (4*365+1));
-       tm->tm_mday %= (4*365+1);
-       mon_day[1] = 29;
-       while (tm->tm_mday >= mon_day[tm->tm_mon]) {
-               tm->tm_mday -= mon_day[tm->tm_mon];
-               if (++tm->tm_mon == 12) {
-                       tm->tm_mon = 0;
-                       ++tm->tm_year;
-                       mon_day[1] = 28;
-               }
-       }
-       ++tm->tm_mday;
-}
-
 /*
  * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
  * I cannot call that code directly from kdb, it has an unconditional
@@ -2515,10 +2506,10 @@ static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
  */
 static void kdb_sysinfo(struct sysinfo *val)
 {
-       struct timespec uptime;
-       ktime_get_ts(&uptime);
+       u64 uptime = ktime_get_mono_fast_ns();
+
        memset(val, 0, sizeof(*val));
-       val->uptime = uptime.tv_sec;
+       val->uptime = div_u64(uptime, NSEC_PER_SEC);
        val->loads[0] = avenrun[0];
        val->loads[1] = avenrun[1];
        val->loads[2] = avenrun[2];
@@ -2533,8 +2524,8 @@ static void kdb_sysinfo(struct sysinfo *val)
  */
 static int kdb_summary(int argc, const char **argv)
 {
-       struct timespec now;
-       struct kdb_tm tm;
+       time64_t now;
+       struct tm tm;
        struct sysinfo val;
 
        if (argc)
@@ -2548,9 +2539,9 @@ static int kdb_summary(int argc, const char **argv)
        kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
        kdb_printf("ccversion  %s\n", __stringify(CCVERSION));
 
-       now = __current_kernel_time();
-       kdb_gmtime(&now, &tm);
-       kdb_printf("date       %04d-%02d-%02d %02d:%02d:%02d "
+       now = __ktime_get_real_seconds();
+       time64_to_tm(now, 0, &tm);
+       kdb_printf("date       %04ld-%02d-%02d %02d:%02d:%02d "
                   "tz_minuteswest %d\n",
                1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
                tm.tm_hour, tm.tm_min, tm.tm_sec,
index d35cc2d3a4cc08c548dad03dee074b9bedaa2da2..990b3cc526c80d2162d79f0524dbd83932418cdf 100644 (file)
@@ -129,13 +129,13 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
                }
                if (i >= ARRAY_SIZE(kdb_name_table)) {
                        debug_kfree(kdb_name_table[0]);
-                       memcpy(kdb_name_table, kdb_name_table+1,
+                       memmove(kdb_name_table, kdb_name_table+1,
                               sizeof(kdb_name_table[0]) *
                               (ARRAY_SIZE(kdb_name_table)-1));
                } else {
                        debug_kfree(knt1);
                        knt1 = kdb_name_table[i];
-                       memcpy(kdb_name_table+i, kdb_name_table+i+1,
+                       memmove(kdb_name_table+i, kdb_name_table+i+1,
                               sizeof(kdb_name_table[0]) *
                               (ARRAY_SIZE(kdb_name_table)-i-1));
                }
index fdbeeb02dde9fcfc40640648df6eecb910cf95e2..cf5c0828ee3157bf620561f39838edd6c144e140 100644 (file)
@@ -31,6 +31,4 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask)
 }
 #endif
 
-extern time64_t __ktime_get_real_seconds(void);
-
 #endif /* _TIMEKEEPING_INTERNAL_H */