xref: /qemu/migration/page_cache.h (revision 8b9407a09f925ff9e4dcf6783add8df68f5c7eb6)
19fb26641SOrit Wasserman /*
29fb26641SOrit Wasserman  * Page cache for QEMU
39fb26641SOrit Wasserman  * The cache is base on a hash of the page address
49fb26641SOrit Wasserman  *
59fb26641SOrit Wasserman  * Copyright 2012 Red Hat, Inc. and/or its affiliates
69fb26641SOrit Wasserman  *
79fb26641SOrit Wasserman  * Authors:
89fb26641SOrit Wasserman  *  Orit Wasserman  <owasserm@redhat.com>
99fb26641SOrit Wasserman  *
109fb26641SOrit Wasserman  * This work is licensed under the terms of the GNU GPL, version 2 or later.
119fb26641SOrit Wasserman  * See the COPYING file in the top-level directory.
129fb26641SOrit Wasserman  *
139fb26641SOrit Wasserman  */
149fb26641SOrit Wasserman 
159fb26641SOrit Wasserman #ifndef PAGE_CACHE_H
169fb26641SOrit Wasserman #define PAGE_CACHE_H
179fb26641SOrit Wasserman 
189fb26641SOrit Wasserman /* Page cache for storing guest pages */
199fb26641SOrit Wasserman typedef struct PageCache PageCache;
209fb26641SOrit Wasserman 
219fb26641SOrit Wasserman /**
229fb26641SOrit Wasserman  * cache_init: Initialize the page cache
239fb26641SOrit Wasserman  *
249fb26641SOrit Wasserman  *
259fb26641SOrit Wasserman  * Returns new allocated cache or NULL on error
269fb26641SOrit Wasserman  *
2780f8dfdeSJuan Quintela  * @cache_size: cache size in bytes
289fb26641SOrit Wasserman  * @page_size: cache page size
2980f8dfdeSJuan Quintela  * @errp: set *errp if the check failed, with reason
309fb26641SOrit Wasserman  */
31*8b9407a0SMarkus Armbruster PageCache *cache_init(uint64_t cache_size, size_t page_size, Error **errp);
329fb26641SOrit Wasserman /**
339fb26641SOrit Wasserman  * cache_fini: free all cache resources
349fb26641SOrit Wasserman  * @cache pointer to the PageCache struct
359fb26641SOrit Wasserman  */
369fb26641SOrit Wasserman void cache_fini(PageCache *cache);
379fb26641SOrit Wasserman 
389fb26641SOrit Wasserman /**
399fb26641SOrit Wasserman  * cache_is_cached: Checks to see if the page is cached
409fb26641SOrit Wasserman  *
419fb26641SOrit Wasserman  * Returns %true if page is cached
429fb26641SOrit Wasserman  *
439fb26641SOrit Wasserman  * @cache pointer to the PageCache struct
449fb26641SOrit Wasserman  * @addr: page addr
4527af7d6eSChenLiang  * @current_age: current bitmap generation
469fb26641SOrit Wasserman  */
4727af7d6eSChenLiang bool cache_is_cached(const PageCache *cache, uint64_t addr,
4827af7d6eSChenLiang                      uint64_t current_age);
499fb26641SOrit Wasserman 
509fb26641SOrit Wasserman /**
519fb26641SOrit Wasserman  * get_cached_data: Get the data cached for an addr
529fb26641SOrit Wasserman  *
539fb26641SOrit Wasserman  * Returns pointer to the data cached or NULL if not cached
549fb26641SOrit Wasserman  *
559fb26641SOrit Wasserman  * @cache pointer to the PageCache struct
569fb26641SOrit Wasserman  * @addr: page addr
579fb26641SOrit Wasserman  */
589fb26641SOrit Wasserman uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);
599fb26641SOrit Wasserman 
609fb26641SOrit Wasserman /**
61ee0b44aaSPeter Lieven  * cache_insert: insert the page into the cache. the page cache
62ee0b44aaSPeter Lieven  * will dup the data on insert. the previous value will be overwritten
639fb26641SOrit Wasserman  *
6427af7d6eSChenLiang  * Returns -1 when the page isn't inserted into cache
6589db9987SOrit Wasserman  *
669fb26641SOrit Wasserman  * @cache pointer to the PageCache struct
679fb26641SOrit Wasserman  * @addr: page address
689fb26641SOrit Wasserman  * @pdata: pointer to the page
6927af7d6eSChenLiang  * @current_age: current bitmap generation
709fb26641SOrit Wasserman  */
7127af7d6eSChenLiang int cache_insert(PageCache *cache, uint64_t addr, const uint8_t *pdata,
7227af7d6eSChenLiang                  uint64_t current_age);
739fb26641SOrit Wasserman 
749fb26641SOrit Wasserman #endif
75