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 469fb26641SOrit Wasserman */ 479fb26641SOrit Wasserman bool cache_is_cached(const PageCache *cache, uint64_t addr); 489fb26641SOrit Wasserman 499fb26641SOrit Wasserman /** 509fb26641SOrit Wasserman * get_cached_data: Get the data cached for an addr 519fb26641SOrit Wasserman * 529fb26641SOrit Wasserman * Returns pointer to the data cached or NULL if not cached 539fb26641SOrit Wasserman * 549fb26641SOrit Wasserman * @cache pointer to the PageCache struct 559fb26641SOrit Wasserman * @addr: page addr 569fb26641SOrit Wasserman */ 579fb26641SOrit Wasserman uint8_t *get_cached_data(const PageCache *cache, uint64_t addr); 589fb26641SOrit Wasserman 599fb26641SOrit Wasserman /** 60*ee0b44aaSPeter Lieven * cache_insert: insert the page into the cache. the page cache 61*ee0b44aaSPeter Lieven * will dup the data on insert. the previous value will be overwritten 629fb26641SOrit Wasserman * 639fb26641SOrit Wasserman * @cache pointer to the PageCache struct 649fb26641SOrit Wasserman * @addr: page address 659fb26641SOrit Wasserman * @pdata: pointer to the page 669fb26641SOrit Wasserman */ 679fb26641SOrit Wasserman void cache_insert(PageCache *cache, uint64_t addr, uint8_t *pdata); 689fb26641SOrit Wasserman 699fb26641SOrit Wasserman /** 709fb26641SOrit Wasserman * cache_resize: resize the page cache. In case of size reduction the extra 719fb26641SOrit Wasserman * pages will be freed 729fb26641SOrit Wasserman * 739fb26641SOrit Wasserman * Returns -1 on error new cache size on success 749fb26641SOrit Wasserman * 759fb26641SOrit Wasserman * @cache pointer to the PageCache struct 769fb26641SOrit Wasserman * @num_pages: new page cache size (in pages) 779fb26641SOrit Wasserman */ 789fb26641SOrit Wasserman int64_t cache_resize(PageCache *cache, int64_t num_pages); 799fb26641SOrit Wasserman 809fb26641SOrit Wasserman #endif 81