SPDK线程模型

本文详细介绍了SPDK的线程模型,包括reactor框架、上层服务与reactor的关系,特别是vhost-virtio和NVMe-oF-Target服务。SPDK在每个核心上创建一个reactor线程,通过注册poller执行任务。此外,文章还深入讨论了bdev框架,特别是NVMe设备和virtio设备的实现,涉及PCIe和RDMA接口的读写请求处理机制。
摘要由CSDN通过智能技术生成

(一)reactor框架: thread线程 和 poller函数

(1.1)SPDK的主线程

SPDK(APP)在启动时候会让指定绑定在那些core上运行,这样在每个core上会创建一个线程(他叫reactor),这个线程不停的做polling操作,而如果你要在这个线程上做事情,则需要注册poller( 可以理解为一个poller就是SPDK中一个事情的thread入口函数,但是),这个线程就不停的调用poller的机型函数执行你要执行的动作。

spdk_app_start 
  spdk_reactors_start 
     reactor_run
        reactor_interrupt_run
            spdk_fd_group_wait
               event_handler->fn
        _reactor_run
            event_queue_run_batch
                spdk_ring_dequeue
                spdk_event->fn
            spdk_thread_poll
                thread_poll
                    msg_queue_run_batch
                       spdk_ring_dequeue
                       spdk_msg->fn
                    <FOREACH> spdk_thread->active_pollers
                    thread_execute_poller
                       spdk_poller->fn
                    thread_execute_timed_poller
                       spdk_poller->fn
                spdk_fd_group_wait
                    event_handler->fn  

            reactor_post_process_lw_thread  
                _reactor_schedule_thread
                    spdk_event_allocate
                    spdk_event_call

(二)上层服务与reactor

(2.1)概述:

(a)vhost-virtio服务
(b)iSCSI-Target服务
(c)NVMe-oF-Target服务

(2.2)vhost-virtio:

spdk_thread_poll
  thread_poll
    thread_execute_poller
        vdev_worker
          process_vq
            vhost_vq_avail_ring_get
              process_blk_task
                 vhost_vq_avail_ring_get
                 process_blk_task
                    process_blk_request
                       spdk_bdev_readv
                       spdk_bdev_writev
                 process_scsi_task
                    bdev_scsi_execute
                       bdev_scsi_readwrite
                         spdk_bdev_readv_blocks
                         spdk_bdev_writev_blocks

(三)spdk-bdev框架

(3.1)spdk-bdev框架对上层服务提供的读写API接口

读接口:spdk_bdev_read / spdk_bdev_readv 
写接口:spdk_bdev_write / spdk_bdev_writev
 [bdev_io_submit]
    _bdev_io_submit
      bdev_io_do_submit
        spdk_bdev->fn_table->submit_request
        <A> bdev_nvme_submit_request
        <B> bdev_pmem_submit_request
        <C> bdev_virtio_submit_request
        <D> bdev_iscsi_submit_request
        <E> bdev_aio_submit_r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值