SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtio::VirtqueueBase Class Reference

Virtqueue 基类(C++23 Deducing this 编译期多态) More...

#include <virtqueue_base.hpp>

Inheritance diagram for virtio::VirtqueueBase:
Inheritance graph
Collaboration diagram for virtio::VirtqueueBase:
Collaboration graph

Public Member Functions

auto SubmitChainWithBarrier (this auto &&self, const IoVec *readable, size_t readable_count, const IoVec *writable, size_t writable_count) -> Expected< uint16_t >
 提交 Scatter-Gather 链并通知设备
 
template<typename Callback >
auto ProcessUsedWithCallback (this auto &&self, Callback &&callback) -> uint32_t
 处理已完成的缓冲区并释放描述符链
 

Protected Member Functions

构造/析构函数(仅允许派生类使用)
 VirtqueueBase ()=default
 
 ~VirtqueueBase ()=default
 
 VirtqueueBase (VirtqueueBase &&) noexcept=default
 
auto operator= (VirtqueueBase &&) noexcept -> VirtqueueBase &=default
 
 VirtqueueBase (const VirtqueueBase &)=delete
 
auto operator= (const VirtqueueBase &) -> VirtqueueBase &=delete
 

Detailed Description

Virtqueue 基类(C++23 Deducing this 编译期多态)

提供 Split/Packed Virtqueue 共享的通用逻辑接口。 利用 C++23 Deducing this(显式对象参数)在编译期静态分发到 派生类的具体实现,零虚表开销,无需传统 CRTP 的 static_cast。

派生类应提供以下方法(隐式接口):

  • IsValid() const -> bool
  • Size() const -> uint16_t
  • NumFree() const -> uint16_t
  • AllocDesc() -> Expected<uint16_t>
  • FreeDesc(uint16_t) -> Expected<void>
  • Submit(uint16_t head) -> void
  • HasUsed() const -> bool
  • PopUsed() -> Expected<UsedElem>
  • SubmitChain(const IoVec*, size_t, const IoVec*, size_t) -> Expected<uint16_t>
  • FreeChain(uint16_t head) -> Expected<void>
  • DescPhys() const -> uint64_t
  • AvailPhys() const -> uint64_t
  • UsedPhys() const -> uint64_t
See also
cpu_io::Wmb/Rmb for barrier semantics
virtio-v1.2#2.7 / #2.8

Definition at line 42 of file virtqueue_base.hpp.

Constructor & Destructor Documentation

◆ VirtqueueBase() [1/3]

virtio::VirtqueueBase::VirtqueueBase ( )
protecteddefault

◆ ~VirtqueueBase()

virtio::VirtqueueBase::~VirtqueueBase ( )
protecteddefault

◆ VirtqueueBase() [2/3]

virtio::VirtqueueBase::VirtqueueBase ( VirtqueueBase &&  )
protecteddefaultnoexcept

◆ VirtqueueBase() [3/3]

virtio::VirtqueueBase::VirtqueueBase ( const VirtqueueBase )
protecteddelete

Member Function Documentation

◆ operator=() [1/2]

auto virtio::VirtqueueBase::operator= ( const VirtqueueBase ) -> VirtqueueBase &=delete
protecteddelete

◆ operator=() [2/2]

auto virtio::VirtqueueBase::operator= ( VirtqueueBase &&  ) -> VirtqueueBase &=default
protecteddefaultnoexcept

◆ ProcessUsedWithCallback()

template<typename Callback >
auto virtio::VirtqueueBase::ProcessUsedWithCallback ( this auto &&  self,
Callback &&  callback 
) -> uint32_t
inline

处理已完成的缓冲区并释放描述符链

通用逻辑:从 Used Ring 弹出已完成的元素,对每个元素调用回调函数, 然后释放描述符链。通过 Deducing this 在编译期分发到派生类的 HasUsed/PopUsed/FreeChain。

Template Parameters
Callback回调函数类型,签名:void(uint16_t head, uint32_t len)
Parameters
callback对每个已完成请求的回调
Returns
处理的已完成请求数量
See also
virtio-v1.2#2.7.14 Receiving Used Buffers From The Device

Definition at line 85 of file virtqueue_base.hpp.

86 {
87 // 读屏障:确保读取到设备最新的 Used Ring 写入
89
90 uint32_t processed = 0;
91 while (self.HasUsed()) {
92 auto result = self.PopUsed();
93 if (!result.has_value()) {
94 break;
95 }
96
97 auto elem = *result;
98 auto head = static_cast<uint16_t>(elem.id);
99 callback(head, elem.len);
100 (void)self.FreeChain(head);
101 ++processed;
102 }
103 return processed;
104 }
void Rmb()
Definition cpu_io.h:57
Here is the call graph for this function:

◆ SubmitChainWithBarrier()

auto virtio::VirtqueueBase::SubmitChainWithBarrier ( this auto &&  self,
const IoVec readable,
size_t  readable_count,
const IoVec writable,
size_t  writable_count 
) -> Expected<uint16_t>
inline

提交 Scatter-Gather 链并通知设备

在 SubmitChain 前后自动插入适当的内存屏障。 通过 Deducing this 在编译期分发到派生类的 SubmitChain 实现。

Parameters
readable设备只读缓冲区数组
readable_countreadable 数组元素数量
writable设备可写缓冲区数组
writable_countwritable 数组元素数量
Returns
成功返回描述符链头索引;失败返回错误
See also
virtio-v1.2#2.7.13 Supplying Buffers to The Device

Definition at line 58 of file virtqueue_base.hpp.

60 {
61 // 写屏障:确保调用方填充的数据对设备可见
63 auto result =
64 self.SubmitChain(readable, readable_count, writable, writable_count);
65 if (result.has_value()) {
66 cpu_io::Mb();
67 }
68 return result;
69 }
void Wmb()
Definition cpu_io.h:58
void Mb()
Definition cpu_io.h:56
Here is the call graph for this function:

The documentation for this class was generated from the following file: