mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Henrik Rydberg" <rydberg@euromail.se>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	Jiri Kosina <jkosina@suse.cz>, Ping Cheng <pingc@wacom.com>,
	Benjamin Tissoires <tissoire@cena.fr>,
	Chase Douglas <chase.douglas@canonical.com>,
	Rafi Rubin <rafi@seas.upenn.edu>,
	Henrik Rydberg <rydberg@euromail.se>
Subject: [PATCH 5/5] input: evdev: Never leave the client buffer empty after write
Date: Wed, 23 Jun 2010 13:14:46 +0200	[thread overview]
Message-ID: <1277291686-7153-6-git-send-email-rydberg@euromail.se> (raw)
In-Reply-To: <1277291686-7153-5-git-send-email-rydberg@euromail.se>

When the client buffer is very small and wraps around a lot, it may
well be that a write increases the head such that head == tail. If
this happens between the point where a poll is triggered and the
actual data is being read, there will be no data to read. This is
confusing to applications, which might end up closing the file.

This patch solves the problem by making sure the client buffer is
never empty after writing to it.

Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
---
 drivers/input/evdev.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 728802f..45eae19 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -62,10 +62,13 @@ static void evdev_pass_event(struct evdev_client *client,
 {
 	/*
 	 * Interrupts are disabled, just acquire the lock
+	 * Never leave the client buffer empty
 	 */
 	spin_lock(&client->buffer_lock);
-	client->buffer[client->head++] = *event;
-	client->head &= client->bufsize - 1;
+	do {
+		client->buffer[client->head++] = *event;
+		client->head &= client->bufsize - 1;
+	} while (client->head == client->tail);
 	spin_unlock(&client->buffer_lock);
 
 	if (event->type == EV_SYN)
-- 
1.6.3.3


  reply	other threads:[~2010-06-23 11:18 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-23 11:14 [PATCH 0/4] input: evdev: Dynamic buffers (rev5) Henrik Rydberg
2010-06-23 11:14 ` [PATCH 1/5] input: evdev: Convert to dynamic event buffer (rev5) Henrik Rydberg
2010-06-23 11:14   ` [PATCH 2/5] input: Use driver hint to compute the evdev buffer size (rev3) Henrik Rydberg
2010-06-23 11:14     ` [PATCH 3/5] input: bcm5974: Set the average number of events per MT event packet Henrik Rydberg
2010-06-23 11:14       ` [PATCH 4/5] hid-input: Use a larger event buffer for MT devices Henrik Rydberg
2010-06-23 11:14         ` Henrik Rydberg [this message]
2010-06-23 14:20         ` Jiri Kosina
2010-06-23 16:54     ` [PATCH 2/5] input: Use driver hint to compute the evdev buffer size (rev3) Ping Cheng
2010-06-23 17:07       ` Henrik Rydberg
2010-06-23 17:12         ` Dmitry Torokhov
2010-06-23 17:27           ` Henrik Rydberg

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=1277291686-7153-6-git-send-email-rydberg@euromail.se \
    --to=rydberg@euromail.se \
    --cc=chase.douglas@canonical.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=jkosina@suse.cz \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pingc@wacom.com \
    --cc=rafi@seas.upenn.edu \
    --cc=tissoire@cena.fr \
    /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

all inboxes | Powered by JetHome®