ee0b44aa9d
The page cache frees all data on finish, on resize and if there is collision on insert. So it should be the caches responsibility to dup the data that is stored in the cache. Signed-off-by: Peter Lieven <pl@kamp.de> Signed-off-by: Orit Wasserman <owasserm@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Juan Quintela <quintela@redhat.com>
81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
/*
|
|
* Page cache for QEMU
|
|
* The cache is base on a hash of the page address
|
|
*
|
|
* Copyright 2012 Red Hat, Inc. and/or its affiliates
|
|
*
|
|
* Authors:
|
|
* Orit Wasserman <owasserm@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef PAGE_CACHE_H
|
|
#define PAGE_CACHE_H
|
|
|
|
/* Page cache for storing guest pages */
|
|
typedef struct PageCache PageCache;
|
|
|
|
/**
|
|
* cache_init: Initialize the page cache
|
|
*
|
|
*
|
|
* Returns new allocated cache or NULL on error
|
|
*
|
|
* @cache pointer to the PageCache struct
|
|
* @num_pages: cache maximal number of cached pages
|
|
* @page_size: cache page size
|
|
*/
|
|
PageCache *cache_init(int64_t num_pages, unsigned int page_size);
|
|
|
|
/**
|
|
* cache_fini: free all cache resources
|
|
* @cache pointer to the PageCache struct
|
|
*/
|
|
void cache_fini(PageCache *cache);
|
|
|
|
/**
|
|
* cache_is_cached: Checks to see if the page is cached
|
|
*
|
|
* Returns %true if page is cached
|
|
*
|
|
* @cache pointer to the PageCache struct
|
|
* @addr: page addr
|
|
*/
|
|
bool cache_is_cached(const PageCache *cache, uint64_t addr);
|
|
|
|
/**
|
|
* get_cached_data: Get the data cached for an addr
|
|
*
|
|
* Returns pointer to the data cached or NULL if not cached
|
|
*
|
|
* @cache pointer to the PageCache struct
|
|
* @addr: page addr
|
|
*/
|
|
uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);
|
|
|
|
/**
|
|
* cache_insert: insert the page into the cache. the page cache
|
|
* will dup the data on insert. the previous value will be overwritten
|
|
*
|
|
* @cache pointer to the PageCache struct
|
|
* @addr: page address
|
|
* @pdata: pointer to the page
|
|
*/
|
|
void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata);
|
|
|
|
/**
|
|
* cache_resize: resize the page cache. In case of size reduction the extra
|
|
* pages will be freed
|
|
*
|
|
* Returns -1 on error new cache size on success
|
|
*
|
|
* @cache pointer to the PageCache struct
|
|
* @num_pages: new page cache size (in pages)
|
|
*/
|
|
int64_t cache_resize(PageCache *cache, int64_t num_pages);
|
|
|
|
#endif
|