1#include <stdio.h> 2#include <stdlib.h> 3#include <assert.h> 4#include <string.h> 5#include <inttypes.h> 6#include <errors/errno.h> 7#include <storage/storage.h> 8 9static struct storage_vsic vsic; 10static struct storage_vsa vsa; 11 12#define BUF_SIZE 1024 13#define ITERATIONS 10000 14 15#ifndef BARRELFISH 16void *user_alloc(size_t size, uintptr_t *paddr); 17#endif 18 19static uint64_t timestamps1[ITERATIONS], timestamps2[ITERATIONS]; 20 21#ifndef BARRELFISH 22static inline uint64_t rdtsc(void) 23{ 24 uint32_t eax, edx; 25 __asm volatile ("rdtsc" : "=a" (eax), "=d" (edx)); 26 return ((uint64_t)edx << 32) | eax; 27} 28#endif 29 30int main(int argc, const char *argv[]) 31{ 32 errval_t err = storage_vsic_driver_init(argc, argv, &vsic); 33 assert(err_is_ok(err)); 34 err = storage_vsa_acquire(&vsa, "0", 1 * 1024 * 1024); 35 assert(err_is_ok(err)); 36 37#ifndef BARRELFISH 38 uintptr_t paddr; 39 uint8_t *buf = user_alloc(BUF_SIZE, &paddr); 40#else 41 uint8_t *buf = malloc(BUF_SIZE); 42#endif 43 assert(buf != NULL); 44 45 memset(buf, 0, BUF_SIZE); 46 47 for(int i = 0; i < ITERATIONS; i++) { 48 /* printf("Iteration %u...\n", i); */ 49 uint64_t begin = rdtsc(); 50 err = vsic.ops.write(&vsic, &vsa, 0, BUF_SIZE, buf); 51 assert(err_is_ok(err)); 52 err = vsic.ops.flush(&vsic, &vsa); 53 assert(err_is_ok(err)); 54 uint64_t start = rdtsc(); 55 err = vsic.ops.wait(&vsic); 56 assert(err_is_ok(err)); 57 timestamps2[i] = rdtsc() - start; 58 timestamps1[i] = start - begin; 59 } 60 61 printf("# write size = %u\n", BUF_SIZE); 62 for(int i = 0; i < ITERATIONS; i++) { 63 printf("%" PRIu64 "\t%" PRIu64 "\n", timestamps1[i], timestamps2[i]); 64 } 65 66 return 0; 67} 68