This patch introduces cpu_active_mask related support for crash. It is import for ARM platform to detemine the number of online CPUs. Signed-off-by: Liu Hua <sdu.liu@xxxxxxxxxx> --- defs.h | 4 +++- kernel.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ ppc64.c | 2 ++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/defs.h b/defs.h index c40cf8d..c02b69f 100644 --- a/defs.h +++ b/defs.h @@ -655,7 +655,8 @@ struct kernel_table { /* kernel data */ #define POSSIBLE_MAP (0x1) #define PRESENT_MAP (0x2) #define ONLINE_MAP (0x4) -#define NMI (0x8) +#define ACTIVE_MAP (0x8) +#define NMI (0x10) int BUG_bytes; ulong xen_flags; #define WRITABLE_PAGE_TABLES (0x1) @@ -4792,6 +4793,7 @@ void set_cpu(int); void clear_machdep_cache(void); struct stack_hook *gather_text_list(struct bt_info *); int get_cpus_online(void); +int get_cpus_active(void); int get_cpus_present(void); int get_cpus_possible(void); int get_highest_cpu_online(void); diff --git a/kernel.c b/kernel.c index 87656fe..f3981ab 100644 --- a/kernel.c +++ b/kernel.c @@ -798,6 +798,7 @@ cpu_maps_init(void) { POSSIBLE_MAP, "possible" }, { PRESENT_MAP, "present" }, { ONLINE_MAP, "online" }, + { ACTIVE_MAP, "active" }, }; if ((len = STRUCT_SIZE("cpumask_t")) < 0) @@ -884,6 +885,13 @@ in_cpu_map(int map, int cpu) return FALSE; } return (kt->cpu_flags[cpu] & ONLINE_MAP); + + case ACTIVE_MAP: + if (!cpu_map_addr("active")) { + error(INFO, "cpu_active_map does not exist\n"); + return FALSE; + } + return (kt->cpu_flags[cpu] & ACTIVE_MAP); } return FALSE; @@ -5306,6 +5314,15 @@ dump_kernel_table(int verbose) fprintf(fp, "\n"); } else fprintf(fp, "(does not exist)\n"); + fprintf(fp, " cpu_active_map: "); + if (cpu_map_addr("active")) { + for (i = 0; i < nr_cpus; i++) { + if (kt->cpu_flags[i] & ACTIVE_MAP) + fprintf(fp, "%d ", i); + } + fprintf(fp, "\n"); + } else + fprintf(fp, "(does not exist)\n"); no_cpu_flags: fprintf(fp, " vmcoreinfo: \n"); @@ -7935,6 +7952,40 @@ get_highest_cpu_online() } /* + * If it exists, return the number of cpus in the cpu_active_map. + */ +int +get_cpus_active() +{ + int i, len, active; + char *buf; + ulong *maskptr, addr; + + if (!(addr = cpu_map_addr("active"))) + return 0; + + len = cpu_map_size("active"); + buf = GETBUF(len); + + active = 0; + + if (readmem(addr, KVADDR, buf, len, + "cpu_active_map", RETURN_ON_ERROR)) { + + maskptr = (ulong *)buf; + for (i = 0; i < (len/sizeof(ulong)); i++, maskptr++) + active += count_bits_long(*maskptr); + + if (CRASHDEBUG(1)) + error(INFO, "get_cpus_active: active: %d\n", active); + } + + FREEBUF(buf); + + return active; +} + +/* * If it exists, return the number of cpus in the cpu_present_map. */ int diff --git a/ppc64.c b/ppc64.c index f414a58..7f2f0e2 100644 --- a/ppc64.c +++ b/ppc64.c @@ -2866,6 +2866,8 @@ ppc64_get_cpu_map(void) map = PRESENT_MAP; else if (cpu_map_addr("online")) map = ONLINE_MAP; + else if (cpu_map_addr("active")) + map = ACTIVE_MAP; else { map = 0; error(FATAL, -- 1.9.0 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility