Lines Matching full:mc
81 static inline void mapcache_lock(MapCache *mc) in mapcache_lock() argument
83 qemu_mutex_lock(&mc->lock); in mapcache_lock()
86 static inline void mapcache_unlock(MapCache *mc) in mapcache_unlock() argument
88 qemu_mutex_unlock(&mc->lock); in mapcache_unlock()
106 MapCache *mc; in xen_map_cache_init_single() local
110 mc = g_new0(MapCache, 1); in xen_map_cache_init_single()
112 mc->phys_offset_to_gaddr = f; in xen_map_cache_init_single()
113 mc->opaque = opaque; in xen_map_cache_init_single()
114 qemu_mutex_init(&mc->lock); in xen_map_cache_init_single()
116 QTAILQ_INIT(&mc->locked_entries); in xen_map_cache_init_single()
118 mc->bucket_shift = bucket_shift; in xen_map_cache_init_single()
119 mc->bucket_size = 1UL << bucket_shift; in xen_map_cache_init_single()
120 mc->max_mcache_size = max_size; in xen_map_cache_init_single()
122 mc->nr_buckets = in xen_map_cache_init_single()
123 (((mc->max_mcache_size >> XC_PAGE_SHIFT) + in xen_map_cache_init_single()
127 size = mc->nr_buckets * sizeof(MapCacheEntry); in xen_map_cache_init_single()
129 trace_xen_map_cache_init(mc->nr_buckets, size); in xen_map_cache_init_single()
130 mc->entry = g_malloc0(size); in xen_map_cache_init_single()
131 return mc; in xen_map_cache_init_single()
186 static void xen_remap_bucket(MapCache *mc, in xen_remap_bucket() argument
246 pfns[i] = (address_index << (mc->bucket_shift - XC_PAGE_SHIFT)) + i; in xen_remap_bucket()
323 static uint8_t *xen_map_cache_unlocked(MapCache *mc, in xen_map_cache_unlocked() argument
339 address_index = phys_addr >> mc->bucket_shift; in xen_map_cache_unlocked()
340 address_offset = phys_addr & (mc->bucket_size - 1); in xen_map_cache_unlocked()
355 if (mc->last_entry != NULL && in xen_map_cache_unlocked()
356 mc->last_entry->paddr_index == address_index && in xen_map_cache_unlocked()
360 mc->last_entry->valid_mapping)) { in xen_map_cache_unlocked()
362 mc->last_entry->vaddr_base + address_offset in xen_map_cache_unlocked()
364 return mc->last_entry->vaddr_base + address_offset; in xen_map_cache_unlocked()
367 /* size is always a multiple of mc->bucket_size */ in xen_map_cache_unlocked()
370 if (cache_size % mc->bucket_size) { in xen_map_cache_unlocked()
371 cache_size += mc->bucket_size - (cache_size % mc->bucket_size); in xen_map_cache_unlocked()
374 cache_size = mc->bucket_size; in xen_map_cache_unlocked()
377 entry = &mc->entry[address_index % mc->nr_buckets]; in xen_map_cache_unlocked()
398 xen_remap_bucket(mc, entry, NULL, cache_size, address_index, dummy, in xen_map_cache_unlocked()
406 xen_remap_bucket(mc, entry, NULL, cache_size, address_index, dummy, in xen_map_cache_unlocked()
414 mc->last_entry = NULL; in xen_map_cache_unlocked()
416 if (!translated && mc->phys_offset_to_gaddr) { in xen_map_cache_unlocked()
417 phys_addr = mc->phys_offset_to_gaddr(phys_addr, size); in xen_map_cache_unlocked()
430 mc->last_entry = entry; in xen_map_cache_unlocked()
440 reventry->vaddr_req = mc->last_entry->vaddr_base + address_offset; in xen_map_cache_unlocked()
441 reventry->paddr_index = mc->last_entry->paddr_index; in xen_map_cache_unlocked()
443 QTAILQ_INSERT_HEAD(&mc->locked_entries, reventry, next); in xen_map_cache_unlocked()
447 mc->last_entry->vaddr_base + address_offset in xen_map_cache_unlocked()
449 return mc->last_entry->vaddr_base + address_offset; in xen_map_cache_unlocked()
459 MapCache *mc = grant ? mapcache_grants : mapcache; in xen_map_cache() local
474 mapcache_lock(mc); in xen_map_cache()
475 p = xen_map_cache_unlocked(mc, phys_addr, size, ram_addr_offset, in xen_map_cache()
477 mapcache_unlock(mc); in xen_map_cache()
481 static ram_addr_t xen_ram_addr_from_mapcache_single(MapCache *mc, void *ptr) in xen_ram_addr_from_mapcache_single() argument
490 mapcache_lock(mc); in xen_ram_addr_from_mapcache_single()
491 QTAILQ_FOREACH(reventry, &mc->locked_entries, next) { in xen_ram_addr_from_mapcache_single()
501 mapcache_unlock(mc); in xen_ram_addr_from_mapcache_single()
505 entry = &mc->entry[paddr_index % mc->nr_buckets]; in xen_ram_addr_from_mapcache_single()
513 raddr = (reventry->paddr_index << mc->bucket_shift) + in xen_ram_addr_from_mapcache_single()
516 mapcache_unlock(mc); in xen_ram_addr_from_mapcache_single()
532 static void xen_invalidate_map_cache_entry_unlocked(MapCache *mc, in xen_invalidate_map_cache_entry_unlocked() argument
542 QTAILQ_FOREACH(reventry, &mc->locked_entries, next) { in xen_invalidate_map_cache_entry_unlocked()
552 QTAILQ_FOREACH(reventry, &mc->locked_entries, next) { in xen_invalidate_map_cache_entry_unlocked()
560 QTAILQ_REMOVE(&mc->locked_entries, reventry, next); in xen_invalidate_map_cache_entry_unlocked()
563 if (mc->last_entry != NULL && in xen_invalidate_map_cache_entry_unlocked()
564 mc->last_entry->paddr_index == paddr_index) { in xen_invalidate_map_cache_entry_unlocked()
565 mc->last_entry = NULL; in xen_invalidate_map_cache_entry_unlocked()
568 entry = &mc->entry[paddr_index % mc->nr_buckets]; in xen_invalidate_map_cache_entry_unlocked()
585 entry->size >> mc->bucket_shift); in xen_invalidate_map_cache_entry_unlocked()
619 static void xen_invalidate_map_cache_entry_single(MapCache *mc, uint8_t *buffer) in xen_invalidate_map_cache_entry_single() argument
621 mapcache_lock(mc); in xen_invalidate_map_cache_entry_single()
622 xen_invalidate_map_cache_entry_unlocked(mc, buffer); in xen_invalidate_map_cache_entry_single()
623 mapcache_unlock(mc); in xen_invalidate_map_cache_entry_single()
655 static void xen_invalidate_map_cache_single(MapCache *mc) in xen_invalidate_map_cache_single() argument
660 mapcache_lock(mc); in xen_invalidate_map_cache_single()
662 QTAILQ_FOREACH(reventry, &mc->locked_entries, next) { in xen_invalidate_map_cache_single()
670 for (i = 0; i < mc->nr_buckets; i++) { in xen_invalidate_map_cache_single()
671 MapCacheEntry *entry = &mc->entry[i]; in xen_invalidate_map_cache_single()
692 mc->last_entry = NULL; in xen_invalidate_map_cache_single()
694 mapcache_unlock(mc); in xen_invalidate_map_cache_single()
706 static uint8_t *xen_replace_cache_entry_unlocked(MapCache *mc, in xen_replace_cache_entry_unlocked() argument
715 address_index = old_phys_addr >> mc->bucket_shift; in xen_replace_cache_entry_unlocked()
716 address_offset = old_phys_addr & (mc->bucket_size - 1); in xen_replace_cache_entry_unlocked()
725 if (cache_size % mc->bucket_size) { in xen_replace_cache_entry_unlocked()
726 cache_size += mc->bucket_size - (cache_size % mc->bucket_size); in xen_replace_cache_entry_unlocked()
729 entry = &mc->entry[address_index % mc->nr_buckets]; in xen_replace_cache_entry_unlocked()
741 address_index = new_phys_addr >> mc->bucket_shift; in xen_replace_cache_entry_unlocked()
742 address_offset = new_phys_addr & (mc->bucket_size - 1); in xen_replace_cache_entry_unlocked()
746 xen_remap_bucket(mc, entry, entry->vaddr_base, in xen_replace_cache_entry_unlocked()