From nobody Sat May 4 07:20:14 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490447908562703.5572801334231; Sat, 25 Mar 2017 06:18:28 -0700 (PDT) Received: from localhost ([::1]:37349 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1crlaM-0001Lq-Lu for importer@patchew.org; Sat, 25 Mar 2017 09:18:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1crjom-0005as-CY for qemu-devel@nongnu.org; Sat, 25 Mar 2017 07:25:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1crjoj-0002GI-9s for qemu-devel@nongnu.org; Sat, 25 Mar 2017 07:25:12 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:36494) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1crjoj-0002F0-4M for qemu-devel@nongnu.org; Sat, 25 Mar 2017 07:25:09 -0400 Received: by mail-wm0-x243.google.com with SMTP id x124so2510654wmf.3 for ; Sat, 25 Mar 2017 04:25:08 -0700 (PDT) Received: from localhost.localdomain (208.red-83-50-117.dynamicip.rima-tde.net. [83.50.117.208]) by smtp.gmail.com with ESMTPSA id m188sm6078949wmm.7.2017.03.25.04.25.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 25 Mar 2017 04:25:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ibBawg6NDoTt7ZMiMGIjkgLpp571WZPoip7whdZHpm4=; b=ukQUdsvru7sDWe+qDBH2d0xWrJEecSbKsYimE3vdyFa9N220vg0I2qXUtGzcdJzgL0 MbdMiNgnU4TXzauDZpDg66XPc7Pv13fKX09hIUadfsoO+uAiz8dzYueGwbTpBSQmzeqg /GDKgCtLTXIfbYd650CWK/yY9UmcHLcjbrbL9BpOD6fAfpsfSSJCLWBnO5Q4b0/Ag5ar Pa7RhljK8pC8R2Y8uy+42LnbneGIFlx9DDAiD4E2sV25mdy6hllZ93l7VvTRYDw8XRfT 69v/0uwH5EAXdVzNX1Nydhxt9lraq55NF6bTHMt0fIlP2ylbcORXCu1FmKX45hMQxOhy pjNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ibBawg6NDoTt7ZMiMGIjkgLpp571WZPoip7whdZHpm4=; b=oAVRalBu0rM6XIIdA7O3FnNKf5sO2Ts7RxvPhDK73DFQutWlp0fX8bQVoCYPofXshd q9TcZYkDgGZlci4R9oLvwD7rpnVZSTYuqdSs8RX+icqnZ7bJGeL2XZbfrl18uAbZn8Dw mHYcNC+CLLjbBoq4HOgh1lE5V5Y9QEUyDLHh1tUu3u+Yp5hm+5p+P0PRiCTBlsOujs+p uARo9Y0QHEc6E5n8+EpiB00UU9LaxTckJh2qvVESqUzLeU2LVi06W3t5BeVmyqPWXXJ/ JVkAaNmM8ip+nq53bVPfWkgdGeA72xC4C4V7vzVmILlzW+QjA+FBmuUnBgm8NH/yWG1d amYQ== X-Gm-Message-State: AFeK/H0RES70KfaRd04XKQW9E0E8w0HQxQaeUbJlgYUBQHntZFYAIWOpozJr2iBIYKd6Uw== X-Received: by 10.28.172.7 with SMTP id v7mr1759759wme.78.1490441107813; Sat, 25 Mar 2017 04:25:07 -0700 (PDT) From: Javier Celaya To: qemu-devel@nongnu.org Date: Sat, 25 Mar 2017 12:25:01 +0100 Message-Id: <20170325112501.15887-1-jcelaya@gmail.com> X-Mailer: git-send-email 2.11.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::243 X-Mailman-Approved-At: Sat, 25 Mar 2017 09:17:28 -0400 Subject: [Qemu-devel] [PATCH] Fix input-linux reading from device X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kraxel@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The evdev devices in input-linux.c are read in blocks of one whole event. If there are not enough bytes available, they are discarded, instead of being kept for the next read operation. This results in lost events, of even non-working devices. This patch keeps track of the number of bytes to be read to fill up a whole event, and then handle it. Signed-off-by: Javier Celaya --- ui/input-linux.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ui/input-linux.c b/ui/input-linux.c index ac31f47719..33bcdb00c6 100644 --- a/ui/input-linux.c +++ b/ui/input-linux.c @@ -169,6 +169,8 @@ struct InputLinux { bool has_abs_x; int num_keys; int num_btns; + struct input_event event; + int to_be_read; =20 QTAILQ_ENTRY(InputLinux) next; }; @@ -327,25 +329,29 @@ static void input_linux_handle_mouse(InputLinux *il, = struct input_event *event) static void input_linux_event(void *opaque) { InputLinux *il =3D opaque; - struct input_event event; int rc; + int offset =3D sizeof(il->event) - il->to_be_read; + uint8_t *p =3D (uint8_t *)&il->event; =20 for (;;) { - rc =3D read(il->fd, &event, sizeof(event)); - if (rc !=3D sizeof(event)) { + rc =3D read(il->fd, &p[offset], il->to_be_read); + if (rc !=3D il->to_be_read) { if (rc < 0 && errno !=3D EAGAIN) { fprintf(stderr, "%s: read: %s\n", __func__, strerror(errno= )); qemu_set_fd_handler(il->fd, NULL, NULL, NULL); close(il->fd); + } else if (rc > 0){ + il->to_be_read -=3D rc; } break; } + il->to_be_read =3D sizeof(il->event); =20 if (il->num_keys) { - input_linux_handle_keyboard(il, &event); + input_linux_handle_keyboard(il, &il->event); } if (il->has_rel_x && il->num_btns) { - input_linux_handle_mouse(il, &event); + input_linux_handle_mouse(il, &il->event); } } } @@ -417,6 +423,7 @@ static void input_linux_complete(UserCreatable *uc, Err= or **errp) } } =20 + il->to_be_read =3D sizeof(il->event); qemu_set_fd_handler(il->fd, input_linux_event, NULL, il); if (il->keycount) { /* delay grab until all keys are released */ --=20 2.11.0