[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] [RFC]: xenpaging: add command to to flush qemu buffer cache via VMCALL


  • To: xen-devel@xxxxxxxxxxxxx
  • From: "Andres Lagar-Cavilla" <andres@xxxxxxxxxxxxxxxx>
  • Date: Thu, 8 Mar 2012 07:08:29 -0800
  • Cc: olaf@xxxxxxxxx, tim@xxxxxxx
  • Delivery-date: Thu, 08 Mar 2012 15:08:40 +0000
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=lagarcavilla.org; h=message-id :in-reply-to:references:date:subject:from:to:cc:reply-to :mime-version:content-type:content-transfer-encoding; q=dns; s= lagarcavilla.org; b=PoCplP+ifqj9GtC0kqw7xDZ9K+FSY/ZIac+8+tlCPcmN LgCJ+vWHqE5+TVDBRhptpcc/I5Q8z3v6bO1hFfvH39e7HAT5k/l9F0cxOe9zn3rm 80YDnfM9P/wPaIngSTHJ35omVU+5UpiOoA1kwCHywRaSX/SSIfLcyOlLWtuB3i4=
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>

> Date: Thu, 8 Mar 2012 14:51:20 +0000
> From: Tim Deegan <tim@xxxxxxx>
> To: Olaf Hering <olaf@xxxxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
> Subject: Re: [Xen-devel] [PATCH] [RFC]: xenpaging: add command to to
>       flush   qemu buffer cache via VMCALL
> Message-ID: <20120308145120.GL64337@xxxxxxxxxxxxxxxxxxxxx>
> Content-Type: text/plain; charset=iso-8859-1
>
> At 15:42 +0100 on 08 Mar (1331221336), Olaf Hering wrote:
>> On Thu, Mar 08, Tim Deegan wrote:
>>
>> > At 17:15 +0100 on 26 Feb (1330276512), Olaf Hering wrote:
>> > > # HG changeset patch
>> > > # User Olaf Hering <olaf@xxxxxxxxx>
>> > > # Date 1330272880 -3600
>> > > # Node ID e17afed13a35989bdf422b75d44843bfd2fda0f4
>> > > # Parent  3ace34b89ebe3bdd6afb0bca85b0c1270f99c1bb
>> > > [RFC]: xenpaging: add command to to flush qemu buffer cache via
>> VMCALL
>> > >
>> > > Is the approach taken in this patch ok?
>> >
>> > Can you explain a bit more about what you're trying to do?
>>
>> It looked easy to "inject" a request to send a flush to ioemu in this
>> way. But it turned out that this approach will not work.
>
> I think it could be made to work, but it will need more changes than
> this.  Since the current mechanism is really only intended for guest
> hypercalls it would need to be updated so that the flag is checked in
> more places (say, on every VMENTER, or maybe somewhere a little less hot
> like on interrupt injection).
>
> How synchronous to you need the flush to be, btw?  If you need to be
> sure it's completed then you probably can't go through the hypervisor.
>
>> So both old and new qemu need a change to accept the flush command in
>> some way. For old qemu the xenstore approach looks best, for the new
>> qemu I need to dig into QMP.
>
> Righto.  Can you please make sure that whatever you do for new qemu
> doesn't require xenpaging and qemu to be in the same VM?

Stub domains: great fun with QMP! Guaranteed or your money back! (insert
smiley here)

This is a good reason to get inter VM TCP/IP within the same host to
finally work, without requiring naming other than a domain id. If feasible
at all.

Andres
>
> Cheers,
>
> Tim.
>
>
>
> ------------------------------
>
> Message: 2
> Date: Thu, 8 Mar 2012 15:00:59 +0000
> From: xen.org <ian.jackson@xxxxxxxxxxxxx>
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: ian.jackson@xxxxxxxxxxxxx
> Subject: [Xen-devel] [xen-unstable test] 12201: tolerable FAIL
> Message-ID: <osstest-12201-mainreport@xxxxxxx>
> Content-Type: text/plain
>
> flight 12201 xen-unstable real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/12201/
>
> Failures :-/ but no regressions.
>
> Tests which are failing intermittently (not blocking):
>  build-i386-pvops              4 kernel-build                fail pass in
> 12195
>
> Regressions which are regarded as allowable (not blocking):
>  test-amd64-i386-qemuu-rhel6hvm-amd 9 guest-start.2 fail in 12195 blocked
> in 12201
>  test-i386-i386-win           14 guest-start.2   fail in 12195 blocked in
> 12201
>
> Tests which did not succeed, but are not blocking:
>  test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never
> pass
>  test-amd64-i386-pv            1 xen-build-check(1)           blocked  n/a
>  test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
>  test-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-qemuu-rhel6hvm-intel  1 xen-build-check(1)
> blocked n/a
>  test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-xend-winxpsp3  1 xen-build-check(1)           blocked
> n/a
>  test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked
> n/a
>  test-amd64-i386-qemuu-rhel6hvm-amd  1 xen-build-check(1)
> blocked n/a
>  test-amd64-amd64-win         16 leak-check/check             fail   never
> pass
>  test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
>  test-i386-i386-win            1 xen-build-check(1)           blocked  n/a
>  test-i386-i386-xl-qemuu-winxpsp3  1 xen-build-check(1)           blocked
> n/a
>  test-amd64-amd64-xl-qemuu-winxpsp3  7 windows-install          fail never
> pass
>  test-i386-i386-xl-win         1 xen-build-check(1)           blocked  n/a
>  test-amd64-amd64-xl-win      13 guest-stop                   fail   never
> pass
>  test-amd64-i386-xl-win7-amd64  1 xen-build-check(1)           blocked
> n/a
>  test-amd64-i386-xl-win-vcpus1  1 xen-build-check(1)           blocked
> n/a
>  test-amd64-amd64-xl-qemuu-win7-amd64  7 windows-install        fail never
> pass
>  test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never
> pass
>  test-i386-i386-xl-winxpsp3    1 xen-build-check(1)           blocked  n/a
>  test-amd64-i386-xl-winxpsp3-vcpus1  1 xen-build-check(1)
> blocked n/a
>  test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never
> pass
>  test-amd64-i386-qemuu-rhel6hvm-intel  9 guest-start.2 fail in 12195 never
> pass
>  test-amd64-i386-win          16 leak-check/check      fail in 12195 never
> pass
>  test-amd64-i386-xend-winxpsp3 16 leak-check/check     fail in 12195 never
> pass
>  test-amd64-i386-rhel6hvm-amd 11 leak-check/check      fail in 12195 never
> pass
>  test-amd64-i386-rhel6hvm-intel 11 leak-check/check    fail in 12195 never
> pass
>  test-amd64-i386-win-vcpus1   16 leak-check/check      fail in 12195 never
> pass
>  test-i386-i386-xl-qemuu-winxpsp3  7 windows-install   fail in 12195 never
> pass
>  test-i386-i386-xl-win        13 guest-stop            fail in 12195 never
> pass
>  test-amd64-i386-xl-win7-amd64 13 guest-stop           fail in 12195 never
> pass
>  test-amd64-i386-xl-win-vcpus1 13 guest-stop           fail in 12195 never
> pass
>  test-i386-i386-xl-winxpsp3   13 guest-stop            fail in 12195 never
> pass
>  test-amd64-i386-xl-winxpsp3-vcpus1 13 guest-stop      fail in 12195 never
> pass
>
> version targeted for testing:
>  xen                  f61120046915
> baseline version:
>  xen                  f61120046915
>
> jobs:
>  build-amd64                                                  pass
>  build-i386                                                   pass
>  build-amd64-oldkern                                          pass
>  build-i386-oldkern                                           pass
>  build-amd64-pvops                                            pass
>  build-i386-pvops                                             fail
>  test-amd64-amd64-xl                                          pass
>  test-amd64-i386-xl                                           blocked
>  test-i386-i386-xl                                            blocked
>  test-amd64-i386-rhel6hvm-amd                                 blocked
>  test-amd64-i386-qemuu-rhel6hvm-amd                           blocked
>  test-amd64-amd64-xl-qemuu-win7-amd64                         fail
>  test-amd64-amd64-xl-win7-amd64                               fail
>  test-amd64-i386-xl-win7-amd64                                blocked
>  test-amd64-i386-xl-credit2                                   blocked
>  test-amd64-amd64-xl-pcipt-intel                              fail
>  test-amd64-i386-rhel6hvm-intel                               blocked
>  test-amd64-i386-qemuu-rhel6hvm-intel                         blocked
>  test-amd64-i386-xl-multivcpu                                 blocked
>  test-amd64-amd64-pair                                        pass
>  test-amd64-i386-pair                                         blocked
>  test-i386-i386-pair                                          blocked
>  test-amd64-amd64-xl-sedf-pin                                 pass
>  test-amd64-amd64-pv                                          pass
>  test-amd64-i386-pv                                           blocked
>  test-i386-i386-pv                                            blocked
>  test-amd64-amd64-xl-sedf                                     pass
>  test-amd64-i386-win-vcpus1                                   blocked
>  test-amd64-i386-xl-win-vcpus1                                blocked
>  test-amd64-i386-xl-winxpsp3-vcpus1                           blocked
>  test-amd64-amd64-win                                         fail
>  test-amd64-i386-win                                          blocked
>  test-i386-i386-win                                           blocked
>  test-amd64-amd64-xl-win                                      fail
>  test-i386-i386-xl-win                                        blocked
>  test-amd64-amd64-xl-qemuu-winxpsp3                           fail
>  test-i386-i386-xl-qemuu-winxpsp3                             blocked
>  test-amd64-i386-xend-winxpsp3                                blocked
>  test-amd64-amd64-xl-winxpsp3                                 fail
>  test-i386-i386-xl-winxpsp3                                   blocked
>
>
> ------------------------------------------------------------
> sg-report-flight on woking.cam.xci-test.com
> logs: /home/xc_osstest/logs
> images: /home/xc_osstest/images
>
> Logs, config files, etc. are available at
>     http://www.chiark.greenend.org.uk/~xensrcts/logs
>
> Test harness code can be found at
>     http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary
>
>
> Published tested tree is already up to date.
>
>
>
>
> ------------------------------
>
> Message: 3
> Date: Thu, 08 Mar 2012 10:02:55 -0500
> From: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: olaf@xxxxxxxxx, ian.campbell@xxxxxxxxxx, andres@xxxxxxxxxxxxxx,
>       tim@xxxxxxx,    keir.xen@xxxxxxxxx, ian.jackson@xxxxxxxxxx,
>       adin@xxxxxxxxxxxxxx
> Subject: [Xen-devel] [PATCH 0 of 8] Mem event ring interface setup
>       update, V3 rebased
> Message-ID: <patchbomb.1331218975@xxxxxxxxxxxxxxxxxxx>
> Content-Type: text/plain; charset="us-ascii"
>
> Changes from previous posting, dated Feb 29th:
> - Added Acked-by Ian Campbell for tools bits
> - Turned ((void)0) define for non-x86 architectures into "empty" static
> inlines
> - Added patch #8 to remove the ring from the guest physmap's once
> successfully
>  mapped by the helper
>
> Rebased against 24984:f61120046915
>
> Headers from previous posting follow below
>
> ------------------------------------------------------------------------------
> Feb 29th: Changes from previous posting
> - Added Acked-by Tim Deegan for hypervisor side
> - Added Acked-by Olaf Hering, okaying the ABI/API change
> - +ve errno value when sanity-checking the port pointer within libxc
> - not clearing errno before calling the ring setup ioctl.
>
> ------------------------------------------------------------------------------
>
> Update the interface for setting up mem event rings (for sharing, mem
> access or
> paging).
>
> Remove the "shared page", which was a waste of a whole page for a single
> event
> channel port value.
>
> More importantly, both the shared page and the ring page were dom0
> user-space
> process pages mapped by the hypervisor. If the dom0 process does not clean
> up,
> the hypervisor keeps posting events (and holding a map) to a page now
> belonging
> to another process.
>
> Solutions proposed:
> - Pass the event channel port explicitly as part of the domctl payload.
> - Reserve a pfn in the guest physmap for a each mem event ring.
> Set/retrieve
> these pfns via hvm params. Ensure they are set during build and restore,
> and
> retrieved during save. Ensure these pages don't leak and domains are left
> zombie.
>
> In all cases mem events consumers in-tree (xenpaging and xen-access) have
> been
> updated.
>
> Updating the interface to deal with these problems requires
> backwards-incompatible changes on both the helper<->libxc and
> libxc<->hypervisor interfaces.
>
> Take advantage of the interface update to plumb setting up of the sharing
> ring,
> which was missing.
>
> All patches touch x86/mm hypervisor bits. Patches 1, 3 and 5 are tools
> patches
> as well.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> Acked-by: Tim Deegan <tim@xxxxxxx>
> Acked-by: Olaf Hering <olaf@xxxxxxxxx>
> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
>  tools/libxc/xc_mem_access.c         |  10 +++-
>  tools/libxc/xc_mem_event.c          |  12 +++--
>  tools/libxc/xc_mem_paging.c         |  10 +++-
>  tools/libxc/xenctrl.h               |   6 +-
>  tools/tests/xen-access/xen-access.c |  22 +--------
>  tools/xenpaging/xenpaging.c         |  17 +------
>  tools/xenpaging/xenpaging.h         |   2 +-
>  xen/arch/x86/mm/mem_event.c         |  33 +-------------
>  xen/include/public/domctl.h         |   4 +-
>  xen/include/public/mem_event.h      |   4 -
>  xen/include/xen/sched.h             |   2 -
>  xen/arch/x86/hvm/hvm.c              |  48 ++++++++++++++++-----
>  xen/include/asm-x86/hvm/hvm.h       |   7 +++
>  tools/libxc/xc_domain_restore.c     |  42 ++++++++++++++++++
>  tools/libxc/xc_domain_save.c        |  36 ++++++++++++++++
>  tools/libxc/xc_hvm_build.c          |  21 ++++++--
>  tools/libxc/xc_mem_access.c         |   6 +-
>  tools/libxc/xc_mem_event.c          |   3 +-
>  tools/libxc/xc_mem_paging.c         |   6 +-
>  tools/libxc/xenctrl.h               |   8 +--
>  tools/libxc/xg_save_restore.h       |   4 +
>  tools/tests/xen-access/xen-access.c |  83
> +++++++++++++++++-------------------
>  tools/xenpaging/xenpaging.c         |  52 ++++++++++++++++------
>  xen/arch/x86/mm/mem_event.c         |  50 ++++++++++------------
>  xen/include/public/domctl.h         |   1 -
>  xen/include/public/hvm/params.h     |   7 ++-
>  xen/include/xen/sched.h             |   1 +
>  xen/arch/x86/mm/mem_event.c         |  41 ++++++++++++++++++
>  xen/include/public/domctl.h         |  20 ++++++++-
>  xen/include/xen/sched.h             |   3 +
>  tools/libxc/xc_memshr.c             |  25 +++++++++++
>  tools/libxc/xenctrl.h               |   5 ++
>  xen/arch/x86/mm/mem_event.c         |  11 ++++
>  xen/common/domain.c                 |   3 +
>  xen/include/asm-arm/mm.h            |   3 +-
>  xen/include/asm-ia64/mm.h           |   3 +-
>  xen/include/asm-x86/mm.h            |   6 ++
>  xen/arch/x86/mm/mem_event.c         |   6 +-
>  tools/tests/xen-access/xen-access.c |   5 ++
>  tools/xenpaging/xenpaging.c         |   5 ++
>  40 files changed, 425 insertions(+), 208 deletions(-)
>
>
>
> ------------------------------
>
> Message: 4
> Date: Thu, 08 Mar 2012 10:02:56 -0500
> From: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: olaf@xxxxxxxxx, ian.campbell@xxxxxxxxxx, andres@xxxxxxxxxxxxxx,
>       tim@xxxxxxx,    keir.xen@xxxxxxxxx, ian.jackson@xxxxxxxxxx,
>       adin@xxxxxxxxxxxxxx
> Subject: [Xen-devel] [PATCH 1 of 8] Tools: Remove shared page from
>       mem_event/access/paging interfaces
> Message-ID: <77f173290740f336baaa.1331218976@xxxxxxxxxxxxxxxxxxx>
> Content-Type: text/plain; charset="us-ascii"
>
>  tools/libxc/xc_mem_access.c         |  10 ++++++++--
>  tools/libxc/xc_mem_event.c          |  12 +++++++-----
>  tools/libxc/xc_mem_paging.c         |  10 ++++++++--
>  tools/libxc/xenctrl.h               |   6 +++---
>  tools/tests/xen-access/xen-access.c |  22 ++++------------------
>  tools/xenpaging/xenpaging.c         |  17 ++---------------
>  tools/xenpaging/xenpaging.h         |   2 +-
>  xen/arch/x86/mm/mem_event.c         |  33
> +++------------------------------
>  xen/include/public/domctl.h         |   4 ++--
>  xen/include/public/mem_event.h      |   4 ----
>  xen/include/xen/sched.h             |   2 --
>  11 files changed, 38 insertions(+), 84 deletions(-)
>
>
> Don't use the superfluous shared page, return the event channel directly
> as
> part of the domctl struct, instead.
>
> In-tree consumers (xenpaging, xen-access) updated. This is an ABI/API
> change,
> so please voice any concerns.
>
> Known pending issues:
> - pager could die and its ring page could be used by some other process,
> yet
>   Xen retains the mapping to it.
> - use a saner interface for the paging_load buffer.
>
> This change also affects the x86/mm bits in the hypervisor that process
> the
> mem_event setup domctl.
>
> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
> Acked-by: Tim Deegan <tim@xxxxxxx>
> Acked-by: Olaf Hering <olaf@xxxxxxxxx>
> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r e81ed892ba62 -r 77f173290740 tools/libxc/xc_mem_access.c
> --- a/tools/libxc/xc_mem_access.c
> +++ b/tools/libxc/xc_mem_access.c
> @@ -25,12 +25,18 @@
>
>
>  int xc_mem_access_enable(xc_interface *xch, domid_t domain_id,
> -                        void *shared_page, void *ring_page)
> +                         uint32_t *port, void *ring_page)
>  {
> +    if ( !port )
> +    {
> +        errno = EINVAL;
> +        return -1;
> +    }
> +
>      return xc_mem_event_control(xch, domain_id,
>                                  XEN_DOMCTL_MEM_EVENT_OP_ACCESS_ENABLE,
>                                  XEN_DOMCTL_MEM_EVENT_OP_ACCESS,
> -                                shared_page, ring_page);
> +                                port, ring_page);
>  }
>
>  int xc_mem_access_disable(xc_interface *xch, domid_t domain_id)
> diff -r e81ed892ba62 -r 77f173290740 tools/libxc/xc_mem_event.c
> --- a/tools/libxc/xc_mem_event.c
> +++ b/tools/libxc/xc_mem_event.c
> @@ -24,19 +24,21 @@
>  #include "xc_private.h"
>
>  int xc_mem_event_control(xc_interface *xch, domid_t domain_id, unsigned
> int op,
> -                         unsigned int mode, void *page, void *ring_page)
> +                         unsigned int mode, uint32_t *port, void
> *ring_page)
>  {
>      DECLARE_DOMCTL;
> +    int rc;
>
>      domctl.cmd = XEN_DOMCTL_mem_event_op;
>      domctl.domain = domain_id;
>      domctl.u.mem_event_op.op = op;
>      domctl.u.mem_event_op.mode = mode;
> -
> -    domctl.u.mem_event_op.shared_addr = (unsigned long)page;
> -    domctl.u.mem_event_op.ring_addr = (unsigned long)ring_page;
> +    domctl.u.mem_event_op.ring_addr = (unsigned long) ring_page;
>
> -    return do_domctl(xch, &domctl);
> +    rc = do_domctl(xch, &domctl);
> +    if ( !rc && port )
> +        *port = domctl.u.mem_event_op.port;
> +    return rc;
>  }
>
>  int xc_mem_event_memop(xc_interface *xch, domid_t domain_id,
> diff -r e81ed892ba62 -r 77f173290740 tools/libxc/xc_mem_paging.c
> --- a/tools/libxc/xc_mem_paging.c
> +++ b/tools/libxc/xc_mem_paging.c
> @@ -25,12 +25,18 @@
>
>
>  int xc_mem_paging_enable(xc_interface *xch, domid_t domain_id,
> -                        void *shared_page, void *ring_page)
> +                         uint32_t *port, void *ring_page)
>  {
> +    if ( !port )
> +    {
> +        errno = EINVAL;
> +        return -1;
> +    }
> +
>      return xc_mem_event_control(xch, domain_id,
>                                  XEN_DOMCTL_MEM_EVENT_OP_PAGING_ENABLE,
>                                  XEN_DOMCTL_MEM_EVENT_OP_PAGING,
> -                                shared_page, ring_page);
> +                                port, ring_page);
>  }
>
>  int xc_mem_paging_disable(xc_interface *xch, domid_t domain_id)
> diff -r e81ed892ba62 -r 77f173290740 tools/libxc/xenctrl.h
> --- a/tools/libxc/xenctrl.h
> +++ b/tools/libxc/xenctrl.h
> @@ -1897,13 +1897,13 @@ int xc_tmem_restore_extra(xc_interface *
>   * mem_event operations
>   */
>  int xc_mem_event_control(xc_interface *xch, domid_t domain_id, unsigned
> int op,
> -                         unsigned int mode, void *shared_page, void
> *ring_page);
> +                         unsigned int mode, uint32_t *port, void
> *ring_page);
>  int xc_mem_event_memop(xc_interface *xch, domid_t domain_id,
>                          unsigned int op, unsigned int mode,
>                          uint64_t gfn, void *buffer);
>
>  int xc_mem_paging_enable(xc_interface *xch, domid_t domain_id,
> -                        void *shared_page, void *ring_page);
> +                         uint32_t *port, void *ring_page);
>  int xc_mem_paging_disable(xc_interface *xch, domid_t domain_id);
>  int xc_mem_paging_nominate(xc_interface *xch, domid_t domain_id,
>                             unsigned long gfn);
> @@ -1913,7 +1913,7 @@ int xc_mem_paging_load(xc_interface *xch
>                          unsigned long gfn, void *buffer);
>
>  int xc_mem_access_enable(xc_interface *xch, domid_t domain_id,
> -                        void *shared_page, void *ring_page);
> +                         uint32_t *port, void *ring_page);
>  int xc_mem_access_disable(xc_interface *xch, domid_t domain_id);
>  int xc_mem_access_resume(xc_interface *xch, domid_t domain_id,
>                           unsigned long gfn);
> diff -r e81ed892ba62 -r 77f173290740 tools/tests/xen-access/xen-access.c
> --- a/tools/tests/xen-access/xen-access.c
> +++ b/tools/tests/xen-access/xen-access.c
> @@ -98,7 +98,7 @@ typedef struct mem_event {
>      xc_evtchn *xce_handle;
>      int port;
>      mem_event_back_ring_t back_ring;
> -    mem_event_shared_page_t *shared_page;
> +    uint32_t evtchn_port;
>      void *ring_page;
>      spinlock_t ring_lock;
>  } mem_event_t;
> @@ -166,7 +166,7 @@ int xc_wait_for_event_or_timeout(xc_inte
>   err:
>      return -errno;
>  }
> -
> +
>  static void *init_page(void)
>  {
>      void *buffer;
> @@ -214,14 +214,6 @@ xenaccess_t *xenaccess_init(xc_interface
>      /* Set domain id */
>      xenaccess->mem_event.domain_id = domain_id;
>
> -    /* Initialise shared page */
> -    xenaccess->mem_event.shared_page = init_page();
> -    if ( xenaccess->mem_event.shared_page == NULL )
> -    {
> -        ERROR("Error initialising shared page");
> -        goto err;
> -    }
> -
>      /* Initialise ring page */
>      xenaccess->mem_event.ring_page = init_page();
>      if ( xenaccess->mem_event.ring_page == NULL )
> @@ -242,7 +234,7 @@ xenaccess_t *xenaccess_init(xc_interface
>
>      /* Initialise Xen */
>      rc = xc_mem_access_enable(xenaccess->xc_handle,
> xenaccess->mem_event.domain_id,
> -                             xenaccess->mem_event.shared_page,
> +                             &xenaccess->mem_event.evtchn_port,
>                               xenaccess->mem_event.ring_page);
>      if ( rc != 0 )
>      {
> @@ -271,7 +263,7 @@ xenaccess_t *xenaccess_init(xc_interface
>      /* Bind event notification */
>      rc = xc_evtchn_bind_interdomain(xenaccess->mem_event.xce_handle,
>                                      xenaccess->mem_event.domain_id,
> -
> xenaccess->mem_event.shared_page->port);
> +                                    xenaccess->mem_event.evtchn_port);
>      if ( rc < 0 )
>      {
>          ERROR("Failed to bind event channel");
> @@ -322,12 +314,6 @@ xenaccess_t *xenaccess_init(xc_interface
>   err:
>      if ( xenaccess )
>      {
> -        if ( xenaccess->mem_event.shared_page )
> -        {
> -            munlock(xenaccess->mem_event.shared_page, PAGE_SIZE);
> -            free(xenaccess->mem_event.shared_page);
> -        }
> -
>          if ( xenaccess->mem_event.ring_page )
>          {
>              munlock(xenaccess->mem_event.ring_page, PAGE_SIZE);
> diff -r e81ed892ba62 -r 77f173290740 tools/xenpaging/xenpaging.c
> --- a/tools/xenpaging/xenpaging.c
> +++ b/tools/xenpaging/xenpaging.c
> @@ -337,14 +337,6 @@ static struct xenpaging *xenpaging_init(
>          goto err;
>      }
>
> -    /* Initialise shared page */
> -    paging->mem_event.shared_page = init_page();
> -    if ( paging->mem_event.shared_page == NULL )
> -    {
> -        PERROR("Error initialising shared page");
> -        goto err;
> -    }
> -
>      /* Initialise ring page */
>      paging->mem_event.ring_page = init_page();
>      if ( paging->mem_event.ring_page == NULL )
> @@ -361,7 +353,7 @@ static struct xenpaging *xenpaging_init(
>
>      /* Initialise Xen */
>      rc = xc_mem_paging_enable(xch, paging->mem_event.domain_id,
> -                             paging->mem_event.shared_page,
> +                             &paging->mem_event.evtchn_port,
>                               paging->mem_event.ring_page);
>      if ( rc != 0 )
>      {
> @@ -393,7 +385,7 @@ static struct xenpaging *xenpaging_init(
>      /* Bind event notification */
>      rc = xc_evtchn_bind_interdomain(paging->mem_event.xce_handle,
>                                      paging->mem_event.domain_id,
> -                                    paging->mem_event.shared_page->port);
> +                                    paging->mem_event.evtchn_port);
>      if ( rc < 0 )
>      {
>          PERROR("Failed to bind event channel");
> @@ -474,11 +466,6 @@ static struct xenpaging *xenpaging_init(
>              munlock(paging->paging_buffer, PAGE_SIZE);
>              free(paging->paging_buffer);
>          }
> -        if ( paging->mem_event.shared_page )
> -        {
> -            munlock(paging->mem_event.shared_page, PAGE_SIZE);
> -            free(paging->mem_event.shared_page);
> -        }
>
>          if ( paging->mem_event.ring_page )
>          {
> diff -r e81ed892ba62 -r 77f173290740 tools/xenpaging/xenpaging.h
> --- a/tools/xenpaging/xenpaging.h
> +++ b/tools/xenpaging/xenpaging.h
> @@ -36,7 +36,7 @@ struct mem_event {
>      xc_evtchn *xce_handle;
>      int port;
>      mem_event_back_ring_t back_ring;
> -    mem_event_shared_page_t *shared_page;
> +    uint32_t evtchn_port;
>      void *ring_page;
>  };
>
> diff -r e81ed892ba62 -r 77f173290740 xen/arch/x86/mm/mem_event.c
> --- a/xen/arch/x86/mm/mem_event.c
> +++ b/xen/arch/x86/mm/mem_event.c
> @@ -50,12 +50,10 @@ static int mem_event_enable(
>      struct domain *dom_mem_event = current->domain;
>      struct vcpu *v = current;
>      unsigned long ring_addr = mec->ring_addr;
> -    unsigned long shared_addr = mec->shared_addr;
>      l1_pgentry_t l1e;
> -    unsigned long shared_gfn = 0, ring_gfn = 0; /* gcc ... */
> +    unsigned long ring_gfn = 0; /* gcc ... */
>      p2m_type_t p2mt;
>      mfn_t ring_mfn;
> -    mfn_t shared_mfn;
>
>      /* Only one helper at a time. If the helper crashed,
>       * the ring is in an undefined state and so is the guest.
> @@ -66,10 +64,6 @@ static int mem_event_enable(
>      /* Get MFN of ring page */
>      guest_get_eff_l1e(v, ring_addr, &l1e);
>      ring_gfn = l1e_get_pfn(l1e);
> -    /* We're grabbing these two in an order that could deadlock
> -     * dom0 if 1. it were an hvm 2. there were two concurrent
> -     * enables 3. the two gfn's in each enable criss-crossed
> -     * 2MB regions. Duly noted.... */
>      ring_mfn = get_gfn(dom_mem_event, ring_gfn, &p2mt);
>
>      if ( unlikely(!mfn_valid(mfn_x(ring_mfn))) )
> @@ -80,23 +74,9 @@ static int mem_event_enable(
>
>      mem_event_ring_lock_init(med);
>
> -    /* Get MFN of shared page */
> -    guest_get_eff_l1e(v, shared_addr, &l1e);
> -    shared_gfn = l1e_get_pfn(l1e);
> -    shared_mfn = get_gfn(dom_mem_event, shared_gfn, &p2mt);
> -
> -    if ( unlikely(!mfn_valid(mfn_x(shared_mfn))) )
> -    {
> -        put_gfn(dom_mem_event, ring_gfn);
> -        put_gfn(dom_mem_event, shared_gfn);
> -        return -EINVAL;
> -    }
> -
> -    /* Map ring and shared pages */
> +    /* Map ring page */
>      med->ring_page = map_domain_page(mfn_x(ring_mfn));
> -    med->shared_page = map_domain_page(mfn_x(shared_mfn));
>      put_gfn(dom_mem_event, ring_gfn);
> -    put_gfn(dom_mem_event, shared_gfn);
>
>      /* Set the number of currently blocked vCPUs to 0. */
>      med->blocked = 0;
> @@ -108,8 +88,7 @@ static int mem_event_enable(
>      if ( rc < 0 )
>          goto err;
>
> -    ((mem_event_shared_page_t *)med->shared_page)->port = rc;
> -    med->xen_port = rc;
> +    med->xen_port = mec->port = rc;
>
>      /* Prepare ring buffer */
>      FRONT_RING_INIT(&med->front_ring,
> @@ -125,9 +104,6 @@ static int mem_event_enable(
>      return 0;
>
>   err:
> -    unmap_domain_page(med->shared_page);
> -    med->shared_page = NULL;
> -
>      unmap_domain_page(med->ring_page);
>      med->ring_page = NULL;
>
> @@ -249,9 +225,6 @@ static int mem_event_disable(struct doma
>          unmap_domain_page(med->ring_page);
>          med->ring_page = NULL;
>
> -        unmap_domain_page(med->shared_page);
> -        med->shared_page = NULL;
> -
>          /* Unblock all vCPUs */
>          for_each_vcpu ( d, v )
>          {
> diff -r e81ed892ba62 -r 77f173290740 xen/include/public/domctl.h
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -747,8 +747,8 @@ struct xen_domctl_mem_event_op {
>      uint32_t       op;           /* XEN_DOMCTL_MEM_EVENT_OP_*_* */
>      uint32_t       mode;         /* XEN_DOMCTL_MEM_EVENT_OP_* */
>
> -    uint64_aligned_t shared_addr;  /* IN:  Virtual address of shared page
> */
> -    uint64_aligned_t ring_addr;    /* IN:  Virtual address of ring page
> */
> +    uint32_t port;              /* OUT: event channel for ring */
> +    uint64_aligned_t ring_addr; /* IN:  Virtual address of ring page */
>  };
>  typedef struct xen_domctl_mem_event_op xen_domctl_mem_event_op_t;
>  DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_event_op_t);
> diff -r e81ed892ba62 -r 77f173290740 xen/include/public/mem_event.h
> --- a/xen/include/public/mem_event.h
> +++ b/xen/include/public/mem_event.h
> @@ -46,10 +46,6 @@
>  #define MEM_EVENT_REASON_INT3        5    /* int3 was hit: gla/gfn are
> RIP */
>  #define MEM_EVENT_REASON_SINGLESTEP  6    /* single step was invoked:
> gla/gfn are RIP */
>
> -typedef struct mem_event_shared_page {
> -    uint32_t port;
> -} mem_event_shared_page_t;
> -
>  typedef struct mem_event_st {
>      uint32_t flags;
>      uint32_t vcpu_id;
> diff -r e81ed892ba62 -r 77f173290740 xen/include/xen/sched.h
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -190,8 +190,6 @@ struct mem_event_domain
>      /* The ring has 64 entries */
>      unsigned char foreign_producers;
>      unsigned char target_producers;
> -    /* shared page */
> -    mem_event_shared_page_t *shared_page;
>      /* shared ring page */
>      void *ring_page;
>      /* front-end ring */
>
>
>
> ------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
>
>
> End of Xen-devel Digest, Vol 85, Issue 116
> ******************************************
>



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.