[Crash-utility] [PATCH] search: Introduce -T option
Aaron Tomlin
atomlin at redhat.com
Fri Oct 6 08:26:40 UTC 2017
On Wed 2017-10-04 14:52 -0400, Dave Anderson wrote:
> Couple minor things about the patch...
[ ... ]
> I'm not sure why it couldn't be used on a live dump:
>
> + if (Tflag && LIVE())
> + error(FATAL,
> + "-T option cannot be used on a live "
> + "system or live dump\n");
> +
>
> I agree that it should be restricted for a live system, but it
> seems safe to allow it for a live dump? (i.e., use ACTIVE() instead)
> With "bt", it does make sense to restrict it, because it's trying to
> unwind/translate what's being actively written on the stack when the
> dump was taken. But just a simple search should be safe.
Fair enough - I agree a 'live dump' (i.e. with pc->flags2 & LIVE_DUMP set)
is fine for this option. I'll use ACTIVE() instead.
> And lastly, this minor nit -- this kind of seems like overkill:
[ ... ]
> Why not something simple like this:
>
> - if (tflag) {
> + if (tflag || Tflag) {
> searchinfo.tasks_found = 0;
> tc = FIRST_CONTEXT();
> for (i = 0; i < RUNNING_TASKS(); i++, tc++) {
> + if (Tflag && !is_task_active(tc->task))
> + continue;
> searchinfo.vaddr_start = GET_STACKBASE(tc->task);
> searchinfo.vaddr_end = GET_STACKTOP(tc->task);
> searchinfo.task_context = tc;
> searchinfo.do_task_header = TRUE;
> search_virtual(&searchinfo);
> }
> break;
> }
I don't like the above since we'd have to traverse RUNNING_TASKS() just to
find each active task. If I understand correctly, under a live dump the
panic_threads[] should be populated. So it should be safe to use?
> It would also keep the searchinfo initializations contained within
> the cmd_search() function like all of the other arguments.
How about the following then:
-------------- next part --------------
>From 46710702ca2fa2b25411293c98863d353f646c40 Mon Sep 17 00:00:00 2001
From: Aaron Tomlin <atomlin at redhat.com>
Date: Tue, 3 Oct 2017 17:30:04 +0100
Subject: [PATCH] search: Introduce -T option
Like the -t option, except consider only the "active" task
on each CPU and cannot be used on a live system.
The -t and -T options are mutually exclusive.
Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
---
help.c | 4 +++-
memory.c | 53 +++++++++++++++++++++++++++++++++++++++--------------
2 files changed, 42 insertions(+), 15 deletions(-)
diff --git a/help.c b/help.c
index 2d80202..3e65b15 100644
--- a/help.c
+++ b/help.c
@@ -2862,7 +2862,7 @@ NULL
char *help_search[] = {
"search",
"search memory",
-"[-s start] [ -[kKV] | -u | -p | -t ] [-e end | -l length] [-m mask]\n"
+"[-s start] [ -[kKV] | -u | -p | -t|-T ] [-e end | -l length] [-m mask]\n"
" [-x count] -[cwh] [value | (expression) | symbol | string] ...",
" This command searches for a given value within a range of user virtual, kernel",
" virtual, or physical memory space. If no end nor length value is entered, ",
@@ -2893,6 +2893,8 @@ char *help_search[] = {
" -t Search only the kernel stack pages of every task. If one or more",
" matches are found in a task's kernel stack, precede the output",
" with a task-identifying header.",
+" -T Same as -t, except only the active task(s) are considered.",
+" This option cannot be used on a live system.",
" -e end Stop the search at this hexadecimal user or kernel virtual",
" address, kernel symbol, or physical address. The end address",
" must be appropriate for the memory type specified.",
diff --git a/memory.c b/memory.c
index 8efe0b2..8b026ce 100644
--- a/memory.c
+++ b/memory.c
@@ -13864,6 +13864,12 @@ generic_get_kvaddr_ranges(struct vaddr_range *rp)
return cnt;
}
+#define PREPARE_SEARCHINFO_FOR_TASK_SEARCH(si, tc) \
+ si.tasks_found = 0; \
+ si.vaddr_start = GET_STACKBASE((tc)->task); \
+ si.vaddr_end = GET_STACKTOP((tc)->task); \
+ si.task_context = tc; \
+ si.do_task_header = TRUE;
/*
* Search for a given value between a starting and ending address range,
@@ -13882,7 +13888,7 @@ cmd_search(void)
ulong value, mask, len;
ulong uvaddr_start, uvaddr_end;
ulong kvaddr_start, kvaddr_end, range_end;
- int sflag, Kflag, Vflag, pflag, tflag;
+ int sflag, Kflag, Vflag, pflag, Tflag, tflag;
struct searchinfo searchinfo;
struct syment *sp;
struct node_table *nt;
@@ -13896,7 +13902,7 @@ cmd_search(void)
context = max = 0;
start = end = 0;
- value = mask = sflag = pflag = Kflag = Vflag = memtype = len = tflag = 0;
+ value = mask = sflag = pflag = Kflag = Vflag = memtype = len = Tflag = tflag = 0;
kvaddr_start = kvaddr_end = 0;
uvaddr_start = UNINITIALIZED;
uvaddr_end = COMMON_VADDR_SPACE() ? (ulong)(-1) : machdep->kvbase;
@@ -13933,7 +13939,7 @@ cmd_search(void)
searchinfo.mode = SEARCH_ULONG; /* default search */
- while ((c = getopt(argcnt, args, "tl:ukKVps:e:v:m:hwcx:")) != EOF) {
+ while ((c = getopt(argcnt, args, "Ttl:ukKVps:e:v:m:hwcx:")) != EOF) {
switch(c)
{
case 'u':
@@ -14038,12 +14044,17 @@ cmd_search(void)
context = dtoi(optarg, FAULT_ON_ERROR, NULL);
break;
+ case 'T':
case 't':
if (XEN_HYPER_MODE())
error(FATAL,
- "-t option is not applicable to the "
- "Xen hypervisor\n");
- tflag++;
+ "-%c option is not applicable to the "
+ "Xen hypervisor\n", c);
+
+ if (c == 'T')
+ Tflag++;
+ else if (c == 't')
+ tflag++;
break;
default:
@@ -14052,10 +14063,19 @@ cmd_search(void)
}
}
- if (tflag && (memtype || start || end || len))
+ if ((tflag || Tflag) && (memtype || start || end || len))
+ error(FATAL,
+ "-%c option cannot be used with other "
+ "memory-selection options\n",
+ tflag ? 't' : 'T');
+
+ if (Tflag && ACTIVE())
error(FATAL,
- "-t option cannot be used with other "
- "memory-selection options\n");
+ "-T option cannot be used on a live system\n");
+
+ if (tflag && Tflag)
+ error(FATAL,
+ "-t and -T options are mutually exclusive\n");
if (XEN_HYPER_MODE()) {
memtype = KVADDR;
@@ -14328,14 +14348,19 @@ cmd_search(void)
break;
}
+ if (Tflag) {
+ for (c = 0; c < NR_CPUS; c++)
+ if ((tc = task_to_context(tt->panic_threads[c]))) {
+ PREPARE_SEARCHINFO_FOR_TASK_SEARCH(searchinfo, tc);
+ search_virtual(&searchinfo);
+ }
+ break;
+ }
+
if (tflag) {
- searchinfo.tasks_found = 0;
tc = FIRST_CONTEXT();
for (i = 0; i < RUNNING_TASKS(); i++, tc++) {
- searchinfo.vaddr_start = GET_STACKBASE(tc->task);
- searchinfo.vaddr_end = GET_STACKTOP(tc->task);
- searchinfo.task_context = tc;
- searchinfo.do_task_header = TRUE;
+ PREPARE_SEARCHINFO_FOR_TASK_SEARCH(searchinfo, tc);
search_virtual(&searchinfo);
}
break;
--
2.9.4
More information about the Crash-utility
mailing list