On Sun, Feb 15, 2015 at 06:28:01PM -0500, Aaron Fineman wrote:
> >Synopsis: USB KVM switch under Xorg spams read IO errors on detach (filling 
> >up /var)
> >Category: user
> >Environment:
>         System      : OpenBSD 5.7
>         Details     : OpenBSD 5.7-beta (GENERIC.MP) #854: Fri Feb 13
>         12:19:00 MST 2015
>                          
> [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> 
>         Architecture: OpenBSD.amd64
>         Machine     : amd64
> >Description:
> Works under 5.6. Can reproduce on snaps from 8-feb and 15-feb. When
> using a USB KVM switch under Xorg, toggling the switch (detach) spams
> read IO errors to /var/log/Xorg.0.log until /var is full. I only notice
> these for the mouse device, not the keyboard.
> 
> [   327.467] (EE) ws: /dev/wsmouse1: read error Input/output error
>

Hi,

I agree that filling /var with log spam is not nice. However the core
of the problem is that when the KVM is switched to another input
device it produces something that lead to I/O errors on the devices.
There is no spam for the keyboard either because it's not generating
those I/O errors or because they are not logged by the
xf68-input-keyboard driver if they happend.

I could just patch xf86-input-ws to silently ignore I/O errors, but it
would not be particularly nice.

Can you run the test program below in console mode, and do a KVM
switch away and then back while the program is running. Capture its
stdout (using '>' or tee(1)) and send us the result.

A good KVM should just generate no events while switched away.

/* wsmouse events dump */
#include <sys/time.h>
#include <dev/wscons/wsconsio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
        int fd, n;
        char     *dev;
        struct wscons_event event;
        
        if (argc == 2) {
                dev = argv[1];  
        } else {
                dev = "/dev/wsmouse";
        }
        
        fd = open(dev, O_RDONLY);
        if (fd < 0) {
                perror("open");
                exit(1);
        } 
        
        while (1) {
                n = read(fd, &event, sizeof(struct wscons_event));
                if (n <= 0) {
                        printf("read: %s\n", strerror(errno));
                }
                
                switch (event.type) {
                case WSCONS_EVENT_MOUSE_UP:
                        printf("MOUSE_UP: 0x%x\n", event.value);
                        break;
                case WSCONS_EVENT_MOUSE_DOWN:
                        printf("MOUSE_DOWN: 0x%x\n", event.value);
                        break;
                case WSCONS_EVENT_MOUSE_DELTA_X:
                        printf("MOUSE_DELTA_X: %d\n", event.value);
                        break;
                case WSCONS_EVENT_MOUSE_DELTA_Y:
                        printf("MOUSE_DELTA_Y: %d\n", event.value);
                        break;
#ifdef WSCONS_EVENT_MOUSE_DELTA_Z
                case WSCONS_EVENT_MOUSE_DELTA_Z:
                        printf("MOUSE_DELTA_Z: %d\n", event.value);
                        break;
#endif
#ifdef WSCONS_EVENT_MOUSE_ABSOLUTE_Z
                case WSCONS_EVENT_MOUSE_ABSOLUTE_Z:
                        printf("MOUSE_ABSOLUTE_Z: %d\n", event.value);
                        break;
#endif
                case WSCONS_EVENT_MOUSE_ABSOLUTE_X:
                        printf("MOUSE_ABSOLUTE_X: %d\n", event.value);
                        break;
                case WSCONS_EVENT_MOUSE_ABSOLUTE_Y:
                        printf("MOUSE_ABSOLUTE_Y: %d\n", event.value);
                        break;
                case WSCONS_EVENT_SYNC:
                        printf("SYNC\n");
                        break;
                default:
                        printf("unknown event type 0x%x, value 0x%x\n",
                            event.type, event.value);
                }
        }
}

-- 
Matthieu Herrb

Reply via email to