*/
#define POLLING_TIME 3
-#define PAGE_SIZE 0x400
/* Test for a little-endian machine */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define ENDIAN KBUFFER_ENDIAN_LITTLE
}
}
+static int get_pagesize(struct pevent *pevent) {
+ int fd, len, page_size = 4096;
+ char buf[page_size];
+
+ fd = open(DEBUGFS "tracing/events/header_page", O_RDONLY);
+ if (fd < 0)
+ return page_size;
+
+ len = read(fd, buf, page_size);
+ if (len <= 0)
+ goto error;
+ if (pevent_parse_header_page(pevent, buf, len, sizeof(long)))
+ goto error;
+
+ page_size = pevent->header_page_data_offset + pevent->header_page_data_size;
+
+error:
+ close(fd);
+ return page_size;
+
+}
+
static int ras_mc_event_handler(struct trace_seq *s,
struct pevent_record *record,
struct event_format *event, void *context)
}
static int read_ras_event(int fd, struct pevent *pevent, struct kbuffer *kbuf,
- void *page)
+ void *page, int page_size)
{
unsigned size;
unsigned long long time_stamp;
void *data;
do {
- size = read(fd, page, PAGE_SIZE);
+ size = read(fd, page, page_size);
if (size < 0) {
perror ("read");
return -1;
return num_cpus;
}
-static int handle_ras_events_cpu(struct pevent *pevent, int cpu)
+static int handle_ras_events_cpu(struct pevent *pevent, int cpu, int page_size)
{
int rc, fd;
struct kbuffer *kbuf;
void *page;
- page = malloc(PAGE_SIZE);
+ page = malloc(page_size);
if (!page) {
perror("Can't allocate page");
return errno;
return errno;
}
- rc = read_ras_event(fd, pevent, kbuf, page);
+ rc = read_ras_event(fd, pevent, kbuf, page, page_size);
close(fd);
kbuffer_free(kbuf);
static int handle_ras_events(void)
{
- int rc, fd, size;
+ int rc, fd, size, page_size;
struct pevent *pevent;
void *page;
goto free_pevent;
}
- page = malloc(4 * PAGE_SIZE);
+ page_size = get_pagesize(pevent);
+
+ page = malloc(page_size);
if (!page) {
perror("Can't allocate page to read event format");
rc = errno;
goto free_pevent;
}
- size = read(fd, page, 4 * PAGE_SIZE);
+ size = read(fd, page, page_size);
close(fd);
if (size < 0) {
rc = size;
goto free_pevent;
/* FIXME: start one thread per CPU */
- rc = handle_ras_events_cpu(pevent, 0);
+ rc = handle_ras_events_cpu(pevent, 0, page_size);
free_pevent:
pevent_free(pevent);