From c9bf05f77c1288af6130c4041644ab27fa22a430 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Wed, 27 Feb 2013 04:21:00 -0300 Subject: [PATCH] edactool: Fix page_size logic Signed-off-by: Mauro Carvalho Chehab --- edactool.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/edactool.c b/edactool.c index 5d92507..394aae5 100644 --- a/edactool.c +++ b/edactool.c @@ -41,7 +41,6 @@ */ #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 @@ -119,6 +118,28 @@ static char *mc_event_error_type(unsigned long long err_type) } } +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) @@ -226,14 +247,14 @@ static void parse_ras_data(struct pevent *pevent, struct kbuffer *kbuf, } 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; @@ -276,13 +297,13 @@ static int get_num_cpus(void) 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; @@ -308,7 +329,7 @@ printf("Endian: %d\n", ENDIAN); 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); @@ -318,7 +339,7 @@ printf("Endian: %d\n", ENDIAN); static int handle_ras_events(void) { - int rc, fd, size; + int rc, fd, size, page_size; struct pevent *pevent; void *page; @@ -339,7 +360,9 @@ static int handle_ras_events(void) 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; @@ -347,7 +370,7 @@ static int handle_ras_events(void) goto free_pevent; } - size = read(fd, page, 4 * PAGE_SIZE); + size = read(fd, page, page_size); close(fd); if (size < 0) { rc = size; @@ -364,7 +387,7 @@ static int handle_ras_events(void) 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); -- 2.49.0