void ssd_initialize (void) { int i, j; if (disksim->ssdinfo == NULL) { ssd_initialize_diskinfo (); } initialize_device_physical_parameters(); //Initliaze the physical parameters of the device. ssd_setcallbacks(); // fprintf(stdout, "MAXDEVICES = %d, numssds %d\n", MAXDEVICES, numssds); // vp - changing the MAXDEVICES in the below 'for' loop to numssds for (i=0; i<numssds; i++) { int exp_size; ssd_t *currdisk = getssd (i); if (!currdisk) continue; ssd_alloc_queues(currdisk); //also allocates the refresh queue currdisk->params.refresh_interval*=1000; //in ms. currdisk->next_refresh_time = currdisk->params.refresh_interval; currdisk->params.refresh_service_time = currdisk->params.block_erase_latency + ( (currdisk->params.page_write_latency + currdisk->params.page_read_latency) * currdisk->params.pages_per_block); if (currdisk->params.checkpoint_time == 0) currdisk->params.checkpoint_time = 0.5; currdisk->params.checkpoint_time *= (60* 60 *1000);//hours to milli seconds. //vp - some verifications: ssd_verify_parameters(currdisk); //vp - this was not initialized and caused so many bugs currdisk->devno = i; currdisk->numblocks = currdisk->params.nelements * currdisk->params.blocks_per_element * currdisk->params.pages_per_block * currdisk->params.page_size; currdisk->reconnect_reason = -1; addlisttoextraq ((event **) &currdisk->buswait); currdisk->busowned = -1; currdisk->completion_queue = NULL; /* hack to init queue structure */ ioqueue_initialize (currdisk->queue, i); ssd_statinit(i, TRUE); currdisk->timing_t = ssd_new_timing_t(&currdisk->params); // initialize the gang exp_size = ssd_elem_export_size(currdisk); for (j = 0; j < SSD_NUM_GANG(currdisk); j ++) { int tot_pages = exp_size * currdisk->params.elements_per_gang; currdisk->gang_meta[j].busy = 0; currdisk->gang_meta[j].cleaning = 0; currdisk->gang_meta[j].reqs_waiting = 0; currdisk->gang_meta[j].oldest = 0; currdisk->gang_meta[j].pg2elem = (ssd_elem_number*)malloc(sizeof(ssd_elem_number) * tot_pages); memset(currdisk->gang_meta[j].pg2elem, 0, sizeof(ssd_elem_number) * tot_pages); ioqueue_initialize (currdisk->gang_meta[j].queue, i); } for (j=0; j<currdisk->params.nelements; j++) { ssd_element *elem = &currdisk->elements[j]; ioqueue_initialize (elem->queue, i); /* hack to init queue structure */ elem->media_busy = FALSE; // vp - pins are also free elem->pin_busy = FALSE; // vp - initialize the planes in the element ssd_plane_init(elem, currdisk, i); // vp - initialize the ssd element metadata // FIXME: where to free these data? if (currdisk->params.write_policy == DISKSIM_SSD_WRITE_POLICY_OSR) { ssd_element_metadata_init(j, &(elem->metadata), currdisk); } //vp - initialize the stat structure memset(&elem->stat, 0, sizeof(ssd_element_stat)); } } fprintf(stderr,"Finished loading state from snapshot\n"); }
void ssd_initialize (void) { // static print1 = 1; int i, j; if (disksim->ssdinfo == NULL) { ssd_initialize_diskinfo (); } /* fprintf (outputfile, "Entered ssd_initialize - numssds %d\n", numssds); */ ssd_setcallbacks(); // fprintf(stdout, "MAXDEVICES = %d, numssds %d\n", MAXDEVICES, numssds); // vp - changing the MAXDEVICES in the below 'for' loop to numssds for (i=0; i<numssds; i++) { int exp_size; ssd_t *currdisk = getssd (i); ssd_alloc_queues(currdisk); //vp - some verifications: ssd_verify_parameters(currdisk); //vp - this was not initialized and caused so many bugs currdisk->devno = i; if (!currdisk) continue; /* if (!currdisk->inited) { */ currdisk->numblocks = currdisk->params.nelements * currdisk->params.blocks_per_element * currdisk->params.pages_per_block * currdisk->params.page_size; currdisk->reconnect_reason = -1; addlisttoextraq ((event **) &currdisk->buswait); currdisk->busowned = -1; currdisk->completion_queue = NULL; /* hack to init queue structure */ ioqueue_initialize (currdisk->queue, i); ssd_statinit(i, TRUE); currdisk->timing_t = ssd_new_timing_t(&currdisk->params); // initialize the gang exp_size = ssd_elem_export_size(currdisk); for (j = 0; j < SSD_NUM_GANG(currdisk); j ++) { int tot_pages = exp_size * currdisk->params.elements_per_gang; currdisk->gang_meta[j].busy = 0; currdisk->gang_meta[j].cleaning = 0; currdisk->gang_meta[j].reqs_waiting = 0; currdisk->gang_meta[j].oldest = 0; currdisk->gang_meta[j].pg2elem = malloc(sizeof(ssd_elem_number) * tot_pages); memset(currdisk->gang_meta[j].pg2elem, 0, sizeof(ssd_elem_number) * tot_pages); ioqueue_initialize (currdisk->gang_meta[j].queue, i); } for (j=0; j<currdisk->params.nelements; j++) { ssd_element *elem = &currdisk->elements[j]; ioqueue_initialize (elem->queue, i); /* hack to init queue structure */ elem->media_busy = FALSE; // vp - pins are also free elem->pin_busy = FALSE; // vp - initialize the planes in the element ssd_plane_init(elem, currdisk, i); // vp - initialize the ssd element metadata // FIXME: where to free these data? memset(&elem->stat, 0, sizeof(elem->stat)); if (currdisk->params.write_policy == DISKSIM_SSD_WRITE_POLICY_OSR) { ssd_element_metadata_init(j, &(elem->metadata), currdisk); } //vp - initialize the stat structure memset(&elem->stat, 0, sizeof(ssd_element_stat)); } /* } */ } }