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

nvme处理io command相关操作 更多...

#include "./nvme.h"
nvme-io.c 的引用(Include)关系图:

函数

static uint16_t nvme_io_cmd (FemuCtrl *n, NvmeCmd *cmd, NvmeRequest *req)
 nvme处理io类型的commad,识别cmd类型并调用相关函数 更多...
 
static void nvme_update_sq_eventidx (const NvmeSQueue *sq)
 
static void nvme_copy_cmd (NvmeCmd *dst, NvmeCmd *src)
 从dram中取cmd 更多...
 
static void nvme_process_sq_io (void *opaque, int index_poller)
 从sq中取出req,放入to_ftl队列中,交由ftl处理 更多...
 
static void nvme_post_cqe (NvmeCQueue *cq, NvmeRequest *req)
 将req实际封装入cq 更多...
 
static void nvme_process_cq_cpl (void *arg, int index_poller)
 从to_poller队列中取req,放入cq中,然后通知上层操作已完成 更多...
 
static void * nvme_poller (void *arg)
 nvme poller线程函数,不断处理sq和生成cq 更多...
 
static int cmp_pri (pqueue_pri_t next, pqueue_pri_t curr)
 
static pqueue_pri_t get_pri (void *a)
 
static void set_pri (void *a, pqueue_pri_t pri)
 
static size_t get_pos (void *a)
 
static void set_pos (void *a, size_t pos)
 
void nvme_create_poller (FemuCtrl *n)
 创建poller线程,以及两个ring queue:to_ftl和to_poller 更多...
 
uint16_t nvme_rw (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 nvme读写命令 更多...
 
static uint16_t nvme_dsm (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 处理io cmd:dataset management命令 更多...
 
static uint16_t nvme_compare (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 处理io cmd:compare命令 更多...
 
static uint16_t nvme_flush (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 处理io cmd:flush命令 更多...
 
static uint16_t nvme_write_zeros (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 处理io cmd:write zeros命令 更多...
 
static uint16_t nvme_write_uncor (FemuCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, NvmeRequest *req)
 处理io cmd:write uncorrectable命令 更多...
 
void nvme_post_cqes_io (void *opaque)
 将剩余的req都填入cq 更多...
 

详细描述

nvme处理io command相关操作

函数说明

◆ cmp_pri()

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

◆ get_pos()

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

◆ get_pri()

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

◆ nvme_compare()

static uint16_t nvme_compare ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)
static

处理io cmd:compare命令

参数
n
ns
cmd
req
返回
uint16_t
函数调用图:
这是这个函数的调用关系图:

◆ nvme_copy_cmd()

static void nvme_copy_cmd ( NvmeCmd dst,
NvmeCmd src 
)
inlinestatic

从dram中取cmd

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

◆ nvme_create_poller()

void nvme_create_poller ( FemuCtrl n)

创建poller线程,以及两个ring queue:to_ftl和to_poller

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

◆ nvme_dsm()

static uint16_t nvme_dsm ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)
static

处理io cmd:dataset management命令

参数
n
ns
cmd
req
返回
uint16_t
函数调用图:
这是这个函数的调用关系图:

◆ nvme_flush()

static uint16_t nvme_flush ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)
static

处理io cmd:flush命令

参数
n
ns
cmd
req
返回
uint16_t
这是这个函数的调用关系图:

◆ nvme_io_cmd()

static uint16_t nvme_io_cmd ( FemuCtrl n,
NvmeCmd cmd,
NvmeRequest req 
)
static

nvme处理io类型的commad,识别cmd类型并调用相关函数

参数
n
cmd
req
返回
uint16_t

进入各模式femu(如blackbox)定义的io处理函数

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

◆ nvme_poller()

static void* nvme_poller ( void *  arg)
static

nvme poller线程函数,不断处理sq和生成cq

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

◆ nvme_post_cqe()

static void nvme_post_cqe ( NvmeCQueue cq,
NvmeRequest req 
)
static

将req实际封装入cq

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

◆ nvme_post_cqes_io()

void nvme_post_cqes_io ( void *  opaque)

将剩余的req都填入cq

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

◆ nvme_process_cq_cpl()

static void nvme_process_cq_cpl ( void *  arg,
int  index_poller 
)
static

从to_poller队列中取req,放入cq中,然后通知上层操作已完成

参数
arg
index_pollerto_poller序号

从to_poller中取出req

暂存到pq

处理pq

加入cq中

req结构体重新放回队列

超时

通知

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

◆ nvme_process_sq_io()

static void nvme_process_sq_io ( void *  opaque,
int  index_poller 
)
static

从sq中取出req,放入to_ftl队列中,交由ftl处理

参数
opaquesq队列
index_poller

取cmd

sq头指针递增

取sq中req

(这时还是空req)

用取出的cmd生成新req

实际处理cmd

交给ftl(计算延迟)

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

◆ nvme_rw()

uint16_t nvme_rw ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)

nvme读写命令

参数
n
ns
cmd
req
返回
uint16_t
函数调用图:
这是这个函数的调用关系图:

◆ nvme_update_sq_eventidx()

static void nvme_update_sq_eventidx ( const NvmeSQueue sq)
static
函数调用图:
这是这个函数的调用关系图:

◆ nvme_write_uncor()

static uint16_t nvme_write_uncor ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)
static

处理io cmd:write uncorrectable命令

参数
n
ns
cmd
req
返回
uint16_t
函数调用图:
这是这个函数的调用关系图:

◆ nvme_write_zeros()

static uint16_t nvme_write_zeros ( FemuCtrl n,
NvmeNamespace ns,
NvmeCmd cmd,
NvmeRequest req 
)
static

处理io cmd:write zeros命令

参数
n
ns
cmd
req
返回
uint16_t
函数调用图:
这是这个函数的调用关系图:

◆ set_pos()

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

◆ set_pri()

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