linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 3.17-rc4 0/3] kdb: Improve command output searching
@ 2014-09-11 12:29 Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-09-11 12:29 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, patches, linaro-kernel, linux-kernel,
	kgdb-bugreport, Ingo Molnar, John Stultz, Sumit Semwal

This patchset improves kdb's capabilities to search the output
of commands. Specifically it fixes a bug in the prompt management
when '| grep' is used and adds a new feature to search command
output interactively from the more prompt.


Daniel Thompson (3):
  kdb: Fix a prompt management bug when using | grep
  kdb: Provide forward search at more prompt
  kdb: Const qualifier for kdb_getstr's prompt argument

 kernel/debug/kdb/kdb_io.c      | 24 +++++++++++++++++++++---
 kernel/debug/kdb/kdb_main.c    | 11 ++++++-----
 kernel/debug/kdb/kdb_private.h |  4 +++-
 3 files changed, 30 insertions(+), 9 deletions(-)

--
1.9.3


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 3.17-rc4 1/3] kdb: Fix a prompt management bug when using | grep
  2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
@ 2014-09-11 12:29 ` Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 2/3] kdb: Provide forward search at more prompt Daniel Thompson
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-09-11 12:29 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, patches, linaro-kernel, linux-kernel,
	kgdb-bugreport, Ingo Molnar, John Stultz, Sumit Semwal

Currently when the "| grep" feature is used to filter the output of a
command then the prompt is not displayed for the subsequent command.
Likewise any characters typed by the user are also not echoed to the
display. This rather disconcerting problem eventually corrects itself
when the user presses Enter the kdb_grepping_flag is cleared when
kdb_parse() tries to make sense of whatever they typed.

This patch resolves the problem by moving the clearing of this flag
from the middle of command processing to the beginning.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 379650b..9d10cb2 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -872,13 +872,12 @@ int kdb_parse(const char *cmdstr)
 	char *cp;
 	char *cpp, quoted;
 	kdbtab_t *tp;
-	int i, escaped, ignore_errors = 0, check_grep;
+	int i, escaped, ignore_errors = 0, check_grep = 0;
 
 	/*
 	 * First tokenize the command string.
 	 */
 	cp = (char *)cmdstr;
-	kdb_grepping_flag = check_grep = 0;
 
 	if (KDB_FLAG(CMD_INTERRUPT)) {
 		/* Previous command was interrupted, newline must not
@@ -1241,6 +1240,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		 */
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
+		kdb_grepping_flag = 0;
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3.17-rc4 2/3] kdb: Provide forward search at more prompt
  2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
@ 2014-09-11 12:29 ` Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-09-11 12:29 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, patches, linaro-kernel, linux-kernel,
	kgdb-bugreport, Ingo Molnar, John Stultz, Sumit Semwal

Currently kdb allows the output of comamnds to be filtered using the
| grep feature. This is useful but does not permit the output emitted
shortly after a string match to be examined without wading through the
entire unfiltered output of the command. Such a feature is particularly
useful to navigate function traces because these traces often have a
useful trigger string *before* the point of interest.

This patch reuses the existing filtering logic to introduce a simple
forward search to kdb that can be triggered from the more prompt.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 22 ++++++++++++++++++++--
 kernel/debug/kdb/kdb_main.c    |  7 ++++---
 kernel/debug/kdb/kdb_private.h |  2 ++
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 7c70812..70e0f49 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -680,6 +680,12 @@ int vkdb_printf(const char *fmt, va_list ap)
 			size_avail = sizeof(kdb_buffer) - len;
 			goto kdb_print_out;
 		}
+		if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH)
+			/*
+			 * This was a interactive search (using '/' at more
+			 * prompt) and it has completed. Clear the flag.
+			 */
+			kdb_grepping_flag = 0;
 		/*
 		 * at this point the string is a full line and
 		 * should be printed, up to the null.
@@ -794,11 +800,23 @@ kdb_printit:
 			kdb_nextline = linecount - 1;
 			kdb_printf("\r");
 			suspend_grep = 1; /* for this recursion */
+		} else if (buf1[0] == '/' && !kdb_grepping_flag) {
+			kdb_printf("\r");
+			kdb_getstr(kdb_grep_string, KDB_GREP_STRLEN,
+				   kdbgetenv("SEARCHPROMPT") ?: "search> ");
+			*strchrnul(kdb_grep_string, '\n') = '\0';
+			kdb_grepping_flag += KDB_GREPPING_FLAG_SEARCH;
+			suspend_grep = 1; /* for this recursion */
 		} else if (buf1[0] && buf1[0] != '\n') {
 			/* user hit something other than enter */
 			suspend_grep = 1; /* for this recursion */
-			kdb_printf("\nOnly 'q' or 'Q' are processed at more "
-				   "prompt, input ignored\n");
+			if (buf1[0] != '/')
+				kdb_printf(
+				    "\nOnly 'q', 'Q' or '/' are processed at "
+				    "more prompt, input ignored\n");
+			else
+				kdb_printf("\n'/' cannot be used during | "
+					   "grep filtering, input ignored\n");
 		} else if (kdb_grepping_flag) {
 			/* user hit enter */
 			suspend_grep = 1; /* for this recursion */
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 9d10cb2..c36f6f6 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -42,8 +42,7 @@
 #include <linux/slab.h>
 #include "kdb_private.h"
 
-#define GREP_LEN 256
-char kdb_grep_string[GREP_LEN];
+char kdb_grep_string[KDB_GREP_STRLEN];
 int kdb_grepping_flag;
 EXPORT_SYMBOL(kdb_grepping_flag);
 int kdb_grep_leading;
@@ -827,7 +826,7 @@ static void parse_grep(const char *str)
 	len = strlen(cp);
 	if (!len)
 		return;
-	if (len >= GREP_LEN) {
+	if (len >= KDB_GREP_STRLEN) {
 		kdb_printf("search string too long\n");
 		return;
 	}
@@ -1241,6 +1240,8 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
 		kdb_grepping_flag = 0;
+		/* ensure the old search does not leak into '/' commands */
+		kdb_grep_string[0] = '\0';
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 7afd3c8..30ed4f3 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -197,7 +197,9 @@ extern int kdb_main_loop(kdb_reason_t, kdb_reason_t,
 
 /* Miscellaneous functions and data areas */
 extern int kdb_grepping_flag;
+#define KDB_GREPPING_FLAG_SEARCH 0x8000
 extern char kdb_grep_string[];
+#define KDB_GREP_STRLEN 256
 extern int kdb_grep_leading;
 extern int kdb_grep_trailing;
 extern char *kdb_cmds[];
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3.17-rc4 3/3] kdb: Const qualifier for kdb_getstr's prompt argument
  2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
  2014-09-11 12:29 ` [PATCH 3.17-rc4 2/3] kdb: Provide forward search at more prompt Daniel Thompson
@ 2014-09-11 12:29 ` Daniel Thompson
  2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
  2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
  4 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-09-11 12:29 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, patches, linaro-kernel, linux-kernel,
	kgdb-bugreport, Ingo Molnar, John Stultz, Sumit Semwal

All current callers of kdb_getstr() can pass constant pointers via the
prompt argument. This patch adds a const qualification to make explicit
the fact that this is safe.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 2 +-
 kernel/debug/kdb/kdb_private.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 70e0f49..59a6071 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -439,7 +439,7 @@ poll_again:
  *	substituted for %d, %x or %o in the prompt.
  */
 
-char *kdb_getstr(char *buffer, size_t bufsize, char *prompt)
+char *kdb_getstr(char *buffer, size_t bufsize, const char *prompt)
 {
 	if (prompt && kdb_prompt_str != prompt)
 		strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 30ed4f3..aa90a6a 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -212,7 +212,7 @@ extern void kdb_ps1(const struct task_struct *p);
 extern void kdb_print_nameval(const char *name, unsigned long val);
 extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info);
 extern void kdb_meminfo_proc_show(void);
-extern char *kdb_getstr(char *, size_t, char *);
+extern char *kdb_getstr(char *, size_t, const char *);
 extern void kdb_gdb_state_pass(char *buf);
 
 /* Defines for kdb_symbol_print */
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching
  2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
                   ` (2 preceding siblings ...)
  2014-09-11 12:29 ` [PATCH 3.17-rc4 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
@ 2014-11-06 16:02 ` Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
                     ` (2 more replies)
  2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
  4 siblings, 3 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-11-06 16:02 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

This patchset improves kdb's capabilities to search the output of
commands.

Specifically it fixes a bug in the prompt management when '| grep' is
used and adds a new feature to search command output interactively from
the more prompt. Finally there is a trivial bit of const clean up that I
spotted when implementing the other two patches.


Daniel Thompson (3):
  kdb: Fix a prompt management bug when using | grep
  kdb: Provide forward search at more prompt
  kdb: Const qualifier for kdb_getstr's prompt argument

 kernel/debug/kdb/kdb_io.c      | 24 +++++++++++++++++++++---
 kernel/debug/kdb/kdb_main.c    | 11 ++++++-----
 kernel/debug/kdb/kdb_private.h |  4 +++-
 3 files changed, 30 insertions(+), 9 deletions(-)

--
1.9.3


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.18-rc3 1/3] kdb: Fix a prompt management bug when using | grep
  2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
@ 2014-11-06 16:02   ` Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 2/3] kdb: Provide forward search at more prompt Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-11-06 16:02 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

Currently when the "| grep" feature is used to filter the output of a
command then the prompt is not displayed for the subsequent command.
Likewise any characters typed by the user are also not echoed to the
display. This rather disconcerting problem eventually corrects itself
when the user presses Enter and the kdb_grepping_flag is cleared as
kdb_parse() tries to make sense of whatever they typed.

This patch resolves the problem by moving the clearing of this flag
from the middle of command processing to the beginning.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 379650b..9d10cb2 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -872,13 +872,12 @@ int kdb_parse(const char *cmdstr)
 	char *cp;
 	char *cpp, quoted;
 	kdbtab_t *tp;
-	int i, escaped, ignore_errors = 0, check_grep;
+	int i, escaped, ignore_errors = 0, check_grep = 0;
 
 	/*
 	 * First tokenize the command string.
 	 */
 	cp = (char *)cmdstr;
-	kdb_grepping_flag = check_grep = 0;
 
 	if (KDB_FLAG(CMD_INTERRUPT)) {
 		/* Previous command was interrupted, newline must not
@@ -1241,6 +1240,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		 */
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
+		kdb_grepping_flag = 0;
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.18-rc3 2/3] kdb: Provide forward search at more prompt
  2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
@ 2014-11-06 16:02   ` Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-11-06 16:02 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

Currently kdb allows the output of comamnds to be filtered using the
| grep feature. This is useful but does not permit the output emitted
shortly after a string match to be examined without wading through the
entire unfiltered output of the command. Such a feature is particularly
useful to navigate function traces because these traces often have a
useful trigger string *before* the point of interest.

This patch reuses the existing filtering logic to introduce a simple
forward search to kdb that can be triggered from the more prompt.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 22 ++++++++++++++++++++--
 kernel/debug/kdb/kdb_main.c    |  7 ++++---
 kernel/debug/kdb/kdb_private.h |  2 ++
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 7c70812..70e0f49 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -680,6 +680,12 @@ int vkdb_printf(const char *fmt, va_list ap)
 			size_avail = sizeof(kdb_buffer) - len;
 			goto kdb_print_out;
 		}
+		if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH)
+			/*
+			 * This was a interactive search (using '/' at more
+			 * prompt) and it has completed. Clear the flag.
+			 */
+			kdb_grepping_flag = 0;
 		/*
 		 * at this point the string is a full line and
 		 * should be printed, up to the null.
@@ -794,11 +800,23 @@ kdb_printit:
 			kdb_nextline = linecount - 1;
 			kdb_printf("\r");
 			suspend_grep = 1; /* for this recursion */
+		} else if (buf1[0] == '/' && !kdb_grepping_flag) {
+			kdb_printf("\r");
+			kdb_getstr(kdb_grep_string, KDB_GREP_STRLEN,
+				   kdbgetenv("SEARCHPROMPT") ?: "search> ");
+			*strchrnul(kdb_grep_string, '\n') = '\0';
+			kdb_grepping_flag += KDB_GREPPING_FLAG_SEARCH;
+			suspend_grep = 1; /* for this recursion */
 		} else if (buf1[0] && buf1[0] != '\n') {
 			/* user hit something other than enter */
 			suspend_grep = 1; /* for this recursion */
-			kdb_printf("\nOnly 'q' or 'Q' are processed at more "
-				   "prompt, input ignored\n");
+			if (buf1[0] != '/')
+				kdb_printf(
+				    "\nOnly 'q', 'Q' or '/' are processed at "
+				    "more prompt, input ignored\n");
+			else
+				kdb_printf("\n'/' cannot be used during | "
+					   "grep filtering, input ignored\n");
 		} else if (kdb_grepping_flag) {
 			/* user hit enter */
 			suspend_grep = 1; /* for this recursion */
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 9d10cb2..c36f6f6 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -42,8 +42,7 @@
 #include <linux/slab.h>
 #include "kdb_private.h"
 
-#define GREP_LEN 256
-char kdb_grep_string[GREP_LEN];
+char kdb_grep_string[KDB_GREP_STRLEN];
 int kdb_grepping_flag;
 EXPORT_SYMBOL(kdb_grepping_flag);
 int kdb_grep_leading;
@@ -827,7 +826,7 @@ static void parse_grep(const char *str)
 	len = strlen(cp);
 	if (!len)
 		return;
-	if (len >= GREP_LEN) {
+	if (len >= KDB_GREP_STRLEN) {
 		kdb_printf("search string too long\n");
 		return;
 	}
@@ -1241,6 +1240,8 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
 		kdb_grepping_flag = 0;
+		/* ensure the old search does not leak into '/' commands */
+		kdb_grep_string[0] = '\0';
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 7afd3c8..30ed4f3 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -197,7 +197,9 @@ extern int kdb_main_loop(kdb_reason_t, kdb_reason_t,
 
 /* Miscellaneous functions and data areas */
 extern int kdb_grepping_flag;
+#define KDB_GREPPING_FLAG_SEARCH 0x8000
 extern char kdb_grep_string[];
+#define KDB_GREP_STRLEN 256
 extern int kdb_grep_leading;
 extern int kdb_grep_trailing;
 extern char *kdb_cmds[];
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.18-rc3 3/3] kdb: Const qualifier for kdb_getstr's prompt argument
  2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
  2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 2/3] kdb: Provide forward search at more prompt Daniel Thompson
@ 2014-11-06 16:02   ` Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2014-11-06 16:02 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

All current callers of kdb_getstr() can pass constant pointers via the
prompt argument. This patch adds a const qualification to make explicit
the fact that this is safe.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 2 +-
 kernel/debug/kdb/kdb_private.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 70e0f49..59a6071 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -439,7 +439,7 @@ poll_again:
  *	substituted for %d, %x or %o in the prompt.
  */
 
-char *kdb_getstr(char *buffer, size_t bufsize, char *prompt)
+char *kdb_getstr(char *buffer, size_t bufsize, const char *prompt)
 {
 	if (prompt && kdb_prompt_str != prompt)
 		strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 30ed4f3..aa90a6a 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -212,7 +212,7 @@ extern void kdb_ps1(const struct task_struct *p);
 extern void kdb_print_nameval(const char *name, unsigned long val);
 extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info);
 extern void kdb_meminfo_proc_show(void);
-extern char *kdb_getstr(char *, size_t, char *);
+extern char *kdb_getstr(char *, size_t, const char *);
 extern void kdb_gdb_state_pass(char *buf);
 
 /* Defines for kdb_symbol_print */
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching
  2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
                   ` (3 preceding siblings ...)
  2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
@ 2015-01-07 16:10 ` Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
                     ` (2 more replies)
  4 siblings, 3 replies; 12+ messages in thread
From: Daniel Thompson @ 2015-01-07 16:10 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

This patchset improves kdb's capabilities to search the output of
commands.

Specifically it fixes a bug in the prompt management when '| grep' is
used and adds a new feature to search command output interactively from
the more prompt. Finally there is a trivial bit of const clean up that I
spotted when implementing the other two patches.


Daniel Thompson (3):
  kdb: Fix a prompt management bug when using | grep
  kdb: Provide forward search at more prompt
  kdb: Const qualifier for kdb_getstr's prompt argument

 kernel/debug/kdb/kdb_io.c      | 24 +++++++++++++++++++++---
 kernel/debug/kdb/kdb_main.c    | 11 ++++++-----
 kernel/debug/kdb/kdb_private.h |  4 +++-
 3 files changed, 30 insertions(+), 9 deletions(-)

--
1.9.3


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.19-rc2 1/3] kdb: Fix a prompt management bug when using | grep
  2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
@ 2015-01-07 16:10   ` Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 2/3] kdb: Provide forward search at more prompt Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2015-01-07 16:10 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

Currently when the "| grep" feature is used to filter the output of a
command then the prompt is not displayed for the subsequent command.
Likewise any characters typed by the user are also not echoed to the
display. This rather disconcerting problem eventually corrects itself
when the user presses Enter and the kdb_grepping_flag is cleared as
kdb_parse() tries to make sense of whatever they typed.

This patch resolves the problem by moving the clearing of this flag
from the middle of command processing to the beginning.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 379650b984f8..9d10cb20cef1 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -872,13 +872,12 @@ int kdb_parse(const char *cmdstr)
 	char *cp;
 	char *cpp, quoted;
 	kdbtab_t *tp;
-	int i, escaped, ignore_errors = 0, check_grep;
+	int i, escaped, ignore_errors = 0, check_grep = 0;
 
 	/*
 	 * First tokenize the command string.
 	 */
 	cp = (char *)cmdstr;
-	kdb_grepping_flag = check_grep = 0;
 
 	if (KDB_FLAG(CMD_INTERRUPT)) {
 		/* Previous command was interrupted, newline must not
@@ -1241,6 +1240,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		 */
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
+		kdb_grepping_flag = 0;
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.19-rc2 2/3] kdb: Provide forward search at more prompt
  2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
@ 2015-01-07 16:10   ` Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2015-01-07 16:10 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

Currently kdb allows the output of comamnds to be filtered using the
| grep feature. This is useful but does not permit the output emitted
shortly after a string match to be examined without wading through the
entire unfiltered output of the command. Such a feature is particularly
useful to navigate function traces because these traces often have a
useful trigger string *before* the point of interest.

This patch reuses the existing filtering logic to introduce a simple
forward search to kdb that can be triggered from the more prompt.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 22 ++++++++++++++++++++--
 kernel/debug/kdb/kdb_main.c    |  7 ++++---
 kernel/debug/kdb/kdb_private.h |  2 ++
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 7c70812caea5..70e0f494d3f8 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -680,6 +680,12 @@ int vkdb_printf(const char *fmt, va_list ap)
 			size_avail = sizeof(kdb_buffer) - len;
 			goto kdb_print_out;
 		}
+		if (kdb_grepping_flag >= KDB_GREPPING_FLAG_SEARCH)
+			/*
+			 * This was a interactive search (using '/' at more
+			 * prompt) and it has completed. Clear the flag.
+			 */
+			kdb_grepping_flag = 0;
 		/*
 		 * at this point the string is a full line and
 		 * should be printed, up to the null.
@@ -794,11 +800,23 @@ kdb_printit:
 			kdb_nextline = linecount - 1;
 			kdb_printf("\r");
 			suspend_grep = 1; /* for this recursion */
+		} else if (buf1[0] == '/' && !kdb_grepping_flag) {
+			kdb_printf("\r");
+			kdb_getstr(kdb_grep_string, KDB_GREP_STRLEN,
+				   kdbgetenv("SEARCHPROMPT") ?: "search> ");
+			*strchrnul(kdb_grep_string, '\n') = '\0';
+			kdb_grepping_flag += KDB_GREPPING_FLAG_SEARCH;
+			suspend_grep = 1; /* for this recursion */
 		} else if (buf1[0] && buf1[0] != '\n') {
 			/* user hit something other than enter */
 			suspend_grep = 1; /* for this recursion */
-			kdb_printf("\nOnly 'q' or 'Q' are processed at more "
-				   "prompt, input ignored\n");
+			if (buf1[0] != '/')
+				kdb_printf(
+				    "\nOnly 'q', 'Q' or '/' are processed at "
+				    "more prompt, input ignored\n");
+			else
+				kdb_printf("\n'/' cannot be used during | "
+					   "grep filtering, input ignored\n");
 		} else if (kdb_grepping_flag) {
 			/* user hit enter */
 			suspend_grep = 1; /* for this recursion */
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 9d10cb20cef1..c36f6f6696c2 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -42,8 +42,7 @@
 #include <linux/slab.h>
 #include "kdb_private.h"
 
-#define GREP_LEN 256
-char kdb_grep_string[GREP_LEN];
+char kdb_grep_string[KDB_GREP_STRLEN];
 int kdb_grepping_flag;
 EXPORT_SYMBOL(kdb_grepping_flag);
 int kdb_grep_leading;
@@ -827,7 +826,7 @@ static void parse_grep(const char *str)
 	len = strlen(cp);
 	if (!len)
 		return;
-	if (len >= GREP_LEN) {
+	if (len >= KDB_GREP_STRLEN) {
 		kdb_printf("search string too long\n");
 		return;
 	}
@@ -1241,6 +1240,8 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
 		kdb_nextline = 1;
 		KDB_STATE_CLEAR(SUPPRESS);
 		kdb_grepping_flag = 0;
+		/* ensure the old search does not leak into '/' commands */
+		kdb_grep_string[0] = '\0';
 
 		cmdbuf = cmd_cur;
 		*cmdbuf = '\0';
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 7afd3c8c41d5..30ed4f3d8606 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -197,7 +197,9 @@ extern int kdb_main_loop(kdb_reason_t, kdb_reason_t,
 
 /* Miscellaneous functions and data areas */
 extern int kdb_grepping_flag;
+#define KDB_GREPPING_FLAG_SEARCH 0x8000
 extern char kdb_grep_string[];
+#define KDB_GREP_STRLEN 256
 extern int kdb_grep_leading;
 extern int kdb_grep_trailing;
 extern char *kdb_cmds[];
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [RESEND PATCH 3.19-rc2 3/3] kdb: Const qualifier for kdb_getstr's prompt argument
  2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
  2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 2/3] kdb: Provide forward search at more prompt Daniel Thompson
@ 2015-01-07 16:10   ` Daniel Thompson
  2 siblings, 0 replies; 12+ messages in thread
From: Daniel Thompson @ 2015-01-07 16:10 UTC (permalink / raw)
  To: Jason Wessel
  Cc: Daniel Thompson, linux-kernel, kgdb-bugreport, Andrew Morton,
	Ingo Molnar, patches, linaro-kernel, John Stultz, Sumit Semwal

All current callers of kdb_getstr() can pass constant pointers via the
prompt argument. This patch adds a const qualification to make explicit
the fact that this is safe.

Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
 kernel/debug/kdb/kdb_io.c      | 2 +-
 kernel/debug/kdb/kdb_private.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
index 70e0f494d3f8..59a6071139bc 100644
--- a/kernel/debug/kdb/kdb_io.c
+++ b/kernel/debug/kdb/kdb_io.c
@@ -439,7 +439,7 @@ poll_again:
  *	substituted for %d, %x or %o in the prompt.
  */
 
-char *kdb_getstr(char *buffer, size_t bufsize, char *prompt)
+char *kdb_getstr(char *buffer, size_t bufsize, const char *prompt)
 {
 	if (prompt && kdb_prompt_str != prompt)
 		strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
index 30ed4f3d8606..aa90a6a63e88 100644
--- a/kernel/debug/kdb/kdb_private.h
+++ b/kernel/debug/kdb/kdb_private.h
@@ -212,7 +212,7 @@ extern void kdb_ps1(const struct task_struct *p);
 extern void kdb_print_nameval(const char *name, unsigned long val);
 extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info);
 extern void kdb_meminfo_proc_show(void);
-extern char *kdb_getstr(char *, size_t, char *);
+extern char *kdb_getstr(char *, size_t, const char *);
 extern void kdb_gdb_state_pass(char *buf);
 
 /* Defines for kdb_symbol_print */
-- 
1.9.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-01-07 16:18 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-11 12:29 [PATCH 3.17-rc4 0/3] kdb: Improve command output searching Daniel Thompson
2014-09-11 12:29 ` [PATCH 3.17-rc4 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
2014-09-11 12:29 ` [PATCH 3.17-rc4 2/3] kdb: Provide forward search at more prompt Daniel Thompson
2014-09-11 12:29 ` [PATCH 3.17-rc4 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
2014-11-06 16:02 ` [RESEND PATCH 3.18-rc3 0/3] kdb: Improve command output searching Daniel Thompson
2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 2/3] kdb: Provide forward search at more prompt Daniel Thompson
2014-11-06 16:02   ` [RESEND PATCH 3.18-rc3 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson
2015-01-07 16:10 ` [RESEND PATCH 3.19-rc2 0/3] kdb: Improve command output searching Daniel Thompson
2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 1/3] kdb: Fix a prompt management bug when using | grep Daniel Thompson
2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 2/3] kdb: Provide forward search at more prompt Daniel Thompson
2015-01-07 16:10   ` [RESEND PATCH 3.19-rc2 3/3] kdb: Const qualifier for kdb_getstr's prompt argument Daniel Thompson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).