FEMU  原版 master 7e238cc
FEMU: Accurate, Scalable and Extensible NVMe SSD Emulator (FAST'18)
ftl.c 文件参考

ftl主体 更多...

#include "ftl.h"
ftl.c 的引用(Include)关系图:

函数

static void * ftl_thread (void *arg)
 ftl线程函数,不断从to_ftl中取req,处理(计算出时延)后放入to_poller 更多...
 
static bool should_gc (struct ssd *ssd)
 空闲gc阈值 更多...
 
static bool should_gc_high (struct ssd *ssd)
 gc阈值 更多...
 
static struct ppa get_maptbl_ent (struct ssd *ssd, uint64_t lpn)
 
static void set_maptbl_ent (struct ssd *ssd, uint64_t lpn, struct ppa *ppa)
 赋值一个page映射表项 更多...
 
static uint64_t ppa2pgidx (struct ssd *ssd, struct ppa *ppa)
 
static uint64_t get_rmap_ent (struct ssd *ssd, struct ppa *ppa)
 
static void set_rmap_ent (struct ssd *ssd, uint64_t lpn, struct ppa *ppa)
 赋值一个反向映射表项(rmap[page_no(ppa)] -> lpn) 更多...
 
static int victim_line_cmp_pri (pqueue_pri_t next, pqueue_pri_t curr)
 
static pqueue_pri_t victim_line_get_pri (void *a)
 
static void victim_line_set_pri (void *a, pqueue_pri_t pri)
 
static size_t victim_line_get_pos (void *a)
 
static void victim_line_set_pos (void *a, size_t pos)
 
static void ssd_init_lines (struct ssd *ssd)
 初始化lines,所有line加入free_line_list,而full_line_list和victim_line_pq为空 更多...
 
static void ssd_init_write_pointer (struct ssd *ssd)
 写指针初始化,指向0 更多...
 
static void check_addr (int a, int max)
 
static struct lineget_next_free_line (struct ssd *ssd)
 
static void ssd_advance_write_pointer (struct ssd *ssd)
 写指针后移,每次写操作结束后调用 更多...
 
static struct ppa get_new_page (struct ssd *ssd)
 获取新的page(wpp已经更新,取其指向的page地址即可) 更多...
 
static void check_params (struct ssdparams *spp)
 
static void ssd_init_params (struct ssdparams *spp)
 设置nand大小/并行参数,做相关计算 更多...
 
static void ssd_init_nand_page (struct nand_page *pg, struct ssdparams *spp)
 
static void ssd_init_nand_blk (struct nand_block *blk, struct ssdparams *spp)
 
static void ssd_init_nand_plane (struct nand_plane *pl, struct ssdparams *spp)
 
static void ssd_init_nand_lun (struct nand_lun *lun, struct ssdparams *spp)
 
static void ssd_init_ch (struct ssd_channel *ch, struct ssdparams *spp)
 
static void ssd_init_maptbl (struct ssd *ssd)
 
static void ssd_init_rmap (struct ssd *ssd)
 
void ssd_init (FemuCtrl *n)
 初始化ssd参数,为ssd各层结构体分配空间,创建ftl线程 更多...
 
static bool valid_ppa (struct ssd *ssd, struct ppa *ppa)
 判断ppa地址是否越界 更多...
 
static bool valid_lpn (struct ssd *ssd, uint64_t lpn)
 
static bool mapped_ppa (struct ppa *ppa)
 
static struct ssd_channelget_ch (struct ssd *ssd, struct ppa *ppa)
 
static struct nand_lunget_lun (struct ssd *ssd, struct ppa *ppa)
 
static struct nand_planeget_pl (struct ssd *ssd, struct ppa *ppa)
 
static struct nand_blockget_blk (struct ssd *ssd, struct ppa *ppa)
 
static struct lineget_line (struct ssd *ssd, struct ppa *ppa)
 
static struct nand_pageget_pg (struct ssd *ssd, struct ppa *ppa)
 
static uint64_t ssd_advance_status (struct ssd *ssd, struct ppa *ppa, struct nand_cmd *ncmd)
 根据操作类型,给出模拟的时延 更多...
 
static void mark_page_invalid (struct ssd *ssd, struct ppa *ppa)
 update SSD status about one page from PG_VALID -> PG_INVALID 更多...
 
static void mark_page_valid (struct ssd *ssd, struct ppa *ppa)
 将一个page从PG_FREE标记为PG_VALID 更多...
 
static void mark_block_free (struct ssd *ssd, struct ppa *ppa)
 将一个空block中所有页标记为PG_FREE 更多...
 
static void gc_read_page (struct ssd *ssd, struct ppa *ppa)
 gc产生的读page 更多...
 
**param ssd *param old_ppa *return uint64_t *static uint64_t gc_write_page (struct ssd *ssd, struct ppa *old_ppa)
 gc产生的写 更多...
 
static struct lineselect_victim_line (struct ssd *ssd, bool force)
 为gc选择一个victim line,优先队列中出队即可 更多...
 
static void clean_one_block (struct ssd *ssd, struct ppa *ppa)
 gc清理一个block,将有效页转移 更多...
 
static void mark_line_free (struct ssd *ssd, struct ppa *ppa)
 将该line加入空闲line队列 更多...
 
static int do_gc (struct ssd *ssd, bool force)
 gc函数,清理一整个line 更多...
 
static uint64_t ssd_read (struct ssd *ssd, NvmeRequest *req)
 
static uint64_t ssd_write (struct ssd *ssd, NvmeRequest *req)
 ssd写延迟模拟 更多...
 

详细描述

ftl主体

函数说明

◆ check_addr()

static void check_addr ( int  a,
int  max 
)
inlinestatic
这是这个函数的调用关系图:

◆ check_params()

static void check_params ( struct ssdparams spp)
static
这是这个函数的调用关系图:

◆ clean_one_block()

static void clean_one_block ( struct ssd ssd,
struct ppa ppa 
)
static

gc清理一个block,将有效页转移

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ do_gc()

static int do_gc ( struct ssd ssd,
bool  force 
)
static

gc函数,清理一整个line

参数
ssd
force
返回
int
函数调用图:
这是这个函数的调用关系图:

◆ ftl_thread()

static void * ftl_thread ( void *  arg)
static

ftl线程函数,不断从to_ftl中取req,处理(计算出时延)后放入to_poller

参数
arg
返回
void*
函数调用图:
这是这个函数的调用关系图:

◆ gc_read_page()

static void gc_read_page ( struct ssd ssd,
struct ppa ppa 
)
static

gc产生的读page

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ gc_write_page()

* * param ssd* param old_ppa* return uint64_t* static uint64_t gc_write_page ( struct ssd ssd,
struct ppa old_ppa 
)
static

gc产生的写

函数调用图:
这是这个函数的调用关系图:

◆ get_blk()

static struct nand_block* get_blk ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ get_ch()

static struct ssd_channel* get_ch ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
这是这个函数的调用关系图:

◆ get_line()

static struct line* get_line ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
这是这个函数的调用关系图:

◆ get_lun()

static struct nand_lun* get_lun ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ get_maptbl_ent()

static struct ppa get_maptbl_ent ( struct ssd ssd,
uint64_t  lpn 
)
inlinestatic
这是这个函数的调用关系图:

◆ get_new_page()

static struct ppa get_new_page ( struct ssd ssd)
static

获取新的page(wpp已经更新,取其指向的page地址即可)

参数
ssd
返回
struct ppa
函数调用图:
这是这个函数的调用关系图:

◆ get_next_free_line()

static struct line* get_next_free_line ( struct ssd ssd)
static
这是这个函数的调用关系图:

◆ get_pg()

static struct nand_page* get_pg ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ get_pl()

static struct nand_plane* get_pl ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ get_rmap_ent()

static uint64_t get_rmap_ent ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ mapped_ppa()

static bool mapped_ppa ( struct ppa ppa)
inlinestatic
函数调用图:
这是这个函数的调用关系图:

◆ mark_block_free()

static void mark_block_free ( struct ssd ssd,
struct ppa ppa 
)
static

将一个空block中所有页标记为PG_FREE

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ mark_line_free()

static void mark_line_free ( struct ssd ssd,
struct ppa ppa 
)
static

将该line加入空闲line队列

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ mark_page_invalid()

static void mark_page_invalid ( struct ssd ssd,
struct ppa ppa 
)
static

update SSD status about one page from PG_VALID -> PG_INVALID

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ mark_page_valid()

static void mark_page_valid ( struct ssd ssd,
struct ppa ppa 
)
static

将一个page从PG_FREE标记为PG_VALID

参数
ssd
ppa
函数调用图:
这是这个函数的调用关系图:

◆ ppa2pgidx()

static uint64_t ppa2pgidx ( struct ssd ssd,
struct ppa ppa 
)
static
这是这个函数的调用关系图:

◆ select_victim_line()

static struct line* select_victim_line ( struct ssd ssd,
bool  force 
)
static

为gc选择一个victim line,优先队列中出队即可

参数
ssd
force
返回
struct line*
函数调用图:
这是这个函数的调用关系图:

◆ set_maptbl_ent()

static void set_maptbl_ent ( struct ssd ssd,
uint64_t  lpn,
struct ppa ppa 
)
inlinestatic

赋值一个page映射表项

参数
ssd
lpn
ppa
函数调用图:
这是这个函数的调用关系图:

◆ set_rmap_ent()

static void set_rmap_ent ( struct ssd ssd,
uint64_t  lpn,
struct ppa ppa 
)
inlinestatic

赋值一个反向映射表项(rmap[page_no(ppa)] -> lpn)

参数
ssd
lpn
ppa
函数调用图:
这是这个函数的调用关系图:

◆ should_gc()

static bool should_gc ( struct ssd ssd)
inlinestatic

空闲gc阈值

参数
ssd
返回
true
false
这是这个函数的调用关系图:

◆ should_gc_high()

static bool should_gc_high ( struct ssd ssd)
inlinestatic

gc阈值

参数
ssd
返回
true
false
这是这个函数的调用关系图:

◆ ssd_advance_status()

static uint64_t ssd_advance_status ( struct ssd ssd,
struct ppa ppa,
struct nand_cmd ncmd 
)
static

根据操作类型,给出模拟的时延

参数
ssd
ppa操作地址
ncmd操作类型
返回
uint64_t 时延
函数调用图:
这是这个函数的调用关系图:

◆ ssd_advance_write_pointer()

static void ssd_advance_write_pointer ( struct ssd ssd)
static

写指针后移,每次写操作结束后调用

参数
ssd
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init()

void ssd_init ( FemuCtrl n)

初始化ssd参数,为ssd各层结构体分配空间,创建ftl线程

参数
n
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_ch()

static void ssd_init_ch ( struct ssd_channel ch,
struct ssdparams spp 
)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_lines()

static void ssd_init_lines ( struct ssd ssd)
static

初始化lines,所有line加入free_line_list,而full_line_list和victim_line_pq为空

参数
ssd
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_maptbl()

static void ssd_init_maptbl ( struct ssd ssd)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_nand_blk()

static void ssd_init_nand_blk ( struct nand_block blk,
struct ssdparams spp 
)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_nand_lun()

static void ssd_init_nand_lun ( struct nand_lun lun,
struct ssdparams spp 
)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_nand_page()

static void ssd_init_nand_page ( struct nand_page pg,
struct ssdparams spp 
)
static
这是这个函数的调用关系图:

◆ ssd_init_nand_plane()

static void ssd_init_nand_plane ( struct nand_plane pl,
struct ssdparams spp 
)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_params()

static void ssd_init_params ( struct ssdparams spp)
static

设置nand大小/并行参数,做相关计算

参数
spp
函数调用图:
这是这个函数的调用关系图:

◆ ssd_init_rmap()

static void ssd_init_rmap ( struct ssd ssd)
static
这是这个函数的调用关系图:

◆ ssd_init_write_pointer()

static void ssd_init_write_pointer ( struct ssd ssd)
static

写指针初始化,指向0

参数
ssd
这是这个函数的调用关系图:

◆ ssd_read()

static uint64_t ssd_read ( struct ssd ssd,
NvmeRequest req 
)
static
函数调用图:
这是这个函数的调用关系图:

◆ ssd_write()

static uint64_t ssd_write ( struct ssd ssd,
NvmeRequest req 
)
static

ssd写延迟模拟

参数
ssd
req
返回
uint64_t 返回写延迟
函数调用图:
这是这个函数的调用关系图:

◆ valid_lpn()

static bool valid_lpn ( struct ssd ssd,
uint64_t  lpn 
)
inlinestatic
这是这个函数的调用关系图:

◆ valid_ppa()

static bool valid_ppa ( struct ssd ssd,
struct ppa ppa 
)
inlinestatic

判断ppa地址是否越界

参数
ssd
ppa
返回
true
false
这是这个函数的调用关系图:

◆ victim_line_cmp_pri()

static int victim_line_cmp_pri ( pqueue_pri_t  next,
pqueue_pri_t  curr 
)
inlinestatic
这是这个函数的调用关系图:

◆ victim_line_get_pos()

static size_t victim_line_get_pos ( void *  a)
inlinestatic
这是这个函数的调用关系图:

◆ victim_line_get_pri()

static pqueue_pri_t victim_line_get_pri ( void *  a)
inlinestatic
这是这个函数的调用关系图:

◆ victim_line_set_pos()

static void victim_line_set_pos ( void *  a,
size_t  pos 
)
inlinestatic
这是这个函数的调用关系图:

◆ victim_line_set_pri()

static void victim_line_set_pri ( void *  a,
pqueue_pri_t  pri 
)
inlinestatic
这是这个函数的调用关系图: