summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blkparse.c28
-rw-r--r--blkrawverify.c2
-rw-r--r--blktrace.c2
-rw-r--r--blktrace.h43
4 files changed, 55 insertions, 20 deletions
diff --git a/blkparse.c b/blkparse.c
index 7da67a6..52078c4 100644
--- a/blkparse.c
+++ b/blkparse.c
@@ -245,6 +245,7 @@ static int ppi_hash_by_pid = 1;
static int verbose;
static unsigned int act_mask = -1U;
static int stats_printed;
+static int data_is_native = -1;
static unsigned int t_alloc_cache;
static unsigned int bit_alloc_cache;
@@ -1773,6 +1774,22 @@ static int read_data(int fd, void *buffer, int bytes, int block, int *fdblock)
return 0;
}
+static inline __u16 get_pdulen(struct blk_io_trace *bit)
+{
+ if (data_is_native)
+ return bit->pdu_len;
+
+ return __bswap_16(bit->pdu_len);
+}
+
+static inline __u32 get_magic(struct blk_io_trace *bit)
+{
+ if (data_is_native)
+ return bit->magic;
+
+ return __bswap_32(bit->magic);
+}
+
static int read_events(int fd, int always_block, int *fdblock)
{
struct per_dev_info *pdi = NULL;
@@ -1796,13 +1813,20 @@ static int read_events(int fd, int always_block, int *fdblock)
break;
}
- magic = be32_to_cpu(bit->magic);
+ /*
+ * look at first trace to check whether we need to convert
+ * data in the future
+ */
+ if (data_is_native == -1 && check_data_endianness(bit))
+ break;
+
+ magic = get_magic(bit);
if ((magic & 0xffffff00) != BLK_IO_TRACE_MAGIC) {
fprintf(stderr, "Bad magic %x\n", magic);
break;
}
- pdu_len = be16_to_cpu(bit->pdu_len);
+ pdu_len = get_pdulen(bit);
if (pdu_len) {
void *ptr = realloc(bit, sizeof(*bit) + pdu_len);
diff --git a/blkrawverify.c b/blkrawverify.c
index 190f7ee..6cc9b29 100644
--- a/blkrawverify.c
+++ b/blkrawverify.c
@@ -33,6 +33,8 @@ struct trace_info {
char *string;
};
+static int data_is_native = -1;
+
#define TRACE_TO_STRING(f) {.bit_field = f, .string = #f}
static struct trace_info traces[] = {
TRACE_TO_STRING( BLK_TC_READ ),
diff --git a/blktrace.c b/blktrace.c
index 0054b87..a780481 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -494,8 +494,6 @@ static int flush_subbuf(struct thread_information *tip, struct tip_subbuf *ts)
if (offset + sizeof(*t) + pdu_len > ts->len)
break;
- trace_to_be(t);
-
offset += sizeof(*t) + pdu_len;
tip->events_processed++;
events++;
diff --git a/blktrace.h b/blktrace.h
index af5ab66..13d6e03 100644
--- a/blktrace.h
+++ b/blktrace.h
@@ -53,6 +53,7 @@ struct per_cpu_info {
};
extern FILE *ofp;
+extern int data_is_native;
#define CHECK_MAGIC(t) (((t)->magic & 0xffffff00) == BLK_IO_TRACE_MAGIC)
#define SUPPORTED_VERSION (0x06)
@@ -90,24 +91,11 @@ static inline int verify_trace(struct blk_io_trace *t)
return 0;
}
-static inline void trace_to_be(struct blk_io_trace *t)
-{
- t->magic = cpu_to_be32(t->magic);
- t->sequence = cpu_to_be32(t->sequence);
- t->time = cpu_to_be64(t->time);
- t->sector = cpu_to_be64(t->sector);
- t->bytes = cpu_to_be32(t->bytes);
- t->action = cpu_to_be32(t->action);
- t->pid = cpu_to_be32(t->pid);
- t->cpu = cpu_to_be32(t->cpu);
- t->error = cpu_to_be16(t->error);
- t->pdu_len = cpu_to_be16(t->pdu_len);
- t->device = cpu_to_be32(t->device);
- /* t->comm is a string (endian neutral) */
-}
-
static inline void trace_to_cpu(struct blk_io_trace *t)
{
+ if (data_is_native)
+ return;
+
t->magic = be32_to_cpu(t->magic);
t->sequence = be32_to_cpu(t->sequence);
t->time = be64_to_cpu(t->time);
@@ -122,6 +110,29 @@ static inline void trace_to_cpu(struct blk_io_trace *t)
/* t->comm is a string (endian neutral) */
}
+/*
+ * check whether data is native or not
+ */
+static inline int check_data_endianness(struct blk_io_trace *bit)
+{
+ u32 magic;
+
+ if ((bit->magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) {
+ fprintf(stderr, "data is native\n");
+ data_is_native = 1;
+ return 0;
+ }
+
+ magic = __bswap_32(bit->magic);
+ if ((magic & 0xffffff00) == BLK_IO_TRACE_MAGIC) {
+ fprintf(stderr, "data is not native\n");
+ data_is_native = 0;
+ return 0;
+ }
+
+ return 1;
+}
+
extern void set_all_format_specs(char *);
extern int add_format_spec(char *);
extern void process_fmt(char *, struct per_cpu_info *, struct blk_io_trace *,