int SSD_BLOCK_ERASE_DELAY(int reg) { int ret = 0; int64_t start = 0; int64_t end = 0; int64_t diff; int64_t time_stamp = cell_io_time[reg]; if( time_stamp == -1) return 0; /* Block Erase Delay */ start = get_usec(); diff = get_usec() - cell_io_time[reg]; if( diff < BLOCK_ERASE_DELAY){ while(diff < BLOCK_ERASE_DELAY){ diff = get_usec() - time_stamp; } ret = 1; } end = get_usec(); /* Send Delay Info to Perf Checker */ SEND_TO_PERF_CHECKER(reg_io_type[reg], end-start, REG_OP); /* Update IO Overhead */ cell_io_time[reg] = -1; reg_io_cmd[reg] = NOOP; reg_io_type[reg] = NOOP; return ret; }
int SSD_CELL_WRITE_DELAY(int reg) { int ret = 0; int64_t start = 0; int64_t end = 0; int64_t diff = 0; int64_t time_stamp = cell_io_time[reg]; if( time_stamp == -1 ) return 0; /* Cell Write Delay */ start = get_usec(); diff = start - time_stamp + io_overhead[reg]; #ifndef VSSIM_BENCH #ifdef DEL_QEMU_OVERHEAD if(diff < CELL_PROGRAM_DELAY){ SSD_UPDATE_QEMU_OVERHEAD(CELL_PROGRAM_DELAY-diff); } diff = start - cell_io_time[reg] + io_overhead[reg]; #endif #endif if( diff < CELL_PROGRAM_DELAY){ init_diff_reg = diff; while(diff < CELL_PROGRAM_DELAY){ diff = get_usec() - time_stamp + io_overhead[reg]; } ret = 1; } end = get_usec(); /* Send Delay Info To Perf Checker */ SEND_TO_PERF_CHECKER(reg_io_type[reg], end-start, REG_OP); SSD_UPDATE_IO_REQUEST(reg); /* Update Time Stamp Struct */ cell_io_time[reg] = -1; reg_io_cmd[reg] = NOOP; reg_io_type[reg] = NOOP; /* Update IO Overhead */ io_overhead[reg] = 0; return ret; }
int SSD_REG_WRITE_DELAY(int reg) { int ret = 0; int64_t start = 0; int64_t end = 0; int64_t diff = 0; int64_t time_stamp = reg_io_time[reg]; if (time_stamp == -1) return 0; /* Reg Write Delay */ start = get_usec(); diff = start - time_stamp; #ifndef VSSIM_BENCH #ifdef DEL_QEMU_OVERHEAD if(diff < REG_WRITE_DELAY){ SSD_UPDATE_QEMU_OVERHEAD(REG_WRITE_DELAY-diff); } diff = start - reg_io_time[reg]; #endif #endif if (diff < REG_WRITE_DELAY){ while( diff < REG_WRITE_DELAY ){ diff = get_usec() - time_stamp; } ret = 1; } end = get_usec(); /* Send Delay Info To Perf Checker */ SEND_TO_PERF_CHECKER(reg_io_type[reg], end-start, CH_OP); /* Update Time Stamp Struct */ reg_io_time[reg] = -1; //TEMPs // FILE* fp_temp = fopen("./data/write.txt","a"); // fprintf(fp_temp,"%ld\n",end-start); // fclose(fp_temp); //TEMPe return ret; }
int SSD_REG_READ_DELAY(int reg) { int ret = 0; int64_t start = 0; int64_t end = 0; int64_t diff = 0; int64_t time_stamp = reg_io_time[reg]; if (time_stamp == -1) return 0; /* Reg Read Delay */ start = get_usec(); diff = start - time_stamp; #ifndef VSSIM_BENCH #ifdef DEL_QEMU_OVERHEAD if(diff < REG_READ_DELAY){ SSD_UPDATE_QEMU_OVERHEAD(REG_READ_DELAY-diff); } diff = start - reg_io_time[reg]; #endif #endif if(diff < REG_READ_DELAY){ while(diff < REG_READ_DELAY){ diff = get_usec() - time_stamp; } ret = 1; } end = get_usec(); /* Send Delay Info To Perf Checker */ SEND_TO_PERF_CHECKER(reg_io_type[reg], end-start, CH_OP); SSD_UPDATE_IO_REQUEST(reg); /* Update Time Stamp Struct */ reg_io_time[reg] = -1; reg_io_cmd[reg] = NOOP; reg_io_type[reg] = NOOP; return ret; }
int64_t UPDATE_IO_REQUEST(int request_nb, int offset, int64_t time, int type) { int64_t start = get_usec(); int io_type; int64_t latency=0; int flag = 0; if(request_nb == -1) return 0; io_request* curr_request = LOOKUP_IO_REQUEST(request_nb, type); if(curr_request == NULL){ printf("ERROR[%s] No such io request, nb %d\n",__FUNCTION__, request_nb); return 0; } if(type == UPDATE_START_TIME){ curr_request->start_time[offset] = time; curr_request->start_count++; } else if(type == UPDATE_END_TIME){ curr_request->end_time[offset] = time; curr_request->end_count++; } if(curr_request->start_count == curr_request->request_size && curr_request->end_count == curr_request->request_size){ latency = CALC_IO_LATENCY(curr_request); io_type = curr_request->request_type; SEND_TO_PERF_CHECKER(io_type, latency, LATENCY_OP); FREE_IO_REQUEST(curr_request); flag = 1; } int64_t end = get_usec(); return (end - start); }