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