vhost: Only align sections for vhost-user
I added hugepage alignment code in c1ece84e7c
to deal with
vhost-user + postcopy which needs aligned pages when using userfault.
However, on x86 the lower 2MB of address space tends to be shotgun'd
with small fragments around the 512-640k range - e.g. video RAM, and
with HyperV synic pages tend to sit around there - again splitting
it up. The alignment code complains with a 'Section rounded to ...'
error and gives up.
Since vhost-user already filters out devices without an fd
(see vhost-user.c vhost_user_mem_section_filter) it shouldn't be
affected by those overlaps.
Turn the alignment off on vhost-kernel so that it doesn't try
and align, and thus won't hit the rounding issues.
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <20200116202414.157959-3-dgilbert@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ff4776147e
commit
7652511473
@ -547,26 +547,28 @@ static void vhost_region_add_section(struct vhost_dev *dev,
|
|||||||
uintptr_t mrs_host = (uintptr_t)memory_region_get_ram_ptr(section->mr) +
|
uintptr_t mrs_host = (uintptr_t)memory_region_get_ram_ptr(section->mr) +
|
||||||
section->offset_within_region;
|
section->offset_within_region;
|
||||||
RAMBlock *mrs_rb = section->mr->ram_block;
|
RAMBlock *mrs_rb = section->mr->ram_block;
|
||||||
size_t mrs_page = qemu_ram_pagesize(mrs_rb);
|
|
||||||
|
|
||||||
trace_vhost_region_add_section(section->mr->name, mrs_gpa, mrs_size,
|
trace_vhost_region_add_section(section->mr->name, mrs_gpa, mrs_size,
|
||||||
mrs_host);
|
mrs_host);
|
||||||
|
|
||||||
/* Round the section to it's page size */
|
if (dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER) {
|
||||||
/* First align the start down to a page boundary */
|
/* Round the section to it's page size */
|
||||||
uint64_t alignage = mrs_host & (mrs_page - 1);
|
/* First align the start down to a page boundary */
|
||||||
if (alignage) {
|
size_t mrs_page = qemu_ram_pagesize(mrs_rb);
|
||||||
mrs_host -= alignage;
|
uint64_t alignage = mrs_host & (mrs_page - 1);
|
||||||
mrs_size += alignage;
|
if (alignage) {
|
||||||
mrs_gpa -= alignage;
|
mrs_host -= alignage;
|
||||||
|
mrs_size += alignage;
|
||||||
|
mrs_gpa -= alignage;
|
||||||
|
}
|
||||||
|
/* Now align the size up to a page boundary */
|
||||||
|
alignage = mrs_size & (mrs_page - 1);
|
||||||
|
if (alignage) {
|
||||||
|
mrs_size += mrs_page - alignage;
|
||||||
|
}
|
||||||
|
trace_vhost_region_add_section_aligned(section->mr->name, mrs_gpa, mrs_size,
|
||||||
|
mrs_host);
|
||||||
}
|
}
|
||||||
/* Now align the size up to a page boundary */
|
|
||||||
alignage = mrs_size & (mrs_page - 1);
|
|
||||||
if (alignage) {
|
|
||||||
mrs_size += mrs_page - alignage;
|
|
||||||
}
|
|
||||||
trace_vhost_region_add_section_aligned(section->mr->name, mrs_gpa, mrs_size,
|
|
||||||
mrs_host);
|
|
||||||
|
|
||||||
if (dev->n_tmp_sections) {
|
if (dev->n_tmp_sections) {
|
||||||
/* Since we already have at least one section, lets see if
|
/* Since we already have at least one section, lets see if
|
||||||
|
Loading…
Reference in New Issue
Block a user