Deposit enough pages up front to avoid virtual processor creation failures due to low memory. This also speeds up guest creation. A VP uses 25% more pages in a partition with nested virtualization enabled, but the exact number doesn't vary much, so deposit a fixed number of pages per VP that works for nested virtualization.
Move page depositing from the hypercall wrapper to the virtual processor creation code. The required number of pages is based on empirical data. This logic fits better in the virtual processor creation code than in the hypercall wrapper. Also withdraw the deposited memory if virtual processor creation fails. Signed-off-by: Stanislav Kinsburskii <[email protected]> --- drivers/hv/hv_proc.c | 8 -------- drivers/hv/mshv_root_main.c | 11 ++++++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/hv/hv_proc.c b/drivers/hv/hv_proc.c index 0f84a70def30..3d41f52efd9a 100644 --- a/drivers/hv/hv_proc.c +++ b/drivers/hv/hv_proc.c @@ -251,14 +251,6 @@ int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags) unsigned long irq_flags; int ret = 0; - /* Root VPs don't seem to need pages deposited */ - if (partition_id != hv_current_partition_id) { - /* The value 90 is empirically determined. It may change. */ - ret = hv_call_deposit_pages(node, partition_id, 90); - if (ret) - return ret; - } - do { local_irq_save(irq_flags); diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c index fbfc50de332c..48c842b6938d 100644 --- a/drivers/hv/mshv_root_main.c +++ b/drivers/hv/mshv_root_main.c @@ -38,6 +38,7 @@ /* The deposit values below are empirical and may need to be adjusted. */ #define MSHV_PARTITION_DEPOSIT_PAGES (SZ_512K >> PAGE_SHIFT) #define MSHV_PARTITION_DEPOSIT_PAGES_NESTED (20 * SZ_1M >> PAGE_SHIFT) +#define MSHV_VP_DEPOSIT_PAGES (1 * SZ_1M >> PAGE_SHIFT) MODULE_AUTHOR("Microsoft"); MODULE_LICENSE("GPL"); @@ -1077,10 +1078,15 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition, if (partition->pt_vp_array[args.vp_index]) return -EEXIST; + ret = hv_call_deposit_pages(NUMA_NO_NODE, partition->pt_id, + MSHV_VP_DEPOSIT_PAGES); + if (ret) + return ret; + ret = hv_call_create_vp(NUMA_NO_NODE, partition->pt_id, args.vp_index, 0 /* Only valid for root partition VPs */); if (ret) - return ret; + goto withdraw_mem; ret = hv_map_vp_state_page(partition->pt_id, args.vp_index, HV_VP_STATE_PAGE_INTERCEPT_MESSAGE, @@ -1177,6 +1183,9 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition, intercept_msg_page, input_vtl_zero); destroy_vp: hv_call_delete_vp(partition->pt_id, args.vp_index); +withdraw_mem: + hv_call_withdraw_memory(MSHV_VP_DEPOSIT_PAGES, NUMA_NO_NODE, + partition->pt_id); out: trace_mshv_create_vp(partition->pt_id, args.vp_index, ret); return ret;

