]> www.infradead.org Git - users/mchehab/edactool.git/commitdiff
edactool: Fix page_size logic
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Feb 2013 07:21:00 +0000 (04:21 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 27 Feb 2013 07:21:00 +0000 (04:21 -0300)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
edactool.c

index 5d9250769de074a5b84aa1fbeb373edc075f78c3..394aae5787eb3eeae45206fa2317a99bef44ad5c 100644 (file)
@@ -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);