mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-20 04:33:55 +00:00
DM: release mem range allocated in init_pci
Two memory ranges are allocated: - PCI ECFG - PCI hole They should be released when deinit_pci. Old code mark this two ranges not unregistered. Which is wrong for warm reboot case. Make them could be unregistered. Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> Acked-by: Anthony Xu <anthony.xu@intel.com>
This commit is contained in:
parent
097aee76bf
commit
96085d960f
@ -234,6 +234,34 @@ register_mem_fallback(struct mem_range *memp)
|
|||||||
return register_mem_int(&mmio_rb_fallback, memp);
|
return register_mem_int(&mmio_rb_fallback, memp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
unregister_mem_fallback(struct mem_range *memp)
|
||||||
|
{
|
||||||
|
struct mem_range *mr;
|
||||||
|
struct mmio_rb_range *entry = NULL;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
pthread_rwlock_wrlock(&mmio_rwlock);
|
||||||
|
err = mmio_rb_lookup(&mmio_rb_fallback, memp->base, &entry);
|
||||||
|
if (err == 0) {
|
||||||
|
mr = &entry->mr_param;
|
||||||
|
assert(mr->name == memp->name);
|
||||||
|
assert(mr->base == memp->base && mr->size == memp->size);
|
||||||
|
assert((mr->flags & MEM_F_IMMUTABLE) == 0);
|
||||||
|
RB_REMOVE(mmio_rb_tree, &mmio_rb_fallback, entry);
|
||||||
|
|
||||||
|
/* flush Per-VM cache */
|
||||||
|
if (mmio_hint == entry)
|
||||||
|
mmio_hint = NULL;
|
||||||
|
}
|
||||||
|
pthread_rwlock_unlock(&mmio_rwlock);
|
||||||
|
|
||||||
|
if (entry)
|
||||||
|
free(entry);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
unregister_mem(struct mem_range *memp)
|
unregister_mem(struct mem_range *memp)
|
||||||
{
|
{
|
||||||
|
@ -1204,7 +1204,7 @@ init_pci(struct vmctx *ctx)
|
|||||||
lowmem = vm_get_lowmem_size(ctx);
|
lowmem = vm_get_lowmem_size(ctx);
|
||||||
bzero(&mr, sizeof(struct mem_range));
|
bzero(&mr, sizeof(struct mem_range));
|
||||||
mr.name = "PCI hole";
|
mr.name = "PCI hole";
|
||||||
mr.flags = MEM_F_RW | MEM_F_IMMUTABLE;
|
mr.flags = MEM_F_RW;
|
||||||
mr.base = lowmem;
|
mr.base = lowmem;
|
||||||
mr.size = (4ULL * 1024 * 1024 * 1024) - lowmem;
|
mr.size = (4ULL * 1024 * 1024 * 1024) - lowmem;
|
||||||
mr.handler = pci_emul_fallback_handler;
|
mr.handler = pci_emul_fallback_handler;
|
||||||
@ -1214,7 +1214,7 @@ init_pci(struct vmctx *ctx)
|
|||||||
/* PCI extended config space */
|
/* PCI extended config space */
|
||||||
bzero(&mr, sizeof(struct mem_range));
|
bzero(&mr, sizeof(struct mem_range));
|
||||||
mr.name = "PCI ECFG";
|
mr.name = "PCI ECFG";
|
||||||
mr.flags = MEM_F_RW | MEM_F_IMMUTABLE;
|
mr.flags = MEM_F_RW;
|
||||||
mr.base = PCI_EMUL_ECFG_BASE;
|
mr.base = PCI_EMUL_ECFG_BASE;
|
||||||
mr.size = PCI_EMUL_ECFG_SIZE;
|
mr.size = PCI_EMUL_ECFG_SIZE;
|
||||||
mr.handler = pci_emul_ecfg_handler;
|
mr.handler = pci_emul_ecfg_handler;
|
||||||
@ -1232,6 +1232,23 @@ deinit_pci(struct vmctx *ctx)
|
|||||||
struct slotinfo *si;
|
struct slotinfo *si;
|
||||||
struct funcinfo *fi;
|
struct funcinfo *fi;
|
||||||
int bus, slot, func;
|
int bus, slot, func;
|
||||||
|
size_t lowmem;
|
||||||
|
struct mem_range mr;
|
||||||
|
|
||||||
|
/* Release PCI extended config space */
|
||||||
|
bzero(&mr, sizeof(struct mem_range));
|
||||||
|
mr.name = "PCI ECFG";
|
||||||
|
mr.base = PCI_EMUL_ECFG_BASE;
|
||||||
|
mr.size = PCI_EMUL_ECFG_SIZE;
|
||||||
|
unregister_mem(&mr);
|
||||||
|
|
||||||
|
/* Release PCI hole space */
|
||||||
|
lowmem = vm_get_lowmem_size(ctx);
|
||||||
|
bzero(&mr, sizeof(struct mem_range));
|
||||||
|
mr.name = "PCI hole";
|
||||||
|
mr.base = lowmem;
|
||||||
|
mr.size = (4ULL * 1024 * 1024 * 1024) - lowmem;
|
||||||
|
unregister_mem_fallback(&mr);
|
||||||
|
|
||||||
for (bus = 0; bus < MAXBUSES; bus++) {
|
for (bus = 0; bus < MAXBUSES; bus++) {
|
||||||
bi = pci_businfo[bus];
|
bi = pci_businfo[bus];
|
||||||
|
@ -53,5 +53,6 @@ int emulate_mem(struct vmctx *ctx, struct mmio_request *mmio_req);
|
|||||||
int register_mem(struct mem_range *memp);
|
int register_mem(struct mem_range *memp);
|
||||||
int register_mem_fallback(struct mem_range *memp);
|
int register_mem_fallback(struct mem_range *memp);
|
||||||
int unregister_mem(struct mem_range *memp);
|
int unregister_mem(struct mem_range *memp);
|
||||||
|
int unregister_mem_fallback(struct mem_range *memp);
|
||||||
|
|
||||||
#endif /* _MEM_H_ */
|
#endif /* _MEM_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user