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 * 279fb26641SOrit Wasserman * @cache pointer to the PageCache struct 289fb26641SOrit Wasserman * @num_pages: cache maximal number of cached pages 299fb26641SOrit Wasserman * @page_size: cache page size 309fb26641SOrit Wasserman */ 319fb26641SOrit Wasserman PageCache *cache_init(int64_t num_pages, unsigned int page_size); 329fb26641SOrit Wasserman 339fb26641SOrit Wasserman /** 349fb26641SOrit Wasserman * cache_fini: free all cache resources 359fb26641SOrit Wasserman * @cache pointer to the PageCache struct 369fb26641SOrit Wasserman */ 379fb26641SOrit Wasserman void cache_fini(PageCache *cache); 389fb26641SOrit Wasserman 399fb26641SOrit Wasserman /** 409fb26641SOrit Wasserman * cache_is_cached: Checks to see if the page is cached 419fb26641SOrit Wasserman * 429fb26641SOrit Wasserman * Returns %true if page is cached 439fb26641SOrit Wasserman * 449fb26641SOrit Wasserman * @cache pointer to the PageCache struct 459fb26641SOrit Wasserman * @addr: page addr 46*27af7d6eSChenLiang * @current_age: current bitmap generation 479fb26641SOrit Wasserman */ 48*27af7d6eSChenLiang bool cache_is_cached(const PageCache *cache, uint64_t addr, 49*27af7d6eSChenLiang uint64_t current_age); 509fb26641SOrit Wasserman 519fb26641SOrit Wasserman /** 529fb26641SOrit Wasserman * get_cached_data: Get the data cached for an addr 539fb26641SOrit Wasserman * 549fb26641SOrit Wasserman * Returns pointer to the data cached or NULL if not cached 559fb26641SOrit Wasserman * 569fb26641SOrit Wasserman * @cache pointer to the PageCache struct 579fb26641SOrit Wasserman * @addr: page addr 589fb26641SOrit Wasserman */ 599fb26641SOrit Wasserman uint8_t *get_cached_data(const PageCache *cache, uint64_t addr); 609fb26641SOrit Wasserman 619fb26641SOrit Wasserman /** 62ee0b44aaSPeter Lieven * cache_insert: insert the page into the cache. the page cache 63ee0b44aaSPeter Lieven * will dup the data on insert. the previous value will be overwritten 649fb26641SOrit Wasserman * 65*27af7d6eSChenLiang * Returns -1 when the page isn't inserted into cache 6689db9987SOrit Wasserman * 679fb26641SOrit Wasserman * @cache pointer to the PageCache struct 689fb26641SOrit Wasserman * @addr: page address 699fb26641SOrit Wasserman * @pdata: pointer to the page 70*27af7d6eSChenLiang * @current_age: current bitmap generation 719fb26641SOrit Wasserman */ 72*27af7d6eSChenLiang int cache_insert(PageCache *cache, uint64_t addr, const uint8_t *pdata, 73*27af7d6eSChenLiang uint64_t current_age); 749fb26641SOrit Wasserman 759fb26641SOrit Wasserman /** 769fb26641SOrit Wasserman * cache_resize: resize the page cache. In case of size reduction the extra 779fb26641SOrit Wasserman * pages will be freed 789fb26641SOrit Wasserman * 799fb26641SOrit Wasserman * Returns -1 on error new cache size on success 809fb26641SOrit Wasserman * 819fb26641SOrit Wasserman * @cache pointer to the PageCache struct 829fb26641SOrit Wasserman * @num_pages: new page cache size (in pages) 839fb26641SOrit Wasserman */ 849fb26641SOrit Wasserman int64_t cache_resize(PageCache *cache, int64_t num_pages); 859fb26641SOrit Wasserman 869fb26641SOrit Wasserman #endif 87