From: Jerone Young <jyoung5@us.ibm.com>
To: kvm@vger.kernel.org
Cc: kvm-ppc@vger.kernel.org
Subject: [PATCH 1 of 3] Remove use of bit fields in kvm trace structure
Date: Fri, 20 Jun 2008 04:19:13 +0000 [thread overview]
Message-ID: <c2777036ad4d61259024.1213935553@thinkpadL> (raw)
In-Reply-To: <patchbomb.1213935552@thinkpadL>
2 files changed, 21 insertions(+), 11 deletions(-)
include/linux/kvm.h | 10 +++++++---
virt/kvm/kvm_trace.c | 22 ++++++++++++++--------
This patch fixes kvmtrace use on big endian systems. When using bit fields the compiler will lay data out in the wrong order expected when laid down into a file. This fixes it by using one variable instead of using bit fields.
Signed-off-by: Jerone Young <jyoung5@us.ibm.com>
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -311,9 +311,13 @@ struct kvm_s390_interrupt {
/* This structure represents a single trace buffer record. */
struct kvm_trace_rec {
- __u32 event:28;
- __u32 extra_u32:3;
- __u32 cycle_in:1;
+ /* variable rec_val
+ * is split into:
+ * bits 0 - 27 -> event id
+ * bits 28 -30 -> number of extra data args of size u32
+ * bits 31 -> binary indicator for if tsc is in record
+ */
+ __u32 rec_val;
__u32 pid;
__u32 vcpu_id;
union {
diff --git a/virt/kvm/kvm_trace.c b/virt/kvm/kvm_trace.c
--- a/virt/kvm/kvm_trace.c
+++ b/virt/kvm/kvm_trace.c
@@ -54,12 +54,15 @@ static void kvm_add_trace(void *probe_pr
struct kvm_trace *kt = kvm_trace;
struct kvm_trace_rec rec;
struct kvm_vcpu *vcpu;
- int i, extra, size;
+ int i, size;
+ u32 extra;
if (unlikely(kt->trace_state != KVM_TRACE_STATE_RUNNING))
return;
+
+ /* set event id */
+ rec.rec_val = 0x0fffffff & va_arg(*args, u32);
- rec.event = va_arg(*args, u32);
vcpu = va_arg(*args, struct kvm_vcpu *);
rec.pid = current->tgid;
rec.vcpu_id = vcpu->vcpu_id;
@@ -67,21 +70,24 @@ static void kvm_add_trace(void *probe_pr
extra = va_arg(*args, u32);
WARN_ON(!(extra <= KVM_TRC_EXTRA_MAX));
extra = min_t(u32, extra, KVM_TRC_EXTRA_MAX);
- rec.extra_u32 = extra;
- rec.cycle_in = p->cycle_in;
+ /* set inidicator for tcs record */
+ rec.rec_val |= 0x80000000 & (p->cycle_in << 31);
+
+ /* set extra data num */
+ rec.rec_val |= 0x70000000 & (extra << 28);
- if (rec.cycle_in) {
+ if (p->cycle_in) {
rec.u.cycle.cycle_u64 = get_cycles();
- for (i = 0; i < rec.extra_u32; i++)
+ for (i = 0; i < extra; i++)
rec.u.cycle.extra_u32[i] = va_arg(*args, u32);
} else {
- for (i = 0; i < rec.extra_u32; i++)
+ for (i = 0; i < extra; i++)
rec.u.nocycle.extra_u32[i] = va_arg(*args, u32);
}
- size = calc_rec_size(rec.cycle_in, rec.extra_u32 * sizeof(u32));
+ size = calc_rec_size(p->cycle_in, extra * sizeof(u32));
relay_write(kt->rchan, &rec, size);
}
WARNING: multiple messages have this Message-ID (diff)
From: Jerone Young <jyoung5@us.ibm.com>
To: kvm@vger.kernel.org
Cc: kvm-ppc@vger.kernel.org
Subject: [PATCH 1 of 3] Remove use of bit fields in kvm trace structure
Date: Thu, 19 Jun 2008 23:19:13 -0500 [thread overview]
Message-ID: <c2777036ad4d61259024.1213935553@thinkpadL> (raw)
In-Reply-To: <patchbomb.1213935552@thinkpadL>
2 files changed, 21 insertions(+), 11 deletions(-)
include/linux/kvm.h | 10 +++++++---
virt/kvm/kvm_trace.c | 22 ++++++++++++++--------
This patch fixes kvmtrace use on big endian systems. When using bit fields the compiler will lay data out in the wrong order expected when laid down into a file. This fixes it by using one variable instead of using bit fields.
Signed-off-by: Jerone Young <jyoung5@us.ibm.com>
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -311,9 +311,13 @@ struct kvm_s390_interrupt {
/* This structure represents a single trace buffer record. */
struct kvm_trace_rec {
- __u32 event:28;
- __u32 extra_u32:3;
- __u32 cycle_in:1;
+ /* variable rec_val
+ * is split into:
+ * bits 0 - 27 -> event id
+ * bits 28 -30 -> number of extra data args of size u32
+ * bits 31 -> binary indicator for if tsc is in record
+ */
+ __u32 rec_val;
__u32 pid;
__u32 vcpu_id;
union {
diff --git a/virt/kvm/kvm_trace.c b/virt/kvm/kvm_trace.c
--- a/virt/kvm/kvm_trace.c
+++ b/virt/kvm/kvm_trace.c
@@ -54,12 +54,15 @@ static void kvm_add_trace(void *probe_pr
struct kvm_trace *kt = kvm_trace;
struct kvm_trace_rec rec;
struct kvm_vcpu *vcpu;
- int i, extra, size;
+ int i, size;
+ u32 extra;
if (unlikely(kt->trace_state != KVM_TRACE_STATE_RUNNING))
return;
+
+ /* set event id */
+ rec.rec_val = 0x0fffffff & va_arg(*args, u32);
- rec.event = va_arg(*args, u32);
vcpu = va_arg(*args, struct kvm_vcpu *);
rec.pid = current->tgid;
rec.vcpu_id = vcpu->vcpu_id;
@@ -67,21 +70,24 @@ static void kvm_add_trace(void *probe_pr
extra = va_arg(*args, u32);
WARN_ON(!(extra <= KVM_TRC_EXTRA_MAX));
extra = min_t(u32, extra, KVM_TRC_EXTRA_MAX);
- rec.extra_u32 = extra;
- rec.cycle_in = p->cycle_in;
+ /* set inidicator for tcs record */
+ rec.rec_val |= 0x80000000 & (p->cycle_in << 31);
+
+ /* set extra data num */
+ rec.rec_val |= 0x70000000 & (extra << 28);
- if (rec.cycle_in) {
+ if (p->cycle_in) {
rec.u.cycle.cycle_u64 = get_cycles();
- for (i = 0; i < rec.extra_u32; i++)
+ for (i = 0; i < extra; i++)
rec.u.cycle.extra_u32[i] = va_arg(*args, u32);
} else {
- for (i = 0; i < rec.extra_u32; i++)
+ for (i = 0; i < extra; i++)
rec.u.nocycle.extra_u32[i] = va_arg(*args, u32);
}
- size = calc_rec_size(rec.cycle_in, rec.extra_u32 * sizeof(u32));
+ size = calc_rec_size(p->cycle_in, extra * sizeof(u32));
relay_write(kt->rchan, &rec, size);
}
next prev parent reply other threads:[~2008-06-20 4:19 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-20 4:19 [PATCH 0 of 3] Add ability for KVM TRACE to work on other archs Jerone Young
2008-06-20 4:19 ` Jerone Young
2008-06-20 4:19 ` Jerone Young [this message]
2008-06-20 4:19 ` [PATCH 1 of 3] Remove use of bit fields in kvm trace structure Jerone Young
2008-06-20 16:59 ` Hollis Blanchard
2008-06-20 16:59 ` Hollis Blanchard
2008-06-23 2:33 ` Avi Kivity
2008-06-23 2:33 ` Avi Kivity
2008-06-20 4:19 ` [PATCH 2 of 3] Move KVM TRACE DEFINITIONS to common header Jerone Young
2008-06-20 4:19 ` Jerone Young
2008-06-29 11:50 ` Avi Kivity
2008-06-29 11:50 ` Avi Kivity
2008-07-01 19:59 ` Hollis Blanchard
2008-07-01 19:59 ` Hollis Blanchard
2008-07-01 21:23 ` [PATCH 2 of 3] [v2] " Hollis Blanchard
2008-07-01 21:23 ` Hollis Blanchard
2008-07-05 9:35 ` Avi Kivity
2008-07-05 9:35 ` Avi Kivity
2008-06-20 4:19 ` [PATCH 3 of 3] Add new KVM TRACE events Jerone Young
2008-06-20 4:19 ` Jerone Young
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c2777036ad4d61259024.1213935553@thinkpadL \
--to=jyoung5@us.ibm.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.