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