Skip to content

Commit

Permalink
kdb: fix per_cpu command to remove supress mask
Browse files Browse the repository at this point in the history
Rusty pointed out that the per_cpu command uses up lots of space on
the stack and the cpu supress mask is probably not needed.

This patch removes the need for the supress mask as well as fixing up
the following problems with the kdb per_cpu command:
  * The per_cpu command should allow an address as an argument
  * When you have more data than can be displayed on one screen allow
    the user to break out of the print loop.

Reported-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
  • Loading branch information
Jason Wessel committed Oct 29, 2010
1 parent 4aad8f5 commit 931ea24
Showing 1 changed file with 11 additions and 35 deletions.
46 changes: 11 additions & 35 deletions kernel/debug/kdb/kdb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2603,20 +2603,17 @@ static int kdb_summary(int argc, const char **argv)
*/
static int kdb_per_cpu(int argc, const char **argv)
{
char buf[256], fmtstr[64];
kdb_symtab_t symtab;
cpumask_t suppress = CPU_MASK_NONE;
int cpu, diag;
unsigned long addr, val, bytesperword = 0, whichcpu = ~0UL;
char fmtstr[64];
int cpu, diag, nextarg = 1;
unsigned long addr, symaddr, val, bytesperword = 0, whichcpu = ~0UL;

if (argc < 1 || argc > 3)
return KDB_ARGCOUNT;

snprintf(buf, sizeof(buf), "per_cpu__%s", argv[1]);
if (!kdbgetsymval(buf, &symtab)) {
kdb_printf("%s is not a per_cpu variable\n", argv[1]);
return KDB_BADADDR;
}
diag = kdbgetaddrarg(argc, argv, &nextarg, &symaddr, NULL, NULL);
if (diag)
return diag;

if (argc >= 2) {
diag = kdbgetularg(argv[2], &bytesperword);
if (diag)
Expand Down Expand Up @@ -2649,46 +2646,25 @@ static int kdb_per_cpu(int argc, const char **argv)
#define KDB_PCU(cpu) 0
#endif
#endif

for_each_online_cpu(cpu) {
if (KDB_FLAG(CMD_INTERRUPT))
return 0;

if (whichcpu != ~0UL && whichcpu != cpu)
continue;
addr = symtab.sym_start + KDB_PCU(cpu);
addr = symaddr + KDB_PCU(cpu);
diag = kdb_getword(&val, addr, bytesperword);
if (diag) {
kdb_printf("%5d " kdb_bfd_vma_fmt0 " - unable to "
"read, diag=%d\n", cpu, addr, diag);
continue;
}
#ifdef CONFIG_SMP
if (!val) {
cpu_set(cpu, suppress);
continue;
}
#endif /* CONFIG_SMP */
kdb_printf("%5d ", cpu);
kdb_md_line(fmtstr, addr,
bytesperword == KDB_WORD_SIZE,
1, bytesperword, 1, 1, 0);
}
if (cpus_weight(suppress) == 0)
return 0;
kdb_printf("Zero suppressed cpu(s):");
for (cpu = first_cpu(suppress); cpu < num_possible_cpus();
cpu = next_cpu(cpu, suppress)) {
kdb_printf(" %d", cpu);
if (cpu == num_possible_cpus() - 1 ||
next_cpu(cpu, suppress) != cpu + 1)
continue;
while (cpu < num_possible_cpus() &&
next_cpu(cpu, suppress) == cpu + 1)
++cpu;
kdb_printf("-%d", cpu);
}
kdb_printf("\n");

#undef KDB_PCU

return 0;
}

Expand Down

0 comments on commit 931ea24

Please sign in to comment.