Пример #1
0
int UPDATE_OLD_PAGE_MAPPING(int32_t lpn)
{
	int32_t old_ppn;

	old_ppn = GET_MAPPING_INFO(lpn);

	if(old_ppn == -1){
#ifdef FTL_DEBUG
		//printf("[%s] New page \n",__FUNCTION__);
#endif
		//LOG("Wrote new page for lpn %d (old_ppn %d)", lpn, old_ppn);
		return SUCCESS;
	}
	else{
		LOG("Rewrote lpn %d (old_ppn %d)", lpn, old_ppn);
		UPDATE_INVERSE_BLOCK_VALIDITY(CALC_FLASH(old_ppn), CALC_BLOCK(old_ppn), CALC_PAGE(old_ppn), INVALID);
		//LOG("invalidated old_ppn=%d", old_ppn);
		UPDATE_INVERSE_PAGE_MAPPING(old_ppn, INVALIDATE, lpn);
	}

	return SUCCESS;
}
Пример #2
0
int UPDATE_OLD_PAGE_MAPPING(int32_t lpn, int index)
{
    int32_t *old_ppn;

    old_ppn = GET_MAPPING_INFO(lpn);

    if(old_ppn[index] == -1) {
#ifdef FTL_DEBUG
        printf("[%s] New page \n",__FUNCTION__);
#endif
        LOG("Wrote new page for lpn %d index %d (old_ppn %d)", lpn, index, old_ppn[index]);
        return SUCCESS;
    }
    else {
        LOG("Rewrote lpn %d index %d (old_ppn %d)", lpn, index, old_ppn[index]);
        UPDATE_INVERSE_BLOCK_VALIDITY(CALC_FLASH(old_ppn[index]), CALC_BLOCK(old_ppn[index]), CALC_PAGE(old_ppn[index]), INVALID, ratio_table[lpn][index]);
        UPDATE_INVERSE_PAGE_MAPPING(old_ppn[index], INVALIDATE, lpn, index);
        old_ppn[index] = -1; // this portion of the lpn is now empty
    }

    return SUCCESS;
}
Пример #3
0
int UPDATE_OLD_PAGE_MAPPING(int32_t lpn)
{
	int32_t old_ppn;

#ifdef FTL_MAP_CACHE
	old_ppn = CACHE_GET_PPN(lpn);
#else
	old_ppn = GET_MAPPING_INFO(lpn);
#endif

	if(old_ppn == -1){
#ifdef FTL_DEBUG
		printf("[%s] New page \n", __FUNCTION__);
#endif
		return SUCCESS;
	}
	else{
		UPDATE_BLOCK_STATE_ENTRY(CALC_FLASH(old_ppn), CALC_BLOCK(old_ppn), CALC_PAGE(old_ppn), INVALID);
		UPDATE_INVERSE_MAPPING(old_ppn, -1);
	}

	return SUCCESS;
}
Пример #4
0
int _FTL_READ(int32_t sector_nb, unsigned int length)
{
#ifdef FTL_DEBUG
	printf("[%s] Start: sector_nb %d length %u\n",__FUNCTION__, sector_nb, length);
#endif

	if(sector_nb + length > SECTOR_NB){
		printf("Error[FTL_READ] Exceed Sector number\n"); 
		return FAIL;	
	}

	int32_t lpn;
	int32_t *ppn;
	int32_t lba = sector_nb;
	unsigned int remain = length;
	unsigned int left_skip = sector_nb % SECTORS_PER_PAGE;
	unsigned int right_skip;
	unsigned int read_sects;
	unsigned int i, real_read_length = 0;

	unsigned int ret = FAIL;
	int read_page_nb = 0;
	int io_page_nb;

	while(remain > 0){

		if(remain > SECTORS_PER_PAGE - left_skip){
			right_skip = 0;
		}
		else{
			right_skip = SECTORS_PER_PAGE - left_skip - remain;
		}
		read_sects = SECTORS_PER_PAGE - left_skip - right_skip;

		lpn = lba / (int32_t)SECTORS_PER_PAGE;
		ppn = GET_MAPPING_INFO(lpn);

		if(ppn[0] == -1){
			return FAIL;
		}

		real_read_length += SECTORS_PER_PAGE;
		if(ppn[1] != -1){
			real_read_length += SECTORS_PER_PAGE;
		}

		lba += read_sects;
		remain -= read_sects;
		left_skip = 0;
	}

	io_alloc_overhead = ALLOC_IO_REQUEST(sector_nb, real_read_length, READ, &io_page_nb);

	remain = length;
	lba = sector_nb;
	left_skip = sector_nb % SECTORS_PER_PAGE;

	while(remain > 0){

		if(remain > SECTORS_PER_PAGE - left_skip){
			right_skip = 0;
		}
		else{
			right_skip = SECTORS_PER_PAGE - left_skip - remain;
		}
		read_sects = SECTORS_PER_PAGE - left_skip - right_skip;

		lpn = lba / (int32_t)SECTORS_PER_PAGE;

		ppn = GET_MAPPING_INFO(lpn);

		for(i=0; i<2; i++){
			if(ppn[i] == -1){
	#ifdef FTL_DEBUG
					printf("Error[%s] No Mapping info\n",__FUNCTION__);
	#endif
				/* its legal for 2nd index to be empty*/
				if(i==1)
					break;
			}

			//LOG("lpn %d ppn %d", lpn, ppn);
			ret = SSD_PAGE_READ(CALC_FLASH(ppn[i]), CALC_BLOCK(ppn[i]), CALC_PAGE(ppn[i]), read_page_nb, READ, io_page_nb);

			if(ret == FAIL){
				printf("Error[%s] %u page read fail \n", __FUNCTION__, ppn[i]);
			}
			read_page_nb++;
		}

		lba += read_sects;
		remain -= read_sects;
		left_skip = 0;
	}

	INCREASE_IO_REQUEST_SEQ_NB();

#ifdef MONITOR_ON
	char szTemp[1024];
	sprintf(szTemp, "READ PAGE %d ", length);
	WRITE_LOG(szTemp);
#endif

#ifdef FTL_DEBUG
	printf("[%s] Complete\n",__FUNCTION__);
#endif

	return ret;
}