qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Don Slutz <dslutz@verizon.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	"Slutz, Donald Christopher" <dslutz@verizon.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Marcel Apfelbaum" <marcel.a@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"Alexander Graf" <agraf@suse.de>,
	"Anthony Liguori" <aliguori@amazon.com>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH 1/1] xen-hvm.c: Add support for Xen access to vmport
Date: Wed, 01 Oct 2014 08:33:08 -0400	[thread overview]
Message-ID: <542BF484.3050909@terremark.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1410011011030.17038@kaball.uk.xensource.com>

On 10/01/14 05:20, Stefano Stabellini wrote:
> On Wed, 1 Oct 2014, Slutz, Donald Christopher wrote:
>> On 09/30/14 06:35, Stefano Stabellini wrote:
>>> On Mon, 29 Sep 2014, Don Slutz wrote:
>>>> On 09/29/14 06:25, Stefano Stabellini wrote:
>>>>> On Mon, 29 Sep 2014, Stefano Stabellini wrote:
>>>>>> On Fri, 26 Sep 2014, Don Slutz wrote:
>>>>>>> This adds synchronisation of the vcpu registers
>>>>>>> between Xen and QEMU.
>>>>>>>
>>>>>>> Signed-off-by: Don Slutz <dslutz@verizon.com>
>>>>>> [...]
>>>>>>
>>>>>>> diff --git a/xen-hvm.c b/xen-hvm.c
>>>>>>> index 05e522c..e1274bb 100644
>>>>>>> --- a/xen-hvm.c
>>>>>>> +++ b/xen-hvm.c
>>>>>>> @@ -857,14 +857,48 @@ static void cpu_handle_ioreq(void *opaque)
>>>>>>>           handle_buffered_iopage(state);
>>>>>>>         if (req) {
>>>>>>> +#ifdef IOREQ_TYPE_VMWARE_PORT
>>>>>> Is there any reason to #ifdef this code?
>>>>>> Couldn't we just always build it in QEMU?
>>>> This allows QEMU 2.2 (or later) to build on a system that has Xen 4.5
>>>> or earlier installed; and work.
>>> I would rather remove the #ifdef from here and add any necessary
>>> compatibility stuff to include/hw/xen/xen_common.h.
>>>
>> Ok, will do.
>>
>>>>>>> +        if (req->type == IOREQ_TYPE_VMWARE_PORT) {
>>>>>> I think it would make more sense to check for IOREQ_TYPE_VMWARE_PORT
>>>>>> from within handle_ioreq.
>>>>>>
>>>> Ok, I can move it.
>>>>
>>>>
>>>>>>> +            CPUX86State *env;
>>>>>>> +            ioreq_t fake_req = {
>>>>>>> +                .type = IOREQ_TYPE_PIO,
>>>>>>> +                .addr = (uint16_t)req->size,
>>>>>>> +                .size = 4,
>>>>>>> +                .dir = IOREQ_READ,
>>>>>>> +                .df = 0,
>>>>>>> +                .data_is_ptr = 0,
>>>>>>> +            };
>>>>> Why do you need a fake req?
>>>> To transport the 6 VCPU registers (only 32bits of them) that vmport.c
>>>> needs to do it's work.
>>>>
>>>>> Couldn't Xen send the real req instead?
>>>> Yes, but then a 2nd exchange between QEMU and Xen would be needed
>>>> to fetch the 6 VCPU registers.  The ways I know of to fetch the VCPU registers
>>>> from Xen, all need many cycles to do their work and return
>>>> a lot of data that is not needed.
>>>>
>>>> The other option that I have considered was to extend the ioreq_t type
>>>> to have room for these registers, but that reduces by almost half the
>>>> maximum number of VCPUs that are supported (They all live on 1 page).
>>> Urgh. Now that I understand the patch better is think it's horrible, no
>>> offense :-)
>> None taken.
>>
>>> Why don't you add another new ioreq type to send out the vcpu state?
>>> Something like IOREQ_TYPE_VCPU_SYNC_REGS? You could send it to QEMU
>>> before IOREQ_TYPE_VMWARE_PORT. Actually this solution looks very imilar
>>> to Alex's suggestion.
>>>
>> I can, it is just slower.  This would require 2 new types.  1 for regs to
>> QEMU, 1 for regs from QEMU.  So instead of 1 round trip (Xen to QEMU
>> to Xen), you now have 3 (Xen to QEMU (regs to QEMU) to Xen, Xen to
>> QEMU (PIO) to Xen, Xen to QEMU (regs from QEMU) to Xen).
> This is not an high performance device, is it?

Depends on how you view mouse device speed.

> In any case I agree it would be better to avoid it.
> I wonder if we could send both ioreqs at once from Xen and back from
> QEMU. Or maybe append the registers to IOREQ_TYPE_VMWARE_PORT, changing
> the size of ioreq_t only for this ioreq type.

No idea how do do this since this is an array in a shared page.

> Another maybe simpler possibility would be introducing a union in
> ioreq_t with the registers.
> Anything would be OK for me but I would like to see the registers being
> passes explicitely by Xen rather than "hiding" them into other ioreq
> fields.
>

I considered a union, but this can be a issue with older QEMU
and newer Xen.  Since it appears that you care, I will add a new
struct for this.  The problem is that it is a "union" and so must
match on the common fields.

    -Don Slutz



>>>>>     If any case you should spend a
>>>>> few more words on why you are doing this.
>>>>>
>>>> Sure.  Will add some form of the above as part of the commit message.
>>>>
>>>>>>> +            if (!xen_opaque_env) {
>>>>>>> +                xen_opaque_env = g_malloc(sizeof(CPUX86State));
>>>>>>> +            }
>>>>>>> +            env = xen_opaque_env;
>>>>>>> +            env->regs[R_EAX] = (uint32_t)(req->addr >> 32);
>>>>>>> +            env->regs[R_EBX] = (uint32_t)(req->addr);
>>>>>>> +            env->regs[R_ECX] = req->count;
>>>>>>> +            env->regs[R_EDX] = req->size;
>>>>>>> +            env->regs[R_ESI] = (uint32_t)(req->data >> 32);
>>>>>>> +            env->regs[R_EDI] = (uint32_t)(req->data);
>>>>>>> +            handle_ioreq(&fake_req);
>>>>>>> +            req->addr = ((uint64_t)fake_req.data << 32) |
>>>>>>> +                (uint32_t)env->regs[R_EBX];
>>>>>>> +            req->count = env->regs[R_ECX];
>>>>>>> +            req->size = env->regs[R_EDX];
>>>>>>> +            req->data = ((uint64_t)env->regs[R_ESI] << 32) |
>>>>>>> +                (uint32_t)env->regs[R_EDI];
>>>>>> This code could be moved to a separate helper function called by
>>>>>> handle_ioreq.
>>>>>>
>>>> Ok.
>>>>
>>>>      -Don Slutz
>>>>
>>>>>>> +        } else {
>>>>>>> +            handle_ioreq(req);
>>>>>>> +        }
>>>>>>> +#else
>>>>>>>             handle_ioreq(req);
>>>>>>> +#endif

  reply	other threads:[~2014-10-01 12:33 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-26 18:47 [Qemu-devel] [PATCH 0/1] Add support for Xen access to vmport Don Slutz
2014-09-26 18:47 ` [Qemu-devel] [PATCH 1/1] xen-hvm.c: " Don Slutz
2014-09-29  8:12   ` Alexander Graf
2014-09-29 11:10     ` Paolo Bonzini
2014-09-29 11:53       ` Alexander Graf
2014-09-29 12:21         ` Paolo Bonzini
2014-09-29 12:57           ` Alexander Graf
2014-09-29 13:14             ` Paolo Bonzini
2014-09-30  1:05               ` Don Slutz
2014-09-30  8:14                 ` Paolo Bonzini
2014-09-30  1:00         ` Don Slutz
2014-09-29 10:15   ` Stefano Stabellini
2014-09-29 10:25     ` Stefano Stabellini
2014-09-30  0:32       ` Don Slutz
2014-09-30 10:35         ` Stefano Stabellini
2014-10-01  5:21           ` Slutz, Donald Christopher
2014-10-01  9:20             ` Stefano Stabellini
2014-10-01 12:33               ` Don Slutz [this message]
2014-10-01 14:44               ` [Qemu-devel] [Xen-devel] " Ian Campbell
2014-10-01 16:01                 ` Anthony Liguori
2014-10-01 15:08               ` [Qemu-devel] " Paul Durrant

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=542BF484.3050909@terremark.com \
    --to=dslutz@verizon.com \
    --cc=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=aliguori@amazon.com \
    --cc=armbru@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).