Listener::Listener( thread_Settings *inSettings ) { mClients = inSettings->mThreads; mBuf = NULL; mSettings = inSettings; // initialize buffer mBuf = new char[ mSettings->mBufLen ]; if ( mSettings->mOutputDataFileName != NULL ) if ( (mSettings->Output_file = \ fopen (mSettings->mOutputDataFileName, "ab")) == NULL ) fprintf( stderr, "Unable to open the outfile stream\n"); // open listening socket if ( mSettings->mThreadMode == kMode_RDMA_Listener ) { mCb = new rdma_cb; Settings_Initialize_Cb( mCb ); rdma_init( mCb ); // Setting_Copy_Ts2Cb( mSettings, mCb ); { // addr /* if ( mSettings->mThreadMode == kMode_RDMA_Listener) memcpy( &mCb->sin, &mSettings->local, sizeof(iperf_sockaddr)); else if ( mSettings->mThreadMode == kMode_RDMA_Client) memcpy( &mCb->sin, &mSettings->peer, sizeof(iperf_sockaddr)); */ // port mCb->port = mSettings->mPort; DPRINTF(("listening port is %d\n", mCb->port)); mCb->server = 1; mCb->size = mSettings->mBufLen; DPRINTF(("Listener buffer size is %d\n", mCb->size)); mCb->outputfile = mSettings->Output_file; } ListenRDMA( ); } else Listen( ); ReportSettings( inSettings ); } // end Listener
static int __init main_module_init(void) { int retval; rdma_ctx_t ctx; rdma_request req; char *mem1, *mem2; u64 mem1_addr, mem2_addr; retval = rdma_library_init(); if (retval == 0) { LOG_KERN(LOG_INFO, ("RDMA_LIB_INIT SUCCESS")); } else { LOG_KERN(LOG_INFO, ("RDMA_LIB_INIT FAILED")); return -1; } while(!rdma_library_ready()) ; ctx = rdma_init(100, "127.0.0.1", 18515); if (ctx != NULL) { LOG_KERN(LOG_INFO, ("RDMA_INIT SUCCESS")); } else { LOG_KERN(LOG_INFO, ("RDMA_INIT FAILED")); return -1; } mem1 = kmalloc(MEM_SIZE, GFP_KERNEL); mem2 = kmalloc(MEM_SIZE, GFP_KERNEL); mem1_addr = rdma_map_address(mem1, MEM_SIZE); mem2_addr = rdma_map_address(mem2, MEM_SIZE); strcpy(mem1, "HELLO WORLD"); req.rw = RDMA_WRITE; req.dma_addr = mem1_addr; req.remote_offset = 0; req.length = 20; LOG_KERN(LOG_INFO, ("Launching write op")); retval = rdma_op(ctx, &req, 1); if (retval == 0) { LOG_KERN(LOG_INFO, (" RDMA WRITE SUCCESS")); } else { LOG_KERN(LOG_INFO, ("RDMA WRITE FAILED")); return -1; } strcpy(mem2, "WRONG DATA"); req.rw = RDMA_READ; req.dma_addr = mem2_addr; req.remote_offset = 0; req.length = 20; LOG_KERN(LOG_INFO, ("Launching read op")); retval = rdma_op(ctx, &req, 1); if (retval == 0) { LOG_KERN(LOG_INFO, (" RDMA READ SUCCESS: %s", mem2)); } else { LOG_KERN(LOG_INFO, ("RDMA READ FAILED")); return -1; } strcpy(mem1, "HERE WE GO AGAIN"); req.rw = RDMA_WRITE; req.dma_addr = mem1_addr; req.remote_offset = 0; req.length = 20; LOG_KERN(LOG_INFO, ("Launching write op")); retval = rdma_op(ctx, &req, 1); if (retval == 0) { LOG_KERN(LOG_INFO, (" RDMA WRITE SUCCESS")); } else { LOG_KERN(LOG_INFO, ("RDMA WRITE FAILED")); return -1; } strcpy(mem2, "PLAIN WRONG"); req.rw = RDMA_READ; req.dma_addr = mem2_addr; req.remote_offset = 0; req.length = 20; LOG_KERN(LOG_INFO, ("Launching read op")); retval = rdma_op(ctx, &req, 1); if (retval == 0) { LOG_KERN(LOG_INFO, (" RDMA READ SUCCESS: %s", mem2)); } else { LOG_KERN(LOG_INFO, ("RDMA READ FAILED")); return -1; } return 0; }
int main(int argc, char *argv[]) { int i,n; volatile int ret; char* val; struct timeval t0, t1, t2, t3; ret = dune_init_and_enter(); if (ret) { printf("failed to initialize dune\n"); return ret; } dune_register_pgflt_handler(pgflt_handler); if (argc != 4){ usage(argv[0]); } page_nr = atoi(argv[3]); page_len = PAGE_SIZE*page_nr; //launch_server(2, page_nr); //ret = rdma_init("cp-2", "41406", PAGE_SIZE); rdma_init(argv[1], argv[2] , PAGE_SIZE); gettimeofday(&t0, 0); //allocated a memory if (posix_memalign((void **)&page, PAGE_SIZE, page_len)) { perror("init page memory failed"); return -1; } memset( page,0, page_len); val= (char*) malloc(page_len); memcpy(val, page, page_len); /*page-out*/ pthread_mutex_lock(&_syscall_mtx); //remote write for (i=0; i<page_nr; i++) rdma_write_offset( &page[i*PAGE_SIZE], i*PAGE_SIZE); //unmap physical address dune_vm_unmap(pgroot, (void *)page, page_len); pthread_mutex_unlock(&_syscall_mtx); //printf("page-out\n"); //generate page fault //printf("page fault!\n"); gettimeofday(&t1, 0); assert(!memcmp(val, page, page_len)); gettimeofday(&t2, 0); //printf("page fault handled\n"); rdma_done(); long pagefault = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; long total = (t2.tv_sec-t0.tv_sec)*1000000 + t2.tv_usec-t0.tv_usec; fprintf(stdout, "%ld\t%ld\n", pagefault, total); return 0; }