30 static void __memcache_clrangesimple_dtor(
ADDR start,
ADDR end,
void *data,
42 retval->
cache = g_hash_table_new_full(g_direct_hash,g_direct_equal,
54 g_hash_table_iter_init(&iter,memcache->
cache);
55 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
71 g_hash_table_iter_remove(&iter);
74 g_hash_table_destroy(memcache->
cache);
84 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
88 g_hash_table_iter_init(&iter,mte->
v2p_cache);
89 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
91 g_hash_table_iter_remove(&iter);
99 static void __memcache_clrangesimple_dtor(
ADDR start,
ADDR end,
void *data,
104 memcache = (
struct memcache *)dtor_data;
121 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
142 g_hash_table_iter_init(&iter,memcache->
cache);
143 while (g_hash_table_iter_next(&iter,&kp,NULL)) {
174 unsigned int new_ticks) {
175 GHashTableIter iter2;
190 g_hash_table_iter_init(&iter2,mte->
v2p_cache);
191 while (g_hash_table_iter_next(&iter2,&kp2,&vp2)) {
203 d.new_ticks = new_ticks;
204 d.max_unused_ticks = 0;
205 d.max_unused_ticks_addr =
ADDRMAX;
211 d.new_ticks = new_ticks;
212 d.max_unused_ticks = 0;
213 d.max_unused_ticks_addr =
ADDRMAX;
225 g_hash_table_iter_init(&iter,memcache->
cache);
226 while (g_hash_table_iter_next(&iter,NULL,&vp)) {
228 _memcache_inc_ticks_tag_entry(memcache,mte,new_ticks);
233 ADDR *pa,
void **tag_priv) {
238 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
243 g_hash_table_lookup(mte->
v2p_cache,(gpointer)va);
260 *tag_priv = mte->
priv;
268 void **mem,
unsigned long int *mem_len,
void **tag_priv) {
277 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
286 if (rc == -1 || rc == 1)
292 if ((mme->
mem_len - (pa - __pa_start)) < pa_len) {
295 " but not long enough (needed %lu; %lu short)!\n",
296 (flags & MEMCACHE_VIRT) ?
"v" :
"p",
297 __pa_start,mme->
mem_len,pa,pa_len,
298 pa_len - (mme->
mem_len - (pa - __pa_start)));
304 (flags & MEMCACHE_VIRT) ?
"v" :
"p",
309 if (flags & MEMCACHE_VIRT) {
323 *pa_start = __pa_start;
325 *pa_offset = pa - __pa_start;
331 *tag_priv = mte->
priv;
340 mte->
priv = tag_priv;
346 mte->
v2p_cache = g_hash_table_new_full(g_direct_hash,g_direct_equal,
358 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
360 mte = __memcache_mte_create(tag_priv);
361 g_hash_table_insert(memcache->
cache,(gpointer)tag,mte);
364 mte->
priv = tag_priv;
374 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
376 mte = __memcache_mte_create(NULL);
377 g_hash_table_insert(memcache->
cache,(gpointer)tag,mte);
381 g_hash_table_lookup(mte->
v2p_cache,(gpointer)va);
384 g_hash_table_insert(mte->
v2p_cache,(gpointer)va,mve);
404 void *mem,
unsigned long int mem_len) {
409 unsigned long int overage = 0;
410 unsigned long int evicted = 0;
413 g_hash_table_lookup(memcache->
cache,(gpointer)tag);
415 mte = __memcache_mte_create(NULL);
416 g_hash_table_insert(memcache->
cache,(gpointer)tag,mte);
433 "need to evict %lu bytes to make room for new %lu byte chunk!\n",
437 MEMCACHE_VIRT,overage);
438 if (evicted < overage)
442 if (evicted < overage) {
444 "could not evict %lu bytes to make room for new %lu byte"
445 " chunk; only evited %lu bytes; cannot cache mmap!\n",
446 overage,mem_len,evicted);
454 vwarn(
"internal error; cannot cache mmap of %s 0x%"PRIxADDR" at 0x%p!\n",
455 (flags & MEMCACHE_VIRT) ?
"v" :
"p",pa,mem);
461 "cannot cache mmap of %s 0x%"PRIxADDR" at 0x%p; already used!\n",
462 (flags & MEMCACHE_VIRT) ?
"v" :
"p",pa,mem);
471 (flags & MEMCACHE_VIRT) ?
"v" :
"p",pa,mem_len,tag,mem);
497 unsigned long int evicted = 0;
504 while (evicted < mem_len) {
507 "cache is empty; evicted %lu of requested %lu bytes\n",
517 g_hash_table_iter_init(&iter,memcache->
cache);
518 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
526 _memcache_inc_ticks_tag_entry(memcache,mte,0);
541 _memcache_inc_ticks_tag_entry(memcache,mte,0);
564 verror(
"failed to remove range in eviction; aborting!");
569 " in eviction; BUG!; aborting!\n",oldest);
595 mme->
mem,mme->
mem_len,is_phys ?
"p" :
"v",oldest,end);
601 vwarn(
"could not find anything to evict; evicted %lu of %lu bytes\n",
608 "evicted %lu of requested %lu bytes\n",evicted,mem_len);
int memcache_get_mmap(struct memcache *memcache, ADDR tag, ADDR pa, unsigned long int pa_len, memcache_flags_t flags, ADDR *pa_start, OFFSET *pa_offset, void **mem, unsigned long int *mem_len, void **tag_priv)
#define vwarnopt(level, area, flags, format,...)
void clrangesimple_free(clrangesimple_t clr, clrangesimple_free_dtor dtor, void *dtor_data)
unsigned int oldest_mmap_v_ticks
int __memcache_clrangesimple_print(ADDR start, ADDR end, void *data, void *hpriv)
int memcache_set_mmap(struct memcache *memcache, ADDR tag, ADDR pa, memcache_flags_t flags, void *mem, unsigned long int mem_len)
clrangesimple_t clrangesimple_create(void)
int memcache_invalidate_all_mmap(struct memcache *memcache, ADDR tag)
unsigned long int max_mmap_size
ADDR max_unused_ticks_addr
#define verror(format,...)
int memcache_invalidate_all_v2p(struct memcache *memcache, ADDR tag)
int __memcache_clrangesimple_foreach_inc_ticks(Word_t start, Word_t end, void *data, void *hpriv)
#define vwarn(format,...)
clrangesimple_t mmap_cache_v
int memcache_get_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR *pa, void **tag_priv)
clrangesimple_t mmap_cache_p
memcache_tag_priv_dtor tag_priv_dtor
int memcache_set_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR pa)
int clrangesimple_remove(clrangesimple_t *clr, Word_t index, Word_t *end, void **data)
unsigned long int memcache_lru_evict_mmap(struct memcache *memcache, ADDR tag, memcache_flags_t flags, unsigned long int mem_len)
void memcache_destroy(struct memcache *memcache)
unsigned int oldest_mmap_p_ticks
#define vdebug(devel, areas, flags, format,...)
int memcache_invalidate_all(struct memcache *memcache)
void * calloc(size_t nmemb, size_t size)
int memcache_set_tag_priv(struct memcache *memcache, ADDR tag, void *tag_priv)
unsigned long int current_mmap_size
unsigned long int mem_len
struct memcache * memcache_create(unsigned long int max_v2p, unsigned long int max_mmap_size, memcache_tag_priv_dtor pdtor)
int clrangesimple_add(clrangesimple_t *clr, Word_t start, Word_t end, void *data)
void memcache_inc_ticks(struct memcache *memcache, unsigned int new_ticks)
int clrangesimple_foreach(clrangesimple_t clr, clrangesimple_foreach_handler handler, void *hpriv)
int clrangesimple_find(clrangesimple_t *clr, Word_t index, Word_t *start, Word_t *end, void **data)
unsigned int unused_ticks
unsigned int unused_ticks
unsigned long int max_v2p
unsigned int max_unused_ticks
void(* memcache_tag_priv_dtor)(ADDR tag, void *tag_priv)