xref: /qemu/migration/page_cache.h (revision 8b9407a0)
1aa3544c3SJuan Quintela /*
2aa3544c3SJuan Quintela  * Page cache for QEMU
3aa3544c3SJuan Quintela  * The cache is base on a hash of the page address
4aa3544c3SJuan Quintela  *
5aa3544c3SJuan Quintela  * Copyright 2012 Red Hat, Inc. and/or its affiliates
6aa3544c3SJuan Quintela  *
7aa3544c3SJuan Quintela  * Authors:
8aa3544c3SJuan Quintela  *  Orit Wasserman  <owasserm@redhat.com>
9aa3544c3SJuan Quintela  *
10aa3544c3SJuan Quintela  * This work is licensed under the terms of the GNU GPL, version 2 or later.
11aa3544c3SJuan Quintela  * See the COPYING file in the top-level directory.
12aa3544c3SJuan Quintela  *
13aa3544c3SJuan Quintela  */
14aa3544c3SJuan Quintela 
15aa3544c3SJuan Quintela #ifndef PAGE_CACHE_H
16aa3544c3SJuan Quintela #define PAGE_CACHE_H
17aa3544c3SJuan Quintela 
18aa3544c3SJuan Quintela /* Page cache for storing guest pages */
19aa3544c3SJuan Quintela typedef struct PageCache PageCache;
20aa3544c3SJuan Quintela 
21aa3544c3SJuan Quintela /**
22aa3544c3SJuan Quintela  * cache_init: Initialize the page cache
23aa3544c3SJuan Quintela  *
24aa3544c3SJuan Quintela  *
25aa3544c3SJuan Quintela  * Returns new allocated cache or NULL on error
26aa3544c3SJuan Quintela  *
2780f8dfdeSJuan Quintela  * @cache_size: cache size in bytes
28aa3544c3SJuan Quintela  * @page_size: cache page size
2980f8dfdeSJuan Quintela  * @errp: set *errp if the check failed, with reason
30aa3544c3SJuan Quintela  */
31*8b9407a0SMarkus Armbruster PageCache *cache_init(uint64_t cache_size, size_t page_size, Error **errp);
32aa3544c3SJuan Quintela /**
33aa3544c3SJuan Quintela  * cache_fini: free all cache resources
34aa3544c3SJuan Quintela  * @cache pointer to the PageCache struct
35aa3544c3SJuan Quintela  */
36aa3544c3SJuan Quintela void cache_fini(PageCache *cache);
37aa3544c3SJuan Quintela 
38aa3544c3SJuan Quintela /**
39aa3544c3SJuan Quintela  * cache_is_cached: Checks to see if the page is cached
40aa3544c3SJuan Quintela  *
41aa3544c3SJuan Quintela  * Returns %true if page is cached
42aa3544c3SJuan Quintela  *
43aa3544c3SJuan Quintela  * @cache pointer to the PageCache struct
44aa3544c3SJuan Quintela  * @addr: page addr
45aa3544c3SJuan Quintela  * @current_age: current bitmap generation
46aa3544c3SJuan Quintela  */
47aa3544c3SJuan Quintela bool cache_is_cached(const PageCache *cache, uint64_t addr,
48aa3544c3SJuan Quintela                      uint64_t current_age);
49aa3544c3SJuan Quintela 
50aa3544c3SJuan Quintela /**
51aa3544c3SJuan Quintela  * get_cached_data: Get the data cached for an addr
52aa3544c3SJuan Quintela  *
53aa3544c3SJuan Quintela  * Returns pointer to the data cached or NULL if not cached
54aa3544c3SJuan Quintela  *
55aa3544c3SJuan Quintela  * @cache pointer to the PageCache struct
56aa3544c3SJuan Quintela  * @addr: page addr
57aa3544c3SJuan Quintela  */
58aa3544c3SJuan Quintela uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);
59aa3544c3SJuan Quintela 
60aa3544c3SJuan Quintela /**
61aa3544c3SJuan Quintela  * cache_insert: insert the page into the cache. the page cache
62aa3544c3SJuan Quintela  * will dup the data on insert. the previous value will be overwritten
63aa3544c3SJuan Quintela  *
64aa3544c3SJuan Quintela  * Returns -1 when the page isn't inserted into cache
65aa3544c3SJuan Quintela  *
66aa3544c3SJuan Quintela  * @cache pointer to the PageCache struct
67aa3544c3SJuan Quintela  * @addr: page address
68aa3544c3SJuan Quintela  * @pdata: pointer to the page
69aa3544c3SJuan Quintela  * @current_age: current bitmap generation
70aa3544c3SJuan Quintela  */
71aa3544c3SJuan Quintela int cache_insert(PageCache *cache, uint64_t addr, const uint8_t *pdata,
72aa3544c3SJuan Quintela                  uint64_t current_age);
73aa3544c3SJuan Quintela 
74aa3544c3SJuan Quintela #endif
75