WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] Paravirt framebuffer backend tools [2/5]

To: Steven Smith <sos22-xen@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] Paravirt framebuffer backend tools [2/5]
From: Markus Armbruster <armbru@xxxxxxxxxx>
Date: Fri, 06 Oct 2006 16:10:23 +0200
Cc: aliguori <aliguori@xxxxxxxxxxxxxxx>, Jeremy Katz <katzj@xxxxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, sos22@xxxxxxxxxxxxx
Delivery-date: Fri, 06 Oct 2006 07:10:49 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20061005183346.GB4998@xxxxxxxxx> (Steven Smith's message of "Thu, 5 Oct 2006 19:33:46 +0100")
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20060904090150.GC4812@xxxxxxxxx> <87y7s168k2.fsf@xxxxxxxxxxxxxxxxx> <20061002090145.GA3576@xxxxxxxxx> <87y7rwyy6q.fsf@xxxxxxxxxxxxxxxxx> <20061005183346.GB4998@xxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux)
Steven Smith <sos22-xen@xxxxxxxxxxxxx> writes:

>> > -- The setup protocol doesn't look much like the normal xenbus state
>> >    machine.  There may be a good reason for this, but I haven't heard
>> >    one yet.  I know the standard way is badly documented and
>> >    non-trivial to understand from the existing implementations; sorry
>> >    about that.
>> Anthony wrote it that way.  I don't know why, but it's simple, and it
>> works.
>> 
>> I'm most reluctant to throw out working code while there's so much
>> code that needs fixing.  That situation is improving, though.
> Okay.
>
>> >> + for (;;) {
>> >> +         FD_ZERO(&readfds);
>> >> +         FD_SET(fd, &readfds);
>> >> +         tv = (struct timeval){0, 10000};
>> >> +
>> >> +         if (select(fd + 1, &readfds, NULL, NULL, &tv) < 0) {
>> >> +                 if (errno == EINTR)
>> >> +                         continue;
>> >> +                 fprintf(stderr, "Connection to domain broke (%s)\n",
>> >> +                         strerror(errno));
>> > It's not really the connection to the domain that's broken as the
>> > event channel device.  Not terribly important.
>> Happy to reword it; suggestions?
> I dunno; maybe something like ``select() failed on event channel
> device (%s)\n"?  I'd rather have a message which most users would find
> meaningless than one which is actually misleading.  Given that this
> should almost never happen I don't think it's worth worrying about
> that much.

Works for me.

>> >                  What happens if someone has a four, five, six button
>> > mouse?
>> The extra buttons get mapped to negative values here (ugh), truncated
>> to __u8 in xenfb_send_button() (double-ugh) and thrown away in the
>> frontend.  The 256th button would get misinterpreted as the first one,
>> though :)
> I'd prefer to discard invalid events here in the backend if possible,
> just on the general principle that sending garbage across the ring
> buffer is a bad idea even if you know it's going to get discarded.

Agreed.

>> The xenkbd protocol provides for three mouse buttons.  From xenkbd.h:
>> 
>>      __u8 button;       /* the button (0, 1, 2 is right, middle, left) */
>> 
>> This is extensible as long as we handle unknown buttons gracefully.  I
>> do hate the weird encoding of buttons, though.  Too hebrew for my
>> taste.
> It's certainly not how I would have done it, but I don't think it
> makes much difference.
>
>> SDL provides for five buttons (SDL_BUTTON_LEFT, SDL_BUTTON_MIDDLE,
>> SDL_BUTTON_RIGHT, SDL_BUTTON_WHEELUP, SDL_BUTTON_WHEELDOWN).
>> 
>> LibVNCServer provides for 8 buttons.
>> 
>> The kernel input layer provides for 8 mouse buttons (BTN_LEFT,
>> BTN_RIGHT, BTN_MIDDLE, BTN_SIDE, BTN_EXTRA, BTN_FORWARD, BTN_BACK,
>> BTN_TASK).
>> 
>> How to best map buttons from VNC and SDL to input beyond the first
>> three?  If we can find a workable answer for that, providing for more
>> buttons should be trivial.
> *shrug* We might as well just send input layer codes across the ring
> buffer and do the translation in the backend.  That makes the Linux
> frontend easier and doesn't make other operating systems any harder.
> If we later find that some other operating system supports buttons
> which the input layer doesn't then we can figure out what to do with
> them then; provided we make the frontend discard buttons it doesn't
> understand it should be trivial to do this in a backwards compatible
> way.

The input layer treats mouse buttons just like keys.  If we use its
button encoding, we can just as well use XENKBD_TYPE_KEY and drop
XENKBD_TYPE_BUTTON.  Any objections?

[...]
>> >> + n_fbdirs = n_fbmfns * sizeof(unsigned long);
>> > ...
>> >> + n_fbdirs = (n_fbdirs + (XC_PAGE_SIZE - 1)) / XC_PAGE_SIZE;
>> >> +
>> >> + fbmfns = xc_map_foreign_batch(xenfb->xc, domid, PROT_READ, 
>> >> xenfb->fb_info->pd, n_fbdirs);
>> >> + if (fbmfns == NULL)
>> >> +         goto error;
>> >> +
>> >> + xenfb->fb = xc_map_foreign_batch(xenfb->xc, domid, PROT_READ | 
>> >> PROT_WRITE, fbmfns, n_fbmfns);
>> >> + if (xenfb->fb == NULL)
>> >> +         goto error;
>> > Irritatingly, map_foreign_batch doesn't actually return success or
>> > failure through its return value, but by setting the high bits on the
>> > failed entry in the array you pass in.  If the array is mapped
>> > readonly, or is shared with a remote domain, there's no way to detect
>> > failure.
>> Sounds like a design flaw to me.
> That's one way of putting it, certainly. :)
>
>> xc_map_foreign_batch() returns NULL on obvious failures, but the
>> ioctl() might cause the behavior you described.
>> 
>> I looked for other users of xc_map_foreign_batch() and I can't see
>> them checking success other than by examining the return value.
>> 
>> fbmfns[] is mapped PROT_READ from the frontend's domain.
> I think the correct fix here is probably just to fix up
> xc_map_foreign_batch() to have a more sane calling convention.  As you
> say, most of its existing users seem to make the same assumptions as
> have happened here.  I can't actually see any good way of dealing with
> this in the standard libxc API.
>
>> > You might also want to consider using xc_map_foreign_ranges, since
>> > that has a useful return value, but it would mean copying the pfn
>> > arrays and translating them to a slightly different format.
>> Isn't that function private?
> Oops, yes, sorry, forgot about that.
>
>> What do you want me to do here?
> I'd leave it as a known bug for now.  We'll add a new interface to
> libxc once 3.0.3's dealt with.

Excellent.

>> >> +
>> >> + event.type = XENFB_TYPE_SET_EVENTS;
>> >> + event.set_events.flags = XENFB_FLAG_UPDATE;
>> >> + if (xenfb_fb_event(xenfb, &event))
>> >> +         goto error;
>> > Would it make sense to negotiate this via xenbus at connection setup
>> > time?  It's not like it's likely to change during the life of the
>> > buffer.
>> Can you point to an example of such a negotiation between a frontend
>> and a backend via xenbus?
> The netif feature flags are probably the most obvious example.  For
> instance, to turn on copy rx mode, you first have the backend put
> feature-rx-copy=1 in its xenstore area, and then when the frontend
> connects it notices this and puts request-rx-copy=1 in its area.  The
> backend reads this out as part of connection setup, and rx copy mode
> is turned on.
>
> The equivalent in this case would be for the backend to set
> request-update=1 in its area when it starts, and then for the frontend
> to set provides-update=1 if appropriate.

I'll look into this when/if I find the time.

> Of course, this sort of thing only works well for flags which don't
> change while the buffer is live.  I'd certainly expect
> XENFB_FLAG_UPDATE to fit into that category, but perhaps you have some
> future plans which wouldn't work well with this?

I can't guarantee we won't need a mechanism to switch things during
operation at some time, but neither can I guarantee that
XENFB_TYPE_SET_EVENTS as it is now will do for that then.

Instead of attempting to cover all possible future cases of option
negotiation / mode switching, let's just provide for what we need now
in a simple and reasonably general way.

[...]

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel