VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmblkcache.h@ 99896

Last change on this file since 99896 was 99739, checked in by vboxsync, 19 months ago

*: doxygen corrections (mostly about removing @returns from functions returning void).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.4 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, Block cache.
3 */
4
5/*
6 * Copyright (C) 2007-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef VBOX_INCLUDED_vmm_pdmblkcache_h
37#define VBOX_INCLUDED_vmm_pdmblkcache_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#include <VBox/types.h>
43#include <iprt/sg.h>
44
45
46RT_C_DECLS_BEGIN
47
48/** @defgroup grp_pdm_blk_cache The PDM Block Cache API
49 * @ingroup grp_pdm
50 * @{
51 */
52
53/** Pointer to a PDM block cache. */
54typedef struct PDMBLKCACHE *PPDMBLKCACHE;
55/** Pointer to a PDM block cache pointer. */
56typedef PPDMBLKCACHE *PPPDMBLKCACHE;
57
58/** I/O transfer handle. */
59typedef struct PDMBLKCACHEIOXFER *PPDMBLKCACHEIOXFER;
60
61/**
62 * Block cache I/O request transfer direction.
63 */
64typedef enum PDMBLKCACHEXFERDIR
65{
66 /** Read */
67 PDMBLKCACHEXFERDIR_READ = 0,
68 /** Write */
69 PDMBLKCACHEXFERDIR_WRITE,
70 /** Flush */
71 PDMBLKCACHEXFERDIR_FLUSH,
72 /** Discard */
73 PDMBLKCACHEXFERDIR_DISCARD
74} PDMBLKCACHEXFERDIR;
75
76/**
77 * Completion callback for drivers.
78 *
79 * @param pDrvIns The driver instance.
80 * @param pvUser User argument given during request initiation.
81 * @param rc The status code of the completed request.
82 */
83typedef DECLCALLBACKTYPE(void, FNPDMBLKCACHEXFERCOMPLETEDRV,(PPDMDRVINS pDrvIns, void *pvUser, int rc));
84/** Pointer to a FNPDMBLKCACHEXFERCOMPLETEDRV(). */
85typedef FNPDMBLKCACHEXFERCOMPLETEDRV *PFNPDMBLKCACHEXFERCOMPLETEDRV;
86
87/**
88 * I/O enqueue callback for drivers.
89 *
90 * @param pDrvIns The driver instance.
91 * @param enmXferDir Transfer direction.
92 * @param off Transfer offset.
93 * @param cbXfer Transfer size.
94 * @param pSgBuf Scather / gather buffer for the transfer.
95 * @param hIoXfer I/O transfer handle to ping on completion.
96 */
97typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDRV,(PPDMDRVINS pDrvIns, PDMBLKCACHEXFERDIR enmXferDir, uint64_t off,
98 size_t cbXfer, PCRTSGBUF pSgBuf, PPDMBLKCACHEIOXFER hIoXfer));
99/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDRV(). */
100typedef FNPDMBLKCACHEXFERENQUEUEDRV *PFNPDMBLKCACHEXFERENQUEUEDRV;
101
102/**
103 * Discard enqueue callback for drivers.
104 *
105 * @param pDrvIns The driver instance.
106 * @param paRanges Ranges to discard.
107 * @param cRanges Number of range entries.
108 * @param hIoXfer I/O handle to return on completion.
109 */
110typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDISCARDDRV,(PPDMDRVINS pDrvIns, PCRTRANGE paRanges, unsigned cRanges,
111 PPDMBLKCACHEIOXFER hIoXfer));
112/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDISCARDDRV(). */
113typedef FNPDMBLKCACHEXFERENQUEUEDISCARDDRV *PFNPDMBLKCACHEXFERENQUEUEDISCARDDRV;
114
115/**
116 * Completion callback for devices.
117 *
118 * @param pDevIns The device instance.
119 * @param pvUser User argument given during request initiation.
120 * @param rc The status code of the completed request.
121 */
122typedef DECLCALLBACKTYPE(void, FNPDMBLKCACHEXFERCOMPLETEDEV,(PPDMDEVINS pDevIns, void *pvUser, int rc));
123/** Pointer to a FNPDMBLKCACHEXFERCOMPLETEDEV(). */
124typedef FNPDMBLKCACHEXFERCOMPLETEDEV *PFNPDMBLKCACHEXFERCOMPLETEDEV;
125
126/**
127 * I/O enqueue callback for devices.
128 *
129 * @param pDevIns The device instance.
130 * @param enmXferDir Transfer direction.
131 * @param off Transfer offset.
132 * @param cbXfer Transfer size.
133 * @param pSgBuf Scather / gather buffer for the transfer.
134 * @param hIoXfer I/O transfer handle to ping on completion.
135 */
136typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDEV,(PPDMDEVINS pDevIns, PDMBLKCACHEXFERDIR enmXferDir, uint64_t off,
137 size_t cbXfer, PCRTSGBUF pSgBuf, PPDMBLKCACHEIOXFER hIoXfer));
138/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDEV(). */
139typedef FNPDMBLKCACHEXFERENQUEUEDEV *PFNPDMBLKCACHEXFERENQUEUEDEV;
140
141/**
142 * Discard enqueue callback for devices.
143 *
144 * @param pDevIns The device instance.
145 * @param paRanges Ranges to discard.
146 * @param cRanges Number of range entries.
147 * @param hIoXfer I/O handle to return on completion.
148 */
149typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDISCARDDEV,(PPDMDEVINS pDevIns, PCRTRANGE paRanges, unsigned cRanges,
150 PPDMBLKCACHEIOXFER hIoXfer));
151/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDISCARDDEV(). */
152typedef FNPDMBLKCACHEXFERENQUEUEDISCARDDEV *PFNPDMBLKCACHEXFERENQUEUEDISCARDDEV;
153
154/**
155 * Completion callback for drivers.
156 *
157 * @param pvUserInt User argument given to PDMR3BlkCacheRetainInt.
158 * @param pvUser User argument given during request initiation.
159 * @param rc The status code of the completed request.
160 */
161typedef DECLCALLBACKTYPE(void, FNPDMBLKCACHEXFERCOMPLETEINT,(void *pvUserInt, void *pvUser, int rc));
162/** Pointer to a FNPDMBLKCACHEXFERCOMPLETEINT(). */
163typedef FNPDMBLKCACHEXFERCOMPLETEINT *PFNPDMBLKCACHEXFERCOMPLETEINT;
164
165/**
166 * I/O enqueue callback for internal users.
167 *
168 * @param pvUser User data.
169 * @param enmXferDir Transfer direction.
170 * @param off Transfer offset.
171 * @param cbXfer Transfer size.
172 * @param pSgBuf Scather / gather buffer for the transfer.
173 * @param hIoXfer I/O transfer handle to ping on completion.
174 */
175typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEINT,(void *pvUser, PDMBLKCACHEXFERDIR enmXferDir, uint64_t off,
176 size_t cbXfer, PCRTSGBUF pSgBuf, PPDMBLKCACHEIOXFER hIoXfer));
177/** Pointer to a FNPDMBLKCACHEXFERENQUEUEINT(). */
178typedef FNPDMBLKCACHEXFERENQUEUEINT *PFNPDMBLKCACHEXFERENQUEUEINT;
179
180/**
181 * Discard enqueue callback for VMM internal users.
182 *
183 * @param pvUser User data.
184 * @param paRanges Ranges to discard.
185 * @param cRanges Number of range entries.
186 * @param hIoXfer I/O handle to return on completion.
187 */
188typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDISCARDINT,(void *pvUser, PCRTRANGE paRanges, unsigned cRanges,
189 PPDMBLKCACHEIOXFER hIoXfer));
190/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDISCARDINT(). */
191typedef FNPDMBLKCACHEXFERENQUEUEDISCARDINT *PFNPDMBLKCACHEXFERENQUEUEDISCARDINT;
192
193/**
194 * Completion callback for USB devices.
195 *
196 * @param pUsbIns The USB device instance.
197 * @param pvUser User argument given during request initiation.
198 * @param rc The status code of the completed request.
199 */
200typedef DECLCALLBACKTYPE(void, FNPDMBLKCACHEXFERCOMPLETEUSB,(PPDMUSBINS pUsbIns, void *pvUser, int rc));
201/** Pointer to a FNPDMBLKCACHEXFERCOMPLETEUSB(). */
202typedef FNPDMBLKCACHEXFERCOMPLETEUSB *PFNPDMBLKCACHEXFERCOMPLETEUSB;
203
204/**
205 * I/O enqueue callback for USB devices.
206 *
207 * @param pUsbIns The USB device instance.
208 * @param enmXferDir Transfer direction.
209 * @param off Transfer offset.
210 * @param cbXfer Transfer size.
211 * @param pSgBuf Scather / gather buffer for the transfer.
212 * @param hIoXfer I/O transfer handle to ping on completion.
213 */
214typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEUSB,(PPDMUSBINS pUsbIns, PDMBLKCACHEXFERDIR enmXferDir, uint64_t off,
215 size_t cbXfer, PCRTSGBUF pSgBuf, PPDMBLKCACHEIOXFER hIoXfer));
216/** Pointer to a FNPDMBLKCACHEXFERENQUEUEUSB(). */
217typedef FNPDMBLKCACHEXFERENQUEUEUSB *PFNPDMBLKCACHEXFERENQUEUEUSB;
218
219/**
220 * Discard enqueue callback for USB devices.
221 *
222 * @param pUsbIns The USB device instance.
223 * @param paRanges Ranges to discard.
224 * @param cRanges Number of range entries.
225 * @param hIoXfer I/O handle to return on completion.
226 */
227typedef DECLCALLBACKTYPE(int, FNPDMBLKCACHEXFERENQUEUEDISCARDUSB,(PPDMUSBINS pUsbIns, PCRTRANGE paRanges, unsigned cRanges,
228 PPDMBLKCACHEIOXFER hIoXfer));
229/** Pointer to a FNPDMBLKCACHEXFERENQUEUEDISCARDUSB(). */
230typedef FNPDMBLKCACHEXFERENQUEUEDISCARDUSB *PFNPDMBLKCACHEXFERENQUEUEDISCARDUSB;
231
232/**
233 * Create a block cache user for a driver instance.
234 *
235 * @returns VBox status code.
236 * @param pVM The cross context VM structure.
237 * @param pDrvIns The driver instance.
238 * @param ppBlkCache Where to store the handle to the block cache.
239 * @param pfnXferComplete The I/O transfer complete callback.
240 * @param pfnXferEnqueue The I/O request enqueue callback.
241 * @param pfnXferEnqueueDiscard The discard request enqueue callback.
242 * @param pcszId Unique ID used to identify the user.
243 */
244VMMR3DECL(int) PDMR3BlkCacheRetainDriver(PVM pVM, PPDMDRVINS pDrvIns, PPPDMBLKCACHE ppBlkCache,
245 PFNPDMBLKCACHEXFERCOMPLETEDRV pfnXferComplete,
246 PFNPDMBLKCACHEXFERENQUEUEDRV pfnXferEnqueue,
247 PFNPDMBLKCACHEXFERENQUEUEDISCARDDRV pfnXferEnqueueDiscard,
248 const char *pcszId);
249
250/**
251 * Create a block cache user for a device instance.
252 *
253 * @returns VBox status code.
254 * @param pVM The cross context VM structure.
255 * @param pDevIns The device instance.
256 * @param ppBlkCache Where to store the handle to the block cache.
257 * @param pfnXferComplete The I/O transfer complete callback.
258 * @param pfnXferEnqueue The I/O request enqueue callback.
259 * @param pfnXferEnqueueDiscard The discard request enqueue callback.
260 * @param pcszId Unique ID used to identify the user.
261 */
262VMMR3DECL(int) PDMR3BlkCacheRetainDevice(PVM pVM, PPDMDEVINS pDevIns, PPPDMBLKCACHE ppBlkCache,
263 PFNPDMBLKCACHEXFERCOMPLETEDEV pfnXferComplete,
264 PFNPDMBLKCACHEXFERENQUEUEDEV pfnXferEnqueue,
265 PFNPDMBLKCACHEXFERENQUEUEDISCARDDEV pfnXferEnqueueDiscard,
266 const char *pcszId);
267
268/**
269 * Create a block cache user for a USB instance.
270 *
271 * @returns VBox status code.
272 * @param pVM The cross context VM structure.
273 * @param pUsbIns The USB device instance.
274 * @param ppBlkCache Where to store the handle to the block cache.
275 * @param pfnXferComplete The I/O transfer complete callback.
276 * @param pfnXferEnqueue The I/O request enqueue callback.
277 * @param pfnXferEnqueueDiscard The discard request enqueue callback.
278 * @param pcszId Unique ID used to identify the user.
279 */
280VMMR3DECL(int) PDMR3BlkCacheRetainUsb(PVM pVM, PPDMUSBINS pUsbIns, PPPDMBLKCACHE ppBlkCache,
281 PFNPDMBLKCACHEXFERCOMPLETEUSB pfnXferComplete,
282 PFNPDMBLKCACHEXFERENQUEUEUSB pfnXferEnqueue,
283 PFNPDMBLKCACHEXFERENQUEUEDISCARDUSB pfnXferEnqueueDiscard,
284 const char *pcszId);
285
286/**
287 * Create a block cache user for internal use by VMM.
288 *
289 * @returns VBox status code.
290 * @param pVM The cross context VM structure.
291 * @param pvUser Opaque user data.
292 * @param ppBlkCache Where to store the handle to the block cache.
293 * @param pfnXferComplete The I/O transfer complete callback.
294 * @param pfnXferEnqueue The I/O request enqueue callback.
295 * @param pfnXferEnqueueDiscard The discard request enqueue callback.
296 * @param pcszId Unique ID used to identify the user.
297 */
298VMMR3DECL(int) PDMR3BlkCacheRetainInt(PVM pVM, void *pvUser, PPPDMBLKCACHE ppBlkCache,
299 PFNPDMBLKCACHEXFERCOMPLETEINT pfnXferComplete,
300 PFNPDMBLKCACHEXFERENQUEUEINT pfnXferEnqueue,
301 PFNPDMBLKCACHEXFERENQUEUEDISCARDINT pfnXferEnqueueDiscard,
302 const char *pcszId);
303
304/**
305 * Releases a block cache handle.
306 *
307 * @param pBlkCache Block cache handle.
308 */
309VMMR3DECL(void) PDMR3BlkCacheRelease(PPDMBLKCACHE pBlkCache);
310
311/**
312 * Releases all block cache handles for a device instance.
313 *
314 * @param pVM The cross context VM structure.
315 * @param pDevIns The device instance.
316 */
317VMMR3DECL(void) PDMR3BlkCacheReleaseDevice(PVM pVM, PPDMDEVINS pDevIns);
318
319/**
320 * Releases all block cache handles for a driver instance.
321 *
322 * @param pVM The cross context VM structure.
323 * @param pDrvIns The driver instance.
324 */
325VMMR3DECL(void) PDMR3BlkCacheReleaseDriver(PVM pVM, PPDMDRVINS pDrvIns);
326
327/**
328 * Releases all block cache handles for a USB device instance.
329 *
330 * @param pVM The cross context VM structure.
331 * @param pUsbIns The USB device instance.
332 */
333VMMR3DECL(void) PDMR3BlkCacheReleaseUsb(PVM pVM, PPDMUSBINS pUsbIns);
334
335/**
336 * Creates a read task on the given endpoint.
337 *
338 * @returns VBox status code.
339 * @param pBlkCache The cache instance.
340 * @param off Where to start reading from.
341 * @param pSgBuf Scatter gather buffer store the data in.
342 * @param cbRead The overall number of bytes to read.
343 * @param pvUser Opaque user data returned in the completion callback
344 * upon completion of the read.
345 */
346VMMR3DECL(int) PDMR3BlkCacheRead(PPDMBLKCACHE pBlkCache, uint64_t off, PCRTSGBUF pSgBuf, size_t cbRead, void *pvUser);
347
348/**
349 * Creates a write task on the given endpoint.
350 *
351 * @returns VBox status code.
352 * @param pBlkCache The cache instance.
353 * @param off Where to start writing at.
354 * @param pSgBuf Scatter gather buffer gather the data from.
355 * @param cbWrite The overall number of bytes to write.
356 * @param pvUser Opaque user data returned in the completion callback
357 * upon completion of the task.
358 */
359VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, PCRTSGBUF pSgBuf, size_t cbWrite, void *pvUser);
360
361/**
362 * Creates a flush task on the given endpoint.
363 *
364 * @returns VBox status code.
365 * @param pBlkCache The cache instance.
366 * @param pvUser Opaque user data returned in the completion callback
367 * upon completion of the task.
368 */
369VMMR3DECL(int) PDMR3BlkCacheFlush(PPDMBLKCACHE pBlkCache, void *pvUser);
370
371/**
372 * Discards the given ranges from the cache.
373 *
374 * @returns VBox status code.
375 * @param pBlkCache The cache instance.
376 * @param paRanges Array of ranges to discard.
377 * @param cRanges Number of ranges in the array.
378 * @param pvUser Opaque user data returned in the completion callback
379 * upon completion of the task.
380 */
381VMMR3DECL(int) PDMR3BlkCacheDiscard(PPDMBLKCACHE pBlkCache, PCRTRANGE paRanges, unsigned cRanges, void *pvUser);
382
383/**
384 * Notify the cache of a complete I/O transfer.
385 *
386 * @param pBlkCache The cache instance.
387 * @param hIoXfer The I/O transfer handle which completed.
388 * @param rcIoXfer The status code of the completed request.
389 */
390VMMR3DECL(void) PDMR3BlkCacheIoXferComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEIOXFER hIoXfer, int rcIoXfer);
391
392/**
393 * Suspends the block cache.
394 *
395 * The cache waits until all I/O transfers completed and stops to enqueue new
396 * requests after the call returned but will not accept reads, write or flushes
397 * either.
398 *
399 * @returns VBox status code.
400 * @param pBlkCache The cache instance.
401 */
402VMMR3DECL(int) PDMR3BlkCacheSuspend(PPDMBLKCACHE pBlkCache);
403
404/**
405 * Resumes operation of the block cache.
406 *
407 * @returns VBox status code.
408 * @param pBlkCache The cache instance.
409 */
410VMMR3DECL(int) PDMR3BlkCacheResume(PPDMBLKCACHE pBlkCache);
411
412/**
413 * Clears the block cache and removes all entries.
414 *
415 * The cache waits until all I/O transfers completed.
416 *
417 * @returns VBox status code.
418 * @param pBlkCache The cache instance.
419 */
420VMMR3DECL(int) PDMR3BlkCacheClear(PPDMBLKCACHE pBlkCache);
421
422/** @} */
423
424RT_C_DECLS_END
425
426#endif /* !VBOX_INCLUDED_vmm_pdmblkcache_h */
427
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette