xref: /qemu/migration/page_cache.h (revision 27af7d6ea5015e5ef1f7985eab94a8a218267a2b)
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