Lines Matching +full:cache +full:-

2  * Page cache for QEMU
3 * The cache is base on a hash of the page address
11 * See the COPYING file in the top-level directory.
19 #include "qemu/host-utils.h"
23 /* the page in cache will not be replaced in two cycles */
45 PageCache *cache; in cache_init() local
48 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", in cache_init()
55 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cache size", in cache_init()
61 cache = g_try_malloc(sizeof(*cache)); in cache_init()
62 if (!cache) { in cache_init()
63 error_setg(errp, "Failed to allocate cache"); in cache_init()
66 cache->page_size = page_size; in cache_init()
67 cache->num_items = 0; in cache_init()
68 cache->max_num_items = num_pages; in cache_init()
70 trace_migration_pagecache_init(cache->max_num_items); in cache_init()
73 cache->page_cache = g_try_malloc((cache->max_num_items) * in cache_init()
74 sizeof(*cache->page_cache)); in cache_init()
75 if (!cache->page_cache) { in cache_init()
76 error_setg(errp, "Failed to allocate page cache"); in cache_init()
77 g_free(cache); in cache_init()
81 for (i = 0; i < cache->max_num_items; i++) { in cache_init()
82 cache->page_cache[i].it_data = NULL; in cache_init()
83 cache->page_cache[i].it_age = 0; in cache_init()
84 cache->page_cache[i].it_addr = -1; in cache_init()
87 return cache; in cache_init()
90 void cache_fini(PageCache *cache) in cache_fini() argument
94 g_assert(cache); in cache_fini()
95 g_assert(cache->page_cache); in cache_fini()
97 for (i = 0; i < cache->max_num_items; i++) { in cache_fini()
98 g_free(cache->page_cache[i].it_data); in cache_fini()
101 g_free(cache->page_cache); in cache_fini()
102 cache->page_cache = NULL; in cache_fini()
103 g_free(cache); in cache_fini()
106 static size_t cache_get_cache_pos(const PageCache *cache, in cache_get_cache_pos() argument
109 g_assert(cache->max_num_items); in cache_get_cache_pos()
110 return (address / cache->page_size) & (cache->max_num_items - 1); in cache_get_cache_pos()
113 static CacheItem *cache_get_by_addr(const PageCache *cache, uint64_t addr) in cache_get_by_addr() argument
117 g_assert(cache); in cache_get_by_addr()
118 g_assert(cache->page_cache); in cache_get_by_addr()
120 pos = cache_get_cache_pos(cache, addr); in cache_get_by_addr()
122 return &cache->page_cache[pos]; in cache_get_by_addr()
125 uint8_t *get_cached_data(const PageCache *cache, uint64_t addr) in get_cached_data() argument
127 return cache_get_by_addr(cache, addr)->it_data; in get_cached_data()
130 bool cache_is_cached(const PageCache *cache, uint64_t addr, in cache_is_cached() argument
135 it = cache_get_by_addr(cache, addr); in cache_is_cached()
137 if (it->it_addr == addr) { in cache_is_cached()
138 /* update the it_age when the cache hit */ in cache_is_cached()
139 it->it_age = current_age; in cache_is_cached()
145 int cache_insert(PageCache *cache, uint64_t addr, const uint8_t *pdata, in cache_insert() argument
152 it = cache_get_by_addr(cache, addr); in cache_insert()
154 if (it->it_data && it->it_addr != addr && in cache_insert()
155 it->it_age + CACHED_PAGE_LIFETIME > current_age) { in cache_insert()
156 /* the cache page is fresh, don't replace it */ in cache_insert()
157 return -1; in cache_insert()
160 if (!it->it_data) { in cache_insert()
161 it->it_data = g_try_malloc(cache->page_size); in cache_insert()
162 if (!it->it_data) { in cache_insert()
164 return -1; in cache_insert()
166 cache->num_items++; in cache_insert()
169 memcpy(it->it_data, pdata, cache->page_size); in cache_insert()
171 it->it_age = current_age; in cache_insert()
172 it->it_addr = addr; in cache_insert()