Dave Anderson wrote:
Dave Anderson wrote:
> Is it necessary that the "pcpu_info" check in get_active_set()
> needs to come before the "runqueues" and "per_cpu__runqueues"
> checks? I'd prefer it to be done last if at all possible.
Never mind -- I see that in your kernel patch you do this:
- struct task_struct *curr, *idle;
+ struct task_struct *curr;
so the pcpu_info check can be deferred in get_idle_threads()
but not in get_active_set().
Ideally I'd still like to defer it in get_active_set(), but it's
probably not worth the extra effort.
Actually, I still think it doesn't need to be checked first,
since your kernel patch also removes the per_cpu__runqueues
declaration:
-static DEFINE_PER_CPU(struct rq, runqueues);
So unless you've resurrected the "runqueues" symbol somewhere
it seemingly doesn't need to be checked first.
Anyway, here's how I'd like to do it. I can envision you
gents coming back in the future with other OpenVZ-specific
requests, so I've added a new ARCH_OPENVZ flag for a clearer
way to segregate your code.
Can you please verify (and fix if necessary) the attached patch?
It's 4.0-4.13.
Thanks,
Dave
Index: defs.h
===================================================================
RCS file: /nfs/projects/cvs/crash/defs.h,v
retrieving revision 1.339
diff -u -r1.339 defs.h
--- defs.h 11 Jan 2008 16:52:04 -0000 1.339
+++ defs.h 16 Jan 2008 16:45:00 -0000
@@ -467,10 +467,12 @@
#define BUGVERBOSE_OFF (0x1000000)
#define RELOC_SET (0x2000000)
#define RELOC_FORCE (0x4000000)
+#define ARCH_OPENVZ (0x8000000)
#define GCC_VERSION_DEPRECATED (GCC_3_2|GCC_3_2_3|GCC_2_96|GCC_3_3_2|GCC_3_3_3)
-#define XEN() (kt->flags & ARCH_XEN)
+#define XEN() (kt->flags & ARCH_XEN)
+#define OPENVZ() (kt->flags & ARCH_OPENVZ)
#define XEN_MACHINE_TO_MFN(m) ((ulonglong)(m) >> PAGESHIFT())
#define XEN_PFN_TO_PSEUDO(p) ((ulonglong)(p) << PAGESHIFT())
@@ -1437,6 +1439,9 @@
long zone_present_pages;
long zone_flags;
long zone_pages_scanned;
+ long pcpu_info_vcpu;
+ long pcpu_info_idle;
+ long vcpu_struct_rq;
};
struct size_table { /* stash of commonly-used sizes */
@@ -1540,6 +1545,8 @@
long upid;
long kmem_cache_cpu;
long cfs_rq;
+ long pcpu_info;
+ long vcpu_struct;
};
struct array_table {
Index: kernel.c
===================================================================
RCS file: /nfs/projects/cvs/crash/kernel.c,v
retrieving revision 1.180
diff -u -r1.180 kernel.c
--- kernel.c 26 Nov 2007 20:27:08 -0000 1.180
+++ kernel.c 16 Jan 2008 16:55:33 -0000
@@ -475,6 +475,19 @@
if (!(kt->flags & DWARF_UNWIND))
kt->flags |= NO_DWARF_UNWIND;
+ /*
+ * OpenVZ
+ */
+ if (kernel_symbol_exists("pcpu_info") &&
+ STRUCT_EXISTS("pcpu_info") && STRUCT_EXISTS("vcpu_struct")) {
+ MEMBER_OFFSET_INIT(pcpu_info_vcpu, "pcpu_info", "vcpu");
+ MEMBER_OFFSET_INIT(pcpu_info_idle, "pcpu_info", "idle");
+ MEMBER_OFFSET_INIT(vcpu_struct_rq, "vcpu_struct", "rq");
+ STRUCT_SIZE_INIT(pcpu_info, "pcpu_info");
+ STRUCT_SIZE_INIT(vcpu_struct, "vcpu_struct");
+ kt->flags |= ARCH_OPENVZ;
+ }
+
BUG_bytes_init();
}
@@ -3757,6 +3770,8 @@
fprintf(fp, "%sUSE_OLD_BT", others++ ? "|" : "");
if (kt->flags & ARCH_XEN)
fprintf(fp, "%sARCH_XEN", others++ ? "|" : "");
+ if (kt->flags & ARCH_OPENVZ)
+ fprintf(fp, "%sARCH_OPENVZ", others++ ? "|" : "");
if (kt->flags & NO_IKCONFIG)
fprintf(fp, "%sNO_IKCONFIG", others++ ? "|" : "");
if (kt->flags & DWARF_UNWIND)
Index: symbols.c
===================================================================
RCS file: /nfs/projects/cvs/crash/symbols.c,v
retrieving revision 1.156
diff -u -r1.156 symbols.c
--- symbols.c 4 Jan 2008 16:57:08 -0000 1.156
+++ symbols.c 16 Jan 2008 17:01:59 -0000
@@ -6991,6 +6991,12 @@
OFFSET(cfs_rq_tasks_timeline));
fprintf(fp, " rt_rq_active: %ld\n",
OFFSET(rt_rq_active));
+ fprintf(fp, " pcpu_info_vcpu: %ld\n",
+ OFFSET(pcpu_info_vcpu));
+ fprintf(fp, " pcpu_info_idle: %ld\n",
+ OFFSET(pcpu_info_idle));
+ fprintf(fp, " vcpu_struct_rq: %ld\n",
+ OFFSET(vcpu_struct_rq));
fprintf(fp, "\n size_table:\n");
fprintf(fp, " page: %ld\n", SIZE(page));
@@ -7147,6 +7153,10 @@
SIZE(rlimit));
fprintf(fp, " cfs_rq: %ld\n",
SIZE(cfs_rq));
+ fprintf(fp, " pcpu_info: %ld\n",
+ SIZE(pcpu_info));
+ fprintf(fp, " vcpu_struct: %ld\n",
+ SIZE(vcpu_struct));
fprintf(fp, "\n array_table:\n");
/*
Index: task.c
===================================================================
RCS file: /nfs/projects/cvs/crash/task.c,v
retrieving revision 1.135
diff -u -r1.135 task.c
--- task.c 17 Dec 2007 18:35:38 -0000 1.135
+++ task.c 16 Jan 2008 17:44:46 -0000
@@ -5831,6 +5831,16 @@
cnt++;
else
BZERO(tasklist, sizeof(ulong) * NR_CPUS);
+ } else if (OPENVZ()) {
+ runq = symbol_value("pcpu_info");
+ runqbuf = GETBUF(SIZE(pcpu_info));
+ for (i = 0; i < nr_cpus; i++, runq += SIZE(pcpu_info)) {
+ readmem(runq, KVADDR, runqbuf, SIZE(pcpu_info),
+ "pcpu info", FAULT_ON_ERROR);
+ tasklist[i] = ULONG(runqbuf + OFFSET(pcpu_info_idle));
+ if (IS_KVADDR(tasklist[i]))
+ cnt++;
+ }
}
if (runqbuf)
@@ -5924,14 +5934,38 @@
} else if (symbol_exists("per_cpu__runqueues")) {
runq = symbol_value("per_cpu__runqueues");
per_cpu = TRUE;
- } else
+ } else if (OPENVZ())
+ runq = symbol_value("pcpu_info");
+ else
return FALSE;
BZERO(tt->active_set, sizeof(ulong) * NR_CPUS);
runqbuf = GETBUF(SIZE(runqueue));
cnt = 0;
- if (VALID_MEMBER(runqueue_curr) && per_cpu) {
+ if (OPENVZ()) {
+ ulong vcpu_struct;
+ char *pcpu_info_buf, *vcpu_struct_buf;
+
+ pcpu_info_buf = GETBUF(SIZE(pcpu_info));
+ vcpu_struct_buf = GETBUF(SIZE(vcpu_struct));
+
+ for (i = 0; i < kt->cpus; i++, runq += SIZE(pcpu_info)) {
+ readmem(runq, KVADDR, pcpu_info_buf,
+ SIZE(pcpu_info), "pcpu_info", FAULT_ON_ERROR);
+ vcpu_struct= ULONG(pcpu_info_buf +
+ OFFSET(pcpu_info_vcpu));
+ readmem(vcpu_struct, KVADDR, vcpu_struct_buf,
+ SIZE(vcpu_struct), "pcpu_info->vcpu",
+ FAULT_ON_ERROR);
+ tt->active_set[i] = ULONG(vcpu_struct_buf +
+ OFFSET(vcpu_struct_rq) + OFFSET(runqueue_curr));
+ if (IS_KVADDR(tt->active_set[i]))
+ cnt++;
+ }
+ FREEBUF(pcpu_info_buf);
+ FREEBUF(vcpu_struct_buf);
+ } else if (VALID_MEMBER(runqueue_curr) && per_cpu) {
for (i = 0; i < kt->cpus; i++) {
if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) {
runq = symbol_value("per_cpu__runqueues") +
--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility