From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org, pbonzini@redhat.com,
maxime.coquelin@redhat.com, mst@redhat.com, groug@kaod.org
Subject: Re: [Qemu-devel] [PATCH v4 2/6] vhost: Simplify ring verification checks
Date: Fri, 15 Dec 2017 12:24:08 +0000 [thread overview]
Message-ID: <20171215122408.GA14126@work-vm> (raw)
In-Reply-To: <20171214150716.3ffc6b52@redhat.com>
* Igor Mammedov (imammedo@redhat.com) wrote:
> On Wed, 13 Dec 2017 18:08:03 +0000
> "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> wrote:
>
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > vhost_verify_ring_mappings() were used to verify that
> > rings are still accessible and related memory hasn't
> > been moved after flatview is updated.
> >
> > It was doing checks by mapping ring's GPA+len and
> > checking that HVA hadn't changed with new memory map.
> > To avoid maybe expensive mapping call, we were
> > identifying address range that changed and were doing
> > mapping only if ring was in changed range.
> >
> > However it's not neccessary to perform ring's GPA
> > mapping as we already have its current HVA and all
> > we need is to verify that ring's GPA translates to
> > the same HVA in updated flatview.
> >
> > This will allow the following patches to simplify the range
> > comparison that was previously needed to avoid expensive
> > verify_ring_mapping calls.
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > with modifications by:
> > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > ---
> > hw/virtio/vhost.c | 74 ++++++++++++++++++++++++++++++-------------------------
> > 1 file changed, 41 insertions(+), 33 deletions(-)
> >
> > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> > index e923219e63..c7ce7baf9b 100644
> > --- a/hw/virtio/vhost.c
> > +++ b/hw/virtio/vhost.c
> > @@ -450,35 +450,37 @@ static void vhost_memory_unmap(struct vhost_dev *dev, void *buffer,
> > }
> > }
> >
> > -static int vhost_verify_ring_part_mapping(struct vhost_dev *dev,
> > - void *part,
> > - uint64_t part_addr,
> > - uint64_t part_size,
> > - uint64_t start_addr,
> > - uint64_t size)
> > +static int vhost_verify_ring_part_mapping(void *ring_hva,
> > + uint64_t ring_gpa,
> > + uint64_t ring_size,
> > + void *reg_hva,
> > + uint64_t reg_gpa,
> > + uint64_t reg_size)
> > {
> > - hwaddr l;
> > - void *p;
> > - int r = 0;
> > + uint64_t hva_ring_offset;
> > + uint64_t ring_last = range_get_last(ring_gpa, ring_size);
> > + uint64_t reg_last = range_get_last(reg_gpa, reg_size);
> >
> > - if (!ranges_overlap(start_addr, size, part_addr, part_size)) {
> > + if (ring_last < reg_gpa || ring_gpa > reg_last) {
> > return 0;
> > }
> > - l = part_size;
> > - p = vhost_memory_map(dev, part_addr, &l, 1);
> > - if (!p || l != part_size) {
> > - r = -ENOMEM;
> > + /* check that whole ring's is mapped */
> > + if (ring_last > reg_last) {
> > + return -EBUSY;
> ENOMEM
Done
> > }
> > - if (p != part) {
> > - r = -EBUSY;
> > + /* check that ring's MemoryRegion wasn't replaced */
> > + hva_ring_offset = ring_gpa - reg_gpa;
> > + if (ring_hva != reg_hva + hva_ring_offset) {
> > + return -ENOMEM;
> EBUSY
Done
>
> > }
> > - vhost_memory_unmap(dev, p, l, 0, 0);
> > - return r;
> > +
> > + return 0;
> > }
> >
> > static int vhost_verify_ring_mappings(struct vhost_dev *dev,
> > - uint64_t start_addr,
> > - uint64_t size)
> > + void *reg_hva,
> > + uint64_t reg_gpa,
> > + uint64_t reg_size)
> > {
> > int i, j;
> > int r = 0;
> > @@ -492,22 +494,25 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
> > struct vhost_virtqueue *vq = dev->vqs + i;
> >
> > j = 0;
> > - r = vhost_verify_ring_part_mapping(dev, vq->desc, vq->desc_phys,
> > - vq->desc_size, start_addr, size);
> > + r = vhost_verify_ring_part_mapping(
> > + vq->desc, vq->desc_phys, vq->desc_size,
> > + reg_hva, reg_gpa, reg_size);
> > if (r) {
> > break;
> > }
> >
> > j++;
> > - r = vhost_verify_ring_part_mapping(dev, vq->avail, vq->avail_phys,
> > - vq->avail_size, start_addr, size);
> > + r = vhost_verify_ring_part_mapping(
> > + vq->desc, vq->desc_phys, vq->desc_size,
> > + reg_hva, reg_gpa, reg_size);
> > if (r) {
> > break;
> > }
> >
> > j++;
> > - r = vhost_verify_ring_part_mapping(dev, vq->used, vq->used_phys,
> > - vq->used_size, start_addr, size);
> > + r = vhost_verify_ring_part_mapping(
> > + vq->desc, vq->desc_phys, vq->desc_size,
> > + reg_hva, reg_gpa, reg_size);
> > if (r) {
> > break;
> > }
> > @@ -633,8 +638,6 @@ static void vhost_commit(MemoryListener *listener)
> > {
> > struct vhost_dev *dev = container_of(listener, struct vhost_dev,
> > memory_listener);
> > - hwaddr start_addr = 0;
> > - ram_addr_t size = 0;
> > uint64_t log_size;
> > int r;
> >
> > @@ -649,11 +652,16 @@ static void vhost_commit(MemoryListener *listener)
> > }
> >
> > if (dev->started) {
> ^^^ not needed as we bail out earlier if it's not true
Done
> > - start_addr = dev->mem_changed_start_addr;
> > - size = dev->mem_changed_end_addr - dev->mem_changed_start_addr + 1;
> > -
> > - r = vhost_verify_ring_mappings(dev, start_addr, size);
> > - assert(r >= 0);
> > + int i;
> > + for (i = 0; i < dev->mem->nregions; i++) {
> > + if (vhost_verify_ring_mappings(dev,
> > + (void *)dev->mem->regions[i].userspace_addr,
> > + dev->mem->regions[i].guest_phys_addr,
> > + dev->mem->regions[i].memory_size)) {
> > + error_report("Verify ring failure on region %d", i);
> > + abort();
> > + }
> > + }
> > }
> >
> > if (!dev->log_enabled) {
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2017-12-15 12:24 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-13 18:08 [Qemu-devel] [PATCH v4 0/6] Rework vhost memory region updates Dr. David Alan Gilbert (git)
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 1/6] vhost: Move log_dirty check Dr. David Alan Gilbert (git)
2017-12-14 14:30 ` Igor Mammedov
2017-12-14 15:20 ` Dr. David Alan Gilbert
2017-12-15 10:01 ` Igor Mammedov
2017-12-27 12:10 ` Igor Mammedov
2018-01-09 18:42 ` Dr. David Alan Gilbert
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 2/6] vhost: Simplify ring verification checks Dr. David Alan Gilbert (git)
2017-12-14 14:07 ` Igor Mammedov
2017-12-15 12:24 ` Dr. David Alan Gilbert [this message]
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 3/6] vhost: Add temporary memory structure Dr. David Alan Gilbert (git)
2017-12-14 15:15 ` Igor Mammedov
2017-12-15 13:15 ` Dr. David Alan Gilbert
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 4/6] vhost: add regions to temporary list Dr. David Alan Gilbert (git)
2017-12-13 21:31 ` Paolo Bonzini
2017-12-14 15:53 ` Dr. David Alan Gilbert
2017-12-14 15:27 ` Igor Mammedov
2017-12-14 18:43 ` Michael S. Tsirkin
2017-12-18 20:29 ` Dr. David Alan Gilbert
2017-12-15 13:30 ` Dr. David Alan Gilbert
2017-12-15 14:50 ` Paolo Bonzini
2017-12-15 16:11 ` Dr. David Alan Gilbert
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 5/6] vhost: compare and flip in new memory region list Dr. David Alan Gilbert (git)
2017-12-13 18:08 ` [Qemu-devel] [PATCH v4 6/6] vhost: Clean out old vhost_set_memory and friends Dr. David Alan Gilbert (git)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171215122408.GA14126@work-vm \
--to=dgilbert@redhat.com \
--cc=groug@kaod.org \
--cc=imammedo@redhat.com \
--cc=maxime.coquelin@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.