[PATCH 1/2] KDB: Make LINES an internal variable.

From: Andrei Warkentin
Date: Fri Feb 17 2012 - 21:07:42 EST


1) If you run 'dumpall', LINES will remain set to
10000, and you might wonder why dmesg now doesn't
page.
2) If you run any command that sets LINES, you will
eventually exhaust the heap.

To address (1), you can save and restore across
calls to "defcmd" commands, which might contain
"set LINES". This becomes awkward with keeping
LINES in env, but there is no real reason why
LINES cannot be treated as an internal variable.
Additionally, you get rid of the (small) kdb heap
usage for LINES.

Signed-off-by: Andrei Warkentin <andreiw@xxxxxxxxxx>
---
kernel/debug/kdb/kdb_io.c | 4 ++--
kernel/debug/kdb/kdb_main.c | 29 ++++++++++++++++++++++++++---
kernel/debug/kdb/kdb_private.h | 1 +
3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 4802eb5..5eb7e23 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -580,8 +580,8 @@ int vkdb_printf(const char *fmt, va_list ap)
__acquire(kdb_printf_lock);
}

- diag = kdbgetintenv("LINES", &linecount);
- if (diag || linecount <= 1)
+ linecount = kdb_lines;
+ if (linecount <= 1)
linecount = 24;

diag = kdbgetintenv("LOGGING", &logging);
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 63786e7..37f9d45 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -60,6 +60,7 @@ atomic_t kdb_event;
int kdb_initial_cpu = -1; /* cpu number that owns kdb */
int kdb_nextline = 1;
int kdb_state; /* General KDB state */
+int kdb_lines = 0; /* Lines displayed at once */

struct task_struct *kdb_current_task;
EXPORT_SYMBOL(kdb_current_task);
@@ -386,6 +387,18 @@ int kdb_set(int argc, const char **argv)
| (debugflags << KDB_DEBUG_FLAG_SHIFT);

return 0;
+ } else if (strcmp(argv[1], "LINES") == 0) {
+ int lines;
+ char *cp;
+
+ lines = simple_strtol(argv[2], &cp, 0);
+ if (cp == argv[2]) {
+ kdb_printf("kdb: illegal LINES value '%s'\n",
+ argv[2]);
+ return 0;
+ }
+ kdb_lines = lines;
+ return 0;
}

/*
@@ -721,8 +734,11 @@ static int kdb_defcmd(int argc, const char **argv)
*/
static int kdb_exec_defcmd(int argc, const char **argv)
{
- int i, ret;
+ int i;
+ int oldlines;
struct defcmd_set *s;
+ int ret = 0;
+
if (argc != 0)
return KDB_ARGCOUNT;
for (s = defcmd_set, i = 0; i < defcmd_set_count; ++i, ++s) {
@@ -734,6 +750,9 @@ static int kdb_exec_defcmd(int argc, const char **argv)
argv[0]);
return KDB_NOTIMP;
}
+
+ /* command might have overridden LINES */
+ oldlines = kdb_lines;
for (i = 0; i < s->count; ++i) {
/* Recursive use of kdb_parse, do not use argv after
* this point */
@@ -741,9 +760,10 @@ static int kdb_exec_defcmd(int argc, const char **argv)
kdb_printf("[%s]kdb> %s\n", s->name, s->command[i]);
ret = kdb_parse(s->command[i]);
if (ret)
- return ret;
+ break;
}
- return 0;
+ kdb_lines = oldlines;
+ return ret;
}

/* Command history */
@@ -2026,6 +2046,9 @@ static int kdb_env(int argc, const char **argv)
if (KDB_DEBUG(MASK))
kdb_printf("KDBFLAGS=0x%x\n", kdb_flags);

+ if (kdb_lines)
+ kdb_printf("LINES=%d\n", kdb_lines);
+
return 0;
}

diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index e381d10..41a221f 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -154,6 +154,7 @@ extern int kdb_state;
#define KDB_STATE_CLEAR(flag) ((void)(kdb_state &= ~KDB_STATE_##flag))

extern int kdb_nextline; /* Current number of lines displayed */
+extern int kdb_lines; /* Limit on number of lines displayed at once. */

typedef struct _kdb_bp {
unsigned long bp_addr; /* Address breakpoint is present at */
--
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/