@@ -9,11 +9,11 @@ use std::os::unix::io::AsRawFd;
9
9
use vm_memory:: GuestMemoryError ;
10
10
use vmm_sys_util:: eventfd:: EventFd ;
11
11
12
- use crate :: devices:: virtio:: block:: virtio:: IO_URING_NUM_ENTRIES ;
13
- use crate :: devices:: virtio:: block:: virtio:: io :: UserDataError ;
12
+ use crate :: devices:: virtio:: block:: virtio:: io :: RequestError ;
13
+ use crate :: devices:: virtio:: block:: virtio:: { IO_URING_NUM_ENTRIES , PendingRequest } ;
14
14
use crate :: io_uring:: operation:: { Cqe , OpCode , Operation } ;
15
15
use crate :: io_uring:: restriction:: Restriction ;
16
- use crate :: io_uring:: { self , IoUring , IoUringError } ;
16
+ use crate :: io_uring:: { IoUring , IoUringError } ;
17
17
use crate :: logger:: log_dev_preview_warning;
18
18
use crate :: vstate:: memory:: { GuestAddress , GuestMemory , GuestMemoryExtension , GuestMemoryMmap } ;
19
19
@@ -34,47 +34,44 @@ pub enum AsyncIoError {
34
34
}
35
35
36
36
#[ derive( Debug ) ]
37
- pub struct AsyncFileEngine < T > {
37
+ pub struct AsyncFileEngine {
38
38
file : File ,
39
- ring : IoUring < WrappedUserData < T > > ,
39
+ ring : IoUring < WrappedRequest > ,
40
40
completion_evt : EventFd ,
41
41
}
42
42
43
43
#[ derive( Debug ) ]
44
- pub struct WrappedUserData < T > {
44
+ pub struct WrappedRequest {
45
45
addr : Option < GuestAddress > ,
46
- user_data : T ,
46
+ req : PendingRequest ,
47
47
}
48
48
49
- impl < T : Debug > WrappedUserData < T > {
50
- fn new ( user_data : T ) -> Self {
51
- WrappedUserData {
52
- addr : None ,
53
- user_data,
54
- }
49
+ impl WrappedRequest {
50
+ fn new ( req : PendingRequest ) -> Self {
51
+ WrappedRequest { addr : None , req }
55
52
}
56
53
57
- fn new_with_dirty_tracking ( addr : GuestAddress , user_data : T ) -> Self {
58
- WrappedUserData {
54
+ fn new_with_dirty_tracking ( addr : GuestAddress , req : PendingRequest ) -> Self {
55
+ WrappedRequest {
59
56
addr : Some ( addr) ,
60
- user_data ,
57
+ req ,
61
58
}
62
59
}
63
60
64
- fn mark_dirty_mem_and_unwrap ( self , mem : & GuestMemoryMmap , count : u32 ) -> T {
61
+ fn mark_dirty_mem_and_unwrap ( self , mem : & GuestMemoryMmap , count : u32 ) -> PendingRequest {
65
62
if let Some ( addr) = self . addr {
66
63
mem. mark_dirty ( addr, count as usize )
67
64
}
68
65
69
- self . user_data
66
+ self . req
70
67
}
71
68
}
72
69
73
- impl < T : Debug > AsyncFileEngine < T > {
70
+ impl AsyncFileEngine {
74
71
fn new_ring (
75
72
file : & File ,
76
73
completion_fd : RawFd ,
77
- ) -> Result < IoUring < WrappedUserData < T > > , io_uring :: IoUringError > {
74
+ ) -> Result < IoUring < WrappedRequest > , IoUringError > {
78
75
IoUring :: new (
79
76
u32:: from ( IO_URING_NUM_ENTRIES ) ,
80
77
vec ! [ file] ,
@@ -90,7 +87,7 @@ impl<T: Debug> AsyncFileEngine<T> {
90
87
)
91
88
}
92
89
93
- pub fn from_file ( file : File ) -> Result < AsyncFileEngine < T > , AsyncIoError > {
90
+ pub fn from_file ( file : File ) -> Result < AsyncFileEngine , AsyncIoError > {
94
91
log_dev_preview_warning ( "Async file IO" , Option :: None ) ;
95
92
96
93
let completion_evt = EventFd :: new ( libc:: EFD_NONBLOCK ) . map_err ( AsyncIoError :: EventFd ) ?;
@@ -128,19 +125,19 @@ impl<T: Debug> AsyncFileEngine<T> {
128
125
mem : & GuestMemoryMmap ,
129
126
addr : GuestAddress ,
130
127
count : u32 ,
131
- user_data : T ,
132
- ) -> Result < ( ) , UserDataError < T , AsyncIoError > > {
128
+ req : PendingRequest ,
129
+ ) -> Result < ( ) , RequestError < AsyncIoError > > {
133
130
let buf = match mem. get_slice ( addr, count as usize ) {
134
131
Ok ( slice) => slice. ptr_guard_mut ( ) . as_ptr ( ) ,
135
132
Err ( err) => {
136
- return Err ( UserDataError {
137
- user_data ,
133
+ return Err ( RequestError {
134
+ req ,
138
135
error : AsyncIoError :: GuestMemory ( err) ,
139
136
} ) ;
140
137
}
141
138
} ;
142
139
143
- let wrapped_user_data = WrappedUserData :: new_with_dirty_tracking ( addr, user_data ) ;
140
+ let wrapped_user_data = WrappedRequest :: new_with_dirty_tracking ( addr, req ) ;
144
141
145
142
self . ring
146
143
. push ( Operation :: read (
@@ -150,8 +147,8 @@ impl<T: Debug> AsyncFileEngine<T> {
150
147
offset,
151
148
wrapped_user_data,
152
149
) )
153
- . map_err ( |( io_uring_error, data) | UserDataError {
154
- user_data : data. user_data ,
150
+ . map_err ( |( io_uring_error, data) | RequestError {
151
+ req : data. req ,
155
152
error : AsyncIoError :: IoUring ( io_uring_error) ,
156
153
} )
157
154
}
@@ -162,19 +159,19 @@ impl<T: Debug> AsyncFileEngine<T> {
162
159
mem : & GuestMemoryMmap ,
163
160
addr : GuestAddress ,
164
161
count : u32 ,
165
- user_data : T ,
166
- ) -> Result < ( ) , UserDataError < T , AsyncIoError > > {
162
+ req : PendingRequest ,
163
+ ) -> Result < ( ) , RequestError < AsyncIoError > > {
167
164
let buf = match mem. get_slice ( addr, count as usize ) {
168
165
Ok ( slice) => slice. ptr_guard_mut ( ) . as_ptr ( ) ,
169
166
Err ( err) => {
170
- return Err ( UserDataError {
171
- user_data ,
167
+ return Err ( RequestError {
168
+ req ,
172
169
error : AsyncIoError :: GuestMemory ( err) ,
173
170
} ) ;
174
171
}
175
172
} ;
176
173
177
- let wrapped_user_data = WrappedUserData :: new ( user_data ) ;
174
+ let wrapped_user_data = WrappedRequest :: new ( req ) ;
178
175
179
176
self . ring
180
177
. push ( Operation :: write (
@@ -184,19 +181,19 @@ impl<T: Debug> AsyncFileEngine<T> {
184
181
offset,
185
182
wrapped_user_data,
186
183
) )
187
- . map_err ( |( io_uring_error, data) | UserDataError {
188
- user_data : data. user_data ,
184
+ . map_err ( |( io_uring_error, data) | RequestError {
185
+ req : data. req ,
189
186
error : AsyncIoError :: IoUring ( io_uring_error) ,
190
187
} )
191
188
}
192
189
193
- pub fn push_flush ( & mut self , user_data : T ) -> Result < ( ) , UserDataError < T , AsyncIoError > > {
194
- let wrapped_user_data = WrappedUserData :: new ( user_data ) ;
190
+ pub fn push_flush ( & mut self , req : PendingRequest ) -> Result < ( ) , RequestError < AsyncIoError > > {
191
+ let wrapped_user_data = WrappedRequest :: new ( req ) ;
195
192
196
193
self . ring
197
194
. push ( Operation :: fsync ( 0 , wrapped_user_data) )
198
- . map_err ( |( io_uring_error, data) | UserDataError {
199
- user_data : data. user_data ,
195
+ . map_err ( |( io_uring_error, data) | RequestError {
196
+ req : data. req ,
200
197
error : AsyncIoError :: IoUring ( io_uring_error) ,
201
198
} )
202
199
}
@@ -233,11 +230,14 @@ impl<T: Debug> AsyncFileEngine<T> {
233
230
Ok ( ( ) )
234
231
}
235
232
236
- fn do_pop ( & mut self ) -> Result < Option < Cqe < WrappedUserData < T > > > , AsyncIoError > {
233
+ fn do_pop ( & mut self ) -> Result < Option < Cqe < WrappedRequest > > , AsyncIoError > {
237
234
self . ring . pop ( ) . map_err ( AsyncIoError :: IoUring )
238
235
}
239
236
240
- pub fn pop ( & mut self , mem : & GuestMemoryMmap ) -> Result < Option < Cqe < T > > , AsyncIoError > {
237
+ pub fn pop (
238
+ & mut self ,
239
+ mem : & GuestMemoryMmap ,
240
+ ) -> Result < Option < Cqe < PendingRequest > > , AsyncIoError > {
241
241
let cqe = self . do_pop ( ) ?. map ( |cqe| {
242
242
let count = cqe. count ( ) ;
243
243
cqe. map_user_data ( |wrapped_user_data| {
0 commit comments