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;
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;
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);
};
extern FILE *ofp;
+extern int data_is_native;
#define CHECK_MAGIC(t) (((t)->magic & 0xffffff00) == BLK_IO_TRACE_MAGIC)
#define SUPPORTED_VERSION (0x06)
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);
/* 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 *,