SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtqueue_base.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8
9#include <cstdint>
10
11#include "expected.hpp"
13
14namespace virtio {
15
43 public:
58 [[nodiscard]] auto SubmitChainWithBarrier(
59 this auto&& self, const IoVec* readable, size_t readable_count,
60 const IoVec* writable, size_t writable_count) -> Expected<uint16_t> {
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 }
70
84 template <typename Callback>
85 auto ProcessUsedWithCallback(this auto&& self, Callback&& callback)
86 -> uint32_t {
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 }
105
106 protected:
109 VirtqueueBase() = default;
110 ~VirtqueueBase() = default;
111 VirtqueueBase(VirtqueueBase&&) noexcept = default;
112 auto operator=(VirtqueueBase&&) noexcept -> VirtqueueBase& = default;
113 VirtqueueBase(const VirtqueueBase&) = delete;
114 auto operator=(const VirtqueueBase&) -> VirtqueueBase& = delete;
116};
117
118} // namespace virtio
Virtqueue 基类(C++23 Deducing this 编译期多态)
VirtqueueBase(VirtqueueBase &&) noexcept=default
auto SubmitChainWithBarrier(this auto &&self, const IoVec *readable, size_t readable_count, const IoVec *writable, size_t writable_count) -> Expected< uint16_t >
提交 Scatter-Gather 链并通知设备
auto ProcessUsedWithCallback(this auto &&self, Callback &&callback) -> uint32_t
处理已完成的缓冲区并释放描述符链
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
void Wmb()
Definition cpu_io.h:58
void Mb()
Definition cpu_io.h:56
void Rmb()
Definition cpu_io.h:57
Definition defs.h:9
Scatter-Gather IO 物理内存向量
Definition misc.hpp:43