void *map_domain_page(unsigned long mfn)
{
- unsigned long va;
- unsigned int idx, i, flags;
+ unsigned long va, flags;
+ unsigned int idx, i;
struct vcpu *v;
struct mapcache_domain *dcache;
struct mapcache_vcpu *vcache;
struct vcpu_maphash_entry *hashent;
- ASSERT(!in_irq());
-
perfc_incr(map_domain_page_count);
v = mapcache_current_vcpu();
dcache = &v->domain->arch.mapcache;
vcache = &v->arch.mapcache;
+ local_irq_save(flags);
+
hashent = &vcache->hash[MAPHASH_HASHFN(mfn)];
if ( hashent->mfn == mfn )
{
goto out;
}
- spin_lock_irqsave(&dcache->lock, flags);
+ spin_lock(&dcache->lock);
/* Has some other CPU caused a wrap? We must flush if so. */
if ( unlikely(dcache->epoch != vcache->shadow_epoch) )
set_bit(idx, dcache->inuse);
dcache->cursor = idx + 1;
- spin_unlock_irqrestore(&dcache->lock, flags);
+ spin_unlock(&dcache->lock);
l1e_write(&dcache->l1tab[idx], l1e_from_pfn(mfn, __PAGE_HYPERVISOR));
out:
+ local_irq_restore(flags);
va = MAPCACHE_VIRT_START + (idx << PAGE_SHIFT);
return (void *)va;
}
unsigned int idx;
struct vcpu *v;
struct mapcache_domain *dcache;
- unsigned long mfn;
+ unsigned long mfn, flags;
struct vcpu_maphash_entry *hashent;
- ASSERT(!in_irq());
-
ASSERT((void *)MAPCACHE_VIRT_START <= va);
ASSERT(va < (void *)MAPCACHE_VIRT_END);
mfn = l1e_get_pfn(dcache->l1tab[idx]);
hashent = &v->arch.mapcache.hash[MAPHASH_HASHFN(mfn)];
+ local_irq_save(flags);
+
if ( hashent->idx == idx )
{
ASSERT(hashent->mfn == mfn);
/* /Second/, mark as garbage. */
set_bit(idx, dcache->garbage);
}
+
+ local_irq_restore(flags);
}
void mapcache_domain_init(struct domain *d)