]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
jailhouse: inmates: add Membench inmate and tune inmates' linker sript according...
authorMaxim Baryshnikov <barysmax@fel.cvut.cz>
Fri, 5 Aug 2016 09:38:11 +0000 (11:38 +0200)
committerMaxim Baryshnikov <barysmax@fel.cvut.cz>
Fri, 5 Aug 2016 09:38:11 +0000 (11:38 +0200)
inmates/demos/x86/Membench.c
inmates/lib/x86/inmate.lds

index 021030df19c70a606872d986164dab41702d2210..4366a303a0487e7f573939f5a0ea92c79a95fa58 100644 (file)
@@ -30,7 +30,11 @@ CMDLINE_BUFFER(CMDLINE_BUFFER_SIZE);
 //-----Time-and-and-randomization-overrides-------------------------------\r
 static inline unsigned long time(unsigned long * seconds)\r
 {\r
-       return (*seconds) = tsc_read();\r
+        u64 time_sec = tsc_read();\r
+        if (seconds != NULL){\r
+               (*seconds) = time_sec;\r
+        }\r
+        return time_sec;\r
 }\r
 \r
 /*\r
@@ -76,6 +80,7 @@ static void srand(unsigned int seed)
 static inline void __assert(const char *msg, const char *file, int line)\r
 {\r
        printk("Assertion %s in %s:%s failed.\n", msg, file, line);\r
+       exit(-1);\r
 }\r
 //-END:-Assertion-overrides-------------------------------------------------\r
 \r
@@ -163,7 +168,11 @@ struct s {
 \r
 _Static_assert(sizeof(struct s) == 64, "Struct size differs from cacheline size");\r
 \r
+#ifdef JAILHOUSE\r
+#define MAX_CPUS 1\r
+#else\r
 #define MAX_CPUS 8\r
+#endif\r
 \r
 #ifdef __aarch64__\r
 #define MRS32(reg) ({ uint32_t v; asm volatile ("mrs %0," # reg : "=r" (v)); v; })\r
@@ -232,9 +241,10 @@ static void prepare(struct s *array, unsigned size, bool sequential)
        int count = size / sizeof(struct s);\r
 \r
        if (sequential) {\r
-               for (i = 0; i < count - 1; i++)\r
-                       array[i].ptr = &array[i+1];\r
-               array[count - 1].ptr = &array[0];\r
+               for (i = 0; i < count - 1; i++){\r
+                       array[i].ptr = &array[i+1];\r
+               }\r
+               array[count - 1].ptr = &array[0];\r
        } else {\r
                memset(array, 0, size);\r
                struct s *p = &array[0];\r
@@ -332,14 +342,17 @@ static void do_write(struct s *array, unsigned accesses, unsigned ofs)
 struct benchmark_thread {\r
        pthread_t id;\r
        unsigned cpu;\r
-       double result;\r
+       uint64_t result_integral;\r
+       uint64_t result_fractional;\r
        struct cfg *cfg;\r
 };\r
 \r
 pthread_barrier_t barrier;\r
-\r
+#ifdef JAILHOUSE\r
+struct s array[MAX_CPUS][64*0x100000/sizeof(struct s)] __attribute__ ((aligned (2*1024*1024))) __attribute__ ((section (".bench-array")));\r
+#else\r
 struct s array[MAX_CPUS][64*0x100000/sizeof(struct s)] __attribute__ ((aligned (2*1024*1024)));\r
-\r
+#endif\r
 bool print = true;\r
 \r
 static void *benchmark_thread(void *arg)\r
@@ -348,31 +361,31 @@ static void *benchmark_thread(void *arg)
        cpu_set_t set;\r
 \r
        CPU_ZERO(&set);\r
-       CPU_SET(me->cpu, &set);\r
+       CPU_SET(me->cpu, &set);\r
 \r
        if (pthread_setaffinity_np(me->id, sizeof(set), &set) != 0) {\r
                perror("pthread_setaffinity_np");\r
                exit(1);\r
        }\r
 \r
-       prepare(array[me->cpu], me->cfg->size, me->cfg->sequential);\r
-\r
-       pthread_barrier_wait(&barrier);\r
+       prepare(array[me->cpu], me->cfg->size, me->cfg->sequential);\r
 \r
-       if (print)\r
-               printf("CPU %d starts measurement\n", me->cpu);\r
+       pthread_barrier_wait(&barrier);\r
 \r
-       uint64_t tic, tac;\r
-       tic = get_time(me->cfg);\r
-       if (me->cfg->write == false)\r
-               do_read(array[me->cpu], me->cfg->read_count);\r
-       else\r
-               do_write(array[me->cpu], me->cfg->read_count, me->cfg->ofs);\r
+       if (print)\r
+               printf("CPU %d starts measurement\n", me->cpu);\r
 \r
-       tac = get_time(me->cfg);\r
-       me->result = (double)(tac - tic) / me->cfg->read_count;\r
+       uint64_t tic, tac;\r
+       tic = get_time(me->cfg);\r
+       if (me->cfg->write == false)\r
+               do_read(array[me->cpu], me->cfg->read_count);\r
+       else\r
+               do_write(array[me->cpu], me->cfg->read_count, me->cfg->ofs);\r
 \r
-       return NULL;\r
+       tac = get_time(me->cfg);\r
+       me->result_integral = (tac - tic) / me->cfg->read_count;\r
+       me->result_fractional = (((tac - tic) * 1000) / me->cfg->read_count) % 1000;\r
+       return NULL;\r
 }\r
 \r
 static void run_benchmark(struct cfg *cfg)\r
@@ -407,7 +420,9 @@ static void run_benchmark(struct cfg *cfg)
 \r
        printf("%d", cfg->size);\r
        for (i = 0; i < cfg->num_threads; i++) {\r
-               printf("\t%#.3g", thread[i].result);\r
+               //NOTE: Jailhouse is not able to print doubles.\r
+               //printf("\t%#.3g", thread[i].result);\r
+               printf("\t%lu.%03u", thread[i].result_integral, thread[i].result_fractional);\r
        }\r
        printf("\n");\r
        fflush(stdout);\r
@@ -427,24 +442,25 @@ int main(int argc, char *argv[])
                .read_count = 0x2000000,\r
                .write = false,\r
                .ofs = 0,\r
-               .use_cycles = false, /* i.e. use nanoseconds */\r
+               .use_cycles = false, // i.e. use nanoseconds /\r
        };\r
-\r
 #ifdef JAILHOUSE\r
        //initialize UART\r
        unsigned long tsc_freq;\r
        unsigned int n;\r
-\r
        printk_uart_base = UART_BASE;\r
        do {\r
                for (n = 0; n < UART_IDLE_LOOPS; n++)\r
                        if (!(inb(UART_BASE + UART_LSR) & UART_LSR_THRE))\r
                                break;\r
        } while (n < UART_IDLE_LOOPS);\r
+\r
+       printk("cmdline opts: '%s'\n", cmdline);\r
+       comm_region->pm_timer_address = 0x408;\r
        //parse cmdline\r
        cfg.read_count = cmdline_parse_int("-c", cfg.read_count);\r
        cfg.ofs = cmdline_parse_int("-o", cfg.ofs);\r
-       cfg.sequential = cmdline_parse_bool("-r");\r
+       cfg.sequential = !cmdline_parse_bool("-r");\r
        cfg.size = cmdline_parse_int("-s", cfg.size);\r
        if (cmdline_parse_bool("-t")) {\r
                printk("Threads are not supported. '-t' was ignored.\n");\r
@@ -458,6 +474,16 @@ int main(int argc, char *argv[])
        tsc_freq = tsc_init();\r
        printk("Calibrated TSC frequency: %lu.%03u kHz\n", tsc_freq / 1000,\r
               tsc_freq % 1000);\r
+\r
+       u8 * start_memreg = (u8 *) array;\r
+\r
+       while ( ((u64) start_memreg )< 0x4000000) {\r
+               //printk("%p\n",start_memreg);\r
+               map_range(start_memreg, HUGE_PAGE_SIZE, MAP_CACHED);\r
+               start_memreg += HUGE_PAGE_SIZE;\r
+\r
+       }\r
+\r
 #else //Linux param's parsing\r
        CPU_ZERO(&cfg.cpu_set);\r
 \r
@@ -470,7 +496,7 @@ int main(int argc, char *argv[])
                case 'o':\r
                        cfg.ofs = atol(optarg);\r
                        break;\r
-               case 'r':       /* random */\r
+               case 'r':       // random //\r
                        cfg.sequential = false;\r
                        break;\r
                case 's':\r
@@ -489,7 +515,7 @@ int main(int argc, char *argv[])
                case 'y':\r
                        cfg.use_cycles = true;\r
                        break;\r
-               default: /* '?' */\r
+               default: // '?' //\r
                        fprintf(stderr, "Usage: %s ... TODO\n", argv[0]);\r
                        exit(1);\r
                }\r
@@ -509,19 +535,23 @@ int main(int argc, char *argv[])
        if (cfg.size != 0) {\r
                run_benchmark(&cfg);\r
        } else {\r
-               unsigned order, size, step;\r
-               for (order = 10; order <= 24; order++) {\r
+                unsigned order, size, step;\r
+                for (order = 10; order <= 24; order++) {\r
                        for (step = 0; step < 2; step++) {\r
                                size = 1 << order;\r
                                if (step == 1)\r
                                        size += size / 2;\r
 \r
                                cfg.size = size;\r
-                               run_benchmark(&cfg);\r
+                               run_benchmark(&cfg);\r
                        }\r
                }\r
        }\r
+\r
 #ifndef JAILHOUSE\r
        return 0;\r
+#else\r
+       comm_region->cell_state = JAILHOUSE_CELL_SHUT_DOWN;\r
+       printk("done!");\r
 #endif\r
 }\r
index de6e5928cbe058d415bf7206b8ed7fbb40a802ab..2ebfcbe79a1207066f7e9d70ccb2c1df4a04f0b5 100644 (file)
@@ -63,6 +63,11 @@ SECTIONS
                *(.data)
        }
 
+       . = ALIGN(16);
+       .bench-array : AT (ADDR(.data) + SIZEOF(.data)) {
+               *(.bench-array)
+       }
+
        /DISCARD/ : {
                *(.eh_frame*)
        }